@myop/sdk 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundled-declarations.d.ts +27 -200
- package/dist/cjs/{_IframeSDK.012474c1.min.js → _IframeSDK.2f50c32c.min.js} +1 -1
- package/dist/cjs/{_IframeSDK.c7f71dba.js → _IframeSDK.b80455bf.js} +45 -31
- package/dist/cjs/{_IframeSDK.c7f71dba.js.map → _IframeSDK.b80455bf.js.map} +3 -3
- package/dist/cjs/_MyopHelpers.3d50ac48.min.js +1 -0
- package/dist/cjs/_MyopHelpers.7baba8b8.js +462 -0
- package/dist/cjs/_MyopHelpers.7baba8b8.js.map +7 -0
- package/dist/cjs/{_WebComponentSDK.15ffefb6.min.js → _WebComponentSDK.37374c87.min.js} +1 -1
- package/dist/cjs/{_WebComponentSDK.93d3959a.js → _WebComponentSDK.687ea8cb.js} +45 -31
- package/dist/cjs/{_WebComponentSDK.93d3959a.js.map → _WebComponentSDK.687ea8cb.js.map} +3 -3
- package/dist/cjs/{_hostSDK.a852b7b7.min.js → _hostSDK.48a55f66.min.js} +1 -1
- package/dist/cjs/{_hostSDK.eeb98d7f.js → _hostSDK.e09022f6.js} +45 -31
- package/dist/cjs/{_hostSDK.eeb98d7f.js.map → _hostSDK.e09022f6.js.map} +3 -3
- 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 +3947 -0
- package/dist/cjs-bundled/myop_sdk.bundled.js.map +7 -0
- package/dist/cjs-bundled/myop_sdk.bundled.min.js +1 -0
- package/dist/module/Iframe/index.js +49 -33
- package/dist/module/Iframe/index.js.map +3 -3
- package/dist/module/SDK.js +52 -120
- package/dist/module/SDK.js.map +3 -3
- package/dist/module/helpers/CloudRepository.d.ts +27 -185
- package/dist/module/helpers/index.d.ts +0 -1
- package/dist/module/helpers/index.js +52 -2521
- package/dist/module/helpers/index.js.map +4 -4
- package/dist/module/host/index.js +49 -33
- package/dist/module/host/index.js.map +3 -3
- package/dist/module/webcomponent/index.js +49 -33
- package/dist/module/webcomponent/index.js.map +3 -3
- package/package.json +1 -1
- package/dist/cjs/_MyopHelpers.75e0fd8d.js +0 -2810
- package/dist/cjs/_MyopHelpers.75e0fd8d.js.map +0 -7
- package/dist/cjs/_MyopHelpers.ecfd80d9.min.js +0 -1
- package/dist/module/helpers/enableV2.d.ts +0 -12
|
@@ -0,0 +1,3947 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var MyopSDK = (() => {
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __defProps = Object.defineProperties;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
7
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
8
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
9
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
10
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
11
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
12
|
+
var __spreadValues = (a, b) => {
|
|
13
|
+
for (var prop in b || (b = {}))
|
|
14
|
+
if (__hasOwnProp.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
if (__getOwnPropSymbols)
|
|
17
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
18
|
+
if (__propIsEnum.call(b, prop))
|
|
19
|
+
__defNormalProp(a, prop, b[prop]);
|
|
20
|
+
}
|
|
21
|
+
return a;
|
|
22
|
+
};
|
|
23
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
24
|
+
var __esm = (fn, res) => function __init() {
|
|
25
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
26
|
+
};
|
|
27
|
+
var __export = (target, all) => {
|
|
28
|
+
for (var name in all)
|
|
29
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
30
|
+
};
|
|
31
|
+
var __copyProps = (to, from, except, desc) => {
|
|
32
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
33
|
+
for (let key of __getOwnPropNames(from))
|
|
34
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
35
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
36
|
+
}
|
|
37
|
+
return to;
|
|
38
|
+
};
|
|
39
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
40
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
41
|
+
|
|
42
|
+
// src/dynamicImport/defineDynamicImport.ts
|
|
43
|
+
var __federation__, onLoadKey, moduleInstanceKey, defineDynamicImport;
|
|
44
|
+
var init_defineDynamicImport = __esm({
|
|
45
|
+
"src/dynamicImport/defineDynamicImport.ts"() {
|
|
46
|
+
"use strict";
|
|
47
|
+
__federation__ = "__federation__";
|
|
48
|
+
onLoadKey = "onLoad";
|
|
49
|
+
moduleInstanceKey = "moduleInstance";
|
|
50
|
+
defineDynamicImport = (globalName, module) => {
|
|
51
|
+
if (window[__federation__] && window[__federation__][globalName] && window[__federation__][globalName][onLoadKey]) {
|
|
52
|
+
window[__federation__][globalName][onLoadKey]({ [globalName]: module });
|
|
53
|
+
} else {
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// version:myop-sdk-version
|
|
60
|
+
var myop_sdk_version_default;
|
|
61
|
+
var init_myop_sdk_version = __esm({
|
|
62
|
+
"version:myop-sdk-version"() {
|
|
63
|
+
myop_sdk_version_default = "0.2.4";
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// src/common/MyopMessages.ts
|
|
68
|
+
var MyopMessages;
|
|
69
|
+
var init_MyopMessages = __esm({
|
|
70
|
+
"src/common/MyopMessages.ts"() {
|
|
71
|
+
"use strict";
|
|
72
|
+
MyopMessages = {
|
|
73
|
+
//host to component
|
|
74
|
+
"InitRequest": "InitRequest",
|
|
75
|
+
"InitResponse": "InitResponse",
|
|
76
|
+
"InitMessage": "InitMessage",
|
|
77
|
+
"DisposeMessage": "DisposeMessage",
|
|
78
|
+
"ChangeTextMessage": "ChangeTextMessage",
|
|
79
|
+
"BindClickMessage": "BindClickMessage",
|
|
80
|
+
"DetectMyopRefsMessage": "DetectMyopRefsMessage",
|
|
81
|
+
"ExecuteScriptMessage": "ExecuteScriptMessage",
|
|
82
|
+
"AddEventListenerMessage": "AddEventListenerMessage",
|
|
83
|
+
"SetAttributeMessage": "SetAttributeMessage",
|
|
84
|
+
"CreateRefComponentMessage": "CreateRefComponentMessage",
|
|
85
|
+
"EnvelopedMessage": "EnvelopedMessage",
|
|
86
|
+
"GetElementValueMessage": "GetElementValueMessage",
|
|
87
|
+
"GetAttributeMessage": "GetAttributeMessage",
|
|
88
|
+
"SetInnerHtml": "SetInnerHtml",
|
|
89
|
+
//component messages
|
|
90
|
+
"ExecuteComponentMethod": "ExecuteComponentMethod",
|
|
91
|
+
"SetMutationObserverMessage": "SetMutationObserverMessage",
|
|
92
|
+
"SetResizeObserverMessage": "SetResizeObserverMessage",
|
|
93
|
+
"CleanupMessage": "CleanupMessage",
|
|
94
|
+
// external to host :
|
|
95
|
+
In: {
|
|
96
|
+
"DetectedMyopRefsMessage": "DetectedMyopRefsMessage",
|
|
97
|
+
"ClickReplayMessage": "ClickReplayMessage",
|
|
98
|
+
"ExecuteScriptReplyMessage": "ExecuteScriptReplyMessage",
|
|
99
|
+
"EventListenerCallbackMessage": "EventListenerCallbackMessage",
|
|
100
|
+
"ElementValueReplayMessage": "ElementValueReplayMessage",
|
|
101
|
+
"GetAttributeReplayMessage": "GetAttributeReplayMessage",
|
|
102
|
+
"RefComponentCreatedMessage": "RefComponentCreatedMessage",
|
|
103
|
+
"EnvelopedMessage": "EnvelopedMessage",
|
|
104
|
+
"MutationObserverMessage": "MutationObserverMessage",
|
|
105
|
+
"CleanupReplayMessage": "CleanupReplayMessage",
|
|
106
|
+
"ResizeObserverMessage": "ResizeObserverMessage"
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// src/utils/uuid.ts
|
|
113
|
+
var uuidv4, bytesToUuid, base64UrlDecode, decompressUUIDs;
|
|
114
|
+
var init_uuid = __esm({
|
|
115
|
+
"src/utils/uuid.ts"() {
|
|
116
|
+
"use strict";
|
|
117
|
+
uuidv4 = () => {
|
|
118
|
+
return "10000000-1000-4000-8000-100000000000".replace(
|
|
119
|
+
/[018]/g,
|
|
120
|
+
(c) => (+c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> +c / 4).toString(16)
|
|
121
|
+
);
|
|
122
|
+
};
|
|
123
|
+
bytesToUuid = (bytes) => {
|
|
124
|
+
const hex = [...bytes].map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
125
|
+
return [
|
|
126
|
+
hex.slice(0, 8),
|
|
127
|
+
hex.slice(8, 12),
|
|
128
|
+
hex.slice(12, 16),
|
|
129
|
+
hex.slice(16, 20),
|
|
130
|
+
hex.slice(20)
|
|
131
|
+
].join("-");
|
|
132
|
+
};
|
|
133
|
+
base64UrlDecode = (str) => {
|
|
134
|
+
let base64 = str.replace(/-/g, "+").replace(/_/g, "/");
|
|
135
|
+
while (base64.length % 4) base64 += "=";
|
|
136
|
+
const binary = atob(base64);
|
|
137
|
+
return Uint8Array.from(binary, (char) => char.charCodeAt(0));
|
|
138
|
+
};
|
|
139
|
+
decompressUUIDs = (encoded) => {
|
|
140
|
+
const bytes = base64UrlDecode(encoded);
|
|
141
|
+
if (bytes.length % 16 !== 0) throw new Error("Invalid input length");
|
|
142
|
+
const uuids = [];
|
|
143
|
+
for (let i = 0; i < bytes.length; i += 16) {
|
|
144
|
+
uuids.push(bytesToUuid(bytes.slice(i, i + 16)));
|
|
145
|
+
}
|
|
146
|
+
return uuids;
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
// src/utils/utils.ts
|
|
152
|
+
var wait;
|
|
153
|
+
var init_utils = __esm({
|
|
154
|
+
"src/utils/utils.ts"() {
|
|
155
|
+
"use strict";
|
|
156
|
+
init_uuid();
|
|
157
|
+
wait = (ms) => {
|
|
158
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
// src/messages/BaseMessage.ts
|
|
164
|
+
var MessageDirection, BaseMyopMessage, MyopElementMessage, MyopBindReplayMessage, MyopBindMessage, Ref;
|
|
165
|
+
var init_BaseMessage = __esm({
|
|
166
|
+
"src/messages/BaseMessage.ts"() {
|
|
167
|
+
"use strict";
|
|
168
|
+
init_utils();
|
|
169
|
+
MessageDirection = class {
|
|
170
|
+
};
|
|
171
|
+
__publicField(MessageDirection, "down", "down");
|
|
172
|
+
__publicField(MessageDirection, "up", "up");
|
|
173
|
+
BaseMyopMessage = class {
|
|
174
|
+
constructor() {
|
|
175
|
+
__publicField(this, "id", uuidv4());
|
|
176
|
+
__publicField(this, "myop", true);
|
|
177
|
+
__publicField(this, "content");
|
|
178
|
+
// TODO : cant be optional
|
|
179
|
+
__publicField(this, "source");
|
|
180
|
+
__publicField(this, "destination");
|
|
181
|
+
__publicField(this, "route");
|
|
182
|
+
__publicField(this, "ref");
|
|
183
|
+
__publicField(this, "direction");
|
|
184
|
+
__publicField(this, "cleanable", false);
|
|
185
|
+
}
|
|
186
|
+
static create(...args) {
|
|
187
|
+
return new this(...args);
|
|
188
|
+
}
|
|
189
|
+
isTypeof(msg) {
|
|
190
|
+
return msg.messageType === this.messageType;
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
MyopElementMessage = class extends BaseMyopMessage {
|
|
194
|
+
constructor(ref) {
|
|
195
|
+
super();
|
|
196
|
+
this.ref = ref;
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
MyopBindReplayMessage = class extends BaseMyopMessage {
|
|
200
|
+
constructor(replayToHandler) {
|
|
201
|
+
super();
|
|
202
|
+
this.replayToHandler = replayToHandler;
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
MyopBindMessage = class extends BaseMyopMessage {
|
|
206
|
+
constructor(handler) {
|
|
207
|
+
super();
|
|
208
|
+
this.handler = handler;
|
|
209
|
+
__publicField(this, "handlerUniqueId", uuidv4());
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
Ref = class _Ref {
|
|
213
|
+
constructor(refConfig, component) {
|
|
214
|
+
this.refConfig = refConfig;
|
|
215
|
+
this.component = component;
|
|
216
|
+
__publicField(this, "myop", true);
|
|
217
|
+
__publicField(this, "__nonProxied");
|
|
218
|
+
this.__nonProxied = __spreadProps(__spreadValues({}, this), {
|
|
219
|
+
component: null
|
|
220
|
+
// in order to be serializable
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
static create(selector, refConfig, component) {
|
|
224
|
+
let _refConfig = refConfig;
|
|
225
|
+
if (!_refConfig) {
|
|
226
|
+
_refConfig = {
|
|
227
|
+
id: "",
|
|
228
|
+
name: "",
|
|
229
|
+
description: "",
|
|
230
|
+
selectorType: "id-attribute",
|
|
231
|
+
selector,
|
|
232
|
+
behavior: {
|
|
233
|
+
type: "code"
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
return new _Ref(_refConfig, component);
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
// src/messages/BindClickMessage.ts
|
|
244
|
+
var ReplayMessageKey, BindClickMessage, ClickReplayMessage;
|
|
245
|
+
var init_BindClickMessage = __esm({
|
|
246
|
+
"src/messages/BindClickMessage.ts"() {
|
|
247
|
+
"use strict";
|
|
248
|
+
init_BaseMessage();
|
|
249
|
+
ReplayMessageKey = "ClickReplayMessage";
|
|
250
|
+
BindClickMessage = class extends MyopBindMessage {
|
|
251
|
+
constructor(ref, handler) {
|
|
252
|
+
super(handler);
|
|
253
|
+
this.ref = ref;
|
|
254
|
+
__publicField(this, "replyMessageKey", ReplayMessageKey);
|
|
255
|
+
__publicField(this, "messageType", "BindClickMessage");
|
|
256
|
+
__publicField(this, "cleanable", true);
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
ClickReplayMessage = class extends MyopBindReplayMessage {
|
|
260
|
+
constructor() {
|
|
261
|
+
super(...arguments);
|
|
262
|
+
__publicField(this, "messageType", ReplayMessageKey);
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
// src/messages/ChangeTextMessage.ts
|
|
269
|
+
var ChangeTextMessage;
|
|
270
|
+
var init_ChangeTextMessage = __esm({
|
|
271
|
+
"src/messages/ChangeTextMessage.ts"() {
|
|
272
|
+
"use strict";
|
|
273
|
+
init_BaseMessage();
|
|
274
|
+
ChangeTextMessage = class extends BaseMyopMessage {
|
|
275
|
+
constructor(ref, text) {
|
|
276
|
+
super();
|
|
277
|
+
this.ref = ref;
|
|
278
|
+
__publicField(this, "messageType", "ChangeTextMessage");
|
|
279
|
+
this.content = text;
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
// src/messages/ExecuteScriptMessage.ts
|
|
286
|
+
var ReplayMessageKey2, functionBodyRegex, expressionBodyRegex, stripFunction, ExecuteScriptMessage, ExecuteScriptReplyMessage;
|
|
287
|
+
var init_ExecuteScriptMessage = __esm({
|
|
288
|
+
"src/messages/ExecuteScriptMessage.ts"() {
|
|
289
|
+
"use strict";
|
|
290
|
+
init_BaseMessage();
|
|
291
|
+
ReplayMessageKey2 = "ExecuteScriptReplyMessage";
|
|
292
|
+
functionBodyRegex = /(?:function\s*\w*\s*\([^)]*\)\s*\{([\s\S]*?)\}|(\([^)]*\)\s*=>\s*\{([\s\S]*?)\}))\s*$/;
|
|
293
|
+
expressionBodyRegex = /\(\s*[^)]+\s*\)\s*=>\s*(.+)/;
|
|
294
|
+
stripFunction = (content) => {
|
|
295
|
+
let match = content.match(functionBodyRegex);
|
|
296
|
+
if (match) {
|
|
297
|
+
return match[1] || match[3];
|
|
298
|
+
} else {
|
|
299
|
+
let match2 = content.match(expressionBodyRegex);
|
|
300
|
+
if (match2)
|
|
301
|
+
return match2[1].trim();
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
ExecuteScriptMessage = class extends MyopBindMessage {
|
|
305
|
+
constructor(script, handler = () => {
|
|
306
|
+
}, scriptInputs2) {
|
|
307
|
+
super(handler);
|
|
308
|
+
this.scriptInputs = scriptInputs2;
|
|
309
|
+
__publicField(this, "replyMessageKey", ReplayMessageKey2);
|
|
310
|
+
__publicField(this, "messageType", "ExecuteScriptMessage");
|
|
311
|
+
__publicField(this, "script", "");
|
|
312
|
+
this.script = script.toString();
|
|
313
|
+
this.content = script.toString();
|
|
314
|
+
this.content = stripFunction(this.content);
|
|
315
|
+
}
|
|
316
|
+
};
|
|
317
|
+
__publicField(ExecuteScriptMessage, "replierKey", "send");
|
|
318
|
+
__publicField(ExecuteScriptMessage, "completeStreamKey", "completeStream");
|
|
319
|
+
ExecuteScriptReplyMessage = class extends MyopBindReplayMessage {
|
|
320
|
+
constructor(replayToHandler, content) {
|
|
321
|
+
super(replayToHandler);
|
|
322
|
+
this.replayToHandler = replayToHandler;
|
|
323
|
+
this.content = content;
|
|
324
|
+
__publicField(this, "messageType", ReplayMessageKey2);
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
// src/messages/CustomRefMessage.ts
|
|
331
|
+
var CustomRefMessage;
|
|
332
|
+
var init_CustomRefMessage = __esm({
|
|
333
|
+
"src/messages/CustomRefMessage.ts"() {
|
|
334
|
+
"use strict";
|
|
335
|
+
init_ExecuteScriptMessage();
|
|
336
|
+
CustomRefMessage = class extends ExecuteScriptMessage {
|
|
337
|
+
constructor(script, scriptInputs2, handler = () => {
|
|
338
|
+
}) {
|
|
339
|
+
super(({ rootRef, elementId, _script, __scriptInputs }) => {
|
|
340
|
+
const refs = (rootRef.shadowRoot || rootRef.container).querySelectorAll("[".concat("myop-id", "='").concat(elementId, "']"));
|
|
341
|
+
if (refs.length) {
|
|
342
|
+
__scriptInputs.ref = refs[0];
|
|
343
|
+
const dynamicFunction = new Function("return (".concat(_script, ")(...arguments)"));
|
|
344
|
+
return dynamicFunction(__scriptInputs);
|
|
345
|
+
}
|
|
346
|
+
return null;
|
|
347
|
+
}, handler);
|
|
348
|
+
this.scriptInputs = scriptInputs2;
|
|
349
|
+
this.scriptInputs = __spreadProps(__spreadValues({}, scriptInputs2), {
|
|
350
|
+
//_script: stripFunction(script.toString()),
|
|
351
|
+
_script: script.toString()
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
// src/messages/AddEventListenerMessage.ts
|
|
359
|
+
var ReplayMessageKey3, AddEventListenerMessage, EventListenerCallbackMessage;
|
|
360
|
+
var init_AddEventListenerMessage = __esm({
|
|
361
|
+
"src/messages/AddEventListenerMessage.ts"() {
|
|
362
|
+
"use strict";
|
|
363
|
+
init_BaseMessage();
|
|
364
|
+
ReplayMessageKey3 = "EventListenerCallbackMessage";
|
|
365
|
+
AddEventListenerMessage = class extends MyopBindMessage {
|
|
366
|
+
// {} // empty
|
|
367
|
+
constructor(ref, type, handler) {
|
|
368
|
+
super(handler);
|
|
369
|
+
this.ref = ref;
|
|
370
|
+
this.type = type;
|
|
371
|
+
this.handler = handler;
|
|
372
|
+
__publicField(this, "replyMessageKey", ReplayMessageKey3);
|
|
373
|
+
__publicField(this, "messageType", "AddEventListenerMessage");
|
|
374
|
+
__publicField(this, "cleanable", true);
|
|
375
|
+
__publicField(this, "serializableSkeleton", false);
|
|
376
|
+
}
|
|
377
|
+
withSerializableSkeleton(serializableSkeleton) {
|
|
378
|
+
this.serializableSkeleton = serializableSkeleton;
|
|
379
|
+
return this;
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
EventListenerCallbackMessage = class extends MyopBindReplayMessage {
|
|
383
|
+
constructor(replayToHandler, e) {
|
|
384
|
+
super(replayToHandler);
|
|
385
|
+
this.replayToHandler = replayToHandler;
|
|
386
|
+
this.e = e;
|
|
387
|
+
__publicField(this, "messageType", ReplayMessageKey3);
|
|
388
|
+
this.content = {
|
|
389
|
+
e
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
// src/messages/SetAttributeMessage.ts
|
|
397
|
+
var SetAttributeMessage;
|
|
398
|
+
var init_SetAttributeMessage = __esm({
|
|
399
|
+
"src/messages/SetAttributeMessage.ts"() {
|
|
400
|
+
"use strict";
|
|
401
|
+
init_BaseMessage();
|
|
402
|
+
SetAttributeMessage = class extends BaseMyopMessage {
|
|
403
|
+
constructor(ref, name, value) {
|
|
404
|
+
super();
|
|
405
|
+
this.ref = ref;
|
|
406
|
+
this.name = name;
|
|
407
|
+
this.value = value;
|
|
408
|
+
__publicField(this, "messageType", "SetAttributeMessage");
|
|
409
|
+
}
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
// src/messages/GetElementValueMessage.ts
|
|
415
|
+
var ReplayMessageKey4, GetElementValueMessage, ElementValueReplayMessage;
|
|
416
|
+
var init_GetElementValueMessage = __esm({
|
|
417
|
+
"src/messages/GetElementValueMessage.ts"() {
|
|
418
|
+
"use strict";
|
|
419
|
+
init_BaseMessage();
|
|
420
|
+
ReplayMessageKey4 = "ElementValueReplayMessage";
|
|
421
|
+
GetElementValueMessage = class extends MyopBindMessage {
|
|
422
|
+
constructor(ref, handler) {
|
|
423
|
+
super(handler);
|
|
424
|
+
this.ref = ref;
|
|
425
|
+
__publicField(this, "replyMessageKey", ReplayMessageKey4);
|
|
426
|
+
__publicField(this, "messageType", "GetElementValueMessage");
|
|
427
|
+
}
|
|
428
|
+
};
|
|
429
|
+
ElementValueReplayMessage = class extends MyopBindReplayMessage {
|
|
430
|
+
constructor(content) {
|
|
431
|
+
super();
|
|
432
|
+
this.content = content;
|
|
433
|
+
__publicField(this, "messageType", ReplayMessageKey4);
|
|
434
|
+
}
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
// src/messages/SetInnerHtml.ts
|
|
440
|
+
var SetInnerHtml;
|
|
441
|
+
var init_SetInnerHtml = __esm({
|
|
442
|
+
"src/messages/SetInnerHtml.ts"() {
|
|
443
|
+
"use strict";
|
|
444
|
+
init_BaseMessage();
|
|
445
|
+
SetInnerHtml = class extends BaseMyopMessage {
|
|
446
|
+
constructor(ref, innerHtml) {
|
|
447
|
+
super();
|
|
448
|
+
this.ref = ref;
|
|
449
|
+
__publicField(this, "messageType", "SetInnerHtml");
|
|
450
|
+
this.content = innerHtml;
|
|
451
|
+
}
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
// src/messages/InitMessage.ts
|
|
457
|
+
var InitMessage, InitResponse, InitRequest;
|
|
458
|
+
var init_InitMessage = __esm({
|
|
459
|
+
"src/messages/InitMessage.ts"() {
|
|
460
|
+
"use strict";
|
|
461
|
+
init_BaseMessage();
|
|
462
|
+
InitMessage = class extends BaseMyopMessage {
|
|
463
|
+
constructor(id) {
|
|
464
|
+
super();
|
|
465
|
+
__publicField(this, "messageType", "InitMessage");
|
|
466
|
+
this.content = { id };
|
|
467
|
+
}
|
|
468
|
+
isTypeof(msg) {
|
|
469
|
+
return msg.messageType === this.messageType;
|
|
470
|
+
}
|
|
471
|
+
};
|
|
472
|
+
InitResponse = class extends InitMessage {
|
|
473
|
+
constructor() {
|
|
474
|
+
super(...arguments);
|
|
475
|
+
__publicField(this, "messageType", "InitResponse");
|
|
476
|
+
}
|
|
477
|
+
};
|
|
478
|
+
InitRequest = class extends BaseMyopMessage {
|
|
479
|
+
constructor() {
|
|
480
|
+
super(...arguments);
|
|
481
|
+
__publicField(this, "messageType", "InitRequest");
|
|
482
|
+
}
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
});
|
|
486
|
+
|
|
487
|
+
// src/messages/CreateRefComponentMessage.ts
|
|
488
|
+
var ReplayMessageKey5, CreateRefComponentMessage, RefComponentCreatedMessage;
|
|
489
|
+
var init_CreateRefComponentMessage = __esm({
|
|
490
|
+
"src/messages/CreateRefComponentMessage.ts"() {
|
|
491
|
+
"use strict";
|
|
492
|
+
init_BaseMessage();
|
|
493
|
+
ReplayMessageKey5 = "RefComponentCreatedMessage";
|
|
494
|
+
CreateRefComponentMessage = class extends MyopBindMessage {
|
|
495
|
+
constructor(refConfig, nestedComponentConfig, options, handler) {
|
|
496
|
+
super(handler);
|
|
497
|
+
this.refConfig = refConfig;
|
|
498
|
+
this.nestedComponentConfig = nestedComponentConfig;
|
|
499
|
+
this.options = options;
|
|
500
|
+
__publicField(this, "replyMessageKey", ReplayMessageKey5);
|
|
501
|
+
__publicField(this, "messageType", "CreateRefComponentMessage");
|
|
502
|
+
}
|
|
503
|
+
};
|
|
504
|
+
RefComponentCreatedMessage = class extends MyopBindReplayMessage {
|
|
505
|
+
constructor(replayToHandler, nestedRefs, failed) {
|
|
506
|
+
super(replayToHandler);
|
|
507
|
+
this.replayToHandler = replayToHandler;
|
|
508
|
+
this.nestedRefs = nestedRefs;
|
|
509
|
+
this.failed = failed;
|
|
510
|
+
__publicField(this, "messageType", ReplayMessageKey5);
|
|
511
|
+
}
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
});
|
|
515
|
+
|
|
516
|
+
// src/messages/EnvelopedMessage.ts
|
|
517
|
+
var EnvelopedMessage;
|
|
518
|
+
var init_EnvelopedMessage = __esm({
|
|
519
|
+
"src/messages/EnvelopedMessage.ts"() {
|
|
520
|
+
"use strict";
|
|
521
|
+
init_BaseMessage();
|
|
522
|
+
EnvelopedMessage = class extends BaseMyopMessage {
|
|
523
|
+
constructor(destination, message) {
|
|
524
|
+
super();
|
|
525
|
+
this.destination = destination;
|
|
526
|
+
this.message = message;
|
|
527
|
+
__publicField(this, "messageType", "EnvelopedMessage");
|
|
528
|
+
const innerEnvelopedMessage = message;
|
|
529
|
+
this.route = [destination, ...innerEnvelopedMessage.route ? innerEnvelopedMessage.route : []];
|
|
530
|
+
}
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
// src/messages/DetectMyopRefsMessage.ts
|
|
536
|
+
var ReplayMessageKey6, DetectMyopRefsMessage, DetectedMyopRefsMessage;
|
|
537
|
+
var init_DetectMyopRefsMessage = __esm({
|
|
538
|
+
"src/messages/DetectMyopRefsMessage.ts"() {
|
|
539
|
+
"use strict";
|
|
540
|
+
init_BaseMessage();
|
|
541
|
+
ReplayMessageKey6 = "DetectedMyopRefsMessage";
|
|
542
|
+
DetectMyopRefsMessage = class extends MyopBindMessage {
|
|
543
|
+
constructor() {
|
|
544
|
+
super(...arguments);
|
|
545
|
+
__publicField(this, "messageType", "DetectMyopRefsMessage");
|
|
546
|
+
__publicField(this, "replyMessageKey", ReplayMessageKey6);
|
|
547
|
+
}
|
|
548
|
+
};
|
|
549
|
+
DetectedMyopRefsMessage = class extends MyopBindReplayMessage {
|
|
550
|
+
constructor(replayToHandler, myopElementRefs) {
|
|
551
|
+
super(replayToHandler);
|
|
552
|
+
this.replayToHandler = replayToHandler;
|
|
553
|
+
__publicField(this, "messageType", ReplayMessageKey6);
|
|
554
|
+
this.content = myopElementRefs;
|
|
555
|
+
}
|
|
556
|
+
isTypeof(msg) {
|
|
557
|
+
return msg.messageType === this.messageType;
|
|
558
|
+
}
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
});
|
|
562
|
+
|
|
563
|
+
// src/messages/GetAttributeMessage.ts
|
|
564
|
+
var ReplayMessageKey7, GetAttributeMessage, GetAttributeReplayMessage;
|
|
565
|
+
var init_GetAttributeMessage = __esm({
|
|
566
|
+
"src/messages/GetAttributeMessage.ts"() {
|
|
567
|
+
"use strict";
|
|
568
|
+
init_BaseMessage();
|
|
569
|
+
ReplayMessageKey7 = "GetAttributeReplayMessage";
|
|
570
|
+
GetAttributeMessage = class extends MyopBindMessage {
|
|
571
|
+
constructor(ref, name, handler) {
|
|
572
|
+
super(handler);
|
|
573
|
+
this.ref = ref;
|
|
574
|
+
this.name = name;
|
|
575
|
+
__publicField(this, "replyMessageKey", ReplayMessageKey7);
|
|
576
|
+
__publicField(this, "messageType", "GetAttributeMessage");
|
|
577
|
+
}
|
|
578
|
+
};
|
|
579
|
+
GetAttributeReplayMessage = class extends MyopBindReplayMessage {
|
|
580
|
+
constructor(content) {
|
|
581
|
+
super();
|
|
582
|
+
this.content = content;
|
|
583
|
+
__publicField(this, "messageType", ReplayMessageKey7);
|
|
584
|
+
}
|
|
585
|
+
};
|
|
586
|
+
}
|
|
587
|
+
});
|
|
588
|
+
|
|
589
|
+
// src/messages/componentMessages/ExecuteComponentMethod.ts
|
|
590
|
+
var ExecuteComponentMethod;
|
|
591
|
+
var init_ExecuteComponentMethod = __esm({
|
|
592
|
+
"src/messages/componentMessages/ExecuteComponentMethod.ts"() {
|
|
593
|
+
"use strict";
|
|
594
|
+
init_BaseMessage();
|
|
595
|
+
ExecuteComponentMethod = class extends BaseMyopMessage {
|
|
596
|
+
constructor(method) {
|
|
597
|
+
super();
|
|
598
|
+
this.method = method;
|
|
599
|
+
__publicField(this, "messageType", "ExecuteComponentMethod");
|
|
600
|
+
}
|
|
601
|
+
};
|
|
602
|
+
}
|
|
603
|
+
});
|
|
604
|
+
|
|
605
|
+
// src/messages/componentMessages/SetMutationObserverMessage.ts
|
|
606
|
+
var SetMutationObserverMessage, MutationObserverMessage;
|
|
607
|
+
var init_SetMutationObserverMessage = __esm({
|
|
608
|
+
"src/messages/componentMessages/SetMutationObserverMessage.ts"() {
|
|
609
|
+
"use strict";
|
|
610
|
+
init_BaseMessage();
|
|
611
|
+
SetMutationObserverMessage = class extends BaseMyopMessage {
|
|
612
|
+
constructor() {
|
|
613
|
+
super(...arguments);
|
|
614
|
+
__publicField(this, "messageType", "SetMutationObserverMessage");
|
|
615
|
+
}
|
|
616
|
+
};
|
|
617
|
+
MutationObserverMessage = class extends BaseMyopMessage {
|
|
618
|
+
constructor() {
|
|
619
|
+
super(...arguments);
|
|
620
|
+
__publicField(this, "messageType", "MutationObserverMessage");
|
|
621
|
+
}
|
|
622
|
+
};
|
|
623
|
+
}
|
|
624
|
+
});
|
|
625
|
+
|
|
626
|
+
// src/messages/CleanupMessage.ts
|
|
627
|
+
var ReplayMessageKey8, CleanupMessage, CleanupReplayMessage;
|
|
628
|
+
var init_CleanupMessage = __esm({
|
|
629
|
+
"src/messages/CleanupMessage.ts"() {
|
|
630
|
+
"use strict";
|
|
631
|
+
init_BaseMessage();
|
|
632
|
+
ReplayMessageKey8 = "CleanupReplayMessage";
|
|
633
|
+
CleanupMessage = class extends MyopBindMessage {
|
|
634
|
+
constructor(cleanupForMessageId, handler) {
|
|
635
|
+
super(handler);
|
|
636
|
+
this.cleanupForMessageId = cleanupForMessageId;
|
|
637
|
+
__publicField(this, "replyMessageKey", ReplayMessageKey8);
|
|
638
|
+
__publicField(this, "messageType", "CleanupMessage");
|
|
639
|
+
}
|
|
640
|
+
};
|
|
641
|
+
CleanupReplayMessage = class extends MyopBindReplayMessage {
|
|
642
|
+
constructor(customCleanup) {
|
|
643
|
+
super();
|
|
644
|
+
this.customCleanup = customCleanup;
|
|
645
|
+
__publicField(this, "messageType", ReplayMessageKey8);
|
|
646
|
+
}
|
|
647
|
+
};
|
|
648
|
+
}
|
|
649
|
+
});
|
|
650
|
+
|
|
651
|
+
// src/messages/DisposeMessage.ts
|
|
652
|
+
var DisposeMessage;
|
|
653
|
+
var init_DisposeMessage = __esm({
|
|
654
|
+
"src/messages/DisposeMessage.ts"() {
|
|
655
|
+
"use strict";
|
|
656
|
+
init_BaseMessage();
|
|
657
|
+
DisposeMessage = class extends BaseMyopMessage {
|
|
658
|
+
constructor() {
|
|
659
|
+
super(...arguments);
|
|
660
|
+
__publicField(this, "messageType", "DisposeMessage");
|
|
661
|
+
}
|
|
662
|
+
};
|
|
663
|
+
}
|
|
664
|
+
});
|
|
665
|
+
|
|
666
|
+
// src/messages/componentMessages/SetResizeObserverMessage.ts
|
|
667
|
+
var SetResizeObserverMessage, ResizeObserverMessage;
|
|
668
|
+
var init_SetResizeObserverMessage = __esm({
|
|
669
|
+
"src/messages/componentMessages/SetResizeObserverMessage.ts"() {
|
|
670
|
+
"use strict";
|
|
671
|
+
init_BaseMessage();
|
|
672
|
+
SetResizeObserverMessage = class extends BaseMyopMessage {
|
|
673
|
+
constructor() {
|
|
674
|
+
super(...arguments);
|
|
675
|
+
__publicField(this, "cleanable", true);
|
|
676
|
+
__publicField(this, "messageType", "SetResizeObserverMessage");
|
|
677
|
+
}
|
|
678
|
+
};
|
|
679
|
+
ResizeObserverMessage = class extends BaseMyopMessage {
|
|
680
|
+
constructor() {
|
|
681
|
+
super(...arguments);
|
|
682
|
+
__publicField(this, "messageType", "ResizeObserverMessage");
|
|
683
|
+
}
|
|
684
|
+
};
|
|
685
|
+
}
|
|
686
|
+
});
|
|
687
|
+
|
|
688
|
+
// src/messages/index.ts
|
|
689
|
+
var messages_exports = {};
|
|
690
|
+
__export(messages_exports, {
|
|
691
|
+
AddEventListenerMessage: () => AddEventListenerMessage,
|
|
692
|
+
BaseMyopMessage: () => BaseMyopMessage,
|
|
693
|
+
BindClickMessage: () => BindClickMessage,
|
|
694
|
+
ChangeTextMessage: () => ChangeTextMessage,
|
|
695
|
+
CleanupMessage: () => CleanupMessage,
|
|
696
|
+
CleanupReplayMessage: () => CleanupReplayMessage,
|
|
697
|
+
ClickReplayMessage: () => ClickReplayMessage,
|
|
698
|
+
CreateRefComponentMessage: () => CreateRefComponentMessage,
|
|
699
|
+
CustomRefMessage: () => CustomRefMessage,
|
|
700
|
+
DetectMyopRefsMessage: () => DetectMyopRefsMessage,
|
|
701
|
+
DetectedMyopRefsMessage: () => DetectedMyopRefsMessage,
|
|
702
|
+
DisposeMessage: () => DisposeMessage,
|
|
703
|
+
ElementValueReplayMessage: () => ElementValueReplayMessage,
|
|
704
|
+
EnvelopedMessage: () => EnvelopedMessage,
|
|
705
|
+
EventListenerCallbackMessage: () => EventListenerCallbackMessage,
|
|
706
|
+
ExecuteComponentMethod: () => ExecuteComponentMethod,
|
|
707
|
+
ExecuteScriptMessage: () => ExecuteScriptMessage,
|
|
708
|
+
ExecuteScriptReplyMessage: () => ExecuteScriptReplyMessage,
|
|
709
|
+
GetAttributeMessage: () => GetAttributeMessage,
|
|
710
|
+
GetAttributeReplayMessage: () => GetAttributeReplayMessage,
|
|
711
|
+
GetElementValueMessage: () => GetElementValueMessage,
|
|
712
|
+
InitMessage: () => InitMessage,
|
|
713
|
+
InitRequest: () => InitRequest,
|
|
714
|
+
InitResponse: () => InitResponse,
|
|
715
|
+
MessageDirection: () => MessageDirection,
|
|
716
|
+
MutationObserverMessage: () => MutationObserverMessage,
|
|
717
|
+
MyopBindMessage: () => MyopBindMessage,
|
|
718
|
+
MyopBindReplayMessage: () => MyopBindReplayMessage,
|
|
719
|
+
MyopElementMessage: () => MyopElementMessage,
|
|
720
|
+
Ref: () => Ref,
|
|
721
|
+
RefComponentCreatedMessage: () => RefComponentCreatedMessage,
|
|
722
|
+
ResizeObserverMessage: () => ResizeObserverMessage,
|
|
723
|
+
SetAttributeMessage: () => SetAttributeMessage,
|
|
724
|
+
SetInnerHtml: () => SetInnerHtml,
|
|
725
|
+
SetMutationObserverMessage: () => SetMutationObserverMessage,
|
|
726
|
+
SetResizeObserverMessage: () => SetResizeObserverMessage,
|
|
727
|
+
stripFunction: () => stripFunction
|
|
728
|
+
});
|
|
729
|
+
var init_messages = __esm({
|
|
730
|
+
"src/messages/index.ts"() {
|
|
731
|
+
"use strict";
|
|
732
|
+
init_BaseMessage();
|
|
733
|
+
init_BindClickMessage();
|
|
734
|
+
init_ChangeTextMessage();
|
|
735
|
+
init_ExecuteScriptMessage();
|
|
736
|
+
init_CustomRefMessage();
|
|
737
|
+
init_AddEventListenerMessage();
|
|
738
|
+
init_SetAttributeMessage();
|
|
739
|
+
init_GetElementValueMessage();
|
|
740
|
+
init_SetInnerHtml();
|
|
741
|
+
init_InitMessage();
|
|
742
|
+
init_CreateRefComponentMessage();
|
|
743
|
+
init_EnvelopedMessage();
|
|
744
|
+
init_DetectMyopRefsMessage();
|
|
745
|
+
init_GetElementValueMessage();
|
|
746
|
+
init_GetAttributeMessage();
|
|
747
|
+
init_ExecuteComponentMethod();
|
|
748
|
+
init_SetMutationObserverMessage();
|
|
749
|
+
init_CleanupMessage();
|
|
750
|
+
init_DisposeMessage();
|
|
751
|
+
init_SetResizeObserverMessage();
|
|
752
|
+
}
|
|
753
|
+
});
|
|
754
|
+
|
|
755
|
+
// src/host/components/IMyopComponent.ts
|
|
756
|
+
var BaseMyopComponent;
|
|
757
|
+
var init_IMyopComponent = __esm({
|
|
758
|
+
"src/host/components/IMyopComponent.ts"() {
|
|
759
|
+
"use strict";
|
|
760
|
+
init_MyopMessages();
|
|
761
|
+
init_messages();
|
|
762
|
+
init_hostSDK();
|
|
763
|
+
BaseMyopComponent = class {
|
|
764
|
+
constructor(componentDefinition, container, options) {
|
|
765
|
+
this.componentDefinition = componentDefinition;
|
|
766
|
+
this.container = container;
|
|
767
|
+
__publicField(this, "id", "");
|
|
768
|
+
__publicField(this, "messageHandlers", {});
|
|
769
|
+
__publicField(this, "element");
|
|
770
|
+
__publicField(this, "_markedForDisposed", false);
|
|
771
|
+
//TODO: use bindWhen with return true predicate ...
|
|
772
|
+
__publicField(this, "bind", (messageType, handler) => {
|
|
773
|
+
if (!this.messageHandlers[messageType]) {
|
|
774
|
+
this.messageHandlers[messageType] = [];
|
|
775
|
+
}
|
|
776
|
+
if (!this.messageHandlers[messageType].includes(handler)) {
|
|
777
|
+
this.messageHandlers[messageType].push(handler);
|
|
778
|
+
}
|
|
779
|
+
});
|
|
780
|
+
__publicField(this, "bindWhen", (messageType, predicate, handler) => {
|
|
781
|
+
if (!handler) {
|
|
782
|
+
throw new Error("can't use component.bindWhen without an handler");
|
|
783
|
+
}
|
|
784
|
+
if (!this.messageHandlers[messageType]) {
|
|
785
|
+
this.messageHandlers[messageType] = [];
|
|
786
|
+
}
|
|
787
|
+
const handlers = this.messageHandlers[messageType];
|
|
788
|
+
const predicateWrappedHandler = (e) => {
|
|
789
|
+
if (predicate(e)) {
|
|
790
|
+
handler(e);
|
|
791
|
+
return true;
|
|
792
|
+
}
|
|
793
|
+
return false;
|
|
794
|
+
};
|
|
795
|
+
handlers.push(predicateWrappedHandler);
|
|
796
|
+
return () => {
|
|
797
|
+
const index = handlers.indexOf(predicateWrappedHandler);
|
|
798
|
+
if (index > -1) {
|
|
799
|
+
handlers.splice(index, 1);
|
|
800
|
+
}
|
|
801
|
+
};
|
|
802
|
+
});
|
|
803
|
+
__publicField(this, "setInitiated", () => {
|
|
804
|
+
this.isInitiated = true;
|
|
805
|
+
if (this._whenInitiatedResolve)
|
|
806
|
+
this._whenInitiatedResolve();
|
|
807
|
+
});
|
|
808
|
+
__publicField(this, "isInitiated", false);
|
|
809
|
+
__publicField(this, "_whenInitiatedResolve");
|
|
810
|
+
__publicField(this, "_whenInitiatedReject");
|
|
811
|
+
__publicField(this, "_whenInitiated", new Promise((resolve, reject) => {
|
|
812
|
+
this._whenInitiatedResolve = resolve;
|
|
813
|
+
this._whenInitiatedReject = reject;
|
|
814
|
+
}));
|
|
815
|
+
__publicField(this, "initiated", () => {
|
|
816
|
+
return this._whenInitiated;
|
|
817
|
+
});
|
|
818
|
+
__publicField(this, "props", {});
|
|
819
|
+
__publicField(this, "refs", {});
|
|
820
|
+
this.id = (options == null ? void 0 : options.id) || HostSDK.Instance().assignId(componentDefinition);
|
|
821
|
+
const timeout = (options == null ? void 0 : options.timeout) ? options == null ? void 0 : options.timeout : 5 * 1e3;
|
|
822
|
+
setTimeout(() => {
|
|
823
|
+
if (!this.isInitiated && this._whenInitiatedReject && !this._markedForDisposed) {
|
|
824
|
+
this._whenInitiatedReject("timeout_".concat(timeout, " ").concat(this.id));
|
|
825
|
+
}
|
|
826
|
+
}, timeout);
|
|
827
|
+
this.initiated().then(() => {
|
|
828
|
+
if (window.myop.hostSDK.inspected) {
|
|
829
|
+
this.inspect();
|
|
830
|
+
}
|
|
831
|
+
});
|
|
832
|
+
}
|
|
833
|
+
get markedForDisposed() {
|
|
834
|
+
return this._markedForDisposed;
|
|
835
|
+
}
|
|
836
|
+
set markedForDisposed(value) {
|
|
837
|
+
if (this._markedForDisposed) {
|
|
838
|
+
throw new Error("InvalidOperationException: The component is already in the process of being disposed. Dispose operation cannot be performed again until the current disposal process is complete.");
|
|
839
|
+
}
|
|
840
|
+
this._markedForDisposed = value;
|
|
841
|
+
}
|
|
842
|
+
onMessageReceived(incomeMessage) {
|
|
843
|
+
if (incomeMessage.messageType === MyopMessages.ExecuteComponentMethod) {
|
|
844
|
+
const typedMessage = incomeMessage;
|
|
845
|
+
if (this[typedMessage.method]) {
|
|
846
|
+
this[typedMessage.method](typedMessage.content);
|
|
847
|
+
} else {
|
|
848
|
+
console.log("method not found ".concat(typedMessage.method, " on component"), this);
|
|
849
|
+
}
|
|
850
|
+
return true;
|
|
851
|
+
}
|
|
852
|
+
const handlers = this.messageHandlers[incomeMessage.messageType];
|
|
853
|
+
if (handlers && handlers.length) {
|
|
854
|
+
let handled = false;
|
|
855
|
+
handlers.forEach((handler) => {
|
|
856
|
+
handled = handled || handler(incomeMessage);
|
|
857
|
+
});
|
|
858
|
+
return handled;
|
|
859
|
+
} else {
|
|
860
|
+
}
|
|
861
|
+
return false;
|
|
862
|
+
}
|
|
863
|
+
sendCleanupMessage(message) {
|
|
864
|
+
message.source = this.id;
|
|
865
|
+
message.destination = this.id;
|
|
866
|
+
message.direction = MessageDirection.down;
|
|
867
|
+
const cleanupHandler = this.bindWhen(message.replyMessageKey, (msg) => {
|
|
868
|
+
return msg.replayToHandler === message.handlerUniqueId;
|
|
869
|
+
}, (m) => {
|
|
870
|
+
message.handler(m);
|
|
871
|
+
cleanupHandler();
|
|
872
|
+
});
|
|
873
|
+
const handler = message.handler;
|
|
874
|
+
delete message.handler;
|
|
875
|
+
this.send(message);
|
|
876
|
+
message.handler = handler;
|
|
877
|
+
}
|
|
878
|
+
send(message) {
|
|
879
|
+
if (!message.source)
|
|
880
|
+
message.source = this.id;
|
|
881
|
+
if (!message.destination)
|
|
882
|
+
message.destination = this.id;
|
|
883
|
+
message.direction = MessageDirection.down;
|
|
884
|
+
let cleanupHandler;
|
|
885
|
+
if (message.handler) {
|
|
886
|
+
const typedMessage = message;
|
|
887
|
+
cleanupHandler = this.bindWhen(typedMessage.replyMessageKey, (msg) => {
|
|
888
|
+
return msg.replayToHandler === typedMessage.handlerUniqueId;
|
|
889
|
+
}, typedMessage.handler);
|
|
890
|
+
delete message.handler;
|
|
891
|
+
}
|
|
892
|
+
if (message.ref) {
|
|
893
|
+
message.ref = message.ref.__nonProxied || message.ref;
|
|
894
|
+
}
|
|
895
|
+
if (message.cleanable) {
|
|
896
|
+
return () => {
|
|
897
|
+
this.sendCleanupMessage(new CleanupMessage(message.id, (replay) => {
|
|
898
|
+
}));
|
|
899
|
+
if (cleanupHandler) {
|
|
900
|
+
cleanupHandler();
|
|
901
|
+
}
|
|
902
|
+
};
|
|
903
|
+
} else {
|
|
904
|
+
return () => {
|
|
905
|
+
};
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
dispose() {
|
|
909
|
+
this.markedForDisposed = true;
|
|
910
|
+
if (!this.isInitiated) {
|
|
911
|
+
return;
|
|
912
|
+
}
|
|
913
|
+
console.log("disposing component", this.id);
|
|
914
|
+
this.send(new DisposeMessage());
|
|
915
|
+
const onDisposeHandlers = this.messageHandlers["onDispose"];
|
|
916
|
+
if (onDisposeHandlers) {
|
|
917
|
+
onDisposeHandlers.forEach((disposeHandler) => {
|
|
918
|
+
disposeHandler(null);
|
|
919
|
+
});
|
|
920
|
+
}
|
|
921
|
+
this.messageHandlers = {};
|
|
922
|
+
this.id += "_disposed";
|
|
923
|
+
this.isInitiated = false;
|
|
924
|
+
}
|
|
925
|
+
};
|
|
926
|
+
}
|
|
927
|
+
});
|
|
928
|
+
|
|
929
|
+
// src/common/MyopElementRef.ts
|
|
930
|
+
var MyopElementRef;
|
|
931
|
+
var init_MyopElementRef = __esm({
|
|
932
|
+
"src/common/MyopElementRef.ts"() {
|
|
933
|
+
"use strict";
|
|
934
|
+
MyopElementRef = class {
|
|
935
|
+
constructor(myopId, htmlTagName, BoundingRect, offsetTop, offsetLeft) {
|
|
936
|
+
this.myopId = myopId;
|
|
937
|
+
this.htmlTagName = htmlTagName;
|
|
938
|
+
this.BoundingRect = BoundingRect;
|
|
939
|
+
this.offsetTop = offsetTop;
|
|
940
|
+
this.offsetLeft = offsetLeft;
|
|
941
|
+
__publicField(this, "type", "MyopElementRef");
|
|
942
|
+
}
|
|
943
|
+
};
|
|
944
|
+
}
|
|
945
|
+
});
|
|
946
|
+
|
|
947
|
+
// src/common/baseMessageHandler.ts
|
|
948
|
+
var runExecutorCleanup, BaseMessageHandler, BaseContextMessageHandler;
|
|
949
|
+
var init_baseMessageHandler = __esm({
|
|
950
|
+
"src/common/baseMessageHandler.ts"() {
|
|
951
|
+
"use strict";
|
|
952
|
+
runExecutorCleanup = async (task) => {
|
|
953
|
+
if (typeof task === "function") {
|
|
954
|
+
task();
|
|
955
|
+
} else if (task instanceof Promise) {
|
|
956
|
+
const result = await task;
|
|
957
|
+
if (typeof result === "function") {
|
|
958
|
+
result();
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
};
|
|
962
|
+
BaseMessageHandler = class {
|
|
963
|
+
//TODO : add dispose method
|
|
964
|
+
constructor(messageToHost) {
|
|
965
|
+
this.messageToHost = messageToHost;
|
|
966
|
+
}
|
|
967
|
+
};
|
|
968
|
+
BaseContextMessageHandler = class extends BaseMessageHandler {
|
|
969
|
+
constructor(messageToHost, context) {
|
|
970
|
+
super(messageToHost);
|
|
971
|
+
this.messageToHost = messageToHost;
|
|
972
|
+
this.context = context;
|
|
973
|
+
}
|
|
974
|
+
};
|
|
975
|
+
}
|
|
976
|
+
});
|
|
977
|
+
|
|
978
|
+
// src/common/BaseMyopSDK.ts
|
|
979
|
+
var HostedComponent, BaseMyopSDK;
|
|
980
|
+
var init_BaseMyopSDK = __esm({
|
|
981
|
+
"src/common/BaseMyopSDK.ts"() {
|
|
982
|
+
"use strict";
|
|
983
|
+
init_MyopMessages();
|
|
984
|
+
init_common();
|
|
985
|
+
init_messages();
|
|
986
|
+
HostedComponent = class {
|
|
987
|
+
//onMessageReceived: (msg: IMyopMessage) => void;
|
|
988
|
+
constructor(id, context) {
|
|
989
|
+
this.id = id;
|
|
990
|
+
this.context = context;
|
|
991
|
+
__publicField(this, "send", (message) => {
|
|
992
|
+
});
|
|
993
|
+
}
|
|
994
|
+
};
|
|
995
|
+
BaseMyopSDK = class {
|
|
996
|
+
constructor() {
|
|
997
|
+
__publicField(this, "messageToHandleAfterInit", []);
|
|
998
|
+
__publicField(this, "components", {});
|
|
999
|
+
__publicField(this, "alwaysPassEnvelopesToHost", false);
|
|
1000
|
+
__publicField(this, "messageCleanupCache", {});
|
|
1001
|
+
}
|
|
1002
|
+
handleIncomeMessages(event) {
|
|
1003
|
+
const eventContent = event.data ? event.data : event.detail;
|
|
1004
|
+
if (!eventContent || !eventContent.myop) {
|
|
1005
|
+
return;
|
|
1006
|
+
} else {
|
|
1007
|
+
let message = eventContent;
|
|
1008
|
+
if (message.direction !== MessageDirection.down) {
|
|
1009
|
+
return;
|
|
1010
|
+
}
|
|
1011
|
+
if (message.messageType === MyopMessages.DisposeMessage) {
|
|
1012
|
+
if (message.destination)
|
|
1013
|
+
delete this.components[message.destination];
|
|
1014
|
+
return;
|
|
1015
|
+
}
|
|
1016
|
+
if (message.messageType === MyopMessages.InitMessage) {
|
|
1017
|
+
const newComponentId = message.content.id;
|
|
1018
|
+
if (this.components[newComponentId]) {
|
|
1019
|
+
return;
|
|
1020
|
+
}
|
|
1021
|
+
this.components[newComponentId] = new HostedComponent(newComponentId);
|
|
1022
|
+
this.messageToHost(new InitResponse(newComponentId));
|
|
1023
|
+
return;
|
|
1024
|
+
}
|
|
1025
|
+
if (message.messageType === MyopMessages.EnvelopedMessage) {
|
|
1026
|
+
const envelopedMessage = message;
|
|
1027
|
+
const innerMessage = envelopedMessage.message;
|
|
1028
|
+
message = innerMessage;
|
|
1029
|
+
if (this.alwaysPassEnvelopesToHost || this.components[message.destination]) {
|
|
1030
|
+
const destinationComponent = myop.hostSDK.components.find((c) => c.id === innerMessage.destination);
|
|
1031
|
+
if (destinationComponent) {
|
|
1032
|
+
destinationComponent.send(innerMessage);
|
|
1033
|
+
return;
|
|
1034
|
+
}
|
|
1035
|
+
const envelopedDestinationComponent = myop.hostSDK.components.find((c) => c.id === envelopedMessage.destination);
|
|
1036
|
+
if (envelopedDestinationComponent) {
|
|
1037
|
+
envelopedDestinationComponent.send(innerMessage);
|
|
1038
|
+
return;
|
|
1039
|
+
}
|
|
1040
|
+
} else {
|
|
1041
|
+
return;
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
if (message.messageType) {
|
|
1045
|
+
if (message.messageType === MyopMessages.CleanupMessage) {
|
|
1046
|
+
const typedMessage = message;
|
|
1047
|
+
const cleanup = this.messageCleanupCache[typedMessage.cleanupForMessageId];
|
|
1048
|
+
const cleanupMessage = new CleanupReplayMessage(!!cleanup);
|
|
1049
|
+
cleanupMessage.destination = message.destination;
|
|
1050
|
+
if (!!cleanup) {
|
|
1051
|
+
delete this.messageCleanupCache[typedMessage.cleanupForMessageId];
|
|
1052
|
+
runExecutorCleanup(cleanup).then(() => {
|
|
1053
|
+
this.messageToHost(cleanupMessage, typedMessage);
|
|
1054
|
+
}).catch(() => {
|
|
1055
|
+
});
|
|
1056
|
+
} else {
|
|
1057
|
+
this.messageToHost(cleanupMessage, typedMessage);
|
|
1058
|
+
}
|
|
1059
|
+
return;
|
|
1060
|
+
}
|
|
1061
|
+
let actionHandlerFound = false;
|
|
1062
|
+
this.supportedHandlers.forEach((handler) => {
|
|
1063
|
+
if (handler.messageType === message.messageType) {
|
|
1064
|
+
actionHandlerFound = true;
|
|
1065
|
+
const cleanup = handler.executor(message);
|
|
1066
|
+
if (message.cleanable && cleanup) {
|
|
1067
|
+
this.messageCleanupCache[message.id] = cleanup;
|
|
1068
|
+
}
|
|
1069
|
+
if (cleanup && !message.cleanable) {
|
|
1070
|
+
throw new Error("Cleanup handler generated for non-cleanable message. \nmessageType - ".concat(message.messageType, ", handler executor was - ").concat(handler.executor, "\n\nPlease review the message definition object & message handler.\nTo ensure cleanup properly set 'cleanable' true at message definition and return IMessageExecutorCleanup from your handlers."));
|
|
1071
|
+
}
|
|
1072
|
+
if (!cleanup && message.cleanable) {
|
|
1073
|
+
throw new Error("No cleanup handler generated for a cleanable message. \nmessageType - ".concat(message.messageType, ", handler executor was - ").concat(handler.executor, "\n\nPlease review the message definition object & message handler.\nTo ensure cleanup properly set 'cleanable' true at message definition and return IMessageExecutorCleanup from your handlers."));
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
});
|
|
1077
|
+
if (!actionHandlerFound) {
|
|
1078
|
+
}
|
|
1079
|
+
} else {
|
|
1080
|
+
console.log("unsupported message type");
|
|
1081
|
+
}
|
|
1082
|
+
}
|
|
1083
|
+
}
|
|
1084
|
+
};
|
|
1085
|
+
}
|
|
1086
|
+
});
|
|
1087
|
+
|
|
1088
|
+
// src/common/index.ts
|
|
1089
|
+
var SkinLoaders, ShadowRootModeType, PropConfigBehaviorTypes, RefBehaviorType, SkinSelectorTypes, ExperienceTypes, RootRef;
|
|
1090
|
+
var init_common = __esm({
|
|
1091
|
+
"src/common/index.ts"() {
|
|
1092
|
+
"use strict";
|
|
1093
|
+
init_MyopElementRef();
|
|
1094
|
+
init_baseMessageHandler();
|
|
1095
|
+
init_BaseMyopSDK();
|
|
1096
|
+
SkinLoaders = {
|
|
1097
|
+
"IframeLoader": "IframeLoader",
|
|
1098
|
+
"WebComponentLoader": "WebComponentLoader",
|
|
1099
|
+
"HTMLLoader": "HTMLLoader",
|
|
1100
|
+
"MinimizedLoader": "MinimizedLoader"
|
|
1101
|
+
};
|
|
1102
|
+
ShadowRootModeType = {
|
|
1103
|
+
"open": "open",
|
|
1104
|
+
"closed": "closed",
|
|
1105
|
+
"none": "none",
|
|
1106
|
+
"localFrame": "localFrame"
|
|
1107
|
+
};
|
|
1108
|
+
PropConfigBehaviorTypes = {
|
|
1109
|
+
"message": "message",
|
|
1110
|
+
"code": "code"
|
|
1111
|
+
};
|
|
1112
|
+
RefBehaviorType = class {
|
|
1113
|
+
};
|
|
1114
|
+
__publicField(RefBehaviorType, "code", "code");
|
|
1115
|
+
__publicField(RefBehaviorType, "component", "component");
|
|
1116
|
+
SkinSelectorTypes = {
|
|
1117
|
+
"Segmented": "Segmented",
|
|
1118
|
+
"Dedicated": "Dedicated",
|
|
1119
|
+
/**
|
|
1120
|
+
* This Selector Type is not yet supported but will be added in a future release.
|
|
1121
|
+
* Please check the documentation for updates.
|
|
1122
|
+
*
|
|
1123
|
+
* @type {string}
|
|
1124
|
+
*/
|
|
1125
|
+
"Default": "Default"
|
|
1126
|
+
};
|
|
1127
|
+
ExperienceTypes = {
|
|
1128
|
+
"Segment": "Segment",
|
|
1129
|
+
"Promo": "Promo",
|
|
1130
|
+
"AB": "AB"
|
|
1131
|
+
};
|
|
1132
|
+
RootRef = class {
|
|
1133
|
+
constructor(container, shadowRoot) {
|
|
1134
|
+
this.container = container;
|
|
1135
|
+
this.shadowRoot = shadowRoot;
|
|
1136
|
+
__publicField(this, "getRootDiv", () => {
|
|
1137
|
+
return (this.shadowRoot || this.container).querySelector("div");
|
|
1138
|
+
});
|
|
1139
|
+
__publicField(this, "getRoot", () => {
|
|
1140
|
+
return this.shadowRoot || this.container;
|
|
1141
|
+
});
|
|
1142
|
+
}
|
|
1143
|
+
};
|
|
1144
|
+
}
|
|
1145
|
+
});
|
|
1146
|
+
|
|
1147
|
+
// src/common/utils/serialization.ts
|
|
1148
|
+
var isPrimitive, isFunction, containsPrimitivesOnly, makeSerializable;
|
|
1149
|
+
var init_serialization = __esm({
|
|
1150
|
+
"src/common/utils/serialization.ts"() {
|
|
1151
|
+
"use strict";
|
|
1152
|
+
isPrimitive = (value) => {
|
|
1153
|
+
return value !== Object(value);
|
|
1154
|
+
};
|
|
1155
|
+
isFunction = (value) => {
|
|
1156
|
+
return typeof value === "function";
|
|
1157
|
+
};
|
|
1158
|
+
containsPrimitivesOnly = (obj) => {
|
|
1159
|
+
if (isPrimitive(obj)) {
|
|
1160
|
+
return true;
|
|
1161
|
+
}
|
|
1162
|
+
if (isFunction(obj)) {
|
|
1163
|
+
return false;
|
|
1164
|
+
}
|
|
1165
|
+
if (Object.getPrototypeOf(obj)) {
|
|
1166
|
+
return false;
|
|
1167
|
+
}
|
|
1168
|
+
for (const key in obj) {
|
|
1169
|
+
const value = obj[key];
|
|
1170
|
+
if (typeof value === "object") {
|
|
1171
|
+
if (!containsPrimitivesOnly(value)) {
|
|
1172
|
+
return false;
|
|
1173
|
+
}
|
|
1174
|
+
} else if (isPrimitive(value)) {
|
|
1175
|
+
continue;
|
|
1176
|
+
} else {
|
|
1177
|
+
return false;
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1180
|
+
return true;
|
|
1181
|
+
};
|
|
1182
|
+
makeSerializable = (obj, skeleton = {}, includeFalsyKeys = true, seen3 = /* @__PURE__ */ new WeakMap()) => {
|
|
1183
|
+
if (isPrimitive(obj)) {
|
|
1184
|
+
return obj;
|
|
1185
|
+
}
|
|
1186
|
+
if (Array.isArray(obj)) {
|
|
1187
|
+
if (seen3.has(obj)) {
|
|
1188
|
+
return seen3.get(obj);
|
|
1189
|
+
}
|
|
1190
|
+
const serializableArray = [];
|
|
1191
|
+
seen3.set(obj, serializableArray);
|
|
1192
|
+
for (let index = 0; index < obj.length; index++) {
|
|
1193
|
+
const element = obj[index];
|
|
1194
|
+
serializableArray[index] = makeSerializable(element, skeleton, includeFalsyKeys, seen3);
|
|
1195
|
+
}
|
|
1196
|
+
return serializableArray;
|
|
1197
|
+
}
|
|
1198
|
+
if (obj !== null && typeof obj === "object") {
|
|
1199
|
+
if (seen3.has(obj)) {
|
|
1200
|
+
return seen3.get(obj);
|
|
1201
|
+
}
|
|
1202
|
+
const serializableObject = {};
|
|
1203
|
+
seen3.set(obj, serializableObject);
|
|
1204
|
+
for (const key in obj) {
|
|
1205
|
+
const keyInSkeleton = typeof skeleton == "boolean" ? skeleton : skeleton[key];
|
|
1206
|
+
if (keyInSkeleton) {
|
|
1207
|
+
if (keyInSkeleton === true) {
|
|
1208
|
+
if (includeFalsyKeys ? obj[key] !== void 0 : obj[key]) {
|
|
1209
|
+
serializableObject[key] = makeSerializable(obj[key], true, includeFalsyKeys, seen3);
|
|
1210
|
+
}
|
|
1211
|
+
} else if (typeof keyInSkeleton === "object") {
|
|
1212
|
+
serializableObject[key] = makeSerializable(obj[key], keyInSkeleton, includeFalsyKeys, seen3);
|
|
1213
|
+
}
|
|
1214
|
+
}
|
|
1215
|
+
}
|
|
1216
|
+
return serializableObject;
|
|
1217
|
+
}
|
|
1218
|
+
return {};
|
|
1219
|
+
};
|
|
1220
|
+
}
|
|
1221
|
+
});
|
|
1222
|
+
|
|
1223
|
+
// src/host/logMessages.ts
|
|
1224
|
+
var Errors;
|
|
1225
|
+
var init_logMessages = __esm({
|
|
1226
|
+
"src/host/logMessages.ts"() {
|
|
1227
|
+
"use strict";
|
|
1228
|
+
Errors = {
|
|
1229
|
+
notSerializableRefCall: (prop, arg) => {
|
|
1230
|
+
throw new Error("\nThe input provided to '".concat(prop.toString(), "' is not serializable. Serialization is required to ensure that the data can be safely transferred to the skin implementation. \nThe following types of data are considered non-serializable and cannot be processed:\n\n- Functions\n- DOM elements\n- Class instances\n- Circular references\n- Symbols\n- BigInt values\n\nIn the following execution we detected :\n~~~~~~~~\n").concat(arg, " \n~~~~~~~~\nas not serializable.\n\nTo resolve this issue, please ensure that all inputs passed to '").concat(prop.toString(), "' are in a serializable format.\nThis typically includes primitive types (strings, numbers, booleans), arrays, and plain objects. \nIf you need to include complex data types, consider converting them to a serializable structure before passing them to the function.\nOr use Myop message that support it: CustomRefMessage, AddEventListenerMessage or ExecuteScriptMessage.\n\nSuggested Fix:\n1. Remove or replace non-serializable values from your input.\n2. If using objects, ensure they do not contain any functions or circular references.\n3. Convert any class instances to plain objects or JSON-compatible formats.\n4. Use dedicated Myop message.\n\nFor more details on serialization and Myop message examples, refer to https://docs.myop.dev.\n\n"));
|
|
1231
|
+
}
|
|
1232
|
+
};
|
|
1233
|
+
}
|
|
1234
|
+
});
|
|
1235
|
+
|
|
1236
|
+
// src/host/components/myopRefComponent.ts
|
|
1237
|
+
var MyopRefComponent;
|
|
1238
|
+
var init_myopRefComponent = __esm({
|
|
1239
|
+
"src/host/components/myopRefComponent.ts"() {
|
|
1240
|
+
"use strict";
|
|
1241
|
+
init_IMyopComponent();
|
|
1242
|
+
init_messages();
|
|
1243
|
+
init_EnvelopedMessage();
|
|
1244
|
+
MyopRefComponent = class extends BaseMyopComponent {
|
|
1245
|
+
constructor(componentDefinition, parent, options) {
|
|
1246
|
+
super(componentDefinition, parent.container, options);
|
|
1247
|
+
this.componentDefinition = componentDefinition;
|
|
1248
|
+
this.parent = parent;
|
|
1249
|
+
__publicField(this, "send", (message) => {
|
|
1250
|
+
const handler = message.handler;
|
|
1251
|
+
const cleanupHandler = super.send(message);
|
|
1252
|
+
this.parent.send(new EnvelopedMessage(this.id, message));
|
|
1253
|
+
message.handler = handler;
|
|
1254
|
+
return cleanupHandler;
|
|
1255
|
+
});
|
|
1256
|
+
__publicField(this, "dispose", () => {
|
|
1257
|
+
if (this.isInitiated)
|
|
1258
|
+
this.send(new ExecuteComponentMethod("dispose"));
|
|
1259
|
+
super.dispose();
|
|
1260
|
+
});
|
|
1261
|
+
}
|
|
1262
|
+
hide() {
|
|
1263
|
+
this.send(new ExecuteComponentMethod("hide"));
|
|
1264
|
+
}
|
|
1265
|
+
show() {
|
|
1266
|
+
this.send(new ExecuteComponentMethod("show"));
|
|
1267
|
+
}
|
|
1268
|
+
inspect() {
|
|
1269
|
+
return this.send(new ExecuteComponentMethod("inspect"));
|
|
1270
|
+
}
|
|
1271
|
+
setHeightBasedOnDocumentElement() {
|
|
1272
|
+
this.send(new ExecuteComponentMethod("setHeightBasedOnDocumentElement"));
|
|
1273
|
+
}
|
|
1274
|
+
setHeightBasedOnScrollHeight() {
|
|
1275
|
+
this.send(new ExecuteComponentMethod("setHeightBasedOnScrollHeight"));
|
|
1276
|
+
}
|
|
1277
|
+
onMessageReceived(incomeMessage) {
|
|
1278
|
+
return super.onMessageReceived(incomeMessage);
|
|
1279
|
+
}
|
|
1280
|
+
};
|
|
1281
|
+
}
|
|
1282
|
+
});
|
|
1283
|
+
|
|
1284
|
+
// src/host/componentCore.ts
|
|
1285
|
+
var createDebugTitle, setDebugStyle, reportError, reportUnsupported, connectProps, createRefProxy, createRefComponent, connectRefs;
|
|
1286
|
+
var init_componentCore = __esm({
|
|
1287
|
+
"src/host/componentCore.ts"() {
|
|
1288
|
+
"use strict";
|
|
1289
|
+
init_messages();
|
|
1290
|
+
init_messages();
|
|
1291
|
+
init_common();
|
|
1292
|
+
init_serialization();
|
|
1293
|
+
init_logMessages();
|
|
1294
|
+
init_myopRefComponent();
|
|
1295
|
+
createDebugTitle = (text, top, componentDefinitionConfig) => {
|
|
1296
|
+
const titleEl = document.createElement("a");
|
|
1297
|
+
titleEl.textContent = text;
|
|
1298
|
+
titleEl.style.position = "relative";
|
|
1299
|
+
titleEl.style.padding = "0 5px";
|
|
1300
|
+
titleEl.style.fontSize = "14px";
|
|
1301
|
+
titleEl.style["top"] = "0";
|
|
1302
|
+
titleEl.style.top = "".concat(top, "px");
|
|
1303
|
+
titleEl.style.transform = "translateX(-50%)";
|
|
1304
|
+
titleEl.target = "_blank";
|
|
1305
|
+
titleEl.href = "https://dashboard.myop.dev/dashboard/component/".concat(componentDefinitionConfig.id);
|
|
1306
|
+
return titleEl;
|
|
1307
|
+
};
|
|
1308
|
+
setDebugStyle = (id, type, top, container, componentElement, componentDefinitionConfig) => {
|
|
1309
|
+
const topText = createDebugTitle("".concat(componentDefinitionConfig.name, " : ").concat(type), top, componentDefinitionConfig);
|
|
1310
|
+
container.insertBefore(topText, componentElement);
|
|
1311
|
+
componentElement.style.border = "1px solid #007BFF";
|
|
1312
|
+
componentElement.style.display = "block";
|
|
1313
|
+
return () => {
|
|
1314
|
+
componentElement.style.border = "unset";
|
|
1315
|
+
container.removeChild(topText);
|
|
1316
|
+
};
|
|
1317
|
+
};
|
|
1318
|
+
reportError = (propConfig, propName, component) => {
|
|
1319
|
+
if (!propConfig) {
|
|
1320
|
+
console.error(
|
|
1321
|
+
// throw new Error(
|
|
1322
|
+
"Error: Undefined Prop\n\nIt looks like you've tried to use a prop that hasn't been defined.\nPlease check the prop name for any typos or ensure that it is properly defined in the component's prop list.\n\n" + "Prop Name: ".concat(propName, "\n") + "Component: ".concat(component.componentDefinition.name, ", ID: ").concat(component.componentDefinition.id, "\n\n") + "For more information, refer to the component page https://dashboard.myop.dev/dashboard/component/".concat(component.componentDefinition.id, " or consult the developer guide.")
|
|
1323
|
+
);
|
|
1324
|
+
return true;
|
|
1325
|
+
}
|
|
1326
|
+
return false;
|
|
1327
|
+
};
|
|
1328
|
+
reportUnsupported = (propConfig, propName, component) => {
|
|
1329
|
+
console.error(
|
|
1330
|
+
"Error: Code Prop Not Supported\n\nCurrently, code props are only supported in local frame components.\n\u26A0\uFE0F This is a work in progress feature \u2014 code props will be supported in upcoming versions.\n\nIn the meantime, you can use message props.\n\n" + "Prop Name: ".concat(propName, "\n") + "Component: ".concat(component.componentDefinition.name, ", ID: ").concat(component.componentDefinition.id, "\n\n") + "For more information, refer to the component page https://dashboard.myop.dev/dashboard/component/".concat(component.componentDefinition.id, " or consult the developer guide.")
|
|
1331
|
+
);
|
|
1332
|
+
};
|
|
1333
|
+
connectProps = (component, propsConfig, selectedSkin) => {
|
|
1334
|
+
const propsMap = propsConfig.reduce((previousValue, currentValue) => {
|
|
1335
|
+
return __spreadProps(__spreadValues({}, previousValue), {
|
|
1336
|
+
[currentValue.name]: __spreadValues({}, currentValue)
|
|
1337
|
+
});
|
|
1338
|
+
}, {});
|
|
1339
|
+
const propsHandler = {
|
|
1340
|
+
get: (_, prop) => {
|
|
1341
|
+
const propConfig = propsMap[prop];
|
|
1342
|
+
if (reportError(propConfig, prop, component)) {
|
|
1343
|
+
return false;
|
|
1344
|
+
}
|
|
1345
|
+
if (propConfig.behavior.type === PropConfigBehaviorTypes.code) {
|
|
1346
|
+
if (selectedSkin.loader.type === SkinLoaders.HTMLLoader) {
|
|
1347
|
+
const typedLoader = selectedSkin.loader;
|
|
1348
|
+
if (typedLoader.shadowRootMode === ShadowRootModeType.localFrame) {
|
|
1349
|
+
const typedPropBehavior = propConfig.behavior;
|
|
1350
|
+
return component.element.contentWindow[typedPropBehavior.remap || prop];
|
|
1351
|
+
}
|
|
1352
|
+
}
|
|
1353
|
+
reportUnsupported(propConfig, prop, component);
|
|
1354
|
+
return false;
|
|
1355
|
+
}
|
|
1356
|
+
if (propConfig.mode === "output") {
|
|
1357
|
+
return new Promise((resolve) => {
|
|
1358
|
+
const messageParams = [];
|
|
1359
|
+
if (propConfig.behavior.ref) {
|
|
1360
|
+
messageParams.push(Ref.create(propConfig.behavior.ref));
|
|
1361
|
+
}
|
|
1362
|
+
messageParams.push((data) => {
|
|
1363
|
+
resolve(data);
|
|
1364
|
+
});
|
|
1365
|
+
if (propConfig.behavior.params) {
|
|
1366
|
+
messageParams.push(...propConfig.behavior.params);
|
|
1367
|
+
}
|
|
1368
|
+
const messageCtor = messages_exports[propConfig.behavior.message];
|
|
1369
|
+
component.send(new messageCtor(...messageParams));
|
|
1370
|
+
});
|
|
1371
|
+
}
|
|
1372
|
+
return null;
|
|
1373
|
+
},
|
|
1374
|
+
set: (_, prop, value) => {
|
|
1375
|
+
const propConfig = propsMap[prop];
|
|
1376
|
+
if (reportError(propConfig, prop, component)) {
|
|
1377
|
+
return false;
|
|
1378
|
+
}
|
|
1379
|
+
if (propConfig.behavior.type === PropConfigBehaviorTypes.code) {
|
|
1380
|
+
if (selectedSkin.loader.type === SkinLoaders.HTMLLoader) {
|
|
1381
|
+
const typedLoader = selectedSkin.loader;
|
|
1382
|
+
if (typedLoader.shadowRootMode === ShadowRootModeType.localFrame) {
|
|
1383
|
+
const typedPropBehavior = propConfig.behavior;
|
|
1384
|
+
component.element.contentWindow[typedPropBehavior.remap || prop] = value;
|
|
1385
|
+
return true;
|
|
1386
|
+
}
|
|
1387
|
+
}
|
|
1388
|
+
reportUnsupported(propConfig, prop, component);
|
|
1389
|
+
return false;
|
|
1390
|
+
} else {
|
|
1391
|
+
if (propConfig.mode === "input") {
|
|
1392
|
+
if (propConfig.behavior.type === "message") {
|
|
1393
|
+
const messageParams = [];
|
|
1394
|
+
if (propConfig.behavior.ref) {
|
|
1395
|
+
messageParams.push(Ref.create(propConfig.behavior.ref));
|
|
1396
|
+
}
|
|
1397
|
+
messageParams.push(value);
|
|
1398
|
+
if (propConfig.behavior.params) {
|
|
1399
|
+
messageParams.push(...propConfig.behavior.params);
|
|
1400
|
+
}
|
|
1401
|
+
const messageCtor = messages_exports[propConfig.behavior.message];
|
|
1402
|
+
component.send(new messageCtor(...messageParams));
|
|
1403
|
+
return true;
|
|
1404
|
+
} else {
|
|
1405
|
+
throw new Error(
|
|
1406
|
+
"Error: Unsupported Behavior\n\nThe 'behavior' field provided is not supported.\n" + "Component: ".concat(component.componentDefinition.name, ", ID: ").concat(component.componentDefinition.id, "\n\n") + "Prop Name: ".concat(prop, "\n") + "Behavior Field: ".concat(propConfig.behavior.type, "\n\n") + "Check the documentation for valid behavior options."
|
|
1407
|
+
);
|
|
1408
|
+
return false;
|
|
1409
|
+
}
|
|
1410
|
+
}
|
|
1411
|
+
}
|
|
1412
|
+
return false;
|
|
1413
|
+
}
|
|
1414
|
+
};
|
|
1415
|
+
component.props = {};
|
|
1416
|
+
component.props = new Proxy(component.props, propsHandler);
|
|
1417
|
+
return component;
|
|
1418
|
+
};
|
|
1419
|
+
createRefProxy = (target, component) => {
|
|
1420
|
+
return new Proxy(target, {
|
|
1421
|
+
get(target2, prop) {
|
|
1422
|
+
if (target2[prop]) {
|
|
1423
|
+
return target2[prop];
|
|
1424
|
+
}
|
|
1425
|
+
const getterFunction = (...args) => {
|
|
1426
|
+
return new Promise((resolve) => {
|
|
1427
|
+
args.forEach((arg) => {
|
|
1428
|
+
if (!containsPrimitivesOnly(arg)) {
|
|
1429
|
+
Errors.notSerializableRefCall(prop, arg);
|
|
1430
|
+
}
|
|
1431
|
+
});
|
|
1432
|
+
component.send(new CustomRefMessage(
|
|
1433
|
+
({ ref, propName, functionArgs, makeSerializable: makeSerializable2 }) => {
|
|
1434
|
+
if (ref) {
|
|
1435
|
+
const value = ref[propName];
|
|
1436
|
+
if (typeof value === "function") {
|
|
1437
|
+
return makeSerializable2(ref[propName](...functionArgs), true);
|
|
1438
|
+
} else {
|
|
1439
|
+
return makeSerializable2(value, true);
|
|
1440
|
+
}
|
|
1441
|
+
}
|
|
1442
|
+
return null;
|
|
1443
|
+
},
|
|
1444
|
+
{
|
|
1445
|
+
//TODO : turn it to config
|
|
1446
|
+
elementId: target2.refConfig.selector,
|
|
1447
|
+
propName: prop,
|
|
1448
|
+
functionArgs: args
|
|
1449
|
+
},
|
|
1450
|
+
(msg) => {
|
|
1451
|
+
resolve(msg.content);
|
|
1452
|
+
}
|
|
1453
|
+
));
|
|
1454
|
+
});
|
|
1455
|
+
};
|
|
1456
|
+
return getterFunction;
|
|
1457
|
+
},
|
|
1458
|
+
set(target2, prop, value) {
|
|
1459
|
+
component.send(new CustomRefMessage(
|
|
1460
|
+
({ ref, propName, propValue }) => {
|
|
1461
|
+
if (ref)
|
|
1462
|
+
ref[propName] = propValue;
|
|
1463
|
+
},
|
|
1464
|
+
{
|
|
1465
|
+
//TODO : fix that
|
|
1466
|
+
elementId: target2.refConfig.selector,
|
|
1467
|
+
propValue: value,
|
|
1468
|
+
propName: prop
|
|
1469
|
+
},
|
|
1470
|
+
(msg) => {
|
|
1471
|
+
}
|
|
1472
|
+
));
|
|
1473
|
+
return true;
|
|
1474
|
+
}
|
|
1475
|
+
});
|
|
1476
|
+
};
|
|
1477
|
+
createRefComponent = async (ref, componentConfig, components, options) => {
|
|
1478
|
+
const component = ref.component;
|
|
1479
|
+
if (!component)
|
|
1480
|
+
throw new Error("cant createRefComponent with detached ref");
|
|
1481
|
+
return new Promise(async (resolve, reject) => {
|
|
1482
|
+
const refComponent = new MyopRefComponent(componentConfig.type, component, options);
|
|
1483
|
+
components.push(refComponent);
|
|
1484
|
+
await component.initiated();
|
|
1485
|
+
const timeout = setTimeout(() => {
|
|
1486
|
+
reject("timeout");
|
|
1487
|
+
}, 5e3);
|
|
1488
|
+
component.send(new CreateRefComponentMessage(
|
|
1489
|
+
ref.refConfig,
|
|
1490
|
+
componentConfig,
|
|
1491
|
+
__spreadProps(__spreadValues({}, options ? options : {}), {
|
|
1492
|
+
id: refComponent.id,
|
|
1493
|
+
_hasParent: true
|
|
1494
|
+
}),
|
|
1495
|
+
async (message) => {
|
|
1496
|
+
clearTimeout(timeout);
|
|
1497
|
+
if (message.failed) {
|
|
1498
|
+
reject("CreateRefComponentMessage failed");
|
|
1499
|
+
return;
|
|
1500
|
+
}
|
|
1501
|
+
const implementationComponent = components.find((c) => c.id == refComponent.id);
|
|
1502
|
+
if (implementationComponent !== refComponent) {
|
|
1503
|
+
component.refs[ref.refConfig.name] = implementationComponent;
|
|
1504
|
+
resolve(implementationComponent);
|
|
1505
|
+
return;
|
|
1506
|
+
} else {
|
|
1507
|
+
refComponent.setInitiated();
|
|
1508
|
+
component.refs[ref.refConfig.name] = refComponent;
|
|
1509
|
+
}
|
|
1510
|
+
message.nestedRefs.forEach((nestedRefConfig) => {
|
|
1511
|
+
const nestedComponentDefinition = componentConfig.instance.resolvedNestedComponents.find((c) => c.type.id === nestedRefConfig.componentDefinitionId).type;
|
|
1512
|
+
const nestedComponent = new MyopRefComponent(nestedComponentDefinition, refComponent);
|
|
1513
|
+
nestedComponent.setInitiated();
|
|
1514
|
+
refComponent.refs[nestedRefConfig.refName] = nestedComponent;
|
|
1515
|
+
components.push(nestedComponent);
|
|
1516
|
+
});
|
|
1517
|
+
try {
|
|
1518
|
+
await connectRefs(refComponent, componentConfig, components, true);
|
|
1519
|
+
if (component.setHeightBasedOnScrollHeight)
|
|
1520
|
+
component.setHeightBasedOnScrollHeight();
|
|
1521
|
+
resolve(refComponent);
|
|
1522
|
+
} catch (e) {
|
|
1523
|
+
reject(e);
|
|
1524
|
+
}
|
|
1525
|
+
}
|
|
1526
|
+
));
|
|
1527
|
+
});
|
|
1528
|
+
};
|
|
1529
|
+
connectRefs = async (component, componentConfig, components, withoutRefComponents = false) => {
|
|
1530
|
+
if (!component.refs)
|
|
1531
|
+
component.refs = {};
|
|
1532
|
+
const waitFor = Object.values(component.componentDefinition.refs).map((ref) => {
|
|
1533
|
+
return new Promise(async (resolve, reject) => {
|
|
1534
|
+
var _a2;
|
|
1535
|
+
if (ref.behavior.type == RefBehaviorType.component) {
|
|
1536
|
+
if (withoutRefComponents) {
|
|
1537
|
+
resolve();
|
|
1538
|
+
return;
|
|
1539
|
+
}
|
|
1540
|
+
let refComponentId = ref.behavior.componentId;
|
|
1541
|
+
if (!refComponentId)
|
|
1542
|
+
refComponentId = ref.behavior.instance.componentId;
|
|
1543
|
+
const nestedComponentConfig = (_a2 = componentConfig.instance.resolvedNestedComponents) == null ? void 0 : _a2.find((nestedComponent) => nestedComponent.type.id === refComponentId);
|
|
1544
|
+
if (!nestedComponentConfig) {
|
|
1545
|
+
throw new Error("componentConfig provided without nestedComponentConfig check the config object");
|
|
1546
|
+
return;
|
|
1547
|
+
}
|
|
1548
|
+
const _ref = Ref.create("", ref, component);
|
|
1549
|
+
try {
|
|
1550
|
+
const nestedComponent = await createRefComponent(_ref, nestedComponentConfig, components);
|
|
1551
|
+
component.refs[ref.name] = nestedComponent;
|
|
1552
|
+
resolve();
|
|
1553
|
+
} catch (e) {
|
|
1554
|
+
reject(e);
|
|
1555
|
+
}
|
|
1556
|
+
} else {
|
|
1557
|
+
try {
|
|
1558
|
+
const __nonProxied = Ref.create("", ref, component);
|
|
1559
|
+
component.refs[ref.name] = createRefProxy(__nonProxied, component);
|
|
1560
|
+
resolve();
|
|
1561
|
+
} catch (e) {
|
|
1562
|
+
}
|
|
1563
|
+
}
|
|
1564
|
+
});
|
|
1565
|
+
});
|
|
1566
|
+
try {
|
|
1567
|
+
await Promise.all(waitFor);
|
|
1568
|
+
} catch (e) {
|
|
1569
|
+
throw e;
|
|
1570
|
+
}
|
|
1571
|
+
};
|
|
1572
|
+
}
|
|
1573
|
+
});
|
|
1574
|
+
|
|
1575
|
+
// src/host/components/myopIframeComponent.ts
|
|
1576
|
+
var MyopIframeComponent;
|
|
1577
|
+
var init_myopIframeComponent = __esm({
|
|
1578
|
+
"src/host/components/myopIframeComponent.ts"() {
|
|
1579
|
+
"use strict";
|
|
1580
|
+
init_IMyopComponent();
|
|
1581
|
+
init_messages();
|
|
1582
|
+
init_componentCore();
|
|
1583
|
+
init_MyopMessages();
|
|
1584
|
+
MyopIframeComponent = class extends BaseMyopComponent {
|
|
1585
|
+
constructor(componentConfig, skin, container, IframeElement, options) {
|
|
1586
|
+
super(componentConfig, container, options);
|
|
1587
|
+
this.componentConfig = componentConfig;
|
|
1588
|
+
this.container = container;
|
|
1589
|
+
this.IframeElement = IframeElement;
|
|
1590
|
+
__publicField(this, "cleanupInspect");
|
|
1591
|
+
__publicField(this, "setHeightBasedOnDocumentElement", () => {
|
|
1592
|
+
const cleanupHandler = this.send(new ExecuteScriptMessage(() => {
|
|
1593
|
+
return window.document.documentElement.scrollHeight;
|
|
1594
|
+
}, (ret) => {
|
|
1595
|
+
this.IframeElement.style.height = "".concat(ret.content, "px");
|
|
1596
|
+
cleanupHandler();
|
|
1597
|
+
}));
|
|
1598
|
+
});
|
|
1599
|
+
__publicField(this, "observeSizeBasedOnDocumentElement", () => {
|
|
1600
|
+
const cleanupHandler = this.send(new ExecuteScriptMessage(({ send }) => {
|
|
1601
|
+
const { height, width } = document.documentElement.getBoundingClientRect();
|
|
1602
|
+
const observer = new ResizeObserver(() => {
|
|
1603
|
+
const { height: height2, width: width2 } = document.documentElement.getBoundingClientRect();
|
|
1604
|
+
send({ height: height2, width: width2 });
|
|
1605
|
+
});
|
|
1606
|
+
observer.observe(document.documentElement);
|
|
1607
|
+
observer.observe(document.body);
|
|
1608
|
+
return { height, width };
|
|
1609
|
+
}, (ret) => {
|
|
1610
|
+
this.IframeElement.style.width = "".concat(ret.content.width, "px");
|
|
1611
|
+
this.IframeElement.style.height = "".concat(ret.content.height, "px");
|
|
1612
|
+
}));
|
|
1613
|
+
return cleanupHandler;
|
|
1614
|
+
});
|
|
1615
|
+
__publicField(this, "setSizeBasedOnDocumentElement", () => {
|
|
1616
|
+
const cleanupHandler = this.send(new ExecuteScriptMessage(() => {
|
|
1617
|
+
const { height, width } = document.documentElement.getBoundingClientRect();
|
|
1618
|
+
return { height, width };
|
|
1619
|
+
}, (ret) => {
|
|
1620
|
+
this.IframeElement.style.width = "".concat(ret.content.width, "px");
|
|
1621
|
+
this.IframeElement.style.height = "".concat(ret.content.height, "px");
|
|
1622
|
+
cleanupHandler();
|
|
1623
|
+
}));
|
|
1624
|
+
});
|
|
1625
|
+
__publicField(this, "setHeightBasedOnScrollHeight", () => {
|
|
1626
|
+
const cleanupHandler = this.send(new ExecuteScriptMessage(() => {
|
|
1627
|
+
const noOp = () => {
|
|
1628
|
+
return 0;
|
|
1629
|
+
};
|
|
1630
|
+
let x = noOp();
|
|
1631
|
+
x++;
|
|
1632
|
+
x--;
|
|
1633
|
+
return Math.max(
|
|
1634
|
+
Math.max(
|
|
1635
|
+
window.document.body.clientHeight,
|
|
1636
|
+
window.document.body.scrollHeight
|
|
1637
|
+
),
|
|
1638
|
+
window.document.body.offsetHeight
|
|
1639
|
+
) + x + "px";
|
|
1640
|
+
}, (ret) => {
|
|
1641
|
+
this.IframeElement.style.height = ret.content;
|
|
1642
|
+
cleanupHandler();
|
|
1643
|
+
}));
|
|
1644
|
+
});
|
|
1645
|
+
__publicField(this, "send", (message) => {
|
|
1646
|
+
var _a2, _b;
|
|
1647
|
+
let message_ = __spreadValues({}, message);
|
|
1648
|
+
if (message_.messageType === MyopMessages.ExecuteComponentMethod) {
|
|
1649
|
+
const typedMessage = message_;
|
|
1650
|
+
this[typedMessage.method]();
|
|
1651
|
+
return () => {
|
|
1652
|
+
};
|
|
1653
|
+
}
|
|
1654
|
+
message_.direction = MessageDirection.down;
|
|
1655
|
+
const cleanupHandler = super.send(message_);
|
|
1656
|
+
(_b = (_a2 = this.IframeElement) == null ? void 0 : _a2.contentWindow) == null ? void 0 : _b.postMessage(message_, "*");
|
|
1657
|
+
return cleanupHandler;
|
|
1658
|
+
});
|
|
1659
|
+
__publicField(this, "dispose", () => {
|
|
1660
|
+
if (this.cleanupInspect)
|
|
1661
|
+
this.cleanupInspect();
|
|
1662
|
+
super.dispose();
|
|
1663
|
+
this.IframeElement.parentNode.removeChild(this.IframeElement);
|
|
1664
|
+
});
|
|
1665
|
+
if (skin.loader.autoHeight) {
|
|
1666
|
+
this.initiated().then(() => {
|
|
1667
|
+
this.setHeightBasedOnScrollHeight();
|
|
1668
|
+
});
|
|
1669
|
+
}
|
|
1670
|
+
this.element = this.IframeElement;
|
|
1671
|
+
}
|
|
1672
|
+
inspect() {
|
|
1673
|
+
if (this.cleanupInspect) {
|
|
1674
|
+
return this.cleanupInspect;
|
|
1675
|
+
}
|
|
1676
|
+
this.cleanupInspect = setDebugStyle(this.id, "MyopIframeComponent", 10, this.container, this.IframeElement, this.componentDefinition);
|
|
1677
|
+
return () => {
|
|
1678
|
+
this.cleanupInspect();
|
|
1679
|
+
this.cleanupInspect = void 0;
|
|
1680
|
+
};
|
|
1681
|
+
}
|
|
1682
|
+
hide() {
|
|
1683
|
+
this.IframeElement.style.opacity = "0";
|
|
1684
|
+
this.IframeElement.style.position = "absolute";
|
|
1685
|
+
this.IframeElement.style.pointerEvents = "none";
|
|
1686
|
+
this.IframeElement.style.visibility = "hidden";
|
|
1687
|
+
}
|
|
1688
|
+
show() {
|
|
1689
|
+
this.IframeElement.style.opacity = "1";
|
|
1690
|
+
this.IframeElement.style.position = "unset";
|
|
1691
|
+
this.IframeElement.style.pointerEvents = "all";
|
|
1692
|
+
this.IframeElement.style.visibility = "visible";
|
|
1693
|
+
}
|
|
1694
|
+
onMessageReceived(incomeMessage) {
|
|
1695
|
+
if (incomeMessage.messageType === MyopMessages.In.MutationObserverMessage || incomeMessage.messageType === MyopMessages.In.ResizeObserverMessage) {
|
|
1696
|
+
this.setHeightBasedOnScrollHeight();
|
|
1697
|
+
return true;
|
|
1698
|
+
}
|
|
1699
|
+
return super.onMessageReceived(incomeMessage);
|
|
1700
|
+
}
|
|
1701
|
+
};
|
|
1702
|
+
}
|
|
1703
|
+
});
|
|
1704
|
+
|
|
1705
|
+
// src/host/loaders/IMyopLoader.ts
|
|
1706
|
+
var BaseMyopLoader;
|
|
1707
|
+
var init_IMyopLoader = __esm({
|
|
1708
|
+
"src/host/loaders/IMyopLoader.ts"() {
|
|
1709
|
+
"use strict";
|
|
1710
|
+
BaseMyopLoader = class {
|
|
1711
|
+
constructor() {
|
|
1712
|
+
__publicField(this, "appendChild", (container, element, options) => {
|
|
1713
|
+
var _a2;
|
|
1714
|
+
if (options == null ? void 0 : options.relative) {
|
|
1715
|
+
if (options.relative.direction === "before") {
|
|
1716
|
+
return container.insertBefore(element, options.relative.child);
|
|
1717
|
+
}
|
|
1718
|
+
if (options.relative.direction === "after") {
|
|
1719
|
+
const nextSibling = (_a2 = options.relative.child) == null ? void 0 : _a2.nextSibling;
|
|
1720
|
+
return container.insertBefore(element, nextSibling ? nextSibling : null);
|
|
1721
|
+
}
|
|
1722
|
+
} else {
|
|
1723
|
+
return container.appendChild(element);
|
|
1724
|
+
}
|
|
1725
|
+
});
|
|
1726
|
+
}
|
|
1727
|
+
};
|
|
1728
|
+
}
|
|
1729
|
+
});
|
|
1730
|
+
|
|
1731
|
+
// src/host/loaders/iframeLoader.ts
|
|
1732
|
+
var addQueryParam, MyopIframeLoader;
|
|
1733
|
+
var init_iframeLoader = __esm({
|
|
1734
|
+
"src/host/loaders/iframeLoader.ts"() {
|
|
1735
|
+
"use strict";
|
|
1736
|
+
init_myopIframeComponent();
|
|
1737
|
+
init_IMyopLoader();
|
|
1738
|
+
init_utils();
|
|
1739
|
+
init_common();
|
|
1740
|
+
addQueryParam = (url, param, value) => {
|
|
1741
|
+
const urlObj = new URL(url);
|
|
1742
|
+
urlObj.searchParams.append(param, value);
|
|
1743
|
+
return urlObj.toString();
|
|
1744
|
+
};
|
|
1745
|
+
MyopIframeLoader = class extends BaseMyopLoader {
|
|
1746
|
+
constructor() {
|
|
1747
|
+
super(...arguments);
|
|
1748
|
+
__publicField(this, "type", SkinLoaders.IframeLoader);
|
|
1749
|
+
// @ts-ignore
|
|
1750
|
+
__publicField(this, "load", async (componentDefinition, skin, container, options) => {
|
|
1751
|
+
let IframeElement;
|
|
1752
|
+
const typedLoaderConfig = skin.loader;
|
|
1753
|
+
if ((container == null ? void 0 : container.nodeName) === "IFRAME") {
|
|
1754
|
+
console.log("needs to load into an exsisting Iframe...", typedLoaderConfig.url, container);
|
|
1755
|
+
IframeElement = container;
|
|
1756
|
+
IframeElement.src = typedLoaderConfig.url;
|
|
1757
|
+
} else {
|
|
1758
|
+
const uniqId = uuidv4();
|
|
1759
|
+
const domId = "myop-comp-".concat(uniqId);
|
|
1760
|
+
IframeElement = document.createElement("iframe");
|
|
1761
|
+
if (!container.querySelector('[id^="myop-comp-"]'))
|
|
1762
|
+
container.innerHTML = "";
|
|
1763
|
+
if (options == null ? void 0 : options.hidden) {
|
|
1764
|
+
IframeElement.style.visibility = "hidden";
|
|
1765
|
+
}
|
|
1766
|
+
IframeElement = this.appendChild(container, IframeElement, options);
|
|
1767
|
+
let url2load = skin.loader.url;
|
|
1768
|
+
if (options == null ? void 0 : options._hasParent)
|
|
1769
|
+
url2load = addQueryParam(url2load, "_myop-comp", uniqId);
|
|
1770
|
+
let elementAttributesString = "";
|
|
1771
|
+
if (options == null ? void 0 : options.elementAttributes)
|
|
1772
|
+
elementAttributesString = Object.entries(options == null ? void 0 : options.elementAttributes).map(([key, value]) => {
|
|
1773
|
+
if (value === "" || value === null || value === void 0) {
|
|
1774
|
+
return key;
|
|
1775
|
+
}
|
|
1776
|
+
return "".concat(key, '="').concat(String(value), '"');
|
|
1777
|
+
}).join(" ");
|
|
1778
|
+
IframeElement.outerHTML = '<iframe \n id="'.concat(domId, '"\n style="\n padding: 0;\n margin: 0;\n height: ').concat(typedLoaderConfig.autoHeight || !typedLoaderConfig.height ? "" : typedLoaderConfig.height, "; \n width : 100%;\n overflow: hidden;\n border: none;\n opacity: ").concat((options == null ? void 0 : options.hidden) ? "0" : "1", ";\n position: ").concat((options == null ? void 0 : options.hidden) ? "absolute" : "static", ";\n pointer-events: ").concat((options == null ? void 0 : options.hidden) ? "none" : "all", ';\n "\n src="').concat(url2load, '"\n ').concat(elementAttributesString, "\n ></iframe>");
|
|
1779
|
+
IframeElement = container.querySelector("#".concat(domId));
|
|
1780
|
+
}
|
|
1781
|
+
return new MyopIframeComponent(componentDefinition, skin, container, IframeElement, options);
|
|
1782
|
+
});
|
|
1783
|
+
}
|
|
1784
|
+
};
|
|
1785
|
+
}
|
|
1786
|
+
});
|
|
1787
|
+
|
|
1788
|
+
// src/webcomponent/consts.ts
|
|
1789
|
+
var myopWebcomponentConsts;
|
|
1790
|
+
var init_consts = __esm({
|
|
1791
|
+
"src/webcomponent/consts.ts"() {
|
|
1792
|
+
"use strict";
|
|
1793
|
+
myopWebcomponentConsts = {
|
|
1794
|
+
webcomponent_message_key: "myop_webcomponent_message"
|
|
1795
|
+
};
|
|
1796
|
+
}
|
|
1797
|
+
});
|
|
1798
|
+
|
|
1799
|
+
// src/host/components/myopWebcomponent.ts
|
|
1800
|
+
var MyopWebComponent;
|
|
1801
|
+
var init_myopWebcomponent = __esm({
|
|
1802
|
+
"src/host/components/myopWebcomponent.ts"() {
|
|
1803
|
+
"use strict";
|
|
1804
|
+
init_consts();
|
|
1805
|
+
init_IMyopComponent();
|
|
1806
|
+
init_componentCore();
|
|
1807
|
+
MyopWebComponent = class extends BaseMyopComponent {
|
|
1808
|
+
constructor(componentDefinition, skin, container, customElement, options) {
|
|
1809
|
+
super(componentDefinition, container, options);
|
|
1810
|
+
this.container = container;
|
|
1811
|
+
this.customElement = customElement;
|
|
1812
|
+
__publicField(this, "cleanupInspect", () => {
|
|
1813
|
+
});
|
|
1814
|
+
__publicField(this, "send", (message) => {
|
|
1815
|
+
let message_ = __spreadValues({}, message);
|
|
1816
|
+
const cleanupHandler = super.send(message_);
|
|
1817
|
+
const msg = new CustomEvent(myopWebcomponentConsts.webcomponent_message_key, {
|
|
1818
|
+
// @ts-ignore
|
|
1819
|
+
detail: message_
|
|
1820
|
+
// bubbles: true,
|
|
1821
|
+
// cancelable: false,
|
|
1822
|
+
// composed: true
|
|
1823
|
+
});
|
|
1824
|
+
try {
|
|
1825
|
+
this.customElement.dispatchEvent(msg);
|
|
1826
|
+
} catch (e) {
|
|
1827
|
+
console.log("error while trying to dispatchEvent", e);
|
|
1828
|
+
}
|
|
1829
|
+
return cleanupHandler;
|
|
1830
|
+
});
|
|
1831
|
+
__publicField(this, "dispose", () => {
|
|
1832
|
+
var _a2;
|
|
1833
|
+
super.dispose();
|
|
1834
|
+
(_a2 = this.customElement.parentNode) == null ? void 0 : _a2.removeChild(this.customElement);
|
|
1835
|
+
});
|
|
1836
|
+
this.element = customElement;
|
|
1837
|
+
}
|
|
1838
|
+
inspect() {
|
|
1839
|
+
this.cleanupInspect = setDebugStyle(this.id, "MyopWebComponent", 0, this.container, this.customElement, this.componentDefinition);
|
|
1840
|
+
return this.cleanupInspect;
|
|
1841
|
+
}
|
|
1842
|
+
hide() {
|
|
1843
|
+
this.customElement.style.opacity = "0";
|
|
1844
|
+
this.customElement.style.position = "absolute";
|
|
1845
|
+
this.customElement.style.pointerEvents = "none";
|
|
1846
|
+
this.customElement.style.visibility = "hidden";
|
|
1847
|
+
this.customElement.style.height = "0";
|
|
1848
|
+
this.customElement.style.width = "0";
|
|
1849
|
+
}
|
|
1850
|
+
show() {
|
|
1851
|
+
this.customElement.style.opacity = "1";
|
|
1852
|
+
this.customElement.style.position = "unset";
|
|
1853
|
+
this.customElement.style.pointerEvents = "all";
|
|
1854
|
+
this.customElement.style.visibility = "visible";
|
|
1855
|
+
this.customElement.style.height = "";
|
|
1856
|
+
this.customElement.style.width = "";
|
|
1857
|
+
}
|
|
1858
|
+
};
|
|
1859
|
+
}
|
|
1860
|
+
});
|
|
1861
|
+
|
|
1862
|
+
// src/host/loaders/webcomponentLoader.ts
|
|
1863
|
+
var seen, WebcomponentLoader;
|
|
1864
|
+
var init_webcomponentLoader = __esm({
|
|
1865
|
+
"src/host/loaders/webcomponentLoader.ts"() {
|
|
1866
|
+
"use strict";
|
|
1867
|
+
init_myopWebcomponent();
|
|
1868
|
+
init_IMyopLoader();
|
|
1869
|
+
init_utils();
|
|
1870
|
+
init_common();
|
|
1871
|
+
seen = {};
|
|
1872
|
+
WebcomponentLoader = class extends BaseMyopLoader {
|
|
1873
|
+
constructor() {
|
|
1874
|
+
super(...arguments);
|
|
1875
|
+
__publicField(this, "type", SkinLoaders.WebComponentLoader);
|
|
1876
|
+
__publicField(this, "load", async (componentDefinition, skin, container, options) => {
|
|
1877
|
+
const loaderConfig = skin.loader;
|
|
1878
|
+
if (!seen[loaderConfig.url]) {
|
|
1879
|
+
seen[loaderConfig.url] = new Promise((resolve, reject) => {
|
|
1880
|
+
const webComponentLoadUrl = loaderConfig.url;
|
|
1881
|
+
const script = document.createElement("script");
|
|
1882
|
+
script.type = "module";
|
|
1883
|
+
script.src = webComponentLoadUrl;
|
|
1884
|
+
script.onload = () => {
|
|
1885
|
+
resolve();
|
|
1886
|
+
};
|
|
1887
|
+
script.onerror = () => {
|
|
1888
|
+
reject();
|
|
1889
|
+
};
|
|
1890
|
+
document.head.appendChild(script);
|
|
1891
|
+
});
|
|
1892
|
+
} else {
|
|
1893
|
+
console.log("Module alreday loaded or in loading process");
|
|
1894
|
+
}
|
|
1895
|
+
await seen[loaderConfig.url];
|
|
1896
|
+
await wait(1);
|
|
1897
|
+
let domId = "myop-comp-".concat(uuidv4());
|
|
1898
|
+
const element = document.createElement(loaderConfig.tag);
|
|
1899
|
+
if (!container.querySelector('[id^="myop-comp-"]'))
|
|
1900
|
+
container.innerHTML = "";
|
|
1901
|
+
element.id = domId;
|
|
1902
|
+
if (options == null ? void 0 : options.hidden) {
|
|
1903
|
+
element.style.opacity = "0";
|
|
1904
|
+
element.style.position = "absolute";
|
|
1905
|
+
element.style.height = "0";
|
|
1906
|
+
element.style.width = "0";
|
|
1907
|
+
element.style.pointerEvents = "none";
|
|
1908
|
+
element.style.visibility = "hidden";
|
|
1909
|
+
}
|
|
1910
|
+
if (options == null ? void 0 : options._environment) {
|
|
1911
|
+
element._myopEnvironment = options == null ? void 0 : options._environment;
|
|
1912
|
+
}
|
|
1913
|
+
this.appendChild(container, element, options);
|
|
1914
|
+
return new MyopWebComponent(componentDefinition, skin, container, element, options);
|
|
1915
|
+
});
|
|
1916
|
+
}
|
|
1917
|
+
};
|
|
1918
|
+
}
|
|
1919
|
+
});
|
|
1920
|
+
|
|
1921
|
+
// src/webcomponent/messageHandlers/BaseWebComponentMessageHandler.ts
|
|
1922
|
+
var BaseWebComponentMessageHandler;
|
|
1923
|
+
var init_BaseWebComponentMessageHandler = __esm({
|
|
1924
|
+
"src/webcomponent/messageHandlers/BaseWebComponentMessageHandler.ts"() {
|
|
1925
|
+
"use strict";
|
|
1926
|
+
init_common();
|
|
1927
|
+
BaseWebComponentMessageHandler = class extends BaseContextMessageHandler {
|
|
1928
|
+
constructor(messageToHost, context) {
|
|
1929
|
+
super(messageToHost);
|
|
1930
|
+
this.context = context;
|
|
1931
|
+
__publicField(this, "executor", (event) => {
|
|
1932
|
+
if (event.destination) {
|
|
1933
|
+
const destination = event.destination;
|
|
1934
|
+
if (this.context[destination].context) {
|
|
1935
|
+
const _messageToHost = (message, replayTo) => {
|
|
1936
|
+
this.messageToHost(__spreadProps(__spreadValues({}, message), {
|
|
1937
|
+
source: event.destination ? event.destination : event.source,
|
|
1938
|
+
destination: event.source ? event.source : event.destination
|
|
1939
|
+
}), replayTo);
|
|
1940
|
+
};
|
|
1941
|
+
return this.innerExecutor(event, this.context[destination].context, _messageToHost);
|
|
1942
|
+
} else {
|
|
1943
|
+
debugger;
|
|
1944
|
+
}
|
|
1945
|
+
} else {
|
|
1946
|
+
debugger;
|
|
1947
|
+
}
|
|
1948
|
+
});
|
|
1949
|
+
}
|
|
1950
|
+
};
|
|
1951
|
+
}
|
|
1952
|
+
});
|
|
1953
|
+
|
|
1954
|
+
// src/consts.ts
|
|
1955
|
+
var myopAttributes;
|
|
1956
|
+
var init_consts2 = __esm({
|
|
1957
|
+
"src/consts.ts"() {
|
|
1958
|
+
"use strict";
|
|
1959
|
+
myopAttributes = {
|
|
1960
|
+
id: "myop-id"
|
|
1961
|
+
};
|
|
1962
|
+
}
|
|
1963
|
+
});
|
|
1964
|
+
|
|
1965
|
+
// src/common/messageHandlers/helpers.ts
|
|
1966
|
+
var getElementsByRef, getFirstElementByRef;
|
|
1967
|
+
var init_helpers = __esm({
|
|
1968
|
+
"src/common/messageHandlers/helpers.ts"() {
|
|
1969
|
+
"use strict";
|
|
1970
|
+
init_consts2();
|
|
1971
|
+
getElementsByRef = (ref, el) => {
|
|
1972
|
+
return el.querySelectorAll("[".concat(myopAttributes.id, "='").concat(ref.refConfig.selector, "']"));
|
|
1973
|
+
};
|
|
1974
|
+
getFirstElementByRef = (ref, el) => {
|
|
1975
|
+
const elements = getElementsByRef(ref, el);
|
|
1976
|
+
if (elements.length) {
|
|
1977
|
+
return elements.item(0);
|
|
1978
|
+
}
|
|
1979
|
+
return null;
|
|
1980
|
+
};
|
|
1981
|
+
}
|
|
1982
|
+
});
|
|
1983
|
+
|
|
1984
|
+
// src/webcomponent/messageHandlers/bindOnClickHandler.ts
|
|
1985
|
+
var BindOnClickHandler;
|
|
1986
|
+
var init_bindOnClickHandler = __esm({
|
|
1987
|
+
"src/webcomponent/messageHandlers/bindOnClickHandler.ts"() {
|
|
1988
|
+
"use strict";
|
|
1989
|
+
init_MyopMessages();
|
|
1990
|
+
init_messages();
|
|
1991
|
+
init_BaseWebComponentMessageHandler();
|
|
1992
|
+
init_helpers();
|
|
1993
|
+
BindOnClickHandler = class extends BaseWebComponentMessageHandler {
|
|
1994
|
+
constructor() {
|
|
1995
|
+
super(...arguments);
|
|
1996
|
+
__publicField(this, "messageType", MyopMessages.BindClickMessage);
|
|
1997
|
+
__publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
|
|
1998
|
+
const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
|
|
1999
|
+
const cleanupTasks = [];
|
|
2000
|
+
items.forEach((item) => {
|
|
2001
|
+
const handler = () => {
|
|
2002
|
+
messageToHost(new ClickReplayMessage(event.handlerUniqueId));
|
|
2003
|
+
};
|
|
2004
|
+
item.addEventListener("click", handler);
|
|
2005
|
+
cleanupTasks.push(() => {
|
|
2006
|
+
item.removeEventListener("click", handler);
|
|
2007
|
+
});
|
|
2008
|
+
});
|
|
2009
|
+
return () => {
|
|
2010
|
+
cleanupTasks.forEach((task) => task());
|
|
2011
|
+
};
|
|
2012
|
+
});
|
|
2013
|
+
}
|
|
2014
|
+
};
|
|
2015
|
+
}
|
|
2016
|
+
});
|
|
2017
|
+
|
|
2018
|
+
// src/webcomponent/messageHandlers/changeTextHandler.ts
|
|
2019
|
+
var ChangeTextHandler;
|
|
2020
|
+
var init_changeTextHandler = __esm({
|
|
2021
|
+
"src/webcomponent/messageHandlers/changeTextHandler.ts"() {
|
|
2022
|
+
"use strict";
|
|
2023
|
+
init_MyopMessages();
|
|
2024
|
+
init_BaseWebComponentMessageHandler();
|
|
2025
|
+
init_helpers();
|
|
2026
|
+
ChangeTextHandler = class extends BaseWebComponentMessageHandler {
|
|
2027
|
+
constructor() {
|
|
2028
|
+
super(...arguments);
|
|
2029
|
+
__publicField(this, "messageType", MyopMessages.ChangeTextMessage);
|
|
2030
|
+
__publicField(this, "innerExecutor", (event, shadowRootRef) => {
|
|
2031
|
+
const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
|
|
2032
|
+
items.forEach((item) => {
|
|
2033
|
+
item.textContent = event.content;
|
|
2034
|
+
});
|
|
2035
|
+
});
|
|
2036
|
+
}
|
|
2037
|
+
};
|
|
2038
|
+
}
|
|
2039
|
+
});
|
|
2040
|
+
|
|
2041
|
+
// src/webcomponent/shadowRootRef.ts
|
|
2042
|
+
var ShadowRootRef;
|
|
2043
|
+
var init_shadowRootRef = __esm({
|
|
2044
|
+
"src/webcomponent/shadowRootRef.ts"() {
|
|
2045
|
+
"use strict";
|
|
2046
|
+
init_common();
|
|
2047
|
+
ShadowRootRef = class extends RootRef {
|
|
2048
|
+
constructor(container, shadowRoot) {
|
|
2049
|
+
super(container, shadowRoot);
|
|
2050
|
+
this.container = container;
|
|
2051
|
+
this.shadowRoot = shadowRoot;
|
|
2052
|
+
}
|
|
2053
|
+
};
|
|
2054
|
+
}
|
|
2055
|
+
});
|
|
2056
|
+
|
|
2057
|
+
// src/webcomponent/messageHandlers/DetectMyopRefsMessageHandler.ts
|
|
2058
|
+
var DetectMyopRefsMessageHandler;
|
|
2059
|
+
var init_DetectMyopRefsMessageHandler = __esm({
|
|
2060
|
+
"src/webcomponent/messageHandlers/DetectMyopRefsMessageHandler.ts"() {
|
|
2061
|
+
"use strict";
|
|
2062
|
+
init_common();
|
|
2063
|
+
init_consts2();
|
|
2064
|
+
init_BaseWebComponentMessageHandler();
|
|
2065
|
+
init_messages();
|
|
2066
|
+
init_MyopMessages();
|
|
2067
|
+
DetectMyopRefsMessageHandler = class extends BaseWebComponentMessageHandler {
|
|
2068
|
+
constructor() {
|
|
2069
|
+
super(...arguments);
|
|
2070
|
+
__publicField(this, "innerExecutor", (event, shadowRootRef) => {
|
|
2071
|
+
const allMyopItems = shadowRootRef.shadowRoot.querySelectorAll("[".concat(myopAttributes.id, "]"));
|
|
2072
|
+
let myopRefs = [];
|
|
2073
|
+
allMyopItems.forEach((item) => {
|
|
2074
|
+
const myopId = item.getAttribute(myopAttributes.id);
|
|
2075
|
+
if (myopId) {
|
|
2076
|
+
myopRefs.push(new MyopElementRef(myopId, item.tagName, item.getBoundingClientRect(), item.offsetTop, item.offsetLeft));
|
|
2077
|
+
}
|
|
2078
|
+
});
|
|
2079
|
+
this.messageToHost(new DetectedMyopRefsMessage(event.handlerUniqueId, myopRefs));
|
|
2080
|
+
});
|
|
2081
|
+
__publicField(this, "messageType", MyopMessages.DetectMyopRefsMessage);
|
|
2082
|
+
}
|
|
2083
|
+
};
|
|
2084
|
+
}
|
|
2085
|
+
});
|
|
2086
|
+
|
|
2087
|
+
// src/webcomponent/messageHandlers/setAttributeHandler.ts
|
|
2088
|
+
var setAttributeHandler;
|
|
2089
|
+
var init_setAttributeHandler = __esm({
|
|
2090
|
+
"src/webcomponent/messageHandlers/setAttributeHandler.ts"() {
|
|
2091
|
+
"use strict";
|
|
2092
|
+
init_MyopMessages();
|
|
2093
|
+
init_BaseWebComponentMessageHandler();
|
|
2094
|
+
init_helpers();
|
|
2095
|
+
setAttributeHandler = class extends BaseWebComponentMessageHandler {
|
|
2096
|
+
constructor() {
|
|
2097
|
+
super(...arguments);
|
|
2098
|
+
__publicField(this, "messageType", MyopMessages.SetAttributeMessage);
|
|
2099
|
+
__publicField(this, "innerExecutor", (event, shadowRootRef) => {
|
|
2100
|
+
const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
|
|
2101
|
+
items.forEach((item) => {
|
|
2102
|
+
item.setAttribute(event.name, event.value);
|
|
2103
|
+
});
|
|
2104
|
+
});
|
|
2105
|
+
}
|
|
2106
|
+
};
|
|
2107
|
+
}
|
|
2108
|
+
});
|
|
2109
|
+
|
|
2110
|
+
// src/webcomponent/messageHandlers/addEventListenerHandler.ts
|
|
2111
|
+
var AddEventListenerHandler;
|
|
2112
|
+
var init_addEventListenerHandler = __esm({
|
|
2113
|
+
"src/webcomponent/messageHandlers/addEventListenerHandler.ts"() {
|
|
2114
|
+
"use strict";
|
|
2115
|
+
init_MyopMessages();
|
|
2116
|
+
init_messages();
|
|
2117
|
+
init_BaseWebComponentMessageHandler();
|
|
2118
|
+
init_helpers();
|
|
2119
|
+
init_serialization();
|
|
2120
|
+
AddEventListenerHandler = class extends BaseWebComponentMessageHandler {
|
|
2121
|
+
constructor() {
|
|
2122
|
+
super(...arguments);
|
|
2123
|
+
__publicField(this, "messageType", MyopMessages.AddEventListenerMessage);
|
|
2124
|
+
__publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
|
|
2125
|
+
const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
|
|
2126
|
+
const cleanupTasks = [];
|
|
2127
|
+
items.forEach((item) => {
|
|
2128
|
+
const handler = (e) => {
|
|
2129
|
+
messageToHost(new EventListenerCallbackMessage(event.handlerUniqueId, makeSerializable(e, event.serializableSkeleton)));
|
|
2130
|
+
};
|
|
2131
|
+
item.addEventListener(event.type, handler);
|
|
2132
|
+
cleanupTasks.push(() => {
|
|
2133
|
+
item.removeEventListener(event.type, handler);
|
|
2134
|
+
});
|
|
2135
|
+
});
|
|
2136
|
+
return () => {
|
|
2137
|
+
cleanupTasks.forEach((task) => task());
|
|
2138
|
+
};
|
|
2139
|
+
});
|
|
2140
|
+
}
|
|
2141
|
+
};
|
|
2142
|
+
}
|
|
2143
|
+
});
|
|
2144
|
+
|
|
2145
|
+
// src/webcomponent/messageHandlers/CreateRefComponentMessageHandler.ts
|
|
2146
|
+
var CreateRefComponentMessageHandler;
|
|
2147
|
+
var init_CreateRefComponentMessageHandler = __esm({
|
|
2148
|
+
"src/webcomponent/messageHandlers/CreateRefComponentMessageHandler.ts"() {
|
|
2149
|
+
"use strict";
|
|
2150
|
+
init_MyopMessages();
|
|
2151
|
+
init_consts2();
|
|
2152
|
+
init_hostSDK();
|
|
2153
|
+
init_CreateRefComponentMessage();
|
|
2154
|
+
init_BaseWebComponentMessageHandler();
|
|
2155
|
+
CreateRefComponentMessageHandler = class extends BaseWebComponentMessageHandler {
|
|
2156
|
+
constructor() {
|
|
2157
|
+
super(...arguments);
|
|
2158
|
+
__publicField(this, "messageType", MyopMessages.CreateRefComponentMessage);
|
|
2159
|
+
__publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
|
|
2160
|
+
const createRef = async () => {
|
|
2161
|
+
const allItems = shadowRootRef.shadowRoot.querySelectorAll("[".concat(myopAttributes.id, "='").concat(event.refConfig.selector, "']"));
|
|
2162
|
+
if (allItems.length === 1) {
|
|
2163
|
+
const hostSDK2 = HostSDK.Instance();
|
|
2164
|
+
const refComponent = hostSDK2.components.find((c) => c.id === event.options.id);
|
|
2165
|
+
if (refComponent) {
|
|
2166
|
+
refComponent.dispose();
|
|
2167
|
+
} else {
|
|
2168
|
+
}
|
|
2169
|
+
const index = hostSDK2.components.indexOf(refComponent);
|
|
2170
|
+
if (index !== -1) {
|
|
2171
|
+
hostSDK2.components.splice(index, 1);
|
|
2172
|
+
} else {
|
|
2173
|
+
}
|
|
2174
|
+
const implementationComponent = await hostSDK2.loadComponent(
|
|
2175
|
+
event.nestedComponentConfig,
|
|
2176
|
+
allItems.item(0),
|
|
2177
|
+
event.options
|
|
2178
|
+
);
|
|
2179
|
+
const nestedRefConfig = [];
|
|
2180
|
+
Object.keys(implementationComponent.refs).forEach((refName) => {
|
|
2181
|
+
let ref = implementationComponent.refs[refName];
|
|
2182
|
+
ref = ref.__nonProxied || ref;
|
|
2183
|
+
if (ref.componentDefinition) {
|
|
2184
|
+
nestedRefConfig.push({
|
|
2185
|
+
refName,
|
|
2186
|
+
componentDefinitionId: ref.componentDefinition.id
|
|
2187
|
+
});
|
|
2188
|
+
}
|
|
2189
|
+
});
|
|
2190
|
+
messageToHost(new RefComponentCreatedMessage(event.handlerUniqueId, nestedRefConfig));
|
|
2191
|
+
} else {
|
|
2192
|
+
console.error("CreateRefComponentMessageHandler - DOM element not found");
|
|
2193
|
+
this.messageToHost(new RefComponentCreatedMessage(event.handlerUniqueId, [], true));
|
|
2194
|
+
debugger;
|
|
2195
|
+
}
|
|
2196
|
+
};
|
|
2197
|
+
createRef().then();
|
|
2198
|
+
});
|
|
2199
|
+
}
|
|
2200
|
+
};
|
|
2201
|
+
}
|
|
2202
|
+
});
|
|
2203
|
+
|
|
2204
|
+
// src/common/messageHandlers/executeScriptHandler.ts
|
|
2205
|
+
var ExecuteScriptHandlerExecutor;
|
|
2206
|
+
var init_executeScriptHandler = __esm({
|
|
2207
|
+
"src/common/messageHandlers/executeScriptHandler.ts"() {
|
|
2208
|
+
"use strict";
|
|
2209
|
+
init_serialization();
|
|
2210
|
+
ExecuteScriptHandlerExecutor = (event, replier, rootRef) => {
|
|
2211
|
+
const __scriptInputs = event.scriptInputs ? event.scriptInputs : {};
|
|
2212
|
+
__scriptInputs.makeSerializable = makeSerializable;
|
|
2213
|
+
__scriptInputs.send = replier;
|
|
2214
|
+
__scriptInputs.rootRef = rootRef;
|
|
2215
|
+
__scriptInputs.__scriptInputs = __scriptInputs;
|
|
2216
|
+
const dynamicFunction = new Function("return (".concat(event.script, ")(...arguments)"));
|
|
2217
|
+
const ret = dynamicFunction(__scriptInputs);
|
|
2218
|
+
replier(ret);
|
|
2219
|
+
};
|
|
2220
|
+
}
|
|
2221
|
+
});
|
|
2222
|
+
|
|
2223
|
+
// src/webcomponent/messageHandlers/executeScriptHandler.ts
|
|
2224
|
+
var ExecuteScriptHandler;
|
|
2225
|
+
var init_executeScriptHandler2 = __esm({
|
|
2226
|
+
"src/webcomponent/messageHandlers/executeScriptHandler.ts"() {
|
|
2227
|
+
"use strict";
|
|
2228
|
+
init_MyopMessages();
|
|
2229
|
+
init_messages();
|
|
2230
|
+
init_BaseWebComponentMessageHandler();
|
|
2231
|
+
init_executeScriptHandler();
|
|
2232
|
+
ExecuteScriptHandler = class extends BaseWebComponentMessageHandler {
|
|
2233
|
+
constructor() {
|
|
2234
|
+
super(...arguments);
|
|
2235
|
+
__publicField(this, "messageType", MyopMessages.ExecuteScriptMessage);
|
|
2236
|
+
__publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
|
|
2237
|
+
const replier = (data) => {
|
|
2238
|
+
messageToHost(new ExecuteScriptReplyMessage(event.handlerUniqueId, data));
|
|
2239
|
+
};
|
|
2240
|
+
ExecuteScriptHandlerExecutor(event, replier, shadowRootRef);
|
|
2241
|
+
});
|
|
2242
|
+
}
|
|
2243
|
+
};
|
|
2244
|
+
}
|
|
2245
|
+
});
|
|
2246
|
+
|
|
2247
|
+
// src/webcomponent/messageHandlers/GetElementValueHandler.ts
|
|
2248
|
+
var getInputValue, GetElementValueHandler;
|
|
2249
|
+
var init_GetElementValueHandler = __esm({
|
|
2250
|
+
"src/webcomponent/messageHandlers/GetElementValueHandler.ts"() {
|
|
2251
|
+
"use strict";
|
|
2252
|
+
init_MyopMessages();
|
|
2253
|
+
init_messages();
|
|
2254
|
+
init_BaseWebComponentMessageHandler();
|
|
2255
|
+
init_helpers();
|
|
2256
|
+
init_consts2();
|
|
2257
|
+
init_serialization();
|
|
2258
|
+
getInputValue = (element) => {
|
|
2259
|
+
if (!element) return null;
|
|
2260
|
+
if (element.tagName === "FORM") {
|
|
2261
|
+
const formData = new FormData(element);
|
|
2262
|
+
const dataObject = {
|
|
2263
|
+
formData: {},
|
|
2264
|
+
unmappedData: []
|
|
2265
|
+
};
|
|
2266
|
+
const elements = element.querySelectorAll("input, select, textarea");
|
|
2267
|
+
let autoNameIndexer = -1;
|
|
2268
|
+
elements.forEach((element2) => {
|
|
2269
|
+
if (typeof element2.value === "string") {
|
|
2270
|
+
const myopId = element2.getAttribute(myopAttributes.id);
|
|
2271
|
+
let key = element2.getAttribute("name");
|
|
2272
|
+
const nodeData = {
|
|
2273
|
+
id: element2.id,
|
|
2274
|
+
name: key,
|
|
2275
|
+
value: getInputValue(element2),
|
|
2276
|
+
required: element2.required,
|
|
2277
|
+
validity: makeSerializable(element2.validity, true),
|
|
2278
|
+
myopId
|
|
2279
|
+
};
|
|
2280
|
+
if (!key) {
|
|
2281
|
+
dataObject.unmappedData.push(nodeData);
|
|
2282
|
+
} else {
|
|
2283
|
+
if (dataObject.formData[key]) {
|
|
2284
|
+
if (dataObject.formData[key].value) {
|
|
2285
|
+
dataObject.unmappedData.push(nodeData);
|
|
2286
|
+
} else {
|
|
2287
|
+
dataObject.unmappedData.push(dataObject.formData[key]);
|
|
2288
|
+
dataObject.formData[key] = nodeData;
|
|
2289
|
+
}
|
|
2290
|
+
} else {
|
|
2291
|
+
dataObject.formData[key] = nodeData;
|
|
2292
|
+
}
|
|
2293
|
+
}
|
|
2294
|
+
}
|
|
2295
|
+
});
|
|
2296
|
+
return dataObject;
|
|
2297
|
+
}
|
|
2298
|
+
if (element.type === "checkbox" || element.type === "radio") {
|
|
2299
|
+
return element.checked ? element.value : null;
|
|
2300
|
+
}
|
|
2301
|
+
if (element.tagName === "INPUT" || element.tagName === "TEXTAREA") {
|
|
2302
|
+
return element.value;
|
|
2303
|
+
}
|
|
2304
|
+
if (element.tagName === "SELECT") {
|
|
2305
|
+
return element.value;
|
|
2306
|
+
}
|
|
2307
|
+
if (element.isContentEditable) {
|
|
2308
|
+
return element.innerText || element.textContent;
|
|
2309
|
+
}
|
|
2310
|
+
return null;
|
|
2311
|
+
};
|
|
2312
|
+
GetElementValueHandler = class extends BaseWebComponentMessageHandler {
|
|
2313
|
+
constructor() {
|
|
2314
|
+
super(...arguments);
|
|
2315
|
+
__publicField(this, "messageType", MyopMessages.GetElementValueMessage);
|
|
2316
|
+
__publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
|
|
2317
|
+
const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
|
|
2318
|
+
items.forEach((item) => {
|
|
2319
|
+
messageToHost(new ElementValueReplayMessage(getInputValue(item)), event);
|
|
2320
|
+
});
|
|
2321
|
+
});
|
|
2322
|
+
}
|
|
2323
|
+
};
|
|
2324
|
+
}
|
|
2325
|
+
});
|
|
2326
|
+
|
|
2327
|
+
// src/webcomponent/messageHandlers/setInnerHtmlHandler.ts
|
|
2328
|
+
var SetInnerHtmlHandler;
|
|
2329
|
+
var init_setInnerHtmlHandler = __esm({
|
|
2330
|
+
"src/webcomponent/messageHandlers/setInnerHtmlHandler.ts"() {
|
|
2331
|
+
"use strict";
|
|
2332
|
+
init_MyopMessages();
|
|
2333
|
+
init_BaseWebComponentMessageHandler();
|
|
2334
|
+
init_helpers();
|
|
2335
|
+
SetInnerHtmlHandler = class extends BaseWebComponentMessageHandler {
|
|
2336
|
+
constructor() {
|
|
2337
|
+
super(...arguments);
|
|
2338
|
+
__publicField(this, "messageType", MyopMessages.SetInnerHtml);
|
|
2339
|
+
__publicField(this, "innerExecutor", (event, shadowRootRef) => {
|
|
2340
|
+
const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
|
|
2341
|
+
items.forEach((item) => {
|
|
2342
|
+
item.innerHTML = event.content;
|
|
2343
|
+
});
|
|
2344
|
+
});
|
|
2345
|
+
}
|
|
2346
|
+
};
|
|
2347
|
+
}
|
|
2348
|
+
});
|
|
2349
|
+
|
|
2350
|
+
// src/webcomponent/WebComponentSDK.ts
|
|
2351
|
+
var WebComponentSDK_exports = {};
|
|
2352
|
+
__export(WebComponentSDK_exports, {
|
|
2353
|
+
WebComponentSDK: () => WebComponentSDK
|
|
2354
|
+
});
|
|
2355
|
+
var WebComponentSDK;
|
|
2356
|
+
var init_WebComponentSDK = __esm({
|
|
2357
|
+
"src/webcomponent/WebComponentSDK.ts"() {
|
|
2358
|
+
"use strict";
|
|
2359
|
+
init_common();
|
|
2360
|
+
init_MyopMessages();
|
|
2361
|
+
init_consts();
|
|
2362
|
+
init_bindOnClickHandler();
|
|
2363
|
+
init_changeTextHandler();
|
|
2364
|
+
init_shadowRootRef();
|
|
2365
|
+
init_DetectMyopRefsMessageHandler();
|
|
2366
|
+
init_defineDynamicImport();
|
|
2367
|
+
init_messages();
|
|
2368
|
+
init_setAttributeHandler();
|
|
2369
|
+
init_addEventListenerHandler();
|
|
2370
|
+
init_CreateRefComponentMessageHandler();
|
|
2371
|
+
init_executeScriptHandler2();
|
|
2372
|
+
init_GetElementValueHandler();
|
|
2373
|
+
init_setInnerHtmlHandler();
|
|
2374
|
+
WebComponentSDK = class extends BaseMyopSDK {
|
|
2375
|
+
constructor() {
|
|
2376
|
+
super(...arguments);
|
|
2377
|
+
__publicField(this, "alwaysPassEnvelopesToHost", true);
|
|
2378
|
+
//when new web component created.
|
|
2379
|
+
__publicField(this, "connectedCallback", (container, shadow) => {
|
|
2380
|
+
container.addEventListener(myopWebcomponentConsts.webcomponent_message_key, (e) => {
|
|
2381
|
+
const eventContent = e.data ? e.data : e.detail;
|
|
2382
|
+
if (!eventContent || !eventContent.myop) {
|
|
2383
|
+
debugger;
|
|
2384
|
+
throw new Error("recvied webcomponent_message with wrong type");
|
|
2385
|
+
} else {
|
|
2386
|
+
const message = eventContent;
|
|
2387
|
+
this.handleIncomeMessages(e);
|
|
2388
|
+
if (message.messageType === MyopMessages.InitMessage) {
|
|
2389
|
+
const newComponentId = message.content.id;
|
|
2390
|
+
this.components[newComponentId].context = new ShadowRootRef(container, shadow);
|
|
2391
|
+
}
|
|
2392
|
+
}
|
|
2393
|
+
});
|
|
2394
|
+
setTimeout(() => {
|
|
2395
|
+
this.messageToHost(new InitRequest());
|
|
2396
|
+
}, 1);
|
|
2397
|
+
});
|
|
2398
|
+
__publicField(this, "messageToHost", (message, replayTo) => {
|
|
2399
|
+
message.direction = MessageDirection.up;
|
|
2400
|
+
if (!message.replayToHandler && (replayTo == null ? void 0 : replayTo.handlerUniqueId))
|
|
2401
|
+
message.replayToHandler = replayTo.handlerUniqueId;
|
|
2402
|
+
window.myop.hostSDK.send(message);
|
|
2403
|
+
});
|
|
2404
|
+
__publicField(this, "supportedHandlers", [
|
|
2405
|
+
new ChangeTextHandler(this.messageToHost, this.components),
|
|
2406
|
+
new SetInnerHtmlHandler(this.messageToHost, this.components),
|
|
2407
|
+
new BindOnClickHandler(this.messageToHost, this.components),
|
|
2408
|
+
new DetectMyopRefsMessageHandler(this.messageToHost, this.components),
|
|
2409
|
+
new setAttributeHandler(this.messageToHost, this.components),
|
|
2410
|
+
new AddEventListenerHandler(this.messageToHost, this.components),
|
|
2411
|
+
new ExecuteScriptHandler(this.messageToHost, this.components),
|
|
2412
|
+
new GetElementValueHandler(this.messageToHost, this.components),
|
|
2413
|
+
//
|
|
2414
|
+
new CreateRefComponentMessageHandler(this.messageToHost, this.components)
|
|
2415
|
+
]);
|
|
2416
|
+
__publicField(this, "init", () => {
|
|
2417
|
+
});
|
|
2418
|
+
}
|
|
2419
|
+
};
|
|
2420
|
+
defineDynamicImport("WebComponentSDK", WebComponentSDK);
|
|
2421
|
+
}
|
|
2422
|
+
});
|
|
2423
|
+
|
|
2424
|
+
// src/webcomponent/index.ts
|
|
2425
|
+
var init_webcomponent = __esm({
|
|
2426
|
+
"src/webcomponent/index.ts"() {
|
|
2427
|
+
"use strict";
|
|
2428
|
+
init_WebComponentSDK();
|
|
2429
|
+
}
|
|
2430
|
+
});
|
|
2431
|
+
|
|
2432
|
+
// src/host/loaders/HTMLComponentLoader.ts
|
|
2433
|
+
function createHTMLElementConstructor(htmlString, ShadowRootMode) {
|
|
2434
|
+
return class extends HTMLElement {
|
|
2435
|
+
connectedCallback() {
|
|
2436
|
+
const mode = ShadowRootMode === ShadowRootModeType.open ? "open" : "closed";
|
|
2437
|
+
const shadow = this.attachShadow({ mode });
|
|
2438
|
+
getInitiatedSdk().then((sdk2) => {
|
|
2439
|
+
sdk2.connectedCallback(this, shadow);
|
|
2440
|
+
shadow.innerHTML = htmlString;
|
|
2441
|
+
});
|
|
2442
|
+
}
|
|
2443
|
+
};
|
|
2444
|
+
}
|
|
2445
|
+
var seen2, sdk, getInitiatedSdk, createCustomWebComponent, toWebComponentName, toCustomElementName, HTMLComponentLoader;
|
|
2446
|
+
var init_HTMLComponentLoader = __esm({
|
|
2447
|
+
"src/host/loaders/HTMLComponentLoader.ts"() {
|
|
2448
|
+
"use strict";
|
|
2449
|
+
init_myopWebcomponent();
|
|
2450
|
+
init_IMyopLoader();
|
|
2451
|
+
init_utils();
|
|
2452
|
+
init_common();
|
|
2453
|
+
init_webcomponent();
|
|
2454
|
+
init_myopIframeComponent();
|
|
2455
|
+
seen2 = [];
|
|
2456
|
+
getInitiatedSdk = async () => {
|
|
2457
|
+
if (!sdk) {
|
|
2458
|
+
sdk = new WebComponentSDK();
|
|
2459
|
+
sdk.init();
|
|
2460
|
+
}
|
|
2461
|
+
return sdk;
|
|
2462
|
+
};
|
|
2463
|
+
createCustomWebComponent = (componentName, html, ShadowRootMode) => {
|
|
2464
|
+
customElements.define(componentName, createHTMLElementConstructor(html, ShadowRootMode));
|
|
2465
|
+
console.log("define('".concat(componentName, "') was called, web component ready to use"));
|
|
2466
|
+
};
|
|
2467
|
+
toWebComponentName = (str) => {
|
|
2468
|
+
return str.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/(\d+)/g, "-$1").toLowerCase();
|
|
2469
|
+
};
|
|
2470
|
+
toCustomElementName = (name) => {
|
|
2471
|
+
name = toWebComponentName(name);
|
|
2472
|
+
return name.replace(/_/g, "-");
|
|
2473
|
+
};
|
|
2474
|
+
HTMLComponentLoader = class extends BaseMyopLoader {
|
|
2475
|
+
constructor() {
|
|
2476
|
+
super(...arguments);
|
|
2477
|
+
__publicField(this, "type", SkinLoaders.HTMLLoader);
|
|
2478
|
+
__publicField(this, "load", async (componentDefinition, skin, container, options) => {
|
|
2479
|
+
const loaderConfig = skin.loader;
|
|
2480
|
+
let domId = "myop-comp-".concat(uuidv4());
|
|
2481
|
+
let element;
|
|
2482
|
+
if (loaderConfig.shadowRootMode === ShadowRootModeType.localFrame) {
|
|
2483
|
+
const uniqId = uuidv4();
|
|
2484
|
+
const domId2 = "myop-comp-".concat(uniqId);
|
|
2485
|
+
let IframeElement = document.createElement("iframe");
|
|
2486
|
+
if (!container.querySelector('[id^="myop-comp-"]'))
|
|
2487
|
+
container.innerHTML = "";
|
|
2488
|
+
if (options == null ? void 0 : options.hidden) {
|
|
2489
|
+
IframeElement.style.visibility = "hidden";
|
|
2490
|
+
}
|
|
2491
|
+
IframeElement = this.appendChild(container, IframeElement, options);
|
|
2492
|
+
IframeElement.id = domId2;
|
|
2493
|
+
IframeElement.setAttribute("style", "\n display: block;\n padding: 0;\n margin: 0;\n overflow: hidden;\n border: none;\n opacity: ".concat((options == null ? void 0 : options.hidden) ? "0" : "1", ";\n width: 100%;\n height: 100%;\n position: ").concat((options == null ? void 0 : options.hidden) ? "absolute" : "static", ";\n pointer-events: ").concat((options == null ? void 0 : options.hidden) ? "none" : "all", ";\n "));
|
|
2494
|
+
container.appendChild(IframeElement);
|
|
2495
|
+
const doc = IframeElement.contentDocument || IframeElement.contentWindow.document;
|
|
2496
|
+
doc.open();
|
|
2497
|
+
let HTML2Render = loaderConfig.HTML;
|
|
2498
|
+
if (options == null ? void 0 : options._inspection) {
|
|
2499
|
+
const parser = new DOMParser();
|
|
2500
|
+
const _doc = parser.parseFromString(loaderConfig.HTML, "text/html");
|
|
2501
|
+
const myop_preview_script = _doc.getElementById("myop_preview");
|
|
2502
|
+
myop_preview_script == null ? void 0 : myop_preview_script.removeAttribute("type");
|
|
2503
|
+
const temp = _doc.implementation.createHTMLDocument();
|
|
2504
|
+
temp.body.innerHTML = "<script>\n const beforeKeysWindow = new Set(Object.keys(window));\n window.myopState = {\n beforeKeysWindow,\n };\n <\/script>";
|
|
2505
|
+
const node = temp.body.firstChild;
|
|
2506
|
+
if (node && _doc.head) {
|
|
2507
|
+
_doc.head.insertBefore(_doc.importNode(node, true), _doc.head.firstChild);
|
|
2508
|
+
}
|
|
2509
|
+
HTML2Render = _doc.documentElement.outerHTML;
|
|
2510
|
+
}
|
|
2511
|
+
doc.writeln(HTML2Render);
|
|
2512
|
+
doc.writeln('<script src="'.concat(window.myop.__ROOT_SDK_PUBLIC_URL__, '"><\/script>\n <script>\n \n window.__federation__.__public_path__ = window.__federation__.__public_path__;\n \n const __myop_init = async () => {\n const {IframeSDK} = (await window.myop.rootSDK.getIframeModule());\n const sdk = new IframeSDK()\n sdk.init();\n }\n \n __myop_init().then();\n \n <\/script>'));
|
|
2513
|
+
doc.close();
|
|
2514
|
+
const comp = new MyopIframeComponent(componentDefinition, skin, container, IframeElement, options);
|
|
2515
|
+
if (loaderConfig.autoHeight) {
|
|
2516
|
+
IframeElement.onload = () => {
|
|
2517
|
+
comp.observeSizeBasedOnDocumentElement();
|
|
2518
|
+
};
|
|
2519
|
+
}
|
|
2520
|
+
return comp;
|
|
2521
|
+
}
|
|
2522
|
+
if (loaderConfig.shadowRootMode === ShadowRootModeType.none) {
|
|
2523
|
+
const template = document.createElement("template");
|
|
2524
|
+
template.innerHTML = loaderConfig.HTML;
|
|
2525
|
+
element = template.content.firstElementChild;
|
|
2526
|
+
getInitiatedSdk().then((sdk2) => {
|
|
2527
|
+
sdk2.connectedCallback(element, element);
|
|
2528
|
+
});
|
|
2529
|
+
} else {
|
|
2530
|
+
const customElementName = toCustomElementName(componentDefinition.name + skin.id);
|
|
2531
|
+
if (!seen2.includes(customElementName)) {
|
|
2532
|
+
createCustomWebComponent(customElementName, loaderConfig.HTML, loaderConfig.shadowRootMode);
|
|
2533
|
+
seen2.push(customElementName);
|
|
2534
|
+
}
|
|
2535
|
+
element = document.createElement(customElementName);
|
|
2536
|
+
}
|
|
2537
|
+
if (!container.querySelector('[id^="myop-comp-"]'))
|
|
2538
|
+
container.innerHTML = "";
|
|
2539
|
+
element.id = domId;
|
|
2540
|
+
if (options == null ? void 0 : options.hidden) {
|
|
2541
|
+
element.style.opacity = "0";
|
|
2542
|
+
element.style.position = "absolute";
|
|
2543
|
+
element.style.height = "0";
|
|
2544
|
+
element.style.width = "0";
|
|
2545
|
+
element.style.pointerEvents = "none";
|
|
2546
|
+
element.style.visibility = "hidden";
|
|
2547
|
+
}
|
|
2548
|
+
this.appendChild(container, element, options);
|
|
2549
|
+
return new MyopWebComponent(componentDefinition, skin, container, element, options);
|
|
2550
|
+
});
|
|
2551
|
+
}
|
|
2552
|
+
};
|
|
2553
|
+
}
|
|
2554
|
+
});
|
|
2555
|
+
|
|
2556
|
+
// src/helpers/applyStylesheet.ts
|
|
2557
|
+
var applyStylesheet, applyStylesheetLink;
|
|
2558
|
+
var init_applyStylesheet = __esm({
|
|
2559
|
+
"src/helpers/applyStylesheet.ts"() {
|
|
2560
|
+
"use strict";
|
|
2561
|
+
init_utils();
|
|
2562
|
+
init_messages();
|
|
2563
|
+
applyStylesheet = (component, stylesheet, css) => {
|
|
2564
|
+
const tagId = "myop-css-".concat(uuidv4());
|
|
2565
|
+
component.send(new ExecuteScriptMessage(({ rootRef, _stylesheet, _tagId, _css }) => {
|
|
2566
|
+
const styleTag = document.createElement("style");
|
|
2567
|
+
styleTag.type = "text/css";
|
|
2568
|
+
let cssString = _css;
|
|
2569
|
+
for (const selector in _stylesheet) {
|
|
2570
|
+
cssString += "".concat(selector, " { ");
|
|
2571
|
+
const properties = _stylesheet[selector];
|
|
2572
|
+
for (const property in properties) {
|
|
2573
|
+
cssString += "".concat(property, ": ").concat(properties[property], "; ");
|
|
2574
|
+
}
|
|
2575
|
+
cssString += "} ";
|
|
2576
|
+
}
|
|
2577
|
+
styleTag.appendChild(document.createTextNode(cssString));
|
|
2578
|
+
styleTag.id = _tagId;
|
|
2579
|
+
(rootRef.shadowRoot || rootRef.container).appendChild(styleTag);
|
|
2580
|
+
}, () => {
|
|
2581
|
+
}, {
|
|
2582
|
+
_stylesheet: stylesheet,
|
|
2583
|
+
_css: css ? css : "",
|
|
2584
|
+
_tagId: tagId
|
|
2585
|
+
}));
|
|
2586
|
+
return () => {
|
|
2587
|
+
component.send(new ExecuteScriptMessage(({ rootRef, _tagId }) => {
|
|
2588
|
+
const element = (rootRef.shadowRoot || document).getElementById(_tagId);
|
|
2589
|
+
if (element) {
|
|
2590
|
+
element.remove();
|
|
2591
|
+
}
|
|
2592
|
+
}, () => {
|
|
2593
|
+
}, {
|
|
2594
|
+
_tagId: tagId
|
|
2595
|
+
}));
|
|
2596
|
+
};
|
|
2597
|
+
};
|
|
2598
|
+
applyStylesheetLink = (component, link) => {
|
|
2599
|
+
const tagId = "myop-css-".concat(uuidv4());
|
|
2600
|
+
component.send(new ExecuteScriptMessage(({ rootRef, _tagId, _link }) => {
|
|
2601
|
+
const linkElement = document.createElement("link");
|
|
2602
|
+
linkElement.id = _tagId;
|
|
2603
|
+
linkElement.rel = "stylesheet";
|
|
2604
|
+
linkElement.href = _link;
|
|
2605
|
+
document.head.appendChild(linkElement);
|
|
2606
|
+
(rootRef.shadowRoot || rootRef.container).appendChild(linkElement);
|
|
2607
|
+
}, () => {
|
|
2608
|
+
}, {
|
|
2609
|
+
_link: link,
|
|
2610
|
+
_tagId: tagId
|
|
2611
|
+
}));
|
|
2612
|
+
return () => {
|
|
2613
|
+
component.send(new ExecuteScriptMessage(({ rootRef, _tagId }) => {
|
|
2614
|
+
const element = (rootRef.shadowRoot || document).getElementById(_tagId);
|
|
2615
|
+
if (element) {
|
|
2616
|
+
element.remove();
|
|
2617
|
+
}
|
|
2618
|
+
}, () => {
|
|
2619
|
+
}, {
|
|
2620
|
+
_tagId: tagId
|
|
2621
|
+
}));
|
|
2622
|
+
};
|
|
2623
|
+
};
|
|
2624
|
+
}
|
|
2625
|
+
});
|
|
2626
|
+
|
|
2627
|
+
// src/helpers/iframeSkinUrlTokenizer.ts
|
|
2628
|
+
var replaceTokens, createIframeSkinByTokenizer, changeSkinUrlByTokenizer;
|
|
2629
|
+
var init_iframeSkinUrlTokenizer = __esm({
|
|
2630
|
+
"src/helpers/iframeSkinUrlTokenizer.ts"() {
|
|
2631
|
+
"use strict";
|
|
2632
|
+
replaceTokens = (input, tokenMap) => {
|
|
2633
|
+
const pattern = new RegExp(Object.keys(tokenMap).join("|"), "g");
|
|
2634
|
+
return input.replace(pattern, (matched) => {
|
|
2635
|
+
return (tokenMap[matched] || matched).toString();
|
|
2636
|
+
});
|
|
2637
|
+
};
|
|
2638
|
+
createIframeSkinByTokenizer = (selectedSkin, tokenMap) => {
|
|
2639
|
+
const typedSkinConfig = selectedSkin.loader;
|
|
2640
|
+
if (typedSkinConfig.type !== "IframeLoader") {
|
|
2641
|
+
throw new Error('iframeSkinUrlTokenizer received skin with loader type "'.concat(typedSkinConfig.type, '", currently only "IframeLoader" is supported'));
|
|
2642
|
+
}
|
|
2643
|
+
selectedSkin.loader = __spreadValues({}, selectedSkin.loader);
|
|
2644
|
+
selectedSkin.loader.url = replaceTokens(selectedSkin.loader.url, tokenMap);
|
|
2645
|
+
return selectedSkin;
|
|
2646
|
+
};
|
|
2647
|
+
changeSkinUrlByTokenizer = (tokenMap) => {
|
|
2648
|
+
return async (selectedSkin) => {
|
|
2649
|
+
return createIframeSkinByTokenizer(selectedSkin, tokenMap);
|
|
2650
|
+
};
|
|
2651
|
+
};
|
|
2652
|
+
}
|
|
2653
|
+
});
|
|
2654
|
+
|
|
2655
|
+
// src/helpers/classList.ts
|
|
2656
|
+
var addClass, removeClass;
|
|
2657
|
+
var init_classList = __esm({
|
|
2658
|
+
"src/helpers/classList.ts"() {
|
|
2659
|
+
"use strict";
|
|
2660
|
+
init_messages();
|
|
2661
|
+
addClass = (component, className, myopId) => {
|
|
2662
|
+
component.send(new CustomRefMessage(({ ref, _className }) => {
|
|
2663
|
+
ref == null ? void 0 : ref.classList.add(_className);
|
|
2664
|
+
}, {
|
|
2665
|
+
elementId: myopId,
|
|
2666
|
+
_className: className
|
|
2667
|
+
}));
|
|
2668
|
+
};
|
|
2669
|
+
removeClass = (component, className, myopId) => {
|
|
2670
|
+
component.send(new CustomRefMessage(({ ref, _className }) => {
|
|
2671
|
+
ref == null ? void 0 : ref.classList.remove(_className);
|
|
2672
|
+
}, {
|
|
2673
|
+
elementId: myopId,
|
|
2674
|
+
_className: className
|
|
2675
|
+
}));
|
|
2676
|
+
};
|
|
2677
|
+
}
|
|
2678
|
+
});
|
|
2679
|
+
|
|
2680
|
+
// src/helpers/configBuilder.ts
|
|
2681
|
+
var _SkinConfig, SkinConfig, _ComponentConfig, ComponentConfig;
|
|
2682
|
+
var init_configBuilder = __esm({
|
|
2683
|
+
"src/helpers/configBuilder.ts"() {
|
|
2684
|
+
"use strict";
|
|
2685
|
+
init_utils();
|
|
2686
|
+
_SkinConfig = class _SkinConfig {
|
|
2687
|
+
constructor() {
|
|
2688
|
+
__publicField(this, "_runTimeInstanceId", "runtime-instance-id-" + uuidv4());
|
|
2689
|
+
__publicField(this, "_runTimeId", "runtime-id-" + uuidv4());
|
|
2690
|
+
__publicField(this, "_runTimeName", "runtime-name-" + uuidv4());
|
|
2691
|
+
__publicField(this, "id", this._runTimeId);
|
|
2692
|
+
__publicField(this, "name", this._runTimeName);
|
|
2693
|
+
__publicField(this, "description", "");
|
|
2694
|
+
__publicField(this, "loader", null);
|
|
2695
|
+
__publicField(this, "withLoader", (loader) => {
|
|
2696
|
+
this.loader = loader;
|
|
2697
|
+
return this;
|
|
2698
|
+
});
|
|
2699
|
+
__publicField(this, "withHTMLLoader", (loader) => {
|
|
2700
|
+
loader.type = "HTMLLoader";
|
|
2701
|
+
this.loader = loader;
|
|
2702
|
+
return this;
|
|
2703
|
+
});
|
|
2704
|
+
__publicField(this, "build", () => {
|
|
2705
|
+
return this;
|
|
2706
|
+
});
|
|
2707
|
+
}
|
|
2708
|
+
};
|
|
2709
|
+
__publicField(_SkinConfig, "create", () => {
|
|
2710
|
+
return new _SkinConfig();
|
|
2711
|
+
});
|
|
2712
|
+
SkinConfig = _SkinConfig;
|
|
2713
|
+
_ComponentConfig = class _ComponentConfig {
|
|
2714
|
+
constructor() {
|
|
2715
|
+
__publicField(this, "_runTimeInstanceId", "runtime-instance-id-" + uuidv4());
|
|
2716
|
+
__publicField(this, "_runTimeId", "runtime-id-" + uuidv4());
|
|
2717
|
+
__publicField(this, "_runTimeName", "runtime-name-" + uuidv4());
|
|
2718
|
+
__publicField(this, "instance", {
|
|
2719
|
+
id: this._runTimeInstanceId,
|
|
2720
|
+
componentId: this._runTimeId,
|
|
2721
|
+
componentName: this._runTimeName,
|
|
2722
|
+
skinSelector: null
|
|
2723
|
+
});
|
|
2724
|
+
__publicField(this, "name", this._runTimeName);
|
|
2725
|
+
__publicField(this, "type", {
|
|
2726
|
+
id: this._runTimeId,
|
|
2727
|
+
name: this._runTimeName,
|
|
2728
|
+
description: "",
|
|
2729
|
+
props: [],
|
|
2730
|
+
refs: [],
|
|
2731
|
+
skins: [],
|
|
2732
|
+
defaultSkin: 0
|
|
2733
|
+
});
|
|
2734
|
+
__publicField(this, "withInstance", (instance) => {
|
|
2735
|
+
this.instance = instance;
|
|
2736
|
+
return this;
|
|
2737
|
+
});
|
|
2738
|
+
__publicField(this, "withType", (type) => {
|
|
2739
|
+
this.type = type;
|
|
2740
|
+
return this;
|
|
2741
|
+
});
|
|
2742
|
+
__publicField(this, "withName", (name) => {
|
|
2743
|
+
this.name = name;
|
|
2744
|
+
return this;
|
|
2745
|
+
});
|
|
2746
|
+
__publicField(this, "withDefaultSkin", (defaultSkin) => {
|
|
2747
|
+
this.type.skins.push(defaultSkin);
|
|
2748
|
+
this.type.defaultSkin = this.type.skins.length - 1;
|
|
2749
|
+
this.instance.skinSelector = {
|
|
2750
|
+
type: "Dedicated",
|
|
2751
|
+
skin: {
|
|
2752
|
+
id: defaultSkin.id
|
|
2753
|
+
}
|
|
2754
|
+
};
|
|
2755
|
+
return this;
|
|
2756
|
+
});
|
|
2757
|
+
__publicField(this, "withRef", (ref) => {
|
|
2758
|
+
this.type.refs.push(ref);
|
|
2759
|
+
return this;
|
|
2760
|
+
});
|
|
2761
|
+
__publicField(this, "withBasicRef", (refSelector) => {
|
|
2762
|
+
const newBasicRef = {
|
|
2763
|
+
id: "",
|
|
2764
|
+
name: refSelector,
|
|
2765
|
+
description: "",
|
|
2766
|
+
selectorType: "id-attribute",
|
|
2767
|
+
selector: refSelector,
|
|
2768
|
+
behavior: {
|
|
2769
|
+
type: "code"
|
|
2770
|
+
}
|
|
2771
|
+
};
|
|
2772
|
+
this.type.refs.push(newBasicRef);
|
|
2773
|
+
return this;
|
|
2774
|
+
});
|
|
2775
|
+
__publicField(this, "build", () => {
|
|
2776
|
+
return JSON.parse(JSON.stringify(this));
|
|
2777
|
+
});
|
|
2778
|
+
}
|
|
2779
|
+
};
|
|
2780
|
+
__publicField(_ComponentConfig, "create", () => {
|
|
2781
|
+
return new _ComponentConfig();
|
|
2782
|
+
});
|
|
2783
|
+
ComponentConfig = _ComponentConfig;
|
|
2784
|
+
}
|
|
2785
|
+
});
|
|
2786
|
+
|
|
2787
|
+
// src/helpers/CloudRepository.ts
|
|
2788
|
+
var _CloudRepository, CloudRepository, v2_CloudRepository;
|
|
2789
|
+
var init_CloudRepository = __esm({
|
|
2790
|
+
"src/helpers/CloudRepository.ts"() {
|
|
2791
|
+
"use strict";
|
|
2792
|
+
_CloudRepository = class _CloudRepository {
|
|
2793
|
+
constructor(_baseUrl = "https://cloud.myop.dev") {
|
|
2794
|
+
this._baseUrl = _baseUrl;
|
|
2795
|
+
// v2 cache
|
|
2796
|
+
__publicField(this, "variants", {});
|
|
2797
|
+
// v1 cache
|
|
2798
|
+
__publicField(this, "userFlows", {});
|
|
2799
|
+
}
|
|
2800
|
+
// ============ V2 Methods (Default) ============
|
|
2801
|
+
/**
|
|
2802
|
+
* Check if a component is already cached/preloaded (v2)
|
|
2803
|
+
*/
|
|
2804
|
+
isPreloaded(componentId) {
|
|
2805
|
+
return componentId in this.variants;
|
|
2806
|
+
}
|
|
2807
|
+
/**
|
|
2808
|
+
* Fetch a v2 component variant
|
|
2809
|
+
*/
|
|
2810
|
+
async fetchComponentV2(componentId, environmentIdentifier) {
|
|
2811
|
+
if (!this.variants[componentId]) {
|
|
2812
|
+
this.variants[componentId] = new Promise(
|
|
2813
|
+
async (resolve, reject) => {
|
|
2814
|
+
try {
|
|
2815
|
+
const res = await fetch(
|
|
2816
|
+
"".concat(this._baseUrl, "/consume?id=").concat(componentId, "&env=").concat(environmentIdentifier)
|
|
2817
|
+
);
|
|
2818
|
+
const json = await res.json();
|
|
2819
|
+
resolve(json.item);
|
|
2820
|
+
} catch (e) {
|
|
2821
|
+
reject(e);
|
|
2822
|
+
}
|
|
2823
|
+
}
|
|
2824
|
+
);
|
|
2825
|
+
}
|
|
2826
|
+
return await this.variants[componentId];
|
|
2827
|
+
}
|
|
2828
|
+
// ============ V1 Methods (Legacy) ============
|
|
2829
|
+
/**
|
|
2830
|
+
* Fetch a v1 component from a flow
|
|
2831
|
+
*/
|
|
2832
|
+
async fetchComponentV1(componentId, flowId) {
|
|
2833
|
+
if (flowId) {
|
|
2834
|
+
const flow = await this.fetchFlow(flowId);
|
|
2835
|
+
return flow.components.find((c) => c.type.id === componentId);
|
|
2836
|
+
} else {
|
|
2837
|
+
const flow = await this.fetchAutoFlow(componentId);
|
|
2838
|
+
return flow.components[0];
|
|
2839
|
+
}
|
|
2840
|
+
}
|
|
2841
|
+
async fetchAutoFlow(componentId) {
|
|
2842
|
+
if (!this.userFlows[componentId]) {
|
|
2843
|
+
this.userFlows[componentId] = new Promise(
|
|
2844
|
+
async (resolve, reject) => {
|
|
2845
|
+
try {
|
|
2846
|
+
const res = await fetch(
|
|
2847
|
+
"".concat(this._baseUrl, "/flow?id=").concat(componentId, "&auto=true")
|
|
2848
|
+
);
|
|
2849
|
+
const json = await res.json();
|
|
2850
|
+
resolve(json.item);
|
|
2851
|
+
} catch (e) {
|
|
2852
|
+
reject(e);
|
|
2853
|
+
}
|
|
2854
|
+
}
|
|
2855
|
+
);
|
|
2856
|
+
}
|
|
2857
|
+
return await this.userFlows[componentId];
|
|
2858
|
+
}
|
|
2859
|
+
async fetchFlow(flowId) {
|
|
2860
|
+
if (!this.userFlows[flowId]) {
|
|
2861
|
+
this.userFlows[flowId] = new Promise(
|
|
2862
|
+
async (resolve, reject) => {
|
|
2863
|
+
try {
|
|
2864
|
+
const res = await fetch(
|
|
2865
|
+
"".concat(this._baseUrl, "/flow?id=").concat(flowId, "&resolve=components")
|
|
2866
|
+
);
|
|
2867
|
+
const json = await res.json();
|
|
2868
|
+
resolve(json.item);
|
|
2869
|
+
} catch (e) {
|
|
2870
|
+
reject(e);
|
|
2871
|
+
}
|
|
2872
|
+
}
|
|
2873
|
+
);
|
|
2874
|
+
}
|
|
2875
|
+
return await this.userFlows[flowId];
|
|
2876
|
+
}
|
|
2877
|
+
// ============ Backward Compatibility ============
|
|
2878
|
+
/**
|
|
2879
|
+
* @deprecated Use fetchComponentV2 or fetchComponentV1 explicitly
|
|
2880
|
+
* Defaults to v1 behavior for backward compatibility with existing code
|
|
2881
|
+
*/
|
|
2882
|
+
async fetchComponent(componentId, flowId) {
|
|
2883
|
+
return this.fetchComponentV1(componentId, flowId);
|
|
2884
|
+
}
|
|
2885
|
+
};
|
|
2886
|
+
__publicField(_CloudRepository, "Main", new _CloudRepository());
|
|
2887
|
+
CloudRepository = _CloudRepository;
|
|
2888
|
+
v2_CloudRepository = CloudRepository;
|
|
2889
|
+
}
|
|
2890
|
+
});
|
|
2891
|
+
|
|
2892
|
+
// src/helpers/exec.ts
|
|
2893
|
+
var exec;
|
|
2894
|
+
var init_exec = __esm({
|
|
2895
|
+
"src/helpers/exec.ts"() {
|
|
2896
|
+
"use strict";
|
|
2897
|
+
exec = async (getter) => {
|
|
2898
|
+
return await getter();
|
|
2899
|
+
};
|
|
2900
|
+
}
|
|
2901
|
+
});
|
|
2902
|
+
|
|
2903
|
+
// src/helpers/index.ts
|
|
2904
|
+
var helpers_exports = {};
|
|
2905
|
+
__export(helpers_exports, {
|
|
2906
|
+
CloudRepository: () => CloudRepository,
|
|
2907
|
+
ComponentConfig: () => ComponentConfig,
|
|
2908
|
+
SkinConfig: () => SkinConfig,
|
|
2909
|
+
addClass: () => addClass,
|
|
2910
|
+
applyStylesheet: () => applyStylesheet,
|
|
2911
|
+
applyStylesheetLink: () => applyStylesheetLink,
|
|
2912
|
+
changeSkinUrlByTokenizer: () => changeSkinUrlByTokenizer,
|
|
2913
|
+
createIframeSkinByTokenizer: () => createIframeSkinByTokenizer,
|
|
2914
|
+
exec: () => exec,
|
|
2915
|
+
removeClass: () => removeClass,
|
|
2916
|
+
v2_CloudRepository: () => v2_CloudRepository
|
|
2917
|
+
});
|
|
2918
|
+
var init_helpers2 = __esm({
|
|
2919
|
+
"src/helpers/index.ts"() {
|
|
2920
|
+
"use strict";
|
|
2921
|
+
init_applyStylesheet();
|
|
2922
|
+
init_iframeSkinUrlTokenizer();
|
|
2923
|
+
init_classList();
|
|
2924
|
+
init_configBuilder();
|
|
2925
|
+
init_CloudRepository();
|
|
2926
|
+
init_exec();
|
|
2927
|
+
}
|
|
2928
|
+
});
|
|
2929
|
+
|
|
2930
|
+
// src/host/myopOverride.ts
|
|
2931
|
+
var checkMyopOverride;
|
|
2932
|
+
var init_myopOverride = __esm({
|
|
2933
|
+
"src/host/myopOverride.ts"() {
|
|
2934
|
+
"use strict";
|
|
2935
|
+
init_uuid();
|
|
2936
|
+
init_helpers2();
|
|
2937
|
+
init_common();
|
|
2938
|
+
checkMyopOverride = async (componentConfig) => {
|
|
2939
|
+
try {
|
|
2940
|
+
const url = new URL(window.location.href);
|
|
2941
|
+
const params = new URLSearchParams(url.search);
|
|
2942
|
+
const myopOverride = params.get("myopOverride");
|
|
2943
|
+
if (myopOverride) {
|
|
2944
|
+
const [source, ...uuids] = decompressUUIDs(myopOverride);
|
|
2945
|
+
switch (source) {
|
|
2946
|
+
case "component":
|
|
2947
|
+
{
|
|
2948
|
+
const [componentId, skinId] = uuids;
|
|
2949
|
+
const componentToOverride = await CloudRepository.Main.fetchComponent(componentId);
|
|
2950
|
+
if (componentToOverride) {
|
|
2951
|
+
const skin = componentToOverride.type.skins.find((skin2) => skin2.id === skinId);
|
|
2952
|
+
if (skin) {
|
|
2953
|
+
componentToOverride.instance.skinSelector = {
|
|
2954
|
+
type: SkinSelectorTypes.Dedicated,
|
|
2955
|
+
skin: {
|
|
2956
|
+
id: skinId
|
|
2957
|
+
}
|
|
2958
|
+
};
|
|
2959
|
+
return componentToOverride;
|
|
2960
|
+
}
|
|
2961
|
+
}
|
|
2962
|
+
}
|
|
2963
|
+
break;
|
|
2964
|
+
// case 'flow': {
|
|
2965
|
+
default:
|
|
2966
|
+
{
|
|
2967
|
+
const [flowId, experimentId] = decompressUUIDs(myopOverride);
|
|
2968
|
+
const flow = await CloudRepository.Main.fetchFlow(flowId);
|
|
2969
|
+
const componentToOverride = flow.components.find((c) => c.type.id === componentConfig.type.id);
|
|
2970
|
+
if (componentToOverride) {
|
|
2971
|
+
if (componentToOverride.instance.skinSelector.type === SkinSelectorTypes.Segmented) {
|
|
2972
|
+
if (componentToOverride.instance.resolvedExperiences) {
|
|
2973
|
+
const resolvedExperience = componentToOverride.instance.resolvedExperiences.find((e) => e.id === experimentId);
|
|
2974
|
+
if ((resolvedExperience == null ? void 0 : resolvedExperience.type) === ExperienceTypes.Segment) {
|
|
2975
|
+
const typedResolvedExperience = resolvedExperience;
|
|
2976
|
+
const typedSkinSelector = componentToOverride.instance.skinSelector;
|
|
2977
|
+
const segment = typedSkinSelector.segments.find((s) => s.segmentId === typedResolvedExperience.segment.id);
|
|
2978
|
+
if (segment) {
|
|
2979
|
+
componentToOverride.instance.skinSelector = segment == null ? void 0 : segment.skinSelector;
|
|
2980
|
+
return componentToOverride;
|
|
2981
|
+
}
|
|
2982
|
+
}
|
|
2983
|
+
}
|
|
2984
|
+
}
|
|
2985
|
+
}
|
|
2986
|
+
}
|
|
2987
|
+
break;
|
|
2988
|
+
}
|
|
2989
|
+
}
|
|
2990
|
+
} finally {
|
|
2991
|
+
return null;
|
|
2992
|
+
}
|
|
2993
|
+
};
|
|
2994
|
+
}
|
|
2995
|
+
});
|
|
2996
|
+
|
|
2997
|
+
// src/host/hostSDK.ts
|
|
2998
|
+
var hostSDK_exports = {};
|
|
2999
|
+
__export(hostSDK_exports, {
|
|
3000
|
+
HostSDK: () => HostSDK,
|
|
3001
|
+
hostSDK: () => hostSDK
|
|
3002
|
+
});
|
|
3003
|
+
var __ROOT_SDK_PUBLIC_URL__, HostSDK, hostSDK;
|
|
3004
|
+
var init_hostSDK = __esm({
|
|
3005
|
+
"src/host/hostSDK.ts"() {
|
|
3006
|
+
"use strict";
|
|
3007
|
+
init_defineDynamicImport();
|
|
3008
|
+
init_MyopMessages();
|
|
3009
|
+
init_messages();
|
|
3010
|
+
init_iframeLoader();
|
|
3011
|
+
init_webcomponentLoader();
|
|
3012
|
+
init_componentCore();
|
|
3013
|
+
init_common();
|
|
3014
|
+
init_myop_sdk_version();
|
|
3015
|
+
init_HTMLComponentLoader();
|
|
3016
|
+
init_myopOverride();
|
|
3017
|
+
__ROOT_SDK_PUBLIC_URL__ = "https://cdn.myop.dev/sdk/next/myop_sdk.min.js";
|
|
3018
|
+
HostSDK = class {
|
|
3019
|
+
constructor() {
|
|
3020
|
+
__publicField(this, "components2init", []);
|
|
3021
|
+
__publicField(this, "components", []);
|
|
3022
|
+
__publicField(this, "componentsLoaders", []);
|
|
3023
|
+
__publicField(this, "initiated", false);
|
|
3024
|
+
__publicField(this, "version", myop_sdk_version_default);
|
|
3025
|
+
__publicField(this, "type2InstanceCount", {});
|
|
3026
|
+
__publicField(this, "assignId", (componentDefinition) => {
|
|
3027
|
+
if (!this.type2InstanceCount[componentDefinition.id]) {
|
|
3028
|
+
this.type2InstanceCount[componentDefinition.id] = 0;
|
|
3029
|
+
}
|
|
3030
|
+
return "".concat(componentDefinition.id, "_").concat(++this.type2InstanceCount[componentDefinition.id]);
|
|
3031
|
+
});
|
|
3032
|
+
//TODO : fix the inspect implementation inside refComponent
|
|
3033
|
+
//then inspected maybe can be dropped
|
|
3034
|
+
__publicField(this, "inspected", false);
|
|
3035
|
+
__publicField(this, "inspect", () => {
|
|
3036
|
+
if (this.inspected)
|
|
3037
|
+
return;
|
|
3038
|
+
this.inspected = true;
|
|
3039
|
+
this.components.forEach((component) => {
|
|
3040
|
+
if (component.inspect) {
|
|
3041
|
+
component.inspect();
|
|
3042
|
+
}
|
|
3043
|
+
});
|
|
3044
|
+
});
|
|
3045
|
+
__publicField(this, "incomingMessageHandler", (event) => {
|
|
3046
|
+
if (event.origin === document.location.origin) {
|
|
3047
|
+
}
|
|
3048
|
+
if (event.data.myop) {
|
|
3049
|
+
if (event.data.direction !== MessageDirection.up && event.data.messageType !== MyopMessages.EnvelopedMessage) {
|
|
3050
|
+
return;
|
|
3051
|
+
}
|
|
3052
|
+
const myopMessage = event.data;
|
|
3053
|
+
if (myopMessage.messageType === MyopMessages.InitRequest) {
|
|
3054
|
+
this.components2init.forEach((component2) => {
|
|
3055
|
+
component2.send(new InitMessage(component2.id));
|
|
3056
|
+
});
|
|
3057
|
+
return;
|
|
3058
|
+
}
|
|
3059
|
+
if (myopMessage.messageType === MyopMessages.InitResponse) {
|
|
3060
|
+
this.components2init = this.components2init.filter((component2) => component2.id !== myopMessage.content.id);
|
|
3061
|
+
const initiatedComponent = this.components.find((component2) => {
|
|
3062
|
+
var _a2;
|
|
3063
|
+
return component2.id === ((_a2 = myopMessage.content) == null ? void 0 : _a2.id);
|
|
3064
|
+
});
|
|
3065
|
+
initiatedComponent == null ? void 0 : initiatedComponent.setInitiated();
|
|
3066
|
+
return;
|
|
3067
|
+
}
|
|
3068
|
+
if (myopMessage.messageType === MyopMessages.EnvelopedMessage) {
|
|
3069
|
+
const typedMessage = myopMessage;
|
|
3070
|
+
const refComponent = this.components.find((component2) => component2.id === typedMessage.destination);
|
|
3071
|
+
if (refComponent) {
|
|
3072
|
+
if (typedMessage.direction === MessageDirection.down) {
|
|
3073
|
+
if (typedMessage.message.messageType === ExecuteComponentMethod.name) {
|
|
3074
|
+
refComponent.onMessageReceived(typedMessage.message);
|
|
3075
|
+
} else {
|
|
3076
|
+
typedMessage.message.route = typedMessage.route;
|
|
3077
|
+
refComponent.send(typedMessage.message);
|
|
3078
|
+
}
|
|
3079
|
+
return;
|
|
3080
|
+
}
|
|
3081
|
+
} else {
|
|
3082
|
+
const innerComponent = this.components.find((component2) => component2.id === typedMessage.message.destination);
|
|
3083
|
+
if (innerComponent) {
|
|
3084
|
+
innerComponent.send(typedMessage.message);
|
|
3085
|
+
} else {
|
|
3086
|
+
}
|
|
3087
|
+
}
|
|
3088
|
+
return;
|
|
3089
|
+
}
|
|
3090
|
+
const component = this.components.find((component2) => component2.id === myopMessage.destination);
|
|
3091
|
+
if (!component) {
|
|
3092
|
+
if (window.myop.IframeSDK) {
|
|
3093
|
+
window.myop.IframeSDK.messageToHost(myopMessage);
|
|
3094
|
+
}
|
|
3095
|
+
return;
|
|
3096
|
+
}
|
|
3097
|
+
if (component) {
|
|
3098
|
+
if (component.onMessageReceived(myopMessage)) {
|
|
3099
|
+
return;
|
|
3100
|
+
} else {
|
|
3101
|
+
if (window.myop.IframeSDK)
|
|
3102
|
+
window.myop.IframeSDK.messageToHost(myopMessage);
|
|
3103
|
+
}
|
|
3104
|
+
}
|
|
3105
|
+
}
|
|
3106
|
+
});
|
|
3107
|
+
__publicField(this, "send", (message) => {
|
|
3108
|
+
const syntheticEvent = new MessageEvent(
|
|
3109
|
+
"",
|
|
3110
|
+
{ data: message }
|
|
3111
|
+
);
|
|
3112
|
+
this.incomingMessageHandler(syntheticEvent);
|
|
3113
|
+
});
|
|
3114
|
+
__publicField(this, "init", (customComponentLoaderCreators) => {
|
|
3115
|
+
if (this.initiated) {
|
|
3116
|
+
throw new Error("hostSDK already initiated");
|
|
3117
|
+
}
|
|
3118
|
+
const basicLoaders = [
|
|
3119
|
+
new MyopIframeLoader(),
|
|
3120
|
+
new WebcomponentLoader(),
|
|
3121
|
+
new HTMLComponentLoader()
|
|
3122
|
+
];
|
|
3123
|
+
this.componentsLoaders = [
|
|
3124
|
+
...basicLoaders
|
|
3125
|
+
];
|
|
3126
|
+
if (customComponentLoaderCreators) {
|
|
3127
|
+
const loaderByType = {};
|
|
3128
|
+
customComponentLoaderCreators.forEach((customComponentLoaderCreator) => {
|
|
3129
|
+
const customLoader = new customComponentLoaderCreator(this.componentsLoaders);
|
|
3130
|
+
loaderByType[customLoader.type] = customLoader;
|
|
3131
|
+
});
|
|
3132
|
+
this.componentsLoaders.forEach((loader) => {
|
|
3133
|
+
if (!loaderByType[loader.type])
|
|
3134
|
+
loaderByType[loader.type] = loader;
|
|
3135
|
+
});
|
|
3136
|
+
this.componentsLoaders = Object.values(loaderByType);
|
|
3137
|
+
}
|
|
3138
|
+
window.addEventListener(
|
|
3139
|
+
"message",
|
|
3140
|
+
this.incomingMessageHandler,
|
|
3141
|
+
false
|
|
3142
|
+
);
|
|
3143
|
+
console.log("myop hostSDK initiated", document.location.href);
|
|
3144
|
+
this.initiated = true;
|
|
3145
|
+
});
|
|
3146
|
+
__publicField(this, "_getSkinIdBySkinSelector", async (skinSelector, experiences = [], hooks) => {
|
|
3147
|
+
var _a2;
|
|
3148
|
+
async function asyncFind(array, predicate) {
|
|
3149
|
+
for (const item of array) {
|
|
3150
|
+
if (await predicate(item)) {
|
|
3151
|
+
return item;
|
|
3152
|
+
}
|
|
3153
|
+
}
|
|
3154
|
+
return void 0;
|
|
3155
|
+
}
|
|
3156
|
+
switch (skinSelector.type) {
|
|
3157
|
+
// @ts-ignore
|
|
3158
|
+
case "DedicatedSkin":
|
|
3159
|
+
//backward compatibility
|
|
3160
|
+
case SkinSelectorTypes.Dedicated:
|
|
3161
|
+
{
|
|
3162
|
+
let selectedSkinId = ((_a2 = skinSelector.skin) == null ? void 0 : _a2.id) || skinSelector.skins[0].id;
|
|
3163
|
+
return selectedSkinId;
|
|
3164
|
+
}
|
|
3165
|
+
break;
|
|
3166
|
+
case SkinSelectorTypes.Segmented:
|
|
3167
|
+
{
|
|
3168
|
+
const typedSkinSelector = skinSelector;
|
|
3169
|
+
const segment = await asyncFind(typedSkinSelector.segments, async (segment2) => {
|
|
3170
|
+
if (segment2.segmentId === "Default") {
|
|
3171
|
+
return true;
|
|
3172
|
+
}
|
|
3173
|
+
const experience = experiences.find((experience2) => {
|
|
3174
|
+
if (experience2.type === ExperienceTypes.Segment) {
|
|
3175
|
+
return experience2.segment.id === segment2.segmentId;
|
|
3176
|
+
}
|
|
3177
|
+
return false;
|
|
3178
|
+
});
|
|
3179
|
+
if (!experience) {
|
|
3180
|
+
throw new Error("experience not found");
|
|
3181
|
+
}
|
|
3182
|
+
const typedExperience = experience;
|
|
3183
|
+
const typedSegment = typedExperience.segment;
|
|
3184
|
+
const segmentFunction = (hooks ? hooks : {})[typedSegment.function];
|
|
3185
|
+
if (segmentFunction) {
|
|
3186
|
+
const results = await segmentFunction();
|
|
3187
|
+
return results;
|
|
3188
|
+
} else {
|
|
3189
|
+
console.warn("segmentId:".concat(segment2.segmentId, ", ").concat(typedSegment.function, " function not provided !"));
|
|
3190
|
+
}
|
|
3191
|
+
return false;
|
|
3192
|
+
});
|
|
3193
|
+
if (segment)
|
|
3194
|
+
return this._getSkinIdBySkinSelector(segment.skinSelector, experiences);
|
|
3195
|
+
else {
|
|
3196
|
+
debugger;
|
|
3197
|
+
}
|
|
3198
|
+
}
|
|
3199
|
+
break;
|
|
3200
|
+
default: {
|
|
3201
|
+
debugger;
|
|
3202
|
+
}
|
|
3203
|
+
}
|
|
3204
|
+
return "";
|
|
3205
|
+
});
|
|
3206
|
+
__publicField(this, "runSkinSelector", async (componentConfig, hooks) => {
|
|
3207
|
+
const skinId = await this._getSkinIdBySkinSelector(componentConfig.instance.skinSelector, componentConfig.instance.resolvedExperiences, hooks);
|
|
3208
|
+
return componentConfig.type.skins.find((skin) => skin.id === skinId);
|
|
3209
|
+
});
|
|
3210
|
+
__publicField(this, "loaderHooks");
|
|
3211
|
+
__publicField(this, "loadComponent", async (componentConfig, container, options) => {
|
|
3212
|
+
var _a2, _b, _c, _d;
|
|
3213
|
+
if (!container) {
|
|
3214
|
+
debugger;
|
|
3215
|
+
throw new Error("no container was found for this component");
|
|
3216
|
+
}
|
|
3217
|
+
const overriddenConfig = await checkMyopOverride(componentConfig);
|
|
3218
|
+
if (overriddenConfig) {
|
|
3219
|
+
componentConfig = overriddenConfig;
|
|
3220
|
+
}
|
|
3221
|
+
const hooks = __spreadValues(__spreadValues({}, (_a2 = this.loaderHooks) != null ? _a2 : {}), (_b = options == null ? void 0 : options.hooks) != null ? _b : {});
|
|
3222
|
+
const ref = container;
|
|
3223
|
+
if (ref.myop) {
|
|
3224
|
+
if (ref.component) {
|
|
3225
|
+
componentConfig = __spreadValues({}, componentConfig);
|
|
3226
|
+
componentConfig.instance = __spreadValues({}, componentConfig.instance);
|
|
3227
|
+
let selectedSkin2 = await this.runSkinSelector(componentConfig, hooks);
|
|
3228
|
+
if (!selectedSkin2) {
|
|
3229
|
+
throw new Error("runSkinSelector failed to choose skin, check the provided config");
|
|
3230
|
+
}
|
|
3231
|
+
if ((_c = options == null ? void 0 : options.hooks) == null ? void 0 : _c.afterSkinSelected) {
|
|
3232
|
+
selectedSkin2 = await options.hooks.afterSkinSelected(__spreadValues({}, selectedSkin2));
|
|
3233
|
+
}
|
|
3234
|
+
componentConfig.instance.skinSelector = {
|
|
3235
|
+
type: SkinSelectorTypes.Dedicated,
|
|
3236
|
+
skin: selectedSkin2
|
|
3237
|
+
// skins: [selectedSkin]
|
|
3238
|
+
};
|
|
3239
|
+
if (options) {
|
|
3240
|
+
options = __spreadValues({}, options);
|
|
3241
|
+
delete options.hooks;
|
|
3242
|
+
}
|
|
3243
|
+
const refComponent = await createRefComponent(ref, componentConfig, this.components, options);
|
|
3244
|
+
return refComponent;
|
|
3245
|
+
} else {
|
|
3246
|
+
throw new Error("load component got a detached ref.");
|
|
3247
|
+
}
|
|
3248
|
+
}
|
|
3249
|
+
container = container;
|
|
3250
|
+
let selectedSkin = await this.runSkinSelector(componentConfig, hooks);
|
|
3251
|
+
if (!selectedSkin) {
|
|
3252
|
+
throw new Error("runSkinSelector failed to choose skin, check the provided config");
|
|
3253
|
+
}
|
|
3254
|
+
if ((_d = options == null ? void 0 : options.hooks) == null ? void 0 : _d.afterSkinSelected) {
|
|
3255
|
+
selectedSkin = await options.hooks.afterSkinSelected(__spreadValues({}, selectedSkin));
|
|
3256
|
+
}
|
|
3257
|
+
const componentLoader = this.componentsLoaders.find((loader) => loader.type === selectedSkin.loader.type);
|
|
3258
|
+
if (!componentLoader) {
|
|
3259
|
+
debugger;
|
|
3260
|
+
throw new Error('no loader "'.concat(selectedSkin.loader.type, '" was found for component'));
|
|
3261
|
+
}
|
|
3262
|
+
let component = await componentLoader.load(componentConfig.type, selectedSkin, container, options);
|
|
3263
|
+
if (!component.isInitiated)
|
|
3264
|
+
this.components2init.push(component);
|
|
3265
|
+
component.bind("onDispose", () => {
|
|
3266
|
+
this.components = this.components.filter((c) => c !== component);
|
|
3267
|
+
this.components2init = this.components2init.filter((c) => c !== component);
|
|
3268
|
+
return true;
|
|
3269
|
+
});
|
|
3270
|
+
this.components.push(component);
|
|
3271
|
+
if (!options || options.connectProps !== false) {
|
|
3272
|
+
component = connectProps(component, componentConfig.type.props, selectedSkin);
|
|
3273
|
+
}
|
|
3274
|
+
try {
|
|
3275
|
+
await connectRefs(component, componentConfig, this.components);
|
|
3276
|
+
} catch (e) {
|
|
3277
|
+
throw e;
|
|
3278
|
+
}
|
|
3279
|
+
if (!(options == null ? void 0 : options.skipInit))
|
|
3280
|
+
await component.initiated();
|
|
3281
|
+
return component;
|
|
3282
|
+
});
|
|
3283
|
+
__publicField(this, "navigate", async (component, newComponentConfig, options) => {
|
|
3284
|
+
if (component.parent) {
|
|
3285
|
+
throw new Error("Navigating on remote ref components is not implemented yet");
|
|
3286
|
+
}
|
|
3287
|
+
if (options == null ? void 0 : options.staged) {
|
|
3288
|
+
let newComponent = await this.loadComponent(newComponentConfig, component.container, __spreadValues({
|
|
3289
|
+
hidden: true,
|
|
3290
|
+
relative: { direction: "after", child: component.element }
|
|
3291
|
+
}, options));
|
|
3292
|
+
if (options.init)
|
|
3293
|
+
await options.init(newComponent);
|
|
3294
|
+
newComponent.show();
|
|
3295
|
+
component.dispose();
|
|
3296
|
+
return newComponent;
|
|
3297
|
+
} else {
|
|
3298
|
+
const nextSibling = component.element.nextSibling;
|
|
3299
|
+
component.dispose();
|
|
3300
|
+
return this.loadComponent(newComponentConfig, component.container, __spreadValues({
|
|
3301
|
+
relative: {
|
|
3302
|
+
direction: "before",
|
|
3303
|
+
child: nextSibling
|
|
3304
|
+
}
|
|
3305
|
+
}, options));
|
|
3306
|
+
}
|
|
3307
|
+
});
|
|
3308
|
+
}
|
|
3309
|
+
};
|
|
3310
|
+
__publicField(HostSDK, "Instance", () => window.myop.hostSDK);
|
|
3311
|
+
if (!window.myop) {
|
|
3312
|
+
window.myop = {
|
|
3313
|
+
__ROOT_SDK_PUBLIC_URL__
|
|
3314
|
+
};
|
|
3315
|
+
}
|
|
3316
|
+
if (!window.myop.hostSDK) {
|
|
3317
|
+
const _hostSDK = new HostSDK();
|
|
3318
|
+
_hostSDK.init();
|
|
3319
|
+
if (!window.myop) {
|
|
3320
|
+
window.myop = {
|
|
3321
|
+
__ROOT_SDK_PUBLIC_URL__
|
|
3322
|
+
};
|
|
3323
|
+
}
|
|
3324
|
+
window.myop.hostSDK = _hostSDK;
|
|
3325
|
+
}
|
|
3326
|
+
hostSDK = window.myop.hostSDK;
|
|
3327
|
+
defineDynamicImport("hostSDK", hostSDK);
|
|
3328
|
+
}
|
|
3329
|
+
});
|
|
3330
|
+
|
|
3331
|
+
// src/Iframe/messageHandlers/DetectMyopRefsMessageHandler.ts
|
|
3332
|
+
var DetectMyopRefsMessageHandler2;
|
|
3333
|
+
var init_DetectMyopRefsMessageHandler2 = __esm({
|
|
3334
|
+
"src/Iframe/messageHandlers/DetectMyopRefsMessageHandler.ts"() {
|
|
3335
|
+
"use strict";
|
|
3336
|
+
init_MyopMessages();
|
|
3337
|
+
init_consts2();
|
|
3338
|
+
init_common();
|
|
3339
|
+
init_messages();
|
|
3340
|
+
DetectMyopRefsMessageHandler2 = class extends BaseMessageHandler {
|
|
3341
|
+
constructor() {
|
|
3342
|
+
super(...arguments);
|
|
3343
|
+
__publicField(this, "messageType", MyopMessages.DetectMyopRefsMessage);
|
|
3344
|
+
__publicField(this, "executor", (message) => {
|
|
3345
|
+
const allMyopItems = document.querySelectorAll("[".concat(myopAttributes.id, "]"));
|
|
3346
|
+
let myopRefs = [];
|
|
3347
|
+
allMyopItems.forEach((item) => {
|
|
3348
|
+
const myopId = item.getAttribute(myopAttributes.id);
|
|
3349
|
+
if (myopId) {
|
|
3350
|
+
myopRefs.push(new MyopElementRef(myopId, item.tagName, item.getBoundingClientRect()));
|
|
3351
|
+
}
|
|
3352
|
+
});
|
|
3353
|
+
this.messageToHost(new DetectedMyopRefsMessage(message.handlerUniqueId, myopRefs));
|
|
3354
|
+
});
|
|
3355
|
+
}
|
|
3356
|
+
};
|
|
3357
|
+
}
|
|
3358
|
+
});
|
|
3359
|
+
|
|
3360
|
+
// src/Iframe/messageHandlers/bindOnClickHandler.ts
|
|
3361
|
+
var BindOnClickHandler2;
|
|
3362
|
+
var init_bindOnClickHandler2 = __esm({
|
|
3363
|
+
"src/Iframe/messageHandlers/bindOnClickHandler.ts"() {
|
|
3364
|
+
"use strict";
|
|
3365
|
+
init_MyopMessages();
|
|
3366
|
+
init_common();
|
|
3367
|
+
init_messages();
|
|
3368
|
+
init_helpers();
|
|
3369
|
+
BindOnClickHandler2 = class extends BaseMessageHandler {
|
|
3370
|
+
constructor() {
|
|
3371
|
+
super(...arguments);
|
|
3372
|
+
__publicField(this, "messageType", MyopMessages.BindClickMessage);
|
|
3373
|
+
__publicField(this, "executor", (event) => {
|
|
3374
|
+
const cleanupTasks = [];
|
|
3375
|
+
const items = getElementsByRef(event.ref, document);
|
|
3376
|
+
items.forEach((item) => {
|
|
3377
|
+
const handler = () => {
|
|
3378
|
+
this.messageToHost(new ClickReplayMessage(), event);
|
|
3379
|
+
};
|
|
3380
|
+
item.addEventListener("click", handler);
|
|
3381
|
+
const cleanUpTask = () => {
|
|
3382
|
+
item.removeEventListener("click", handler);
|
|
3383
|
+
};
|
|
3384
|
+
cleanupTasks.push(cleanUpTask);
|
|
3385
|
+
});
|
|
3386
|
+
return () => {
|
|
3387
|
+
cleanupTasks.forEach((task) => task());
|
|
3388
|
+
};
|
|
3389
|
+
});
|
|
3390
|
+
}
|
|
3391
|
+
};
|
|
3392
|
+
}
|
|
3393
|
+
});
|
|
3394
|
+
|
|
3395
|
+
// src/Iframe/messageHandlers/changeTextHandler.ts
|
|
3396
|
+
var ChangeTextHandler2;
|
|
3397
|
+
var init_changeTextHandler2 = __esm({
|
|
3398
|
+
"src/Iframe/messageHandlers/changeTextHandler.ts"() {
|
|
3399
|
+
"use strict";
|
|
3400
|
+
init_MyopMessages();
|
|
3401
|
+
init_common();
|
|
3402
|
+
init_helpers();
|
|
3403
|
+
ChangeTextHandler2 = class extends BaseMessageHandler {
|
|
3404
|
+
constructor() {
|
|
3405
|
+
super(...arguments);
|
|
3406
|
+
__publicField(this, "messageType", MyopMessages.ChangeTextMessage);
|
|
3407
|
+
__publicField(this, "executor", (event) => {
|
|
3408
|
+
const items = getElementsByRef(event.ref, document);
|
|
3409
|
+
items.forEach((item) => {
|
|
3410
|
+
item.textContent = event.content;
|
|
3411
|
+
});
|
|
3412
|
+
});
|
|
3413
|
+
}
|
|
3414
|
+
};
|
|
3415
|
+
}
|
|
3416
|
+
});
|
|
3417
|
+
|
|
3418
|
+
// src/Iframe/messageHandlers/executeScriptHandler.ts
|
|
3419
|
+
var ExecuteScriptHandler2;
|
|
3420
|
+
var init_executeScriptHandler3 = __esm({
|
|
3421
|
+
"src/Iframe/messageHandlers/executeScriptHandler.ts"() {
|
|
3422
|
+
"use strict";
|
|
3423
|
+
init_MyopMessages();
|
|
3424
|
+
init_messages();
|
|
3425
|
+
init_common();
|
|
3426
|
+
init_executeScriptHandler();
|
|
3427
|
+
ExecuteScriptHandler2 = class extends BaseMessageHandler {
|
|
3428
|
+
constructor() {
|
|
3429
|
+
super(...arguments);
|
|
3430
|
+
__publicField(this, "messageType", MyopMessages.ExecuteScriptMessage);
|
|
3431
|
+
__publicField(this, "executor", (event) => {
|
|
3432
|
+
const replier = (data) => {
|
|
3433
|
+
this.messageToHost(new ExecuteScriptReplyMessage(event.handlerUniqueId, data));
|
|
3434
|
+
};
|
|
3435
|
+
ExecuteScriptHandlerExecutor(event, replier, new RootRef(document.documentElement));
|
|
3436
|
+
});
|
|
3437
|
+
}
|
|
3438
|
+
};
|
|
3439
|
+
}
|
|
3440
|
+
});
|
|
3441
|
+
|
|
3442
|
+
// src/Iframe/messageHandlers/addEventListenerHandler.ts
|
|
3443
|
+
var AddEventListenerHandler2;
|
|
3444
|
+
var init_addEventListenerHandler2 = __esm({
|
|
3445
|
+
"src/Iframe/messageHandlers/addEventListenerHandler.ts"() {
|
|
3446
|
+
"use strict";
|
|
3447
|
+
init_MyopMessages();
|
|
3448
|
+
init_common();
|
|
3449
|
+
init_messages();
|
|
3450
|
+
init_serialization();
|
|
3451
|
+
init_helpers();
|
|
3452
|
+
AddEventListenerHandler2 = class extends BaseMessageHandler {
|
|
3453
|
+
constructor() {
|
|
3454
|
+
super(...arguments);
|
|
3455
|
+
__publicField(this, "messageType", MyopMessages.AddEventListenerMessage);
|
|
3456
|
+
__publicField(this, "executor", (message) => {
|
|
3457
|
+
const items = getElementsByRef(message.ref, document);
|
|
3458
|
+
const cleanupTasks = [];
|
|
3459
|
+
items.forEach((item) => {
|
|
3460
|
+
const handler = (e) => {
|
|
3461
|
+
requestAnimationFrame(() => {
|
|
3462
|
+
this.messageToHost(new EventListenerCallbackMessage(message.handlerUniqueId, makeSerializable(e, message.serializableSkeleton)));
|
|
3463
|
+
});
|
|
3464
|
+
};
|
|
3465
|
+
item.addEventListener(message.type, handler);
|
|
3466
|
+
cleanupTasks.push(() => {
|
|
3467
|
+
item.removeEventListener(message.type, handler);
|
|
3468
|
+
});
|
|
3469
|
+
});
|
|
3470
|
+
return () => {
|
|
3471
|
+
cleanupTasks.forEach((task) => {
|
|
3472
|
+
task();
|
|
3473
|
+
});
|
|
3474
|
+
};
|
|
3475
|
+
});
|
|
3476
|
+
}
|
|
3477
|
+
};
|
|
3478
|
+
}
|
|
3479
|
+
});
|
|
3480
|
+
|
|
3481
|
+
// src/Iframe/messageHandlers/setAttributeHandler.ts
|
|
3482
|
+
var setAttributeHandler2;
|
|
3483
|
+
var init_setAttributeHandler2 = __esm({
|
|
3484
|
+
"src/Iframe/messageHandlers/setAttributeHandler.ts"() {
|
|
3485
|
+
"use strict";
|
|
3486
|
+
init_MyopMessages();
|
|
3487
|
+
init_common();
|
|
3488
|
+
init_helpers();
|
|
3489
|
+
setAttributeHandler2 = class extends BaseMessageHandler {
|
|
3490
|
+
constructor() {
|
|
3491
|
+
super(...arguments);
|
|
3492
|
+
__publicField(this, "messageType", MyopMessages.SetAttributeMessage);
|
|
3493
|
+
__publicField(this, "executor", (event) => {
|
|
3494
|
+
const items = getElementsByRef(event.ref, document);
|
|
3495
|
+
items.forEach((item) => {
|
|
3496
|
+
item.setAttribute(event.name, event.value);
|
|
3497
|
+
});
|
|
3498
|
+
});
|
|
3499
|
+
}
|
|
3500
|
+
};
|
|
3501
|
+
}
|
|
3502
|
+
});
|
|
3503
|
+
|
|
3504
|
+
// src/Iframe/messageHandlers/CreateRefComponentMessageHandler.ts
|
|
3505
|
+
var CreateRefComponentMessageHandler2;
|
|
3506
|
+
var init_CreateRefComponentMessageHandler2 = __esm({
|
|
3507
|
+
"src/Iframe/messageHandlers/CreateRefComponentMessageHandler.ts"() {
|
|
3508
|
+
"use strict";
|
|
3509
|
+
init_MyopMessages();
|
|
3510
|
+
init_consts2();
|
|
3511
|
+
init_common();
|
|
3512
|
+
init_hostSDK();
|
|
3513
|
+
init_CreateRefComponentMessage();
|
|
3514
|
+
CreateRefComponentMessageHandler2 = class extends BaseMessageHandler {
|
|
3515
|
+
constructor() {
|
|
3516
|
+
super(...arguments);
|
|
3517
|
+
__publicField(this, "messageType", MyopMessages.CreateRefComponentMessage);
|
|
3518
|
+
__publicField(this, "executor", (event) => {
|
|
3519
|
+
const createRef = async () => {
|
|
3520
|
+
const allItems = document.querySelectorAll("[".concat(myopAttributes.id, "='").concat(event.refConfig.selector, "']"));
|
|
3521
|
+
if (allItems.length === 1) {
|
|
3522
|
+
const hostSDK2 = HostSDK.Instance();
|
|
3523
|
+
const refComponent = await hostSDK2.loadComponent(
|
|
3524
|
+
event.nestedComponentConfig,
|
|
3525
|
+
allItems.item(0),
|
|
3526
|
+
event.options
|
|
3527
|
+
);
|
|
3528
|
+
const nestedRefConfig = [];
|
|
3529
|
+
Object.keys(refComponent.refs).forEach((refName) => {
|
|
3530
|
+
let ref = refComponent.refs[refName];
|
|
3531
|
+
ref = ref.__nonProxied || ref;
|
|
3532
|
+
if (ref.componentDefinition) {
|
|
3533
|
+
nestedRefConfig.push({
|
|
3534
|
+
refName,
|
|
3535
|
+
componentDefinitionId: ref.componentDefinition.id
|
|
3536
|
+
});
|
|
3537
|
+
}
|
|
3538
|
+
});
|
|
3539
|
+
this.messageToHost(new RefComponentCreatedMessage(event.handlerUniqueId, nestedRefConfig));
|
|
3540
|
+
} else {
|
|
3541
|
+
console.error("CreateRefComponentMessageHandler - DOM element not found");
|
|
3542
|
+
this.messageToHost(new RefComponentCreatedMessage(event.handlerUniqueId, [], true));
|
|
3543
|
+
debugger;
|
|
3544
|
+
}
|
|
3545
|
+
};
|
|
3546
|
+
createRef().then();
|
|
3547
|
+
});
|
|
3548
|
+
}
|
|
3549
|
+
};
|
|
3550
|
+
}
|
|
3551
|
+
});
|
|
3552
|
+
|
|
3553
|
+
// src/common/utils/domObserver.ts
|
|
3554
|
+
var observeDOM;
|
|
3555
|
+
var init_domObserver = __esm({
|
|
3556
|
+
"src/common/utils/domObserver.ts"() {
|
|
3557
|
+
"use strict";
|
|
3558
|
+
observeDOM = (obj, callback) => {
|
|
3559
|
+
if (!obj) {
|
|
3560
|
+
console.log("n");
|
|
3561
|
+
return;
|
|
3562
|
+
}
|
|
3563
|
+
let MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
|
|
3564
|
+
if (!obj || obj.nodeType !== 1) return;
|
|
3565
|
+
if (MutationObserver) {
|
|
3566
|
+
const mutationObserver = new MutationObserver(callback);
|
|
3567
|
+
const config = { attributes: true, childList: true, subtree: true };
|
|
3568
|
+
mutationObserver.observe(obj, config);
|
|
3569
|
+
return mutationObserver;
|
|
3570
|
+
} else if (window.addEventListener) {
|
|
3571
|
+
obj.addEventListener("DOMNodeInserted", callback, false);
|
|
3572
|
+
obj.addEventListener("DOMNodeRemoved", callback, false);
|
|
3573
|
+
}
|
|
3574
|
+
};
|
|
3575
|
+
}
|
|
3576
|
+
});
|
|
3577
|
+
|
|
3578
|
+
// src/Iframe/messageHandlers/SetMutationObserverHandler.ts
|
|
3579
|
+
var SetMutationObserverHandler;
|
|
3580
|
+
var init_SetMutationObserverHandler = __esm({
|
|
3581
|
+
"src/Iframe/messageHandlers/SetMutationObserverHandler.ts"() {
|
|
3582
|
+
"use strict";
|
|
3583
|
+
init_MyopMessages();
|
|
3584
|
+
init_messages();
|
|
3585
|
+
init_common();
|
|
3586
|
+
init_domObserver();
|
|
3587
|
+
SetMutationObserverHandler = class extends BaseMessageHandler {
|
|
3588
|
+
constructor() {
|
|
3589
|
+
super(...arguments);
|
|
3590
|
+
__publicField(this, "messageType", MyopMessages.SetMutationObserverMessage);
|
|
3591
|
+
__publicField(this, "executor", (event) => {
|
|
3592
|
+
if (event.source) {
|
|
3593
|
+
observeDOM(document.body, () => {
|
|
3594
|
+
this.messageToHost(
|
|
3595
|
+
new MutationObserverMessage()
|
|
3596
|
+
// new EnvelopedMessage(event.source!, new MutationObserverMessage())
|
|
3597
|
+
);
|
|
3598
|
+
});
|
|
3599
|
+
}
|
|
3600
|
+
});
|
|
3601
|
+
}
|
|
3602
|
+
};
|
|
3603
|
+
}
|
|
3604
|
+
});
|
|
3605
|
+
|
|
3606
|
+
// src/Iframe/messageHandlers/GetElementValueHandler.ts
|
|
3607
|
+
var getInputValue2, GetElementValueHandler2;
|
|
3608
|
+
var init_GetElementValueHandler2 = __esm({
|
|
3609
|
+
"src/Iframe/messageHandlers/GetElementValueHandler.ts"() {
|
|
3610
|
+
"use strict";
|
|
3611
|
+
init_MyopMessages();
|
|
3612
|
+
init_consts2();
|
|
3613
|
+
init_common();
|
|
3614
|
+
init_messages();
|
|
3615
|
+
init_serialization();
|
|
3616
|
+
init_helpers();
|
|
3617
|
+
getInputValue2 = (element) => {
|
|
3618
|
+
if (!element) return null;
|
|
3619
|
+
if (element.tagName === "FORM") {
|
|
3620
|
+
const formData = new FormData(element);
|
|
3621
|
+
const dataObject = {
|
|
3622
|
+
formData: {},
|
|
3623
|
+
unmappedData: []
|
|
3624
|
+
};
|
|
3625
|
+
const elements = element.querySelectorAll("input, select, textarea");
|
|
3626
|
+
let autoNameIndexer = -1;
|
|
3627
|
+
elements.forEach((element2) => {
|
|
3628
|
+
if (typeof element2.value === "string") {
|
|
3629
|
+
const myopId = element2.getAttribute(myopAttributes.id);
|
|
3630
|
+
let key = element2.getAttribute("name");
|
|
3631
|
+
const nodeData = {
|
|
3632
|
+
id: element2.id,
|
|
3633
|
+
name: key,
|
|
3634
|
+
value: getInputValue2(element2),
|
|
3635
|
+
required: element2.required,
|
|
3636
|
+
validity: makeSerializable(element2.validity, true),
|
|
3637
|
+
myopId
|
|
3638
|
+
};
|
|
3639
|
+
dataObject.unmappedData.push(nodeData);
|
|
3640
|
+
if (key) {
|
|
3641
|
+
if (!dataObject.formData[key] || !dataObject.formData[key].value || nodeData.value) {
|
|
3642
|
+
dataObject.formData[key] = nodeData;
|
|
3643
|
+
}
|
|
3644
|
+
}
|
|
3645
|
+
}
|
|
3646
|
+
});
|
|
3647
|
+
return dataObject;
|
|
3648
|
+
}
|
|
3649
|
+
if (element.type === "checkbox" || element.type === "radio") {
|
|
3650
|
+
return element.checked ? element.value : null;
|
|
3651
|
+
}
|
|
3652
|
+
if (element.tagName === "INPUT" || element.tagName === "TEXTAREA") {
|
|
3653
|
+
return element.value;
|
|
3654
|
+
}
|
|
3655
|
+
if (element.tagName === "SELECT") {
|
|
3656
|
+
return element.value;
|
|
3657
|
+
}
|
|
3658
|
+
if (element.isContentEditable) {
|
|
3659
|
+
return element.innerText || element.textContent;
|
|
3660
|
+
}
|
|
3661
|
+
return null;
|
|
3662
|
+
};
|
|
3663
|
+
GetElementValueHandler2 = class extends BaseMessageHandler {
|
|
3664
|
+
constructor() {
|
|
3665
|
+
super(...arguments);
|
|
3666
|
+
__publicField(this, "messageType", MyopMessages.GetElementValueMessage);
|
|
3667
|
+
__publicField(this, "executor", (event) => {
|
|
3668
|
+
const items = getElementsByRef(event.ref, document);
|
|
3669
|
+
items.forEach((item) => {
|
|
3670
|
+
this.messageToHost(new ElementValueReplayMessage(
|
|
3671
|
+
getInputValue2(item)
|
|
3672
|
+
), event);
|
|
3673
|
+
});
|
|
3674
|
+
});
|
|
3675
|
+
}
|
|
3676
|
+
};
|
|
3677
|
+
}
|
|
3678
|
+
});
|
|
3679
|
+
|
|
3680
|
+
// src/Iframe/messageHandlers/getAttributeHandler.ts
|
|
3681
|
+
var GetAttributeHandler;
|
|
3682
|
+
var init_getAttributeHandler = __esm({
|
|
3683
|
+
"src/Iframe/messageHandlers/getAttributeHandler.ts"() {
|
|
3684
|
+
"use strict";
|
|
3685
|
+
init_MyopMessages();
|
|
3686
|
+
init_common();
|
|
3687
|
+
init_messages();
|
|
3688
|
+
init_helpers();
|
|
3689
|
+
GetAttributeHandler = class extends BaseMessageHandler {
|
|
3690
|
+
constructor() {
|
|
3691
|
+
super(...arguments);
|
|
3692
|
+
__publicField(this, "messageType", MyopMessages.GetAttributeMessage);
|
|
3693
|
+
__publicField(this, "executor", (event) => {
|
|
3694
|
+
const item = getFirstElementByRef(event.ref, document);
|
|
3695
|
+
if (item) {
|
|
3696
|
+
this.messageToHost(new GetAttributeReplayMessage(item.getAttribute(event.name)), event);
|
|
3697
|
+
}
|
|
3698
|
+
});
|
|
3699
|
+
}
|
|
3700
|
+
};
|
|
3701
|
+
}
|
|
3702
|
+
});
|
|
3703
|
+
|
|
3704
|
+
// src/Iframe/messageHandlers/SetResizeObserverHandler.ts
|
|
3705
|
+
var SetResizeObserverHandler;
|
|
3706
|
+
var init_SetResizeObserverHandler = __esm({
|
|
3707
|
+
"src/Iframe/messageHandlers/SetResizeObserverHandler.ts"() {
|
|
3708
|
+
"use strict";
|
|
3709
|
+
init_messages();
|
|
3710
|
+
init_MyopMessages();
|
|
3711
|
+
init_common();
|
|
3712
|
+
SetResizeObserverHandler = class extends BaseMessageHandler {
|
|
3713
|
+
constructor() {
|
|
3714
|
+
super(...arguments);
|
|
3715
|
+
__publicField(this, "messageType", MyopMessages.SetResizeObserverMessage);
|
|
3716
|
+
__publicField(this, "executor", (event) => {
|
|
3717
|
+
const resizeObserver = new ResizeObserver((entries) => {
|
|
3718
|
+
this.messageToHost(new ResizeObserverMessage());
|
|
3719
|
+
});
|
|
3720
|
+
resizeObserver.observe(document.body);
|
|
3721
|
+
return () => {
|
|
3722
|
+
resizeObserver.disconnect();
|
|
3723
|
+
};
|
|
3724
|
+
});
|
|
3725
|
+
}
|
|
3726
|
+
};
|
|
3727
|
+
}
|
|
3728
|
+
});
|
|
3729
|
+
|
|
3730
|
+
// src/Iframe/messageHandlers/setInnerHtmlHandler.ts
|
|
3731
|
+
var SetInnerHtmlHandler2;
|
|
3732
|
+
var init_setInnerHtmlHandler2 = __esm({
|
|
3733
|
+
"src/Iframe/messageHandlers/setInnerHtmlHandler.ts"() {
|
|
3734
|
+
"use strict";
|
|
3735
|
+
init_MyopMessages();
|
|
3736
|
+
init_common();
|
|
3737
|
+
init_helpers();
|
|
3738
|
+
SetInnerHtmlHandler2 = class extends BaseMessageHandler {
|
|
3739
|
+
constructor() {
|
|
3740
|
+
super(...arguments);
|
|
3741
|
+
__publicField(this, "messageType", MyopMessages.SetInnerHtml);
|
|
3742
|
+
__publicField(this, "executor", (event) => {
|
|
3743
|
+
const items = getElementsByRef(event.ref, document);
|
|
3744
|
+
items.forEach((item) => {
|
|
3745
|
+
item.innerHTML = event.content;
|
|
3746
|
+
});
|
|
3747
|
+
});
|
|
3748
|
+
}
|
|
3749
|
+
};
|
|
3750
|
+
}
|
|
3751
|
+
});
|
|
3752
|
+
|
|
3753
|
+
// src/Iframe/IframeSDK.ts
|
|
3754
|
+
var IframeSDK_exports = {};
|
|
3755
|
+
__export(IframeSDK_exports, {
|
|
3756
|
+
IframeSDK: () => IframeSDK
|
|
3757
|
+
});
|
|
3758
|
+
var IframeSDK;
|
|
3759
|
+
var init_IframeSDK = __esm({
|
|
3760
|
+
"src/Iframe/IframeSDK.ts"() {
|
|
3761
|
+
"use strict";
|
|
3762
|
+
init_common();
|
|
3763
|
+
init_DetectMyopRefsMessageHandler2();
|
|
3764
|
+
init_bindOnClickHandler2();
|
|
3765
|
+
init_changeTextHandler2();
|
|
3766
|
+
init_executeScriptHandler3();
|
|
3767
|
+
init_defineDynamicImport();
|
|
3768
|
+
init_addEventListenerHandler2();
|
|
3769
|
+
init_setAttributeHandler2();
|
|
3770
|
+
init_messages();
|
|
3771
|
+
init_CreateRefComponentMessageHandler2();
|
|
3772
|
+
init_SetMutationObserverHandler();
|
|
3773
|
+
init_GetElementValueHandler2();
|
|
3774
|
+
init_myop_sdk_version();
|
|
3775
|
+
init_getAttributeHandler();
|
|
3776
|
+
init_SetResizeObserverHandler();
|
|
3777
|
+
init_setInnerHtmlHandler2();
|
|
3778
|
+
IframeSDK = class extends BaseMyopSDK {
|
|
3779
|
+
constructor() {
|
|
3780
|
+
super();
|
|
3781
|
+
__publicField(this, "version", myop_sdk_version_default);
|
|
3782
|
+
__publicField(this, "messageToHost", (message, replayTo) => {
|
|
3783
|
+
var _a2;
|
|
3784
|
+
if (!message.replayToHandler && (replayTo == null ? void 0 : replayTo.handlerUniqueId))
|
|
3785
|
+
message.replayToHandler = replayTo.handlerUniqueId;
|
|
3786
|
+
const componentIds = Object.keys(this.components);
|
|
3787
|
+
if (!message.destination) {
|
|
3788
|
+
if (replayTo == null ? void 0 : replayTo.route) {
|
|
3789
|
+
message.destination = replayTo.route[replayTo.route.length - 1];
|
|
3790
|
+
} else {
|
|
3791
|
+
message.destination = componentIds[0];
|
|
3792
|
+
}
|
|
3793
|
+
}
|
|
3794
|
+
if (!message.source)
|
|
3795
|
+
message.source = componentIds[0];
|
|
3796
|
+
message.direction = MessageDirection.up;
|
|
3797
|
+
(_a2 = window.parent) == null ? void 0 : _a2.postMessage(__spreadValues({}, message), "*");
|
|
3798
|
+
});
|
|
3799
|
+
__publicField(this, "supportedHandlers", [
|
|
3800
|
+
new ChangeTextHandler2(this.messageToHost),
|
|
3801
|
+
new SetInnerHtmlHandler2(this.messageToHost),
|
|
3802
|
+
new BindOnClickHandler2(this.messageToHost),
|
|
3803
|
+
new DetectMyopRefsMessageHandler2(this.messageToHost),
|
|
3804
|
+
new ExecuteScriptHandler2(this.messageToHost),
|
|
3805
|
+
new AddEventListenerHandler2(this.messageToHost),
|
|
3806
|
+
new setAttributeHandler2(this.messageToHost),
|
|
3807
|
+
new GetElementValueHandler2(this.messageToHost),
|
|
3808
|
+
new SetMutationObserverHandler(this.messageToHost),
|
|
3809
|
+
new SetResizeObserverHandler(this.messageToHost),
|
|
3810
|
+
new GetAttributeHandler(this.messageToHost),
|
|
3811
|
+
//composite support messages :
|
|
3812
|
+
new CreateRefComponentMessageHandler2(this.messageToHost)
|
|
3813
|
+
]);
|
|
3814
|
+
__publicField(this, "init", () => {
|
|
3815
|
+
window.onmessage = this.handleIncomeMessages.bind(this);
|
|
3816
|
+
this.messageToHost(new InitRequest());
|
|
3817
|
+
});
|
|
3818
|
+
if (!window.myop) {
|
|
3819
|
+
window.myop = {};
|
|
3820
|
+
}
|
|
3821
|
+
window.myop.IframeSDK = this;
|
|
3822
|
+
}
|
|
3823
|
+
};
|
|
3824
|
+
defineDynamicImport("IframeSDK", IframeSDK);
|
|
3825
|
+
}
|
|
3826
|
+
});
|
|
3827
|
+
|
|
3828
|
+
// src/messages/MyopMessages.ts
|
|
3829
|
+
var MyopMessages_exports = {};
|
|
3830
|
+
var MyopMessages2;
|
|
3831
|
+
var init_MyopMessages2 = __esm({
|
|
3832
|
+
"src/messages/MyopMessages.ts"() {
|
|
3833
|
+
"use strict";
|
|
3834
|
+
init_messages();
|
|
3835
|
+
init_defineDynamicImport();
|
|
3836
|
+
MyopMessages2 = __spreadValues({}, messages_exports);
|
|
3837
|
+
defineDynamicImport("MyopMessages", MyopMessages2);
|
|
3838
|
+
}
|
|
3839
|
+
});
|
|
3840
|
+
|
|
3841
|
+
// src/helpers/MyopHelpers.ts
|
|
3842
|
+
var MyopHelpers_exports = {};
|
|
3843
|
+
__export(MyopHelpers_exports, {
|
|
3844
|
+
CloudRepository: () => CloudRepository,
|
|
3845
|
+
ComponentConfig: () => ComponentConfig,
|
|
3846
|
+
SkinConfig: () => SkinConfig,
|
|
3847
|
+
addClass: () => addClass,
|
|
3848
|
+
applyStylesheet: () => applyStylesheet,
|
|
3849
|
+
applyStylesheetLink: () => applyStylesheetLink,
|
|
3850
|
+
changeSkinUrlByTokenizer: () => changeSkinUrlByTokenizer,
|
|
3851
|
+
createIframeSkinByTokenizer: () => createIframeSkinByTokenizer,
|
|
3852
|
+
exec: () => exec,
|
|
3853
|
+
removeClass: () => removeClass,
|
|
3854
|
+
v2_CloudRepository: () => v2_CloudRepository
|
|
3855
|
+
});
|
|
3856
|
+
var init_MyopHelpers = __esm({
|
|
3857
|
+
"src/helpers/MyopHelpers.ts"() {
|
|
3858
|
+
"use strict";
|
|
3859
|
+
init_defineDynamicImport();
|
|
3860
|
+
init_helpers2();
|
|
3861
|
+
init_helpers2();
|
|
3862
|
+
defineDynamicImport("MyopHelpers", helpers_exports);
|
|
3863
|
+
}
|
|
3864
|
+
});
|
|
3865
|
+
|
|
3866
|
+
// src/SDK.ts
|
|
3867
|
+
var SDK_exports = {};
|
|
3868
|
+
__export(SDK_exports, {
|
|
3869
|
+
getHostModule: () => getHostModule,
|
|
3870
|
+
getIframeModule: () => getIframeModule,
|
|
3871
|
+
getWebcomponentModule: () => getWebcomponentModule
|
|
3872
|
+
});
|
|
3873
|
+
|
|
3874
|
+
// src/dynamicImport/load__federation__.ts
|
|
3875
|
+
init_defineDynamicImport();
|
|
3876
|
+
var _a;
|
|
3877
|
+
if (!window["__federation__"]) {
|
|
3878
|
+
const scriptSrc = (_a = document.currentScript) == null ? void 0 : _a.src;
|
|
3879
|
+
const __public_auto_path__ = scriptSrc ? scriptSrc.split("/").slice(0, -1).join("/") : "";
|
|
3880
|
+
window["__federation__"] = {
|
|
3881
|
+
__public_auto_path__,
|
|
3882
|
+
__use_public_auto_path__: true,
|
|
3883
|
+
__public_path__: void 0,
|
|
3884
|
+
__loading_timeout__: 5 * 1e3
|
|
3885
|
+
};
|
|
3886
|
+
} else {
|
|
3887
|
+
console.log("__federation__ loaded more than once.");
|
|
3888
|
+
}
|
|
3889
|
+
window["__federation__"]["load__federation__"] = (scriptFilePath, moduleName, onLoad) => {
|
|
3890
|
+
if (!window["__federation__"][moduleName]) {
|
|
3891
|
+
let scriptTag;
|
|
3892
|
+
window["__federation__"][moduleName] = {};
|
|
3893
|
+
window["__federation__"][moduleName][onLoadKey] = (module) => {
|
|
3894
|
+
if (scriptTag) {
|
|
3895
|
+
document.head.removeChild(scriptTag);
|
|
3896
|
+
scriptTag = null;
|
|
3897
|
+
}
|
|
3898
|
+
window["__federation__"][moduleName][moduleInstanceKey] = module;
|
|
3899
|
+
onLoad(module);
|
|
3900
|
+
};
|
|
3901
|
+
scriptTag = document.createElement("script");
|
|
3902
|
+
scriptTag.type = "module";
|
|
3903
|
+
scriptTag.src = scriptFilePath;
|
|
3904
|
+
scriptTag.async = true;
|
|
3905
|
+
document.head.appendChild(scriptTag);
|
|
3906
|
+
} else {
|
|
3907
|
+
console.log("__federation__ module ".concat(moduleName, " already loaded."));
|
|
3908
|
+
onLoad(window["__federation__"][moduleName][moduleInstanceKey]);
|
|
3909
|
+
}
|
|
3910
|
+
};
|
|
3911
|
+
|
|
3912
|
+
// src/SDK.ts
|
|
3913
|
+
init_myop_sdk_version();
|
|
3914
|
+
console.log("myop root sdk - loaded", document.location.origin);
|
|
3915
|
+
var __ROOT_SDK_PUBLIC_URL__2 = "https://cdn.myop.dev/sdk/next/myop_sdk.min.js";
|
|
3916
|
+
var getHostModule = () => Promise.resolve().then(() => (init_hostSDK(), hostSDK_exports));
|
|
3917
|
+
var getIframeModule = () => Promise.resolve().then(() => (init_IframeSDK(), IframeSDK_exports));
|
|
3918
|
+
var getWebcomponentModule = () => Promise.resolve().then(() => (init_WebComponentSDK(), WebComponentSDK_exports));
|
|
3919
|
+
var getMyopMessages = () => Promise.resolve().then(() => (init_MyopMessages2(), MyopMessages_exports));
|
|
3920
|
+
var getMyopHelpers = () => Promise.resolve().then(() => (init_MyopHelpers(), MyopHelpers_exports));
|
|
3921
|
+
var exposeGlobally = (importFunction) => {
|
|
3922
|
+
return async () => (await importFunction()).get();
|
|
3923
|
+
};
|
|
3924
|
+
var rootSDK = {
|
|
3925
|
+
version: myop_sdk_version_default,
|
|
3926
|
+
getHostModule: exposeGlobally(getHostModule),
|
|
3927
|
+
getIframeModule: exposeGlobally(getIframeModule),
|
|
3928
|
+
getWebcomponentModule: exposeGlobally(getWebcomponentModule),
|
|
3929
|
+
getMyopMessages: exposeGlobally(getMyopMessages),
|
|
3930
|
+
getMyopHelpers: exposeGlobally(getMyopHelpers)
|
|
3931
|
+
};
|
|
3932
|
+
if (!window.myop) {
|
|
3933
|
+
window.myop = {
|
|
3934
|
+
__ROOT_SDK_PUBLIC_URL__: __ROOT_SDK_PUBLIC_URL__2
|
|
3935
|
+
};
|
|
3936
|
+
}
|
|
3937
|
+
if (!window.myop.rootSDK) {
|
|
3938
|
+
window.myop = __spreadValues({
|
|
3939
|
+
// @ts-ignore
|
|
3940
|
+
rootSDK
|
|
3941
|
+
}, window.myop);
|
|
3942
|
+
} else {
|
|
3943
|
+
console.log("myop root host loaded more than once.");
|
|
3944
|
+
}
|
|
3945
|
+
return __toCommonJS(SDK_exports);
|
|
3946
|
+
})();
|
|
3947
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvY29tbW9uL0Jhc2VNeW9wU0RLLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vaW5kZXgudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvZ01lc3NhZ2VzLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRDb3JlLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0lNeW9wTG9hZGVyLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvaWZyYW1lTG9hZGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvY29uc3RzLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL2NvbnN0cy50cyIsICIuLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L3NoYWRvd1Jvb3RSZWYudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESy50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9hcHBseVN0eWxlc2hlZXQudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvaWZyYW1lU2tpblVybFRva2VuaXplci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9jbGFzc0xpc3QudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvY29uZmlnQnVpbGRlci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9DbG91ZFJlcG9zaXRvcnkudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvZXhlYy50cyIsICIuLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyIsICIuLi8uLi9zcmMvaG9zdC9teW9wT3ZlcnJpZGUudHMiLCAiLi4vLi4vc3JjL2hvc3QvaG9zdFNESy50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vdXRpbHMvZG9tT2JzZXJ2ZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9nZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL1NldFJlc2l6ZU9ic2VydmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvSWZyYW1lU0RLLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvTXlvcEhlbHBlcnMudHMiLCAiLi4vLi4vc3JjL1NESy50cyIsICIuLi8uLi9zcmMvZHluYW1pY0ltcG9ydC9sb2FkX19mZWRlcmF0aW9uX18udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCBjb25zdCBfX2ZlZGVyYXRpb25fXyA9IFwiX19mZWRlcmF0aW9uX19cIlxuZXhwb3J0IGNvbnN0IG9uTG9hZEtleSA9IFwib25Mb2FkXCJcbmV4cG9ydCBjb25zdCBtb2R1bGVJbnN0YW5jZUtleSA9IFwibW9kdWxlSW5zdGFuY2VcIlxuXG5leHBvcnQgY29uc3QgZGVmaW5lRHluYW1pY0ltcG9ydCA9IChnbG9iYWxOYW1lOiBzdHJpbmcsIG1vZHVsZTogYW55KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh3aW5kb3dbX19mZWRlcmF0aW9uX19dICYmIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV0gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKHtbZ2xvYmFsTmFtZV06IG1vZHVsZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnX19mZWRlcmF0aW9uX18gbG9hZGVyIG5vdCBkZWZpbmVkIGZvciBtb2R1bGUnLCBtb2R1bGUpO1xuICAgIH1cbn0iLCAiZXhwb3J0IGRlZmF1bHQgJzAuMi40JzsiLCAidHlwZSBTdHJpbmdXaXRoQXV0b2NvbXBsZXRlPFQ+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+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NsZWFudXBNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjbGVhbnVwRm9yTWVzc2FnZUlkOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhbnVwUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY3VzdG9tQ2xlYW51cDogYm9vbGVhbikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2VNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEaXNwb3NlTWVzc2FnZSc7XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVPYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59IiwgImV4cG9ydCAqIGZyb20gJy4vQmFzZU1lc3NhZ2UnO1xuXG4vL3VzZXIncyBtZXNzYWdlc1xuZXhwb3J0ICogZnJvbSAnLi9CaW5kQ2xpY2tNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhbmdlVGV4dE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0N1c3RvbVJlZk1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BZGRFdmVudExpc3RlbmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vU2V0SW5uZXJIdG1sJztcblxuLy9zeXN0ZW0gbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vSW5pdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRW52ZWxvcGVkTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0RldGVjdE15b3BSZWZzTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAgJy4vR2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50TWVzc2FnZXMvRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2xlYW51cE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EaXNwb3NlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXksIE15b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIERpc3Bvc2VNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLCBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSxcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtIb3N0U0RLLCBsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG4vL1RPRE8gOiBjaGFuZ2UgSU15b3BDb21wb25lbnQgdG8gcmVmIHNwZWNpZmljIGltcGxcbnR5cGUgUmVmVHlwZXMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogSU15b3BDb21wb25lbnQgfCBSZWZcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiA9IGFueT4ge1xuXG4gICAgaWQ6IHN0cmluZztcblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuO1xuXG4gICAgbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW47XG5cbiAgICBzZXRJbml0aWF0ZWQ6ICgpID0+IHZvaWRcblxuICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50XG5cbiAgICAvL3JlZiBjb21wb25lbnRzIGNhbiBiZSBlbGVtZW50LWxlc3NcbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHNlbmQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gQ2xlYW51cEhhbmRsZXJcblxuICAgIGJpbmQobWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5LCBoYW5kbGVyOiAoKSA9PiBib29sZWFuKTogdm9pZDtcblxuICAgIGJpbmQ8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5LCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICAvLyBib29sZWFuIHJldHVybmVkIHZhbHVlID0gaGFuZGxlZCBvciBub3RcbiAgICBvbk1lc3NhZ2VSZWNlaXZlZDogKG1zZzogQmFzZU15b3BNZXNzYWdlKSA9PiBib29sZWFuXG5cbiAgICBpbml0aWF0ZWQ6ICgpID0+IFByb21pc2U8YW55PjtcblxuICAgIGRpc3Bvc2U6ICgpID0+IHZvaWRcblxuICAgIGhpZGUoKTogdm9pZDtcblxuICAgIHNob3coKTogdm9pZDtcblxuICAgIGluc3BlY3QoKTogdm9pZDtcblxuICAgIHBhcmVudD86IElNeW9wQ29tcG9uZW50O1xuXG4gICAgcHJvcHM6IFBcblxuICAgIHJlZnM6IFJcbn1cblxuZnVuY3Rpb24gaXNJbmhlcml0RnJvbShvYmo6IGFueSwgYmFzZUNsYXNzOiBhbnkpIHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcblxuICAgIGlmICghcHJvdG8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwcm90by5jb25zdHJ1Y3Rvci5uYW1lID09PSBiYXNlQ2xhc3MubmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzSW5oZXJpdEZyb20ocHJvdG8sIGJhc2VDbGFzcyk7XG59XG5cbi8vIFRPRE8gOiBtb3ZlIDogXG50eXBlIG1lc3NhZ2VIYW5kbGVyPFQ+ID0gKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW47XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcENvbXBvbmVudDxQID0gYW55LCBSIGV4dGVuZHMgUmVmVHlwZXMgPSBSZWZUeXBlcz4gaW1wbGVtZW50cyBJTXlvcENvbXBvbmVudDxQPiB7XG4gICAgaWQ6IHN0cmluZyA9ICcnXG5cbiAgICBtZXNzYWdlSGFuZGxlcnM6IFJlY29yZDxzdHJpbmcsIG1lc3NhZ2VIYW5kbGVyPGFueT5bXT4gPSB7fTtcblxuICAgIGVsZW1lbnQ/OiBIVE1MRWxlbWVudFxuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaWQgPSBvcHRpb25zPy5pZCB8fCBIb3N0U0RLLkluc3RhbmNlKCkuYXNzaWduSWQoY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zPy50aW1lb3V0ID8gb3B0aW9ucz8udGltZW91dCA6IDUgKiAxMDAwO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0luaXRpYXRlZCAmJiB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ICYmICF0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QoYHRpbWVvdXRfJHt0aW1lb3V0fSAke3RoaXMuaWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgIC8vIFRPRE8gOiBhdXRvIGluc3BlY3QsIGNvbnRyb2wgZnJvbSBjb25maWdcbiAgICAgICAgdGhpcy5pbml0aWF0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5ob3N0U0RLLmluc3BlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zcGVjdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9tYXJrZWRGb3JEaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgZ2V0IG1hcmtlZEZvckRpc3Bvc2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQ7XG4gICAgfVxuXG4gICAgc2V0IG1hcmtlZEZvckRpc3Bvc2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uOiBUaGUgY29tcG9uZW50IGlzIGFscmVhZHkgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGlzcG9zZWQuIERpc3Bvc2Ugb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgYWdhaW4gdW50aWwgdGhlIGN1cnJlbnQgZGlzcG9zYWwgcHJvY2VzcyBpcyBjb21wbGV0ZS4nKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaGlkZSgpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc2hvdygpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3QgaW5zcGVjdCgpOiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIC8vVE9ETzogdXNlIGJpbmRXaGVuIHdpdGggcmV0dXJuIHRydWUgcHJlZGljYXRlIC4uLlxuICAgIGJpbmQgPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0pIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgZHVwbGljYXRlIHJlZ2lzdHJhdGlvblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5pbmNsdWRlcyhoYW5kbGVyKSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kV2hlbiA9IDxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPihtZXNzYWdlVHlwZTogc3RyaW5nLCBwcmVkaWNhdGU6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuLCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gdm9pZCk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhblxcJ3QgdXNlIGNvbXBvbmVudC5iaW5kV2hlbiB3aXRob3V0IGFuIGhhbmRsZXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV07XG5cbiAgICAgICAgY29uc3QgcHJlZGljYXRlV3JhcHBlZEhhbmRsZXIgPSAoZTogVCkgPT4ge1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShlKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIoZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy9UT0RPIDogaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb24gP1xuICAgICAgICBoYW5kbGVycy5wdXNoKHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBoYW5kbGVycy5pbmRleE9mKHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdvbk1lc3NhZ2VSZWNlaXZlZCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIGluY29tZU1lc3NhZ2UsIHRoaXMpO1xuICAgICAgICAvL1RPRE8gOiBoYW5kZWwgc3BlY2lhbCBldmV0cyA/IGxpa2UgaW5pdFJlcyA/XG4gICAgICAgIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKGluY29tZU1lc3NhZ2UgYXMgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCk7XG5cbiAgICAgICAgICAgIC8va2VlcGluZyB0aGlzLm1ldGhvZCgpIHNvIHRoYXQgY29udGV4dCB3aWxsIHNhdmVkXG4gICAgICAgICAgICBpZiAoKHRoaXMgYXMgYW55KVt0eXBlZE1lc3NhZ2UubWV0aG9kXSkge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0odHlwZWRNZXNzYWdlLmNvbnRlbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgbWV0aG9kIG5vdCBmb3VuZCAke3R5cGVkTWVzc2FnZS5tZXRob2R9IG9uIGNvbXBvbmVudGAsIHRoaXMpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1tpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlXTtcbiAgICAgICAgaWYgKGhhbmRsZXJzICYmIGhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGhhbmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVkID0gaGFuZGxlZCB8fCBoYW5kbGVyKGluY29tZU1lc3NhZ2UpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBjb25zb2xlIG9ubHkgd2hlbiBkZWJ1ZyBjb25maWdcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25vIGhhbmRsZXJzIGZvdW5kIGZvciAnLCBpbmNvbWVNZXNzYWdlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXRJbml0aWF0ZWQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSlcbiAgICAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgaXNJbml0aWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIF93aGVuSW5pdGlhdGVkUmVzb2x2ZT86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuICAgIF93aGVuSW5pdGlhdGVkUmVqZWN0PzogKHZhbHVlPzogYW55KSA9PiBhbnk7XG5cbiAgICBfd2hlbkluaXRpYXRlZDogUHJvbWlzZTxhbnk+ID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICBpbml0aWF0ZWQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aGVuSW5pdGlhdGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VuZENsZWFudXBNZXNzYWdlKG1lc3NhZ2U6IENsZWFudXBNZXNzYWdlKTogdm9pZCB7XG4gICAgICAgIG1lc3NhZ2Uuc291cmNlID0gdGhpcy5pZDtcbiAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5iaW5kV2hlbihtZXNzYWdlLnJlcGx5TWVzc2FnZUtleSwgKG1zZzogTXlvcEJpbmRSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbXNnLnJlcGxheVRvSGFuZGxlciA9PT0gbWVzc2FnZS5oYW5kbGVyVW5pcXVlSWRcbiAgICAgICAgfSwgKG06IENsZWFudXBSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlLmhhbmRsZXIobSk7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcblxuICAgICAgICB0aGlzLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICB9XG5cbiAgICBzZW5kKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IENsZWFudXBIYW5kbGVyIHtcbiAgICAgICAgLy9tZXNzYWdlcyB0aGF0IGV4ZXRyYWN0ZWQgZnJvbSBlbnZlbG9wZSBhbHJlYWR5IGhhdmUgc291cmNlIGluIHRoZW1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnNvdXJjZSlcbiAgICAgICAgICAgIG1lc3NhZ2Uuc291cmNlID0gdGhpcy5pZDtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UuZGVzdGluYXRpb24pXG4gICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gdGhpcy5pZDtcblxuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBsZXQgY2xlYW51cEhhbmRsZXI7XG4gICAgICAgIC8vIFRPRE8gOiBmaXggaGVhdnkgb3AuLlxuICAgICAgICAvLyAgaWYgKGlzSW5oZXJpdEZyb20obWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlKSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChtZXNzYWdlLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChtZXNzYWdlIGFzIE15b3BCaW5kTWVzc2FnZSk7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4odHlwZWRNZXNzYWdlLnJlcGx5TWVzc2FnZUtleSwgKG1zZzogTXlvcEJpbmRSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IHR5cGVkTWVzc2FnZS5oYW5kbGVyVW5pcXVlSWRcbiAgICAgICAgICAgIH0sIHR5cGVkTWVzc2FnZS5oYW5kbGVyKTtcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2UuaGFuZGxlclxuICAgICAgICB9XG5cbiAgICAgICAgLy9UT0RPOiB0aGluayBhYm91dCB0aGF0XG4gICAgICAgIGlmIChtZXNzYWdlLnJlZikge1xuICAgICAgICAgICAgLy8gc2VyaWFsaXphYmxlXG4gICAgICAgICAgICBtZXNzYWdlLnJlZiA9IG1lc3NhZ2UucmVmLl9fbm9uUHJveGllZCB8fCBtZXNzYWdlLnJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRDbGVhbnVwTWVzc2FnZShuZXcgQ2xlYW51cE1lc3NhZ2UobWVzc2FnZS5pZCwgKHJlcGxheSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBsb2cgcmVwbGF5P1xuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcmtlZEZvckRpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IHVzZSBzZGsubG9nZ2VyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdkaXNwb3NpbmcgYmVmb3JlIGlzSW5pdGlhdGVkJywgdGhpcy5pZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ2Rpc3Bvc2luZyBjb21wb25lbnQnLCB0aGlzLmlkKTtcblxuICAgICAgICAvLyAvL1RPRE8gOiBpbXBsZW1lbnQgZGlzcG9zZSBmbG93XG4gICAgICAgIC8vIE9iamVjdC5rZXlzKHRoaXMucmVmcykuZm9yRWFjaChyZWZLZXk9PntcbiAgICAgICAgLy8gICAgIHRoaXMucmVmc1tyZWZLZXldLmRpc3Bvc2UoKTtcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy9UT0RPIDogY2hlY2sgaWYgdGhlcmUgaXMgYW55IHRpbWUgZm9yIHRoZSBvXG4gICAgICAgIC8vIHRoZXIgc2lkZSB0byBwcm9jY2VzcyB0byBtZXNzYWdlIGJlZm9yZSBkaWUgP1xuICAgICAgICAvL25vdGlmeSB0aGUgb3RoZXIgc2lkZSBTREtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBEaXNwb3NlTWVzc2FnZSgpKVxuXG4gICAgICAgIGNvbnN0IG9uRGlzcG9zZUhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbJ29uRGlzcG9zZSddXG4gICAgICAgIGlmIChvbkRpc3Bvc2VIYW5kbGVycykge1xuICAgICAgICAgICAgb25EaXNwb3NlSGFuZGxlcnMuZm9yRWFjaChkaXNwb3NlSGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2VuZCBudWxsIG9yIGZpeCB0aGUgdHlwZSA/XG4gICAgICAgICAgICAgICAgZGlzcG9zZUhhbmRsZXIobnVsbCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzID0ge31cbiAgICAgICAgdGhpcy5pZCArPSAnX2Rpc3Bvc2VkJztcbiAgICAgICAgdGhpcy5pc0luaXRpYXRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByb3BzOiBQID0ge30gYXMgdW5rbm93biBhcyBQO1xuICAgIHJlZnM6IFIgPSB7fSBhcyB1bmtub3duIGFzIFI7XG59XG4iLCAiZXhwb3J0IGludGVyZmFjZSBJRWxlbWVudFJlZiB7XG4gICAgbXlvcElkPzogc3RyaW5nXG4gICAgaHRtbFRhZ05hbWU6IHN0cmluZ1xuICAgIEJvdW5kaW5nUmVjdD86IERPTVJlY3RcbiAgICBvZmZzZXRUb3A/OiBudW1iZXJcbiAgICBvZmZzZXRMZWZ0PzogbnVtYmVyXG5cbiAgICB0eXBlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFhQYXRoRWxlbWVudFJlZiBpbXBsZW1lbnRzIElFbGVtZW50UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgeFBhdGg6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgaHRtbFRhZ05hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgQm91bmRpbmdSZWN0PzogRE9NUmVjdCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0VG9wPzogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRMZWZ0PzogbnVtYmVyKSB7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IHN0cmluZyA9ICdYUGF0aEVsZW1lbnRSZWYnXG59XG5cbmV4cG9ydCBjbGFzcyBNeW9wRWxlbWVudFJlZiBpbXBsZW1lbnRzIElFbGVtZW50UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbXlvcElkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuXG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IHN0cmluZyA9ICdNeW9wRWxlbWVudFJlZidcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyfSBmcm9tIFwiLi9pbmRleC50c1wiO1xuXG5leHBvcnQgdHlwZSBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCA9IENsZWFudXBIYW5kbGVyIHwgUHJvbWlzZTxDbGVhbnVwSGFuZGxlcj4gfCBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblxuZXhwb3J0IGNvbnN0IHJ1bkV4ZWN1dG9yQ2xlYW51cCA9IGFzeW5jICh0YXNrOiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCkgPT4ge1xuICAgIGlmICh0eXBlb2YgdGFzayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBJdCdzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgdGFzaygpO1xuICAgIH0gZWxzZSBpZiAodGFzayBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgLy8gSXQncyBhIFByb21pc2UsIGF3YWl0IGl0XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhc2s7XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgYSBmdW5jdGlvbiwgY2FsbCBpdFxuICAgICAgICAgICAgcmVzdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGFzayBpcyB2b2lkLCBkbyBub3RoaW5nXG59XG5cbnR5cGUgSU1lc3NhZ2VFeGVjdXRvcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPiA9IChtZXNzYWdlOiBUKSA9PiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cDtcblxuaW50ZXJmYWNlIElNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG5cbiAgICBleGVjdXRvcjogSU1lc3NhZ2VFeGVjdXRvcjxUPjtcblxuICAgIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnk+IGltcGxlbWVudHMgSU1lc3NhZ2VIYW5kbGVyPFQ+IHtcblxuICAgIC8vVE9ETyA6IGFkZCBkaXNwb3NlIG1ldGhvZFxuXG4gICAgY29uc3RydWN0b3IocHVibGljIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkKSB7XG5cbiAgICB9XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbiAgICBhYnN0cmFjdCBleGVjdXRvcjogSU1lc3NhZ2VFeGVjdXRvcjxUPjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSA9IGFueSwgRSA9IGFueT4gZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCwgcHVibGljIGNvbnRleHQ/OiBFKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2VUb0hvc3QpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBydW5FeGVjdXRvckNsZWFudXB9IGZyb20gXCIuL2luZGV4LnRzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vYmFzZU1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSwgQ2xlYW51cE1lc3NhZ2UsIENsZWFudXBSZXBsYXlNZXNzYWdlLCBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBFbnZlbG9wZWRNZXNzYWdlLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXNwb25zZSxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBIb3N0ZWRDb21wb25lbnQ8VCA9IGFueT4ge1xuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgfVxuXG4gICAgLy9vbk1lc3NhZ2VSZWNlaXZlZDogKG1zZzogSU15b3BNZXNzYWdlKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGlkOiBzdHJpbmcsIHB1YmxpYyBjb250ZXh0PzogVCkge1xuXG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wU0RLIHtcbiAgICBpbml0OiAoKSA9PiB2b2lkO1xuXG4gICAgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWRcblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXTtcblxuICAgIGhhbmRsZUluY29tZU1lc3NhZ2VzOiAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ+O1xufVxuXG4vLyBjb25zdCBsb2NhbEhvc3RIYW5kbGVkTWVzc2FnZXMgPSBbXG4vLyAgICAgTXlvcE1lc3NhZ2VzLkluaXRSZXF1ZXN0LFxuLy8gICAgIE15b3BNZXNzYWdlcy5Jbml0UmVzcG9uc2UsXG4vLyAgICAgLy9NeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSxcbi8vIF1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wU0RLIGltcGxlbWVudHMgSU15b3BTREsge1xuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW107XG5cbiAgICBtZXNzYWdlVG9IYW5kbGVBZnRlckluaXQ6IEJhc2VNeW9wTWVzc2FnZVtdID0gW107XG5cbiAgICBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ+ID0ge307XG5cbiAgICBhbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0OiBib29sZWFuID0gZmFsc2VcblxuICAgIG1lc3NhZ2VDbGVhbnVwQ2FjaGU6IFJlY29yZDxzdHJpbmcsIENsZWFudXBIYW5kbGVyIHwgUHJvbWlzZTxDbGVhbnVwSGFuZGxlcj4+IHwgUHJvbWlzZTx2b2lkPiA9IHt9O1xuXG4gICAgaGFuZGxlSW5jb21lTWVzc2FnZXMoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCBldmVudENvbnRlbnQgPSBldmVudC5kYXRhID8gZXZlbnQuZGF0YSA6IGV2ZW50LmRldGFpbDtcblxuICAgICAgICBpZiAoIWV2ZW50Q29udGVudCB8fCAhZXZlbnRDb250ZW50Lm15b3ApIHtcbiAgICAgICAgICAgIC8vIG5vdCBteW9wIG1hcmtlZCBldmVudCBcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gZXZlbnRDb250ZW50IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZGlyZWN0aW9uICE9PSBNZXNzYWdlRGlyZWN0aW9uLmRvd24pIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtZXNzYWdlIGRyb3BwZWQgaW4gYmFzZVNESywgZGlyZWN0aW9uIHdhcyAnLCBldmVudC5kYXRhLmRpcmVjdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIChsb2NhbEhvc3RIYW5kbGVkTWVzc2FnZXMuaW5jbHVkZXMobWVzc2FnZS5tZXNzYWdlVHlwZSkpIHtcbiAgICAgICAgICAgIC8vICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vICAgICAvL1RPRE8gOiBmaXggZGlyZWN0aW9uID8gbWVzc2FnZSB3aWxsIG5vdCBwcm9jY2VzcyBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vICAgICB3aW5kb3cubXlvcC5ob3N0U0RLLnNlbmQobWVzc2FnZSlcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRGlzcG9zZU1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2hvdWxkIG5vdCBiZSBvcHRpb25hbCwgZml4IGFuZCByZW1vdmUgJ2lmJ1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb21wb25lbnRzW21lc3NhZ2UuZGVzdGluYXRpb25dXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXZSBnb3Qgb3VyIGlkIGZyb20gb3VyIGhvc3RTREtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBTREsgbWF5IHNlcnZlIG1vcmUgdGhhbiAxIGNvbXBvbmVudCAuLiB0aGluayBhYm91dCB0aGF0XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbXBvbmVudElkID0gKG1lc3NhZ2UgYXMgSW5pdE1lc3NhZ2UpLmNvbnRlbnQuaWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICAvL3Rocm93IG5ldyBFcnJvcihcInJlY2hpdmVkIGluaXQgbWVzc2FnZSBmb3IgYW4gZXhzaXNpbmcgY29tcG9uZW50LlwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXSA9IG5ldyBIb3N0ZWRDb21wb25lbnQobmV3Q29tcG9uZW50SWQpXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVzcG9uc2UobmV3Q29tcG9uZW50SWQpKTtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBpcyBpdCB0cnVlIHRvIG5vdCBwYXNzIGZ1cnRoZXIgKCB0byB0aGUgY29tcG9uZW50IClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGZvciBzYW1lIEhvc3RTREsgY2FzZXNcbiAgICAgICAgICAgIC8vIHdoZW4gYm90aCBSZWZDb21wb25lbnQgYW5kIHJlYWxDb21wb25lbnQgaG9zdGVkIGluIHRoZSBzYW1lIEhvc3RTREtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudmVsb3BlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbm5lck1lc3NhZ2UgPSBlbnZlbG9wZWRNZXNzYWdlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGlubmVyTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3QgfHwgdGhpcy5jb21wb25lbnRzW21lc3NhZ2UuZGVzdGluYXRpb24hXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQ29tcG9uZW50ID0gbXlvcC5ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGlubmVyTWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db21wb25lbnQuc2VuZChpbm5lck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudCA9IG15b3AuaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBlbnZlbG9wZWRNZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudC5zZW5kKGlubmVyTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZihtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSl7XG4gICAgICAgICAgICAvLyAgICAgY29uc3QgdHlwZWRNZXNzYWdlIDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZTtcbiAgICAgICAgICAgIC8vIC8vICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUpIHtcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuQ2xlYW51cE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gbWVzc2FnZSBhcyBDbGVhbnVwTWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9IHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVt0eXBlZE1lc3NhZ2UuY2xlYW51cEZvck1lc3NhZ2VJZF07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cE1lc3NhZ2UgPSBuZXcgQ2xlYW51cFJlcGxheU1lc3NhZ2UoISFjbGVhbnVwKTtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cE1lc3NhZ2UuZGVzdGluYXRpb24gPSBtZXNzYWdlLmRlc3RpbmF0aW9uO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghIWNsZWFudXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbdHlwZWRNZXNzYWdlLmNsZWFudXBGb3JNZXNzYWdlSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuRXhlY3V0b3JDbGVhbnVwKGNsZWFudXApLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChjbGVhbnVwTWVzc2FnZSwgdHlwZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBoYW5kZWwgZXJyb3I/XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KGNsZWFudXBNZXNzYWdlLCB0eXBlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgYWN0aW9uSGFuZGxlckZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnN1cHBvcnRlZEhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyLm1lc3NhZ2VUeXBlID09PSBtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25IYW5kbGVyRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9IGhhbmRsZXIuZXhlY3V0b3IobWVzc2FnZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmNsZWFuYWJsZSAmJiBjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW21lc3NhZ2UuaWRdID0gY2xlYW51cDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFudXAgJiYgIW1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDbGVhbnVwIGhhbmRsZXIgZ2VuZXJhdGVkIGZvciBub24tY2xlYW5hYmxlIG1lc3NhZ2UuIFxubWVzc2FnZVR5cGUgLSAke21lc3NhZ2UubWVzc2FnZVR5cGV9LCBoYW5kbGVyIGV4ZWN1dG9yIHdhcyAtICR7aGFuZGxlci5leGVjdXRvcn1cblxuUGxlYXNlIHJldmlldyB0aGUgbWVzc2FnZSBkZWZpbml0aW9uIG9iamVjdCAmIG1lc3NhZ2UgaGFuZGxlci5cblRvIGVuc3VyZSBjbGVhbnVwIHByb3Blcmx5IHNldCAnY2xlYW5hYmxlJyB0cnVlIGF0IG1lc3NhZ2UgZGVmaW5pdGlvbiBhbmQgcmV0dXJuIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwIGZyb20geW91ciBoYW5kbGVycy5gKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsZWFudXAgJiYgbWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNsZWFudXAgaGFuZGxlciBnZW5lcmF0ZWQgZm9yIGEgY2xlYW5hYmxlIG1lc3NhZ2UuIFxubWVzc2FnZVR5cGUgLSAke21lc3NhZ2UubWVzc2FnZVR5cGV9LCBoYW5kbGVyIGV4ZWN1dG9yIHdhcyAtICR7aGFuZGxlci5leGVjdXRvcn1cblxuUGxlYXNlIHJldmlldyB0aGUgbWVzc2FnZSBkZWZpbml0aW9uIG9iamVjdCAmIG1lc3NhZ2UgaGFuZGxlci5cblRvIGVuc3VyZSBjbGVhbnVwIHByb3Blcmx5IHNldCAnY2xlYW5hYmxlJyB0cnVlIGF0IG1lc3NhZ2UgZGVmaW5pdGlvbiBhbmQgcmV0dXJuIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwIGZyb20geW91ciBoYW5kbGVycy5gKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGlmICghYWN0aW9uSGFuZGxlckZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHByaW50IHdpdGggZGVidWcgY29uZmlnIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbm8gbWVzc2FnZSBoYW5kbGVyIHdhcyBmb3VuZCBmb3IgJywgbWVzc2FnZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd1bnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUnKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaW5pdDogKCkgPT4gdm9pZDtcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcblxuZXhwb3J0ICogZnJvbSAnLi9NeW9wRWxlbWVudFJlZic7XG5leHBvcnQgKiBmcm9tICcuL2Jhc2VNZXNzYWdlSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL0Jhc2VNeW9wU0RLJztcblxuZXhwb3J0IHR5cGUgQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB2b2lkXG5cbmV4cG9ydCB0eXBlIERpY3Rpb25hcnk8VD4gPSB7IFtrZXk6IHN0cmluZ106IFQ7IH07XG5cbi8vZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSAnSWZyYW1lTG9hZGVyJyB8ICdXZWJDb21wb25lbnRMb2FkZXInIHwgJ0hUTUxMb2FkZXInIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgU2tpbkxvYWRlcnMgPSB7XG4gICAgXCJJZnJhbWVMb2FkZXJcIjogXCJJZnJhbWVMb2FkZXJcIixcbiAgICBcIldlYkNvbXBvbmVudExvYWRlclwiOiBcIldlYkNvbXBvbmVudExvYWRlclwiLFxuICAgIFwiSFRNTExvYWRlclwiOiBcIkhUTUxMb2FkZXJcIixcbiAgICBcIk1pbmltaXplZExvYWRlclwiOiBcIk1pbmltaXplZExvYWRlclwiXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSBrZXlvZiB0eXBlb2YgU2tpbkxvYWRlcnM7XG5cbmV4cG9ydCB0eXBlIFByb3BUeXBlID0gJ2FueScgfCAnc3RyaW5nJyB8ICdudW1iZXInIHwgc3RyaW5nOyAvLyBUT0RPIDogPFxuZXhwb3J0IHR5cGUgUmVmU2VsZWN0b3JUeXBlID0gJ2lkLWF0dHJpYnV0ZScgfCAnY3NzLXNlbGVjdG9yJyB8ICd4cGF0aCcgfCBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBMb2FkZXJGcmFtZXdvcmtzID0ge1xuICAgIFwicmVhY3RcIjogXCJyZWFjdFwiLFxuICAgIFwidnVlXCI6IFwidnVlXCIsXG4gICAgXCJhbmd1bGFyXCI6IFwiYW5ndWxhclwiLFxufSBhcyBjb25zdFxuZXhwb3J0IHR5cGUgTG9hZGVyRnJhbWV3b3JrVHlwZSA9IGtleW9mIHR5cGVvZiBMb2FkZXJGcmFtZXdvcmtzO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJXZWJDb21wb25lbnRMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZyxcbiAgICBmcmFtZXdvcms/OiBMb2FkZXJGcmFtZXdvcmtUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUlmcmFtZUxvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIklmcmFtZUxvYWRlclwiO1xuICAgIHVybDogc3RyaW5nXG4gICAgYXV0b0hlaWdodDogYm9vbGVhblxuICAgIGhlaWdodD86IHN0cmluZ1xuICAgIHdpZHRoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTaGFkb3dSb290TW9kZVR5cGUgPSB7XG4gICAgXCJvcGVuXCI6IFwib3BlblwiLFxuICAgIFwiY2xvc2VkXCI6IFwiY2xvc2VkXCIsXG4gICAgXCJub25lXCI6IFwibm9uZVwiLFxuICAgIFwibG9jYWxGcmFtZVwiOiBcImxvY2FsRnJhbWVcIlxufSBhcyBjb25zdDtcblxuXG5leHBvcnQgaW50ZXJmYWNlIElIVE1MTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiSFRNTExvYWRlclwiO1xuICAgIEhUTUw6IHN0cmluZztcbiAgICAvL1RPRE86IHJlbmFtZShyb290TW9kZS9jdXN0b21FbGVtZW50TW9kZSkgKyBkYiBtaWdyYXRpb25cbiAgICBzaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGU7XG4gICAgYXV0b0hlaWdodD86IGJvb2xlYW47XG4gICAgaGVpZ2h0Pzogc3RyaW5nO1xuICAgIHdpZHRoPzogc3RyaW5nO1xufVxuXG4vL2ZvciBpbnRlcm5hbCBkYXNoYm9hcmQgdXNhZ2VcbmV4cG9ydCBpbnRlcmZhY2UgSU1pbmltaXplZExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIk1pbmltaXplZExvYWRlclwiO1xufVxuXG5pbnRlcmZhY2UgRGFzaGJvYXJkT2JqZWN0IHtcbiAgICBfdGVtcF9jbGllbnRfaWQ/OiBzdHJpbmcsXG59XG5cbnR5cGUgRXh0ZW5kPFQsIFU+ID0gVCAmIFU7XG5cbnR5cGUgRXh0ZW5kUmVjdXJzaXZlbHk8VCwgRT4gPSB7XG4gICAgW0sgaW4ga2V5b2YgRV06IEVbS107XG59ICYge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgb2JqZWN0XG4gICAgICAgID8gRXh0ZW5kUmVjdXJzaXZlbHk8VFtLXSwgRT5cbiAgICAgICAgOiBUW0tdO1xufTtcblxuZXhwb3J0IHR5cGUgSURhc2hib2FyZDxUPiA9IEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIERhc2hib2FyZE9iamVjdD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFNraW5Mb2FkZXJUeXBlXG5cbiAgICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93cyBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVJlbGVhc2VNZXRhZGF0YSB7XG4gICAgZW52aXJvbm1lbnRJZDogc3RyaW5nO1xuICAgIGVudmlyb25tZW50SWRlbnRpZmllcjogc3RyaW5nO1xuICAgIC8vXG4gICAgLy8gdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgLy8gdXBkYXRlZEJ5Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVZhcmlhbnRDb25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgbG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZ1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmc7XG5cbiAgICByZWxlYXNlcz86IHYyX0lSZWxlYXNlTWV0YWRhdGFbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjcmVhdGVkQnk/OiBzdHJpbmdcbiAgICBjcmVhdGVkT24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JU2tpbkNvbmZpZyBleHRlbmRzIElTa2luQ29uZmlnIHtcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lc3NhZ2VQcm9wQ29uZmlnIGV4dGVuZHMgSVByb3BDb25maWcge1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJpbmRNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgY29uc3QgUHJvcE1lc3NhZ2VNb2RlcyA9IHtcbiAgICBcImlucHV0XCI6IFwiaW5wdXRcIixcbiAgICBcIm91dHB1dFwiOiBcIm91dHB1dFwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMgPSB7XG4gICAgXCJtZXNzYWdlXCI6IFwibWVzc2FnZVwiLFxuICAgIFwiY29kZVwiOiBcImNvZGVcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtIHtcbiAgICB2YWx1ZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFByb3BDb25maWdCZWhhdmlvclR5cGVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BDb2RlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcImNvZGVcIlxuICAgIHJlbWFwPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcIm1lc3NhZ2VcIlxuICAgIG1lc3NhZ2U6IE15b3BNZXNzYWdlS2V5XG4gICAgcmVmOiBzdHJpbmcsIC8vVE9ETyBtYWtlIGl0IGlkXG4gICAgcGFyYW1zOiBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtW11cbiAgICBtb2RlOiBrZXlvZiB0eXBlb2YgUHJvcE1lc3NhZ2VNb2Rlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgYmVoYXZpb3I6IElQcm9wQmVoYXZpb3Jcbn1cblxuXG5leHBvcnQgY2xhc3MgUmVmQmVoYXZpb3JUeXBlIHtcbiAgICBzdGF0aWMgY29kZSA9ICdjb2RlJyBhcyBjb25zdFxuICAgIHN0YXRpYyBjb21wb25lbnQgPSAnY29tcG9uZW50JyBhcyBjb25zdFxufVxuXG5leHBvcnQgdHlwZSBJUmVmQmVoYXZpb3JUeXBlID0gJ2NvZGUnIHwgJ2NvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiBJUmVmQmVoYXZpb3JUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudFJlZkJlaGF2aW9yIGV4dGVuZHMgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiAnY29tcG9uZW50J1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogUHJvcGVydHkgaW5zdGFuY2UgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAgICAgKi9cbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvZGVSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvZGUnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBzZWxlY3RvclR5cGU6IFJlZlNlbGVjdG9yVHlwZVxuICAgIHNlbGVjdG9yOiBzdHJpbmdcbiAgICBiZWhhdmlvcjogSVJlZkJlaGF2aW9yXG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IHJ1bGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnRSdWxlIHtcbiAgICBwcm9wZXJ0eTogc3RyaW5nO1xuICAgIG9wZXJhdG9yOiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIEEvQiBzcGxpdCB2ZXJzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VBQlNwbGl0VmVyc2lvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBwZXJjZW50YWdlOiBudW1iZXI7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdCB7XG4gICAgdmVyc2lvbnM6IElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb25bXTtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIHNlZ21lbnQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlU2VnbWVudCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBydWxlczogSUV4cGVyaWVuY2VTZWdtZW50UnVsZVtdO1xuICAgIHVzZUFiOiBib29sZWFuO1xuICAgIGNvbXBvbmVudFZhcmlhbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgICBhYlNwbGl0PzogSUV4cGVyaWVuY2VBQlNwbGl0O1xuICAgIHN0aWNreVByb3BlcnRpZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIGRlZmluaXRpb24gY29uZmlnICh2MilcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZURlZmluaXRpb25Db25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgLyoqIFNlbGVjdGVkIGNvbXBvbmVudCBJRHMgKi9cbiAgICBjb21wb25lbnRzOiBzdHJpbmdbXTtcbiAgICAvKiogU2VnbWVudCBjb25maWd1cmF0aW9ucyAqL1xuICAgIHNlZ21lbnRzOiBJRXhwZXJpZW5jZVNlZ21lbnRbXTtcbiAgICAvKiogRmFsbGJhY2sgdmFyaWFudCBwZXIgY29tcG9uZW50ICovXG4gICAgZmFsbGJhY2s6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgLyoqIFRhZ3MgKi9cbiAgICB0YWdzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICAvLyBwcm9wczogUmVjb3JkPHN0cmluZywgSVByb3BDb25maWc+IC8vaWQgLSB0eXBlXG4gICAgLy8gcmVmczogUmVjb3JkPHN0cmluZywgSVJlZkNvbmZpZz4sXG4gICAgLy8gc2tpbnM6IFJlY29yZDxzdHJpbmcsIElTa2luQ29uZmlnPlxuICAgIHByb3BzOiBJUHJvcENvbmZpZ1tdLFxuICAgIHJlZnM6IElSZWZDb25maWdbXSxcbiAgICBza2luczogSVNraW5Db25maWdbXSxcbiAgICBkZWZhdWx0U2tpbjogbnVtYmVyO1xuXG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIC8vcmVzb2x2ZWREZWZpbml0aW9ucz86IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnW11cbiAgICAvL1RPRE8gOiBtb3ZlIHRvIGJhc2UgY2xhc3MgKCBJU3RvcmFibGVJdGVtIG9yIHNvLi4uKVxuXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG59XG5cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JQmFzZU15b3BPYmplY3Qge1xuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSU15b3BTdG9yZWRPYmplY3QgZXh0ZW5kcyB2Ml9JQmFzZU15b3BPYmplY3Qge1xuICAgIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIHZhcmlhbnRzX2lkczogc3RyaW5nW10sXG4gICAgRFRPczogdjJfSURUT1tdLFxuICAgIHRhZ3M6IHN0cmluZ1tdLFxuXG4gICAgLy9cbiAgICB2YXJpYW50c19uYW1lczogc3RyaW5nW10sXG4gICAgdmFyaWFudHNfZGF0YToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGlkOiBzdHJpbmdcbiAgICAgICAgdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xuICAgICAgICBoYXNfcmVsZWFzZXM/OiBib29sZWFuXG4gICAgfVtdLFxuXG4gICAgcHJldmlld192YXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZztcbiAgICBleHRyYT86IHtcbiAgICAgICAgZmlyc3RWYXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZzsgLy93aGVuIG5ldyBjb21wb25lbnQgY3JlYXRlcyBhdCB0aGUgY2xpZW50XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lEVE8gZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgZGF0YTogb2JqZWN0XG4gICAgbWV0aG9kTmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5JbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcyxcbiAgICAvL3NraW5zOiBJU2tpbkluc3RhbmNlQ29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IFNlZ21lbnRUeXBlID0ge1xuICAgIFwiRnVuY3Rpb25SZXN1bHRcIjogXCJGdW5jdGlvblJlc3VsdFwiLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEluc3RhbmNlIHtcbiAgICBzZWdtZW50SWQ6IHN0cmluZztcbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNlZ21lbnRUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQgZXh0ZW5kcyBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTogdHlwZW9mIFNlZ21lbnRUeXBlLkZ1bmN0aW9uUmVzdWx0XG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGZ1bmN0aW9uOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IFNraW5TZWxlY3RvclR5cGVzID0ge1xuICAgIFwiU2VnbWVudGVkXCI6IFwiU2VnbWVudGVkXCIsXG4gICAgXCJEZWRpY2F0ZWRcIjogXCJEZWRpY2F0ZWRcIixcblxuICAgIC8qKlxuICAgICAqIFRoaXMgU2VsZWN0b3IgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgICAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgXCJEZWZhdWx0XCI6IFwiRGVmYXVsdFwiXG59IGFzIGNvbnN0O1xuXG5cbi8qKlxuICogVGhpcyBTa2luIENvbmZpZyBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gKlxuICogQHR5cGUge0lEZWZhdWx0U2tpbkNvbmZpZ31cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRGVmYXVsdFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVmYXVsdCxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQsXG4gICAgc2VnbWVudHM6IElTZWdtZW50SW5zdGFuY2VbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZWRpY2F0ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2tpbn0gaW5zdGVhZC5cbiAgICAgKiBQcm9wZXJ0eSBza2lucyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLlxuICAgICAqIFBsZWFzZSB1cGRhdGUgeW91ciBjb2RlIHRvIHVzZSB7QGxpbmsgc2tpbn0gZm9yIGJldHRlciBjb21wYXRpYmlsaXR5LlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBza2lucz86IElTa2luSW5zdGFuY2VDb25maWdbXSAvLyBkZXByZWNhdGVkXG4gICAgc2tpbjogSVNraW5JbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgLy9UT0RPIDpcbiAgICAvLyBSZWZJRCA/IHRvIHN1cHBvcnQgbW9yZSB0aGFuIDEgY29tcG9uZW50IGZyb20gdGhlIHNhbWUgdHlwZSBpbiBjb21wb3NpdGVzID9cblxuICAgIC8vVE9ETyA6IHJlbW92ZVxuICAgIGNvbXBvbmVudE5hbWU6IHN0cmluZzsgLy8gPDwgY2hlY2tcblxuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xuXG4gICAgLy8gc3RvcmluZyB0aGUgbmVzdGVkIGNvbmZpZyBmb3IgcmVmIGNvbXBvbmVudHNcbiAgICBuZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW11cblxuICAgIC8vb25seSBvbiBHRVQ/XG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIHJlc29sdmVkRXhwZXJpZW5jZXM/OiBJRXhwZXJpZW5jZVtdXG4gICAgLy8gd2lsbCBpbmNsdWRlIGluc3RhbmNlIGFuZCBkZWYgY29uZmlnIGluIG9yZGVyIHRvIHJlbmRlciBpbiBwcm9kdWN0aW9uXG4gICAgcmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBFeHBlcmllbmNlVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50XCI6IFwiU2VnbWVudFwiLFxuICAgIFwiUHJvbW9cIjogXCJQcm9tb1wiLFxuICAgIFwiQUJcIjogXCJBQlwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIC8vc3RpY2tpbmVzc0ZhY3RvclxuICAgIC8vRW5kRGF0ZVxufVxuXG4vLyBleHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2VHcm91cCB7XG4vLyAgICAgaWQ6IHN0cmluZ1xuLy8gICAgIG5hbWU6IHN0cmluZ1xuLy8gICAgIHBlcmNlbnRhZ2U6IG51bWJlclxuLy8gfVxuXG5leHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZTogdHlwZW9mIEV4cGVyaWVuY2VUeXBlcy5BQlxuICAgIC8vIGdyb3VwczogSUFCRXhwZXJpZW5jZUdyb3VwW11cbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIHBlcmNlbnRhZ2U6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEYXRlUmFuZ2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBzdGFydDogRGF0ZVxuICAgIGVuZDogRGF0ZVxuICAgIHRpbWV6b25lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIHNlZ21lbnQ6IElTZWdtZW50RGVmaW5pdGlvblxuICAgIGRhdGVSYW5nZT86IElEYXRlUmFuZ2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3dEZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdO1xuICAgIG9yaWdpbnM6IHN0cmluZ1tdLFxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgYnJhbmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudENvbmZpZyB7XG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xuICAgIHR5cGU6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICAvLyBUT0RPIDogdmVyaWZ5IHVuaXF1ZW5lc3MgKGRhc2hib2FyZCAmIHNlcnZlcilcbiAgICBuYW1lOiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIElCcmFuY2hhYmxlIHtcbiAgICBicmFuY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3cgZXh0ZW5kcyBPbWl0PElVc2VyRmxvd0RlZmluaXRpb24sICdjb21wb25lbnRzJz4sIElCcmFuY2hhYmxlIHtcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNsYXNzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdD86IFNoYWRvd1Jvb3QpIHtcblxuICAgIH1cblxuICAgIGdldFJvb3REaXYgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKS5xdWVyeVNlbGVjdG9yKCdkaXYnKVxuICAgIH1cblxuICAgIGdldFJvb3QgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlPFQ+ID1cbiAgICBUIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IC8vIEV4Y2x1ZGUgZnVuY3Rpb25zXG4gICAgICAgIFQgZXh0ZW5kcyBBcnJheTxpbmZlciBVPiA/IFNlcmlhbGl6YWJsZTxVPltdIDogLy8gSGFuZGxlIGFycmF5c1xuICAgICAgICAgICAgVCBleHRlbmRzIG9iamVjdCA/IHtcbiAgICAgICAgICAgICAgICBbSyBpbiBrZXlvZiBUIGFzIFRbS10gZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogS106IFNlcmlhbGl6YWJsZTxUW0tdPlxuICAgICAgICAgICAgfSA6IFQ7IC8vIEhhbmRsZSBvYmplY3RzXG5cbmNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBPYmplY3QodmFsdWUpO1xufVxuXG5jb25zdCBpc0Z1bmN0aW9uID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnRhaW5zUHJpbWl0aXZlc09ubHkgPSAob2JqKSA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjaGVjayBpZiBpdCdzIGEgbmVzdGVkIG9iamVjdFxuICAgICAgICAgICAgaWYgKCFjb250YWluc1ByaW1pdGl2ZXNPbmx5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBJdCdzIGEgcHJpbWl0aXZlLCBzbyB3ZSBjYW4gc2tpcCBpdFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBGb3VuZCBhIG5vbi1wcmltaXRpdmUgdmFsdWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlOyAvLyBBbGwgdmFsdWVzIGFyZSBwcmltaXRpdmVzIG9yIG5lc3RlZCBvYmplY3RzIHdpdGggcHJpbWl0aXZlc1xufVxuXG4vLyBjdXJyZW50bHkgc3VwcG9ydCByb290IGxldmVsIG9ubHlcbi8vIHt4OiAxLCB5IDogJ2EnLCB6IDogKCk9PnsuLi59LCBpbm5lciA6IHsgeDogMSAsIHkgOiAnYSd9IH1cbi8vIHt4OiAxLCB5IDogJ2EnfVxuLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0dsb3NzYXJ5L0ZhbHN5XG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVTa2VsZXRvbjxUPiA9IFBhcnRpYWw8UmVjb3JkPGtleW9mIFQsIGJvb2xlYW4gfCBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pj4+IHwgYm9vbGVhbjtcblxuZXhwb3J0IGNvbnN0IG1ha2VTZXJpYWxpemFibGUgPSA8VD4oXG4gICAgb2JqOiBULFxuICAgIHNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxUPiA9IHt9LFxuICAgIGluY2x1ZGVGYWxzeUtleXM6IGJvb2xlYW4gPSB0cnVlLCAvLyBUT0RPIDogdXNlIHRoYXQgYXJnXG4gICAgc2VlbjogV2Vha01hcDxvYmplY3QsIFNlcmlhbGl6YWJsZTxhbnk+PiA9IG5ldyBXZWFrTWFwKClcbik6IFNlcmlhbGl6YWJsZTxUPiA9PiB7XG5cbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gb2JqIGFzIFNlcmlhbGl6YWJsZTxUPjsgLy8gRGlyZWN0bHkgcmV0dXJuIHByaW1pdGl2ZSB2YWx1ZXNcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vlbi5nZXQob2JqKSE7IC8vIFJldHVybiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgYXJyYXkgc2VyaWFsaXphdGlvblxuICAgICAgICBjb25zdCBzZXJpYWxpemFibGVBcnJheTogU2VyaWFsaXphYmxlPGFueT5bXSA9IFtdO1xuICAgICAgICBzZWVuLnNldChvYmosIHNlcmlhbGl6YWJsZUFycmF5KTsgLy8gU3RvcmUgdGhlIGFycmF5IGluIHNlZW5cblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb2JqLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IG9ialtpbmRleF07XG4gICAgICAgICAgICBzZXJpYWxpemFibGVBcnJheVtpbmRleF0gPSBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQsIHNrZWxldG9uLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXphYmxlQXJyYXkgYXMgU2VyaWFsaXphYmxlPFQ+O1xuICAgIH1cblxuICAgIGlmIChvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGN5Y2xpYyByZWZlcmVuY2VzXG4gICAgICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vlbi5nZXQob2JqKSE7IC8vIFJldHVybiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXphYmxlT2JqZWN0OiBQYXJ0aWFsPFNlcmlhbGl6YWJsZTxUPj4gPSB7fTtcbiAgICAgICAgc2Vlbi5zZXQob2JqLCBzZXJpYWxpemFibGVPYmplY3QpOyAvLyBTdG9yZSB0aGUgb2JqZWN0IGluIHNlZW5cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgaW4gdGhlIHNrZWxldG9uIGFuZCBpZiBpdCdzIGEgdmFsaWQga2V5IHRvIHNlcmlhbGl6ZVxuXG4gICAgICAgICAgICBjb25zdCBrZXlJblNrZWxldG9uID0gdHlwZW9mIHNrZWxldG9uID09IFwiYm9vbGVhblwiID8gc2tlbGV0b24gOiBza2VsZXRvbltrZXldO1xuXG4gICAgICAgICAgICBpZiAoa2V5SW5Ta2VsZXRvbikge1xuICAgICAgICAgICAgICAgIGlmIChrZXlJblNrZWxldG9uID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBza2VsZXRvbiBpbmRpY2F0ZXMgdG8gc2VyaWFsaXplIHRoaXMga2V5XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlRmFsc3lLZXlzID8gb2JqW2tleV0gIT09IHVuZGVmaW5lZCA6IG9ialtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPYmplY3Rba2V5XSA9IG1ha2VTZXJpYWxpemFibGUob2JqW2tleV0sIHRydWUsIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Yga2V5SW5Ta2VsZXRvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNrZWxldG9uIGluZGljYXRlcyBuZXN0ZWQga2V5cyB0byBzZXJpYWxpemVcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPYmplY3Rba2V5XSA9IG1ha2VTZXJpYWxpemFibGUob2JqW2tleV0sIGtleUluU2tlbGV0b24sIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXphYmxlT2JqZWN0IGFzIFNlcmlhbGl6YWJsZTxUPjtcbiAgICB9XG5cbiAgICByZXR1cm4ge30gYXMgYW55OyAvLyBSZXR1cm4gYW4gZW1wdHkgb2JqZWN0IGZvciBvdGhlciBjYXNlc1xufVxuIiwgImV4cG9ydCBjb25zdCBFcnJvcnMgPSB7XG4gICAgbm90U2VyaWFsaXphYmxlUmVmQ2FsbDogKHByb3AsIGFyZykgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuVGhlIGlucHV0IHByb3ZpZGVkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGlzIG5vdCBzZXJpYWxpemFibGUuIFNlcmlhbGl6YXRpb24gaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGRhdGEgY2FuIGJlIHNhZmVseSB0cmFuc2ZlcnJlZCB0byB0aGUgc2tpbiBpbXBsZW1lbnRhdGlvbi4gXG5UaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRhdGEgYXJlIGNvbnNpZGVyZWQgbm9uLXNlcmlhbGl6YWJsZSBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZDpcblxuLSBGdW5jdGlvbnNcbi0gRE9NIGVsZW1lbnRzXG4tIENsYXNzIGluc3RhbmNlc1xuLSBDaXJjdWxhciByZWZlcmVuY2VzXG4tIFN5bWJvbHNcbi0gQmlnSW50IHZhbHVlc1xuXG5JbiB0aGUgZm9sbG93aW5nIGV4ZWN1dGlvbiB3ZSBkZXRlY3RlZCA6XG5+fn5+fn5+flxuJHthcmd9IFxufn5+fn5+fn5cbmFzIG5vdCBzZXJpYWxpemFibGUuXG5cblRvIHJlc29sdmUgdGhpcyBpc3N1ZSwgcGxlYXNlIGVuc3VyZSB0aGF0IGFsbCBpbnB1dHMgcGFzc2VkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGFyZSBpbiBhIHNlcmlhbGl6YWJsZSBmb3JtYXQuXG5UaGlzIHR5cGljYWxseSBpbmNsdWRlcyBwcmltaXRpdmUgdHlwZXMgKHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zKSwgYXJyYXlzLCBhbmQgcGxhaW4gb2JqZWN0cy4gXG5JZiB5b3UgbmVlZCB0byBpbmNsdWRlIGNvbXBsZXggZGF0YSB0eXBlcywgY29uc2lkZXIgY29udmVydGluZyB0aGVtIHRvIGEgc2VyaWFsaXphYmxlIHN0cnVjdHVyZSBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSBmdW5jdGlvbi5cbk9yIHVzZSBNeW9wIG1lc3NhZ2UgdGhhdCBzdXBwb3J0IGl0OiBDdXN0b21SZWZNZXNzYWdlLCBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSBvciBFeGVjdXRlU2NyaXB0TWVzc2FnZS5cblxuU3VnZ2VzdGVkIEZpeDpcbjEuIFJlbW92ZSBvciByZXBsYWNlIG5vbi1zZXJpYWxpemFibGUgdmFsdWVzIGZyb20geW91ciBpbnB1dC5cbjIuIElmIHVzaW5nIG9iamVjdHMsIGVuc3VyZSB0aGV5IGRvIG5vdCBjb250YWluIGFueSBmdW5jdGlvbnMgb3IgY2lyY3VsYXIgcmVmZXJlbmNlcy5cbjMuIENvbnZlcnQgYW55IGNsYXNzIGluc3RhbmNlcyB0byBwbGFpbiBvYmplY3RzIG9yIEpTT04tY29tcGF0aWJsZSBmb3JtYXRzLlxuNC4gVXNlIGRlZGljYXRlZCBNeW9wIG1lc3NhZ2UuXG5cbkZvciBtb3JlIGRldGFpbHMgb24gc2VyaWFsaXphdGlvbiBhbmQgTXlvcCBtZXNzYWdlIGV4YW1wbGVzLCByZWZlciB0byBodHRwczovL2RvY3MubXlvcC5kZXZcXC5cblxuYCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudCwgSU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0VudmVsb3BlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9FbnZlbG9wZWRNZXNzYWdlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wUmVmQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBwdWJsaWMgcGFyZW50OiBJTXlvcENvbXBvbmVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgLy9UT0RPIDogY2hlY2sgcGFyZW50Q29tcG9uZW50LmNvbnRhaW5lci4uLlxuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBwYXJlbnQuY29udGFpbmVyLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICAvL3RoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZChhcmd1bWVudHMuY2FsbGVlLm5hbWUpKTtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdoaWRlJykpO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2hvdycpKTtcbiAgICB9XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlYWwgY2xlYW51cFxuICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWYgaW5zcGVjdCBjYWxsZWQsIGNyZWF0aW5nIEV4ZWN1dGVDb21wb25lbnRNZXRob2QgaW5zcGVjdCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIHRoaXMuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdpbnNwZWN0JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0JykpO1xuICAgIH1cblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJykge1xuICAgICAgICAvLyAgZGVidWdnZXI7XG4gICAgICAgIC8vICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiBzdXBlci5vbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlKTtcbiAgICB9XG5cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ3JlZiBtZXNzYWdlIHNlbmRpbmcgJywgbWVzc2FnZSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gdGhpcy5pZCB3aWxsIGJlIGF2YWlsYWJsZSBvbiB0aGUgbmVzdGVkIGNvbXBvbmVudFxuICAgICAgICB0aGlzLnBhcmVudC5zZW5kKG5ldyBFbnZlbG9wZWRNZXNzYWdlKHRoaXMuaWQsIG1lc3NhZ2UpKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0luaXRpYXRlZClcbiAgICAgICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnZGlzcG9zZScpKTtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cbn1cbiIsICIvL3R5cGUgQUNvbnN0cnVjdG9yVHlwZU9mPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgQ3VzdG9tUmVmTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCAqIGFzIG1lc3NhZ2VzIGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudENvbmZpZyxcbiAgICB0eXBlIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRSZWZCZWhhdmlvciwgSUhUTUxMb2FkZXJDb25maWcsIElQcm9wQ29kZUJlaGF2aW9yLFxuICAgIElQcm9wQ29uZmlnLCBJU2tpbkNvbmZpZywgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMsXG4gICAgUmVmQmVoYXZpb3JUeXBlLCBTaGFkb3dSb290TW9kZVR5cGUsIFNraW5Mb2FkZXJzLCBTa2luTG9hZGVyVHlwZVxufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2NvbnRhaW5zUHJpbWl0aXZlc09ubHl9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvblwiO1xuaW1wb3J0IHtFcnJvcnN9IGZyb20gXCIuL2xvZ01lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BSZWZDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudFwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi9ob3N0U0RLXCI7XG5cbnR5cGUgY29tcG9uZW50RGVmaW5pdGlvblByb3BzID0gSUNvbXBvbmVudERlZmluaXRpb25Db25maWdbJ3Byb3BzJ11cblxuY29uc3QgY3JlYXRlRGVidWdUaXRsZSA9ICh0ZXh0OiBzdHJpbmcsIHRvcDogbnVtYmVyLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykgPT4ge1xuICAgIGNvbnN0IHRpdGxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgdGl0bGVFbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgdGl0bGVFbC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgdGl0bGVFbC5zdHlsZS5wYWRkaW5nID0gJzAgNXB4JztcbiAgICB0aXRsZUVsLnN0eWxlLmZvbnRTaXplID0gJzE0cHgnO1xuICAgIHRpdGxlRWwuc3R5bGVbJ3RvcCddID0gJzAnO1xuICAgIHRpdGxlRWwuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcbiAgICAvL3RpdGxlRWwuc3R5bGUubGVmdCA9ICc1MCUnO1xuICAgIHRpdGxlRWwuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoLTUwJSknO1xuICAgIHRpdGxlRWwudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgdGl0bGVFbC5ocmVmID0gYGh0dHBzOi8vZGFzaGJvYXJkLm15b3AuZGV2L2Rhc2hib2FyZC9jb21wb25lbnQvJHtjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLmlkfWBcblxuICAgIHJldHVybiB0aXRsZUVsO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldERlYnVnU3R5bGUgPSAoaWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcbik6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAvLyMwMDdCRkYgKGJsdWUpIG9yICNGRjU3MjIgKG9yYW5nZSlcbiAgICAvLyM0Q0FGNTAgKGdyZWVuKSBvciAjRkZDMTA3IChhbWJlcilcbiAgICAvLyBjb25zdCB0b3BUZXh0ID0gY3JlYXRlRGVidWdUaXRsZShgJHtpZH0gOiAke3R5cGV9YCwgdG9wLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKTtcbiAgICBjb25zdCB0b3BUZXh0ID0gY3JlYXRlRGVidWdUaXRsZShgJHtjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLm5hbWV9IDogJHt0eXBlfWAsIHRvcCwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyk7XG4gICAgY29udGFpbmVyLmluc2VydEJlZm9yZSh0b3BUZXh0LCBjb21wb25lbnRFbGVtZW50KTtcbiAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgIzAwN0JGRic7XG4gICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJ3Vuc2V0JztcbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHRvcFRleHQpO1xuICAgIH1cbn1cblxuY29uc3QgcmVwb3J0RXJyb3IgPSAocHJvcENvbmZpZzogSVByb3BDb25maWcsIHByb3BOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgaWYgKCFwcm9wQ29uZmlnKSB7XG5cbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIC8vIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFcnJvcjogVW5kZWZpbmVkIFByb3BcXG5cXG5gICtcbiAgICAgICAgICAgIGBJdCBsb29rcyBsaWtlIHlvdSd2ZSB0cmllZCB0byB1c2UgYSBwcm9wIHRoYXQgaGFzbid0IGJlZW4gZGVmaW5lZC5cXG5gICtcbiAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgdGhlIHByb3AgbmFtZSBmb3IgYW55IHR5cG9zIG9yIGVuc3VyZSB0aGF0IGl0IGlzIHByb3Blcmx5IGRlZmluZWQgaW4gdGhlIGNvbXBvbmVudCdzIHByb3AgbGlzdC5cXG5cXG5gICtcbiAgICAgICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcE5hbWV9XFxuYCArXG4gICAgICAgICAgICBgQ29tcG9uZW50OiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLm5hbWV9LCBJRDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH1cXG5cXG5gICtcbiAgICAgICAgICAgIGBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIGNvbXBvbmVudCBwYWdlIGh0dHBzOi8vZGFzaGJvYXJkLm15b3AuZGV2L2Rhc2hib2FyZC9jb21wb25lbnQvJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH0gb3IgY29uc3VsdCB0aGUgZGV2ZWxvcGVyIGd1aWRlLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmNvbnN0IHJlcG9ydFVuc3VwcG9ydGVkID0gKHByb3BDb25maWc6IElQcm9wQ29uZmlnLCBwcm9wTmFtZTogc3RyaW5nLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50PGFueSwgYW55PikgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBFcnJvcjogQ29kZSBQcm9wIE5vdCBTdXBwb3J0ZWRcXG5cXG5gICtcbiAgICAgICAgYEN1cnJlbnRseSwgY29kZSBwcm9wcyBhcmUgb25seSBzdXBwb3J0ZWQgaW4gbG9jYWwgZnJhbWUgY29tcG9uZW50cy5cXG5gICtcbiAgICAgICAgYFx1MjZBMFx1RkUwRiBUaGlzIGlzIGEgd29yayBpbiBwcm9ncmVzcyBmZWF0dXJlIFx1MjAxNCBjb2RlIHByb3BzIHdpbGwgYmUgc3VwcG9ydGVkIGluIHVwY29taW5nIHZlcnNpb25zLlxcblxcbmAgK1xuICAgICAgICBgSW4gdGhlIG1lYW50aW1lLCB5b3UgY2FuIHVzZSBtZXNzYWdlIHByb3BzLlxcblxcbmAgK1xuICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3BOYW1lfVxcbmAgK1xuICAgICAgICBgQ29tcG9uZW50OiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLm5hbWV9LCBJRDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH1cXG5cXG5gICtcbiAgICAgICAgYEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgY29tcG9uZW50IHBhZ2UgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfSBvciBjb25zdWx0IHRoZSBkZXZlbG9wZXIgZ3VpZGUuYFxuICAgICk7XG59XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0UHJvcHMgPSA8VCBleHRlbmRzIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcz4oY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgcHJvcHNDb25maWc6IElQcm9wQ29uZmlnW10sIHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IHtcblxuICAgIGNvbnN0IHByb3BzTWFwID0gcHJvcHNDb25maWcucmVkdWNlKChwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnByZXZpb3VzVmFsdWUsXG4gICAgICAgICAgICBbY3VycmVudFZhbHVlLm5hbWVdOiB7Li4uY3VycmVudFZhbHVlfVxuICAgICAgICB9XG4gICAgfSwge30pO1xuXG4gICAgY29uc3QgcHJvcHNIYW5kbGVyID0ge1xuICAgICAgICBnZXQ6IChfOiBJTXlvcENvbXBvbmVudCwgcHJvcDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBwcm9wQ29uZmlnID0gcHJvcHNNYXBbcHJvcF07XG5cbiAgICAgICAgICAgIGlmIChyZXBvcnRFcnJvcihwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlID09PSBTa2luTG9hZGVycy5IVE1MTG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyID0gc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGxvY2FsIGZyYW1lIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRMb2FkZXIuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LmVsZW1lbnQuY29udGVudFdpbmRvd1t0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVwb3J0VW5zdXBwb3J0ZWQocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLm1vZGUgPT09ICdvdXRwdXQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJhbXM6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgaW50byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goUmVmLmNyZWF0ZShwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKC4uLnByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUN0b3IgPSBtZXNzYWdlc1twcm9wQ29uZmlnLmJlaGF2aW9yLm1lc3NhZ2VdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBtZXNzYWdlQ3RvciguLi5tZXNzYWdlUGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0sXG4gICAgICAgIHNldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlID09PSBTa2luTG9hZGVycy5IVE1MTG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyID0gc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGxvY2FsIGZyYW1lIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRMb2FkZXIuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuZWxlbWVudC5jb250ZW50V2luZG93W3R5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3BdID0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXBvcnRVbnN1cHBvcnRlZChwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9pZihwcm9wQ29uZmlnLmJlaGF2aW9yID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5tZXNzYWdlKVxuICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLm1vZGUgPT09ICdpbnB1dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogc3VwcG9ydCBtdWx0aSBiZWhhdmlvcnNcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJhbXM6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IGludG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goUmVmLmNyZWF0ZShwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCguLi5wcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDdG9yID0gbWVzc2FnZXNbcHJvcENvbmZpZy5iZWhhdmlvci5tZXNzYWdlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBtZXNzYWdlQ3RvciguLi5tZXNzYWdlUGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvcjogVW5zdXBwb3J0ZWQgQmVoYXZpb3JcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhlICdiZWhhdmlvcicgZmllbGQgcHJvdmlkZWQgaXMgbm90IHN1cHBvcnRlZC5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ29tcG9uZW50OiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLm5hbWV9LCBJRDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3B9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEJlaGF2aW9yIEZpZWxkOiAke3Byb3BDb25maWcuYmVoYXZpb3IudHlwZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHZhbGlkIGJlaGF2aW9yIG9wdGlvbnMuYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudC5wcm9wcyA9IHt9O1xuICAgIGNvbXBvbmVudC5wcm9wcyA9IG5ldyBQcm94eShjb21wb25lbnQucHJvcHMsIHByb3BzSGFuZGxlcik7XG5cbiAgICByZXR1cm4gY29tcG9uZW50IGFzIChPbWl0PElNeW9wQ29tcG9uZW50LCAncHJvcHMnPiAmIHtcbiAgICAgICAgcHJvcHM6IHByb3BUeXBlczxUPlxuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZWZQcm94eSA9ICh0YXJnZXQ6IFJlZiwgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCB7XG4gICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHtcblxuICAgICAgICAgICAgLy8gaWYgKHByb3AgPT09ICdfX25vblByb3hpZWQnKSB7XG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHRhcmdldFtwcm9wXSkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBnZXR0ZXJGdW5jdGlvbiA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MuZm9yRWFjaChhcmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250YWluc1ByaW1pdGl2ZXNPbmx5KGFyZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMubm90U2VyaWFsaXphYmxlUmVmQ2FsbChwcm9wLCBhcmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIHByb3BOYW1lLCBmdW5jdGlvbkFyZ3MsIG1ha2VTZXJpYWxpemFibGV9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVmW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VTZXJpYWxpemFibGUocmVmW3Byb3BOYW1lXSguLi5mdW5jdGlvbkFyZ3MpLCB0cnVlKSAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuZCByZXR1cm4gaXRzIHJlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VTZXJpYWxpemFibGUodmFsdWUsIHRydWUpOyAvLyBSZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgdG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiB0YXJnZXQucmVmQ29uZmlnLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJnczogYXJnc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG1zZy5jb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy9UT0RPOiB3ZSBjYW4gaW1wbGVtZW50IHRoaW5ncyBsaWtlIGF1dG8gc2VyaWFsaXphdGlvbiBhbmQgYmluZGluZyBmdW5jdGlvbnMgaGVyZVxuICAgICAgICAgICAgLy9nZXR0ZXJGdW5jdGlvbi50ZXN0ID0gJzEyMyc7XG5cbiAgICAgICAgICAgIHJldHVybiBnZXR0ZXJGdW5jdGlvbjtcblxuICAgICAgICAgICAgLy9yZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHRhcmdldCwgcHJvcDogc3RyaW5nLCB2YWx1ZSkge1xuICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIHByb3BOYW1lLCBwcm9wVmFsdWV9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWYpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBmaXggdGhhdFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHRhcmdldC5yZWZDb25maWcuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIHByb3BWYWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGxvZz9cbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmQ29tcG9uZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50PihyZWY6IFJlZiwgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdLCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyk6IFByb21pc2U8VD4gPT4ge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHJlZi5jb21wb25lbnQ7XG4gICAgaWYgKCFjb21wb25lbnQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FudCBjcmVhdGVSZWZDb21wb25lbnQgd2l0aCBkZXRhY2hlZCByZWYnKTtcblxuICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQnLCByZWYsIGNvbXBvbmVudENvbmZpZyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChjb21wb25lbnRDb25maWcudHlwZSwgY29tcG9uZW50LCBvcHRpb25zKTtcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKHJlZkNvbXBvbmVudCk7XG5cbiAgICAgICAgLy9mb3IgY2FzZXMgd2hlcmUgcmVmIGNvbXBvbmVudHMgZGVmaW5lIGluIHRoZSBjb21wb25lbnQgY29uZmlnXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHJvb3QgY29tcG9uZW50IHRoZSBiZSBpbml0aWF0ZWQgYmVmb3JlIGludGVyYWN0aW5nIHdpdGggaXRcbiAgICAgICAgYXdhaXQgY29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG5cbiAgICAgICAgLy9UT0RPIDpcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgLy9yZWplY3QoJ3RpbWVvdXQ/Jyk7XG4gICAgICAgICAgICByZWplY3QoJ3RpbWVvdXQnKTtcbiAgICAgICAgfSwgNTAwMCk7XG5cbiAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UocmVmLnJlZkNvbmZpZyxcbiAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zID8gb3B0aW9ucyA6IHt9LFxuICAgICAgICAgICAgICAgIGlkOiByZWZDb21wb25lbnQuaWQsXG4gICAgICAgICAgICAgICAgX2hhc1BhcmVudDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFzeW5jIChtZXNzYWdlKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjaGVjayBpZiB0aW1lb3V0IGFscmVhZHkgcGFzc2VkXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSBmYWlsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PSByZWZDb21wb25lbnQuaWQpO1xuXG4gICAgICAgICAgICAgICAgLy9zYW1lIG1lbW9yeSBlbnYsIHNhbWUgSG9zdFNES1xuICAgICAgICAgICAgICAgIGlmIChpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCAhPT0gcmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNsZWFuIHJlZkNvbXBvbmVudCA/XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGltcGxlbWVudGF0aW9uQ29tcG9uZW50IGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuc2V0SW5pdGlhdGVkKClcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IHJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBoZXJlID5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiB3aGF0IGFib3V0IHJlYXB0ZXJzID8hIGR5bmFtaWMgPyFcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBleHNpc3RpbmdSZWZDb21wb25lbnQgPSBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdIGFzIE15b3BSZWZDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgLy8gaWYgKGV4c2lzdGluZ1JlZkNvbXBvbmVudC5pZCAmJiBleHNpc3RpbmdSZWZDb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSBbY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSwgcmVmQ29tcG9uZW50XTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSkpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXS5wdXNoKHJlZkNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IHJlZkNvbXBvbmVudDsgLy9ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IHJlZkNvbXBvbmVudC5pZCkhO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGluIHdlYmNvbXBvbmVudCBjYXNlIHRoZSBzYW1lIGlkIHdpbGwgYWxyZWRheSBiZSBoZXJlLCB3aGljaCBpcyBnb29kICFcbiAgICAgICAgICAgICAgICAvLyBuYW1lOlxuICAgICAgICAgICAgICAgIC8vICAgICBpZFxuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnREZWZpbml0aW9uSWRcblxuICAgICAgICAgICAgICAgIC8vIGZvciBpbm5lciBjb21wb25lbnRzIGluc2lkZSByZWYgY29tcG9uZW50IDpcbiAgICAgICAgICAgICAgICBtZXNzYWdlLm5lc3RlZFJlZnMuZm9yRWFjaChuZXN0ZWRSZWZDb25maWcgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnJlc29sdmVkTmVzdGVkQ29tcG9uZW50cyEuZmluZChjID0+IGMudHlwZS5pZCA9PT0gbmVzdGVkUmVmQ29uZmlnLmNvbXBvbmVudERlZmluaXRpb25JZCkhLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc3QgbmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnM/LmZpbmQoZGVmID0+IGRlZi5pZCA9PT0gbmVzdGVkUmVmQ29uZmlnLmNvbXBvbmVudERlZmluaXRpb25JZCkhO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCByZWZDb25maWcgPSBjb21wb25lbnRDb25maWcudHlwZS5yZWZzLmZpbmQociA9PiByLm5hbWUgPT09IG5lc3RlZFJlZkNvbmZpZy5yZWZOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFyZWZDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignbm8gcmVmQ29uZmlnIGZvdW5kIGZvciBuZXN0ZWQgcmVmJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudCA9IG5ldyBNeW9wUmVmQ29tcG9uZW50KG5lc3RlZENvbXBvbmVudERlZmluaXRpb24sIHJlZkNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIG5lc3RlZENvbXBvbmVudC5zZXRJbml0aWF0ZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnJlZnNbbmVzdGVkUmVmQ29uZmlnLnJlZk5hbWVdID0gbmVzdGVkQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2gobmVzdGVkQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29ubmVjdFJlZnMocmVmQ29tcG9uZW50LCBjb21wb25lbnRDb25maWcsIGNvbXBvbmVudHMsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6dXNlIGNvbmZpZyBjaGVjayBmb3IgYXV0by1oaWdodCBhbmQgY29udmVydCB0eXBlIHByb3Blcmx5XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlZkNvbXBvbmVudCBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRocm93IGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RSZWZzID0gYXN5bmMgKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSwgd2l0aG91dFJlZkNvbXBvbmVudHM6IGJvb2xlYW4gPSBmYWxzZSkgPT4ge1xuXG4gICAgaWYgKCFjb21wb25lbnQucmVmcylcbiAgICAgICAgY29tcG9uZW50LnJlZnMgPSB7fTtcblxuICAgIGNvbnN0IHdhaXRGb3IgPSBPYmplY3QudmFsdWVzKGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlZnMpLm1hcChyZWYgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlZi5iZWhhdmlvci50eXBlID09IFJlZkJlaGF2aW9yVHlwZS5jb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPVxuXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRSZWZDb21wb25lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudC5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjaGFuZ2UgdG8gZ2V0IGl0IGZyb20gdGhlIGZsb3dcbiAgICAgICAgICAgICAgICBsZXQgcmVmQ29tcG9uZW50SWQgPSAocmVmLmJlaGF2aW9yIGFzIElDb21wb25lbnRSZWZCZWhhdmlvcikuY29tcG9uZW50SWQ7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWZDb21wb25lbnRJZClcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50SWQgPSAocmVmLmJlaGF2aW9yIGFzIElDb21wb25lbnRSZWZCZWhhdmlvcikuaW5zdGFuY2UuY29tcG9uZW50SWRcblxuICAgICAgICAgICAgICAgIC8vIGlmICghY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucykge1xuICAgICAgICAgICAgICAgIC8vICAgICByZWplY3QobmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0JykpO1xuICAgICAgICAgICAgICAgIC8vICAgICAvL3Rocm93IG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAvLyBjb25zdCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucyEuZmluZChjb21wZGVmID0+IGNvbXBkZWYuaWQgPT09IHJlZkNvbXBvbmVudElkKSE7XG4gICAgICAgICAgICAgICAgLy8gLy9jb25zdCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gYXdhaXQgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyhjb21wb25lbnRJbnN0YW5jZUNvbmZpZy5jb21wb25lbnRJZCk7XG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWNvbXBvbmVudERlZmluaXRpb25Db25maWcpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVqZWN0KG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETzogaWYgd2UgaGF2ZSB0aGUgc2FtZSBjb21wb25lbnQgbW9yZSB0aGFuIG9uY2Ugd2Ugd2lsbCBuZWVkIGluc3RhbmNlIGlkIGhlcmUgLi4uXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50Q29uZmlnID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnJlc29sdmVkTmVzdGVkQ29tcG9uZW50cz8uZmluZChuZXN0ZWRDb21wb25lbnQgPT4gbmVzdGVkQ29tcG9uZW50LnR5cGUuaWQgPT09IHJlZkNvbXBvbmVudElkKTtcblxuICAgICAgICAgICAgICAgIGlmICghbmVzdGVkQ29tcG9uZW50Q29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgbmVzdGVkQ29tcG9uZW50Q29uZmlnIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2NvbnN0IGNvbXBvbmVudEluc3RhbmNlQ29uZmlnID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLm5lc3RlZENvbXBvbmVudHM/LmZpbmQoY29tcG9uZW50SW5zdGFjZSA9PiBjb21wb25lbnRJbnN0YWNlLmNvbXBvbmVudElkID09PSBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLmlkKTtcbiAgICAgICAgICAgICAgICAvLyBpZighY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyl7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignVE9ETyBUT0RPIFRPRE8gJyk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOnRoaW5rIGFib3V0IHRoYXQgOlxuICAgICAgICAgICAgICAgIC8vICAgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5yZXNvbHZlZERlZmluaXRpb25zID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucztcbiAgICAgICAgICAgICAgICAvLyAgIGNvbnN0IG5lc3RlZENvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICBpbnN0YW5jZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLmluc3RhbmNlISxcbiAgICAgICAgICAgICAgICAvLyAgICAgICB0eXBlOiBuZXN0ZWRDb21wb25lbnRDb25maWcudHlwZSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBuYW1lOiBuZXN0ZWRDb21wb25lbnRDb25maWcubmFtZVxuICAgICAgICAgICAgICAgIC8vICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgX3JlZiA9IFJlZi5jcmVhdGUoJycsIHJlZiwgY29tcG9uZW50KTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25lc3RlZCAhISBjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudCA9IGF3YWl0IGNyZWF0ZVJlZkNvbXBvbmVudChfcmVmLCBuZXN0ZWRDb21wb25lbnRDb25maWchLCBjb21wb25lbnRzKVxuICAgICAgICAgICAgICAgICAgICAvL1RET08gOiBwdXQgdGhhdCByZWYgY29tcG9uZW50IHNvbWV3aGVyZT9cblxuICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID0gbmVzdGVkQ29tcG9uZW50O1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbm9uUHJveGllZCA9IFJlZi5jcmVhdGUoJycsIHJlZiwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID0gY3JlYXRlUmVmUHJveHkoX19ub25Qcm94aWVkLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KCc/JylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSlcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IHR5cGUgcHJvcFR5cGVzPFQgZXh0ZW5kcyBjb21wb25lbnREZWZpbml0aW9uUHJvcHM+ID0ge1xuICAgIFtQcm9wZXJ0eSBpbiBrZXlvZiBUXTpcbiAgICBUW1Byb3BlcnR5XSBleHRlbmRzIHsgbW9kZTogJ2lucHV0JyB9ID9cbiAgICAgICAgVFtQcm9wZXJ0eV1bJ3R5cGUnXSA6XG4gICAgICAgIFByb21pc2U8VFtQcm9wZXJ0eV1bJ3R5cGUnXT5cbn1cblxuZXhwb3J0IGNvbnN0IGV4ZWMgPSBhc3luYyAoZ2V0dGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2V0dGVyKClcbn1cblxuZXhwb3J0IGNvbnN0IGFjdEFzID0gPFQ+KHJlZjogUmVmKSA9PiB7XG4gICAgcmV0dXJuIHJlZiBhcyB1bmtub3duIGFzIEZ1bmN0aW9uaWZ5UmVmPFQ+XG59XG5cbmV4cG9ydCB0eXBlIEZ1bmN0aW9uaWZ5UmVmPFQgPSBhbnk+ID0ge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIEEpID0+IGluZmVyIFIgLy8gSWYgaXQncyBhIGZ1bmN0aW9uXG4gICAgICAgID8gKC4uLmFyZ3M6IEEpID0+IFByb21pc2U8Uj4gLy8gQ29udmVydCBpdCB0byBhIHByb21pc2VkIGZ1bmN0aW9uXG4gICAgICAgIDogVFtLXVxufTtcbiIsICJpbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTWVzc2FnZURpcmVjdGlvblxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJSWZyYW1lTG9hZGVyQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzLnRzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wSWZyYW1lQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHJpdmF0ZSBJZnJhbWVFbGVtZW50OiBIVE1MSUZyYW1lRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50Q29uZmlnLCBjb250YWluZXIsIG9wdGlvbnMpXG5cbiAgICAgICAgaWYgKChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKS5hdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYXRlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsZW1lbnQgPSB0aGlzLklmcmFtZUVsZW1lbnQ7XG4gICAgICAgIC8vIHRoaXMuSWZyYW1lRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KVxuICAgICAgICAvLyAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QoYElmcmFtZUVsZW1lbnQgZXJyb3JgKTtcbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgY2xlYW51cEluc3BlY3Q/OiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIC8vIFRPRE8gOiB1c2UgYmV0dGVyIGNoZWNrIGZvciBpbnNwZWN0IG1vZGVcbiAgICAgICAgaWYgKHRoaXMuY2xlYW51cEluc3BlY3QpIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2luc3BlY3QgY2FsbCBtb3JlIHRoYW4gb25jZScpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3RcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcElmcmFtZUNvbXBvbmVudCcsIDEwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5JZnJhbWVFbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCEoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3Vuc2V0J1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudH1weGA7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgb2JzZXJ2ZVNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtzZW5kfSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIHNlbmQoe2hlaWdodCwgd2lkdGh9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5KTtcblxuICAgICAgICAgICAgcmV0dXJuIHtoZWlnaHQsIHdpZHRofVxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXQuY29udGVudC53aWR0aH1weGA7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnQuaGVpZ2h0fXB4YDtcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICBzZXRTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIHJldHVybiB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgKyAncHgnO1xuXG5cbiAgICAgICAgICAgIC8vVE9ETzogZml4IHRoYXQgaGFjaywga2VlcCB0aGUgZnVuY3Rpb24gaW4gcmlnaHQgZm9ybWF0IHdoaWxlIG1pbmlmaWVkIDooXG4gICAgICAgICAgICBjb25zdCBub09wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRvIGVuc3VyZSBpdCdzIG5vdCBvcHRpbWl6ZWQgYXdheSwgeW91IGNhbiBjYWxsIGl0IGF0IGxlYXN0IG9uY2VcbiAgICAgICAgICAgIGxldCB4ID0gbm9PcCgpO1xuICAgICAgICAgICAgeCsrO1xuICAgICAgICAgICAgeC0tO1xuXG4gICAgICAgICAgICAvL3JldHVybiBgJHt3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHR9cHhgO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBjaGVjayB0aGF0ICsxID9cbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpXG4gICAgICAgICAgICAgICAgLCB3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpICsgeCArICdweCdcblxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gcmV0LmNvbnRlbnQ7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlXyA9IHsuLi5tZXNzYWdlfSBhcyBCYXNlTXlvcE1lc3NhZ2U7XG4gICAgICAgIC8vVE9ETyA6ID8hPyEgc2hvdWxkIGl0IGJlIGhlcmUgP1xuICAgICAgICBpZiAobWVzc2FnZV8ubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FeGVjdXRlQ29tcG9uZW50TWV0aG9kKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZV8gYXMgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZClcbiAgICAgICAgICAgIHRoaXNbdHlwZWRNZXNzYWdlLm1ldGhvZF0oKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrIDooXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9jb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgbWVzc2FnZV8uZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZV8pO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQ/LmNvbnRlbnRXaW5kb3c/LnBvc3RNZXNzYWdlKG1lc3NhZ2VfLCAnKicpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9tZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbi5NdXRhdGlvbk9ic2VydmVyTWVzc2FnZVxuICAgICAgICAgICAgfHwgaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluLlJlc2l6ZU9ic2VydmVyTWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgICAgICAvL3RoaXMuc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIub25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2xlYW51cEluc3BlY3QpXG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0KCk7XG5cbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQucGFyZW50Tm9kZSEucmVtb3ZlQ2hpbGQodGhpcy5JZnJhbWVFbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnLCBTa2luTG9hZGVyVHlwZX0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wTG9hZGVyIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcExvYWRlciBpbXBsZW1lbnRzIElNeW9wTG9hZGVyIHtcbiAgICBhYnN0cmFjdCB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBhYnN0cmFjdCBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG5cbiAgICBhcHBlbmRDaGlsZCA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMsKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5yZWxhdGl2ZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVsYXRpdmUuZGlyZWN0aW9uID09PSAnYmVmb3JlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG9wdGlvbnMucmVsYXRpdmUuY2hpbGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZS5kaXJlY3Rpb24gPT09ICdhZnRlcicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IG9wdGlvbnMucmVsYXRpdmUuY2hpbGQ/Lm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG5leHRTaWJsaW5nID8gbmV4dFNpYmxpbmcgOiBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IGFkZFF1ZXJ5UGFyYW0gPSAodXJsOiBzdHJpbmcsIHBhcmFtOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAvLyBDcmVhdGUgYSBVUkwgb2JqZWN0XG4gICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXG4gICAgLy8gQWRkIHRoZSBxdWVyeSBwYXJhbWV0ZXJcbiAgICB1cmxPYmouc2VhcmNoUGFyYW1zLmFwcGVuZChwYXJhbSwgdmFsdWUpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSB1cGRhdGVkIFVSTFxuICAgIHJldHVybiB1cmxPYmoudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGNsYXNzIE15b3BJZnJhbWVMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLklmcmFtZUxvYWRlclxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuICAgICAgICBsZXQgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgY29uc3QgdHlwZWRMb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lcj8ubm9kZU5hbWUgPT09IFwiSUZSQU1FXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCduZWVkcyB0byBsb2FkIGludG8gYW4gZXhzaXN0aW5nIElmcmFtZS4uLicsIHR5cGVkTG9hZGVyQ29uZmlnLnVybCwgY29udGFpbmVyKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IChjb250YWluZXIgYXMgSFRNTElGcmFtZUVsZW1lbnQpXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNyYyA9IHR5cGVkTG9hZGVyQ29uZmlnLnVybFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbmVlZHMgdG8gY3JlYXRlIG5ldyBJZnJhbWUuLi4nLCBkb21JZCwgdHlwZWRMb2FkZXJDb25maWcudXJsLCBjb250YWluZXIpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIHRoYXQgOlxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBpbiBvcmRlciB0byBoYW5kbGUgaXNzdWUgdG8gbG9hZCBpZnJhbWUgaW5zaWRlIGFuIGlmcmFtZSB3aXRoIHRoZSBzYW1lIHVybFxuICAgICAgICAgICAgbGV0IHVybDJsb2FkID0gKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLnVybDtcbiAgICAgICAgICAgIC8vY29uc3QgdW5pcVVybCA9IHVybDJsb2FkID09PSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmID8gYWRkUXVlcnlQYXJhbSh1cmwybG9hZCwgXCJfbVwiLCBkb21JZCkgOiB1cmwybG9hZFxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9oYXNQYXJlbnQpXG4gICAgICAgICAgICAgICAgdXJsMmxvYWQgPSBhZGRRdWVyeVBhcmFtKHVybDJsb2FkLCBcIl9teW9wLWNvbXBcIiwgdW5pcUlkKTtcblxuICAgICAgICAgICAgLy9UT0RPIDogaGFuZGxlICdzdHlsZScgYXR0ciBtZXJnZSBoZXJlXG4gICAgICAgICAgICBsZXQgZWxlbWVudEF0dHJpYnV0ZXNTdHJpbmcgPSAnJztcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5lbGVtZW50QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBlbGVtZW50QXR0cmlidXRlc1N0cmluZyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnM/LmVsZW1lbnRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtrZXl9PVwiJHtTdHJpbmcodmFsdWUpfVwiYDtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJyAnKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5vdXRlckhUTUwgPSBgPGlmcmFtZSBcbiAgICAgICAgICAgICAgIGlkPVwiJHtkb21JZH1cIlxuICAgICAgICAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICR7dHlwZWRMb2FkZXJDb25maWcuYXV0b0hlaWdodCB8fCAhdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0ID8gJycgOiB0eXBlZExvYWRlckNvbmZpZy5oZWlnaHR9OyAgICBcbiAgICAgICAgICAgICAgICAgICB3aWR0aCA6IDEwMCU7XG4gICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAke29wdGlvbnM/LmhpZGRlbiA/ICdhYnNvbHV0ZScgOiAnc3RhdGljJ307XG4gICAgICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIHNyYz1cIiR7dXJsMmxvYWR9XCJcbiAgICAgICAgICAgICR7ZWxlbWVudEF0dHJpYnV0ZXNTdHJpbmd9XG4gICAgICAgICAgICA+PC9pZnJhbWU+YDtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAjJHtkb21JZH1gKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcblxuICAgICAgICAgICAgLy8gICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZG9tSWQpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgLy9OTyA6IElmcmFtZUVsZW1lbnQgPSBjb250YWluZXIubGFzdEVsZW1lbnRDaGlsZCBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcFdlYmNvbXBvbmVudENvbnN0cyA9IHtcbiAgICB3ZWJjb21wb25lbnRfbWVzc2FnZV9rZXk6ICdteW9wX3dlYmNvbXBvbmVudF9tZXNzYWdlJ1xufVxuIiwgImltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudC9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BXZWJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIGN1c3RvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBjb250YWluZXIgLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gY3VzdG9tRWxlbWVudDtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BXZWJDb21wb25lbnQnLCAwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5jdXN0b21FbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdDtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2U8YW55PikgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgIC8vVE9ETyA6IGNhbiBiZSBkb25lIHdpdGhvdXQgY2xvbmluZz9cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlXy5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gbmV3IEN1c3RvbUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4obXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRldGFpbDogbWVzc2FnZV8sXG4gICAgICAgICAgICAvLyBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgLy8gY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAvLyBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuZGlzcGF0Y2hFdmVudChtc2cpXG5cbiAgICAgICAgLy9zZW5kaW5nIGRhdGEgZnJvbSBob3N0IHRvIHRoZSBjb21wb25lbnRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW5bMF0uZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciB3aGlsZSB0cnlpbmcgdG8gZGlzcGF0Y2hFdmVudCcsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjQsIHdhaXR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IHNlZW46IFJlY29yZDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0ge307XG5cbmV4cG9ydCBjbGFzcyBXZWJjb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuV2ViQ29tcG9uZW50TG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKCFzZWVuW2xvYWRlckNvbmZpZy51cmxdKSB7XG4gICAgICAgICAgICAvLyBhd2FpdCBpbXBvcnQoIC8qIEB2aXRlLWlnbm9yZSAqLyB3ZWJDb21wb25lbnRMb2FkVXJsKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdtb2R1bGUgbG9hZGVkJyk7XG4gICAgICAgICAgICBzZWVuW2xvYWRlckNvbmZpZy51cmxdID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlYkNvbXBvbmVudExvYWRVcmwgPSBsb2FkZXJDb25maWcudXJsXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICBzY3JpcHQuc3JjID0gd2ViQ29tcG9uZW50TG9hZFVybDtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZHVsZSBhbHJlZGF5IGxvYWRlZCBvciBpbiBsb2FkaW5nIHByb2Nlc3MnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNlZW5bbG9hZGVyQ29uZmlnLnVybF07XG5cbiAgICAgICAgLy9UT0RPIDogYWRkIHJldHJ5IG1lY2hhbmlzbSBpbiBmYWlsIGNhc2UuXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjaywgc2hvdWxkIGZpeCB0aGUgcmFjZSBjb25kaXRpb24gZm9yIGxvYWRlZCBtb2R1bGVzXG4gICAgICAgIGF3YWl0IHdhaXQoMSk7XG5cbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobG9hZGVyQ29uZmlnLnRhZyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZihvcHRpb25zPy5fZW52aXJvbm1lbnQpe1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWxlbWVudC5fbXlvcEVudmlyb25tZW50ID0gb3B0aW9ucz8uX2Vudmlyb25tZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2xvYWRlckNvbmZpZy50YWd9IC8+YDtcbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxuXG59XG4iLCAiaW1wb3J0IHtCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyLCBIb3N0ZWRDb21wb25lbnR9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlcjxULCBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+PiB7XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlVG9Ib3N0OiBhbnksIHB1YmxpYyBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+KSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2VUb0hvc3QpO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGlubmVyRXhlY3V0b3I6IChldmVudDogVCwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4gdm9pZDtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBUKSA9PiB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGlmIChldmVudC5kZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBldmVudC5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIHBhdGNoIHRoZSBzb3VyY2UgaWQsIHRoaW5rIGFib3V0IHRoYXQgP1xuICAgICAgICAgICAgICAgIGNvbnN0IF9tZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGV2ZW50LmRlc3RpbmF0aW9uID8gZXZlbnQuZGVzdGluYXRpb24gOiBldmVudC5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogZXZlbnQuc291cmNlID8gZXZlbnQuc291cmNlIDogZXZlbnQuZGVzdGluYXRpb25cbiAgICAgICAgICAgICAgICAgICAgfSBhcyBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlubmVyRXhlY3V0b3IoZXZlbnQsIHRoaXMuY29udGV4dFtkZXN0aW5hdGlvbl0uY29udGV4dCwgX21lc3NhZ2VUb0hvc3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBteW9wQXR0cmlidXRlcyA9IHtcbiAgICBpZDogJ215b3AtaWQnXG59XG4iLCAiaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHtSZWZ9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudHNCeVJlZiA9IChyZWY6IFJlZiwgZWw6IFBhcmVudE5vZGUpID0+IHtcbiAgICByZXR1cm4gZWwucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke3JlZi5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZpcnN0RWxlbWVudEJ5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZ2V0RWxlbWVudHNCeVJlZihyZWYsIGVsKTtcbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50cy5pdGVtKDApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0JpbmRDbGlja01lc3NhZ2UsIENsaWNrUmVwbGF5TWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQmluZE9uQ2xpY2tIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEJpbmRDbGlja01lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkJpbmRDbGlja01lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBCaW5kQ2xpY2tNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdClcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IENsaWNrUmVwbGF5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge015b3BFbGVtZW50TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPE15b3BFbGVtZW50TWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ2hhbmdlVGV4dE1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBNeW9wRWxlbWVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIFNoYWRvd1Jvb3RSZWYgZXh0ZW5kcyBSb290UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHVibGljIHNoYWRvd1Jvb3Q6IFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgc3VwZXIoY29udGFpbmVyLCBzaGFkb3dSb290KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wRWxlbWVudFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSwgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxEZXRlY3RNeW9wUmVmc01lc3NhZ2U+IHtcbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBEZXRlY3RNeW9wUmVmc01lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcblxuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICBjb25zdCBhbGxNeW9wSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9XWApO1xuXG4gICAgICAgIGxldCBteW9wUmVmczogTXlvcEVsZW1lbnRSZWZbXSA9IFtdO1xuXG4gICAgICAgIGFsbE15b3BJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogdGFrZSB0aGF0IGJhY2sgdG8gdGhlIGRhc2hib2FyZD9cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coaXRlbSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGl0ZW0uZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcblxuICAgICAgICAgICAgaWYgKG15b3BJZCkge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3djIHJlY3QnLCAgaXRlbS5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKVxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBteW9wUmVmcy5wdXNoKG5ldyBNeW9wRWxlbWVudFJlZihteW9wSWQsIGl0ZW0udGFnTmFtZSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgaXRlbS5vZmZzZXRUb3AsIGl0ZW0ub2Zmc2V0TGVmdCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIG15b3BSZWZzKSlcbiAgICB9O1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRGV0ZWN0TXlvcFJlZnNNZXNzYWdlO1xuXG5cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0QXR0cmlidXRlTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIHNldEF0dHJpYnV0ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8U2V0QXR0cmlidXRlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0QXR0cmlidXRlTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IFNldEF0dHJpYnV0ZU1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKGV2ZW50Lm5hbWUsIGV2ZW50LnZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsXG4gICAgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSxcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBBZGRFdmVudExpc3RlbmVySGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxBZGRFdmVudExpc3RlbmVyTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gaW4gZmFjdCB3aGVuIHJ1bm5pbmcgaW4gV2ViQ29tcG9uZW50IHdlIGNhbiB0cmFuc2ZlciB0aGUgb3JpZ2luYWwgZVxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseSB1c2luZyBtYWtlU2VyaWFsaXphYmxlIGZvciBuZXN0ZWQgY2FzZXMsIHRoaW5rIGFib3V0IHRoYXRcbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgIG1ha2VTZXJpYWxpemFibGUoZSwgZXZlbnQuc2VyaWFsaXphYmxlU2tlbGV0b24pKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQudHlwZSwgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQudHlwZSwgaGFuZGxlcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrKCkpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0hvc3RTREt9IGZyb20gXCIuLi8uLi9ob3N0L2hvc3RTREtcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcblxuICAgICAgICBjb25zdCBjcmVhdGVSZWYgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnN0IGFsbEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmPy5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbiAgICAgICAgICAgIGNvbnN0IGFsbEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG5cbiAgICAgICAgICAgIGlmIChhbGxJdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3N0U0RLID0gSG9zdFNESy5JbnN0YW5jZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBldmVudC5vcHRpb25zLmlkKSE7XG4gICAgICAgICAgICAgICAgaWYgKHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLy8vPj4+PlxuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyAgY29uc29sZS5sb2coYGZhaWxlZCB0byBmaW5kICR7ZXZlbnQub3B0aW9ucy5pZH0gaW4gbWVtIHNjb3BlYCwgaG9zdFNESyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vd2UgaGF2ZSB0aGUgcmVmIGNvbXBvbmVudCBpbiBvdXIgSG9zdFNESyAoc2FtZSBtZW1vcnkgd2hlbiB1c2luZyB3ZWJjb21wb25lbnQpXG4gICAgICAgICAgICAgICAgLy8gIHJlZkNvbXBvbmVudC5wYXJlbnQgPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAvL2RlbGV0ZSB0aGUgcmVmIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaG9zdFNESy5jb21wb25lbnRzLmluZGV4T2YocmVmQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3RTREsuY29tcG9uZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHJlbW92ZWQgdGVtcCByZWYgY29tcG9uZW50Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCB1c2luZyB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCA9IGF3YWl0IGhvc3RTREsubG9hZENvbXBvbmVudChldmVudC5uZXN0ZWRDb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAgIGFsbEl0ZW1zLml0ZW0oMCksXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Lm9wdGlvbnMpXG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBubyBuZWVkIHRoaXMsIHBhc3Mgb3B0aW9ucyBmcm9tIHBhcmVudFxuICAgICAgICAgICAgICAgIC8vaW1wbGVtZW50YXRpb25Db21wb25lbnQuaWQgPSBldmVudC5wcmVkZWZpbmVkSWQ7XG4gICAgICAgICAgICAgICAgLy9yZWZDb21wb25lbnQuaWQgKz0gJy4nO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogbm90IHJlYWxseSBuZWVkZWQgP1xuICAgICAgICAgICAgICAgIC8vIGF3YWl0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkUmVmQ29uZmlnOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmcykuZm9yRWFjaChyZWZOYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZiA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50LnJlZnNbcmVmTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIHJlZiA9IHJlZi5fX25vblByb3hpZWQgfHwgcmVmO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSZWZDb25maWcucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uSWQ6IChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIG5lc3RlZFJlZkNvbmZpZykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciAtIERPTSBlbGVtZW50IG5vdCBmb3VuZCcpXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIFtdLCB0cnVlKSk7XG5cbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWF0ZVJlZigpLnRoZW4oKVxuICAgICAgICAvL3JldHVybmluZyB1bmRlZmluZWQgc28gaXQgd29uJ3QgYWN0IGFzIGEgY2xlYW51cFxuICAgIH1cbn1cbiIsICJpbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIHJlcGxpZXI6IChkYXRhOiBhbnkpID0+IHZvaWQsIHJvb3RSZWY6IFJvb3RSZWYpID0+IHtcbiAgICBjb25zdCBfX3NjcmlwdElucHV0cyA9IGV2ZW50LnNjcmlwdElucHV0cyA/IGV2ZW50LnNjcmlwdElucHV0cyA6IHt9XG4gICAgX19zY3JpcHRJbnB1dHMubWFrZVNlcmlhbGl6YWJsZSA9IG1ha2VTZXJpYWxpemFibGU7XG5cbiAgICBfX3NjcmlwdElucHV0cy5zZW5kID0gcmVwbGllcjtcbiAgICBfX3NjcmlwdElucHV0cy5yb290UmVmID0gcm9vdFJlZjtcbiAgICBfX3NjcmlwdElucHV0cy5fX3NjcmlwdElucHV0cyA9IF9fc2NyaXB0SW5wdXRzO1xuXG4gICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7ZXZlbnQuc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgIGNvbnN0IHJldCA9IGR5bmFtaWNGdW5jdGlvbihfX3NjcmlwdElucHV0cyk7XG5cbiAgICAvLyBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBGdW5jdGlvbignc2VuZCcsICdyb290UmVmJywnX19zY3JpcHRJbnB1dHMnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIGV2ZW50LmNvbnRlbnQgPyBldmVudC5jb250ZW50IDogJycpXG4gICAgLy9jb25zdCByZXQgPSBkeW5hbWljRnVuY3Rpb24ocmVwbGllciwgcm9vdFJlZiwgX19zY3JpcHRJbnB1dHMsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKTtcbiAgICByZXBsaWVyKHJldCk7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxpZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIHNoYWRvd1Jvb3RSZWYpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSwgRm9ybURhdGFFbnRyeSwgR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgSW5wdXRFbGVtZW50VmFsdWUsfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgZ2V0SW5wdXRWYWx1ZSA9IChlbGVtZW50KTogSW5wdXRFbGVtZW50VmFsdWUgPT4ge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgZm9ybVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgZGF0YU9iamVjdDogSW5wdXRFbGVtZW50VmFsdWUgPSB7XG4gICAgICAgICAgICBmb3JtRGF0YToge30sXG4gICAgICAgICAgICB1bm1hcHBlZERhdGE6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gTWFudWFsbHkgYWRkIGVsZW1lbnRzIHdpdGhvdXQgbmFtZXNcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJyk7XG4gICAgICAgIGxldCBhdXRvTmFtZUluZGV4ZXIgPSAtMTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblxuICAgICAgICAgICAgICAgIC8vIGBfJHsoKythdXRvTmFtZUluZGV4ZXIpfWBcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhOiBGb3JtRGF0YUVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ2V0SW5wdXRWYWx1ZShlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVsZW1lbnQucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5OiBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQudmFsaWRpdHksIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICBteW9wSWQsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjaGVja2JveCBvciByYWRpbyBidXR0b25cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3QgZWxlbWVudHMgKGRyb3Bkb3ducylcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZWRpdGFibGUgZGl2cyAoY29udGVudEVkaXRhYmxlKVxuICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYW4gdW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKGdldElucHV0VmFsdWUoaXRlbSkpLCBldmVudCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtNeW9wRWxlbWVudE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWxIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFNldElubmVySHRtbD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0SW5uZXJIdG1sO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogTXlvcEVsZW1lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gKiBgYGBqc1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gJ0BteW9wL3Nkay93ZWJjb21wb25lbnQnO1xuICogYGBgXG4gKlxuICovXG5pbXBvcnQge0Jhc2VNeW9wU0RLfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtCaW5kT25DbGlja0hhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXJcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXF1ZXN0LFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7c2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50c1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcbmltcG9ydCB7R2V0RWxlbWVudFZhbHVlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHNcIjtcblxuLyoqXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3QgU0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKlxuICovXG5leHBvcnQgY2xhc3MgV2ViQ29tcG9uZW50U0RLIGV4dGVuZHMgQmFzZU15b3BTREsge1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdCA9IHRydWU7XG5cbiAgICAvL3doZW4gbmV3IHdlYiBjb21wb25lbnQgY3JlYXRlZC5cbiAgICBjb25uZWN0ZWRDYWxsYmFjayA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBzaGFkb3c6IFNoYWRvd1Jvb3QpID0+IHtcbiAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIobXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICBjb25zdCBldmVudENvbnRlbnQgPSBlLmRhdGEgPyBlLmRhdGEgOiBlLmRldGFpbDtcbiAgICAgICAgICAgIGlmICghZXZlbnRDb250ZW50IHx8ICFldmVudENvbnRlbnQubXlvcCkge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVjdmllZCB3ZWJjb21wb25lbnRfbWVzc2FnZSB3aXRoIHdyb25nIHR5cGUnKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnRDb250ZW50IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgY29udGFpbmVyIC8gY29tcG9lbm50IGlkZW50aWZpZXIgZm9yIG11bHRpbCBjb21wb25lbnRzIHN1cHBvcnRcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzKGUpXG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q29tcG9uZW50SWQgPSAobWVzc2FnZSBhcyBJbml0TWVzc2FnZSkuY29udGVudC5pZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXS5jb250ZXh0ID0gbmV3IFNoYWRvd1Jvb3RSZWYoY29udGFpbmVyLCBzaGFkb3cpXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgaGFuZGxlci5jb250ZXh0ID0gdGhpcy5zaGFkb3dSb290cztcbiAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2suIHJhY2UgY29uZGl0aW9uIHdpdGggaG9zdC5sb2FkIHdoZW4gbW9kdWxlIGxvYWRlZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlcXVlc3QoKSlcbiAgICAgICAgfSwgMSlcbiAgICB9XG5cbiAgICBtZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLnVwXG4gICAgICAgIC8vbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgJiYgcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZClcbiAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8uaGFuZGxlclVuaXF1ZUlkXG5cbiAgICAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcltdID0gW1xuICAgICAgICBuZXcgQ2hhbmdlVGV4dEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgU2V0SW5uZXJIdG1sSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBCaW5kT25DbGlja0hhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBzZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEV4ZWN1dGVTY3JpcHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICAvL1xuICAgICAgICBuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpXG4gICAgXTtcblxuICAgIHB1YmxpYyBpbml0ID0gKCkgPT4ge1xuICAgICAgICAvL3RoaXMubXlDb21wb25lbnRJZFxuICAgICAgICAvL3RoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXNcbiAgICB9XG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ1dlYkNvbXBvbmVudFNESycsIFdlYkNvbXBvbmVudFNESyk7XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vV2ViQ29tcG9uZW50U0RLXCI7XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJSFRNTExvYWRlckNvbmZpZyxcbiAgICBJU2tpbkNvbmZpZywgU2hhZG93Um9vdE1vZGVUeXBlLFxuICAgIFNraW5Mb2FkZXJzXG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tIFwiLi4vLi4vd2ViY29tcG9uZW50XCI7XG5pbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnQudHNcIjtcbi8vaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gXCIuLi8uLi9TREsudHNcIjtcblxuY29uc3Qgc2Vlbjogc3RyaW5nW10gPSBbXTtcbmxldCBzZGs7XG5jb25zdCBnZXRJbml0aWF0ZWRTZGsgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFzZGspIHtcbiAgICAgICAgLy9jb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpXG4gICAgICAgIHNkayA9IG5ldyBXZWJDb21wb25lbnRTREsoKTtcbiAgICAgICAgc2RrLmluaXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNkaztcbn1cblxuZnVuY3Rpb24gY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sU3RyaW5nOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSk6IG5ldyAoKSA9PiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgY29uc3QgbW9kZSA9IFNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUub3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnO1xuICAgICAgICAgICAgY29uc3Qgc2hhZG93ID0gdGhpcy5hdHRhY2hTaGFkb3coe21vZGV9KTtcbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayh0aGlzLCBzaGFkb3cpO1xuICAgICAgICAgICAgICAgIHNoYWRvdy5pbm5lckhUTUwgPSBodG1sU3RyaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuY29uc3QgY3JlYXRlQ3VzdG9tV2ViQ29tcG9uZW50ID0gKGNvbXBvbmVudE5hbWU6IHN0cmluZywgaHRtbDogc3RyaW5nLCBTaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGUpID0+IHtcbiAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoY29tcG9uZW50TmFtZSwgY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sLCBTaGFkb3dSb290TW9kZSkpO1xuICAgIGNvbnNvbGUubG9nKGBkZWZpbmUoJyR7Y29tcG9uZW50TmFtZX0nKSB3YXMgY2FsbGVkLCB3ZWIgY29tcG9uZW50IHJlYWR5IHRvIHVzZWApO1xufVxuXG5jb25zdCB0b1dlYkNvbXBvbmVudE5hbWUgPSAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIHN0clxuICAgICAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgdXBwZXJjYXNlIGxldHRlcnNcbiAgICAgICAgLnJlcGxhY2UoLyhcXGQrKS9nLCAnLSQxJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgZGlnaXRzXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpOyAvLyBDb252ZXJ0IHRvIGxvd2VyY2FzZVxufVxuXG5jb25zdCB0b0N1c3RvbUVsZW1lbnROYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIG5hbWUgPSB0b1dlYkNvbXBvbmVudE5hbWUobmFtZSk7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXy9nLCAnLScpO1xufVxuXG5sZXQgcGFyc2VyOiBET01QYXJzZXI7IC8vID0gbmV3IERPTVBhcnNlcigpO1xuXG5leHBvcnQgY2xhc3MgSFRNTENvbXBvbmVudExvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcblxuICAgIHR5cGUgPSBTa2luTG9hZGVycy5IVE1MTG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWcpO1xuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBsZXQgZWxlbWVudDtcblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbmVlZHMgdG8gY3JlYXRlIG5ldyBJZnJhbWUuLi4nLCBkb21JZCwgdHlwZWRMb2FkZXJDb25maWcudXJsLCBjb250YWluZXIpO1xuICAgICAgICAgICAgbGV0IElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LmlkID0gZG9tSWQ7XG4gICAgICAgICAgICAvLyBpZnJhbWUgYXJlIGRpc3BsYXkgaW5saW5lIGJ5IGRlZmF1bHQsIHdlcmUgY2hhbmdpbmcgdG8gYmxvY2tcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsIGBcbiAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAke29wdGlvbnM/LmhpZGRlbiA/ICcwJyA6ICcxJ307XG4gICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAke29wdGlvbnM/LmhpZGRlbiA/ICdhYnNvbHV0ZScgOiAnc3RhdGljJ307XG4gICAgICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgICAgYCk7XG4gICAgICAgICAgICAvLyAgaGVpZ2h0OiAke3R5cGVkTG9hZGVyQ29uZmlnLmF1dG9IZWlnaHQgfHwgIXR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodCA/ICcnIDogdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0fTtcblxuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKElmcmFtZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICAvLyBXcml0ZSBjb250ZW50IGludG8gdGhlIGlmcmFtZVxuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBkb2MgPSBJZnJhbWVFbGVtZW50LmNvbnRlbnREb2N1bWVudCB8fCBJZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgICBkb2Mub3BlbigpO1xuXG5cbiAgICAgICAgICAgIGxldCBIVE1MMlJlbmRlciA9IGxvYWRlckNvbmZpZy5IVE1MO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uX2luc3BlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAvL2luamVjdCBpbnNwZWN0aW9uIHNjcmlwdCBmb3IgcHJvcHMgZGV0ZWN0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogcGFydCBvZiBBSSBjb21wb25lbnRzLCB0aGluayBhYm91dCB0aGF0LCBkb2N1bWVudCBpdC5cbiAgICAgICAgICAgICAgICBjb25zdCBteW9wX3ByZXZpZXdfc2NyaXB0ID0gX2RvYy5nZXRFbGVtZW50QnlJZCgnbXlvcF9wcmV2aWV3Jyk7XG4gICAgICAgICAgICAgICAgbXlvcF9wcmV2aWV3X3NjcmlwdD8ucmVtb3ZlQXR0cmlidXRlKCd0eXBlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBQYXJzZSB0aGUgaW5qZWN0ZWQgSFRNTCBzdHJpbmcgaW50byBhIG5vZGVcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wID0gX2RvYy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoKTtcbiAgICAgICAgICAgICAgICB0ZW1wLmJvZHkuaW5uZXJIVE1MID0gYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVLZXlzV2luZG93ID0gbmV3IFNldChPYmplY3Qua2V5cyh3aW5kb3cpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlS2V5c1dpbmRvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0ZW1wLmJvZHkuZmlyc3RDaGlsZDtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlICYmIF9kb2MuaGVhZCkge1xuICAgICAgICAgICAgICAgICAgICBfZG9jLmhlYWQuaW5zZXJ0QmVmb3JlKF9kb2MuaW1wb3J0Tm9kZShub2RlLCB0cnVlKSwgX2RvYy5oZWFkLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIEhUTUwyUmVuZGVyID0gX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAvLyBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgLy8gY29uc3QgeCA9IF9kb2MuZ2V0RWxlbWVudEJ5SWQoJ215b3BfcHJldmlldycpO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIGlmKHgpe1xuICAgICAgICAgICAgLy8gICAgIHgucmVtb3ZlKCk7XG4gICAgICAgICAgICAvLyAgICAgSFRNTDJSZW5kZXIgPSBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh4KTtcbiAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuXG5cbiAgICAgICAgICAgIGRvYy53cml0ZWxuKEhUTUwyUmVuZGVyKTtcblxuICAgICAgICAgICAgLy8gd2luZG93Ll9fZmVkZXJhdGlvbl9fID1cbiAgICAgICAgICAgIC8vICAgICB7IC4uLndpbmRvdy5fX2ZlZGVyYXRpb25fXyxcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9UT0RPIDogZ2V0IGZyb20gRU5WIGF0IGJ1aWxkIHRpbWUsXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIGluamVjdCB2YWx1ZSB0byBtb2R1bGUgYXQgYnVpbGQgdGltZVxuICAgICAgICAgICAgLy8gICAgICAgICAvLyB0b2RheSB3ZSBkb2luZyBzbyBqdXN0IGZvciB0aGUgQ0pTIHZlcnNpb25cbiAgICAgICAgICAgIC8vICAgICAgICAgX19wdWJsaWNfcGF0aF9fIDonaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQnXG4gICAgICAgICAgICAvLyAgICAgICAgICwuLi4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18pXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH07XG5cbiAgICAgICAgICAgIGRvYy53cml0ZWxuKGA8c2NyaXB0IHNyYz1cIiR7d2luZG93Lm15b3AuX19ST09UX1NES19QVUJMSUNfVVJMX199XCI+PC9zY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgIDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18uX19wdWJsaWNfcGF0aF9fID0gIHdpbmRvdy5fX2ZlZGVyYXRpb25fXy5fX3B1YmxpY19wYXRoX187XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBjb25zdCBfX215b3BfaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2RrID0gbmV3IElmcmFtZVNESygpXG4gICAgICAgICAgICAgICAgICAgICAgICBzZGsuaW5pdCgpO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgX19teW9wX2luaXQoKS50aGVuKCk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8L3NjcmlwdD5gKTtcblxuICAgICAgICAgICAgZG9jLmNsb3NlKCk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBjb250cm9sIGZyb20gZGFzaGJvYXJkXG4gICAgICAgICAgICAvLyAgKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLmF1dG9IZWlnaHQgPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBjb21wID0gbmV3IE15b3BJZnJhbWVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5hdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXAub2JzZXJ2ZVNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIGNvbXAucHJvcHMuX2dsb2JhbCA9IGNvbXAuZWxlbWVudC5jb250ZW50V2luZG93O1xuICAgICAgICAgICAgcmV0dXJuIGNvbXA7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5ub25lKSB7XG4gICAgICAgICAgICAvLyBwYXJzZXIgPSBwYXJzZXIgPyBwYXJzZXIgOiBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAvLyBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gZG9jLmJvZHkuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIC8vZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgZG9tSWQpO1xuXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDsvLy50cmltKCk7XG4gICAgICAgICAgICBlbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgICAgICAgLy8gICBjb25zdCBmaXJzdEVsZW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgLy8gICBjb25zdCB6ID0gZmlyc3RFbGVtZW50ID8gZmlyc3RFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA6IG51bGw7XG4gICAgICAgICAgICAvLyAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gICBjb25zb2xlLmxvZyh0ZW1wbGF0ZSwgZmlyc3RFbGVtZW50LCB6KVxuICAgICAgICAgICAgLy8gICBlbGVtZW50ID0gZmlyc3RFbGVtZW50XG5cbiAgICAgICAgICAgIC8vIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Rib2R5Jyk7XG4gICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIGNvbnRhaW5lci5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgPSBjb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayhlbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21FbGVtZW50TmFtZSA9IHRvQ3VzdG9tRWxlbWVudE5hbWUoY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lICsgc2tpbi5pZCk7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgcmVkZWZpbmUgIVxuICAgICAgICAgICAgaWYgKCFzZWVuLmluY2x1ZGVzKGN1c3RvbUVsZW1lbnROYW1lKSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUN1c3RvbVdlYkNvbXBvbmVudChjdXN0b21FbGVtZW50TmFtZSwgbG9hZGVyQ29uZmlnLkhUTUwsIGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSk7XG4gICAgICAgICAgICAgICAgc2Vlbi5wdXNoKGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29udGFpbmVyLmlkLnN0YXJ0c1dpdGgoJ215b3AtY29tcC0nKSkge1xuICAgICAgICAvLyAgICAgLy8gaW4gcGxhY2UgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIC8vY29udGFpbmVyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2N1c3RvbUVsZW1lbnROYW1lfSAvPmA7XG4gICAgICAgIHJldHVybiBuZXcgTXlvcFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSAqIGFzIENTUyBmcm9tIFwiY3NzdHlwZVwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG4vLyBpZ25vcmluZyBkb2N1bWVudGF0aW9uXG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGludGVyZmFjZSBDU1NQcm9wZXJ0aWVzIGV4dGVuZHMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPiB7XG59XG5cbmV4cG9ydCB0eXBlIFN0eWxlc2hlZXREZWZpbml0aW9uID0geyBba2V5OiBzdHJpbmddOiBDU1NQcm9wZXJ0aWVzIH07XG5cbmV4cG9ydCBjb25zdCBhcHBseVN0eWxlc2hlZXQgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgc3R5bGVzaGVldDogU3R5bGVzaGVldERlZmluaXRpb24sIGNzcz86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHRhZ0lkID0gYG15b3AtY3NzLSR7dXVpZHY0KCl9YDtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfc3R5bGVzaGVldCwgX3RhZ0lkLCBfY3NzfSkgPT4ge1xuICAgICAgICBjb25zdCBzdHlsZVRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHN0eWxlVGFnLnR5cGUgPSAndGV4dC9jc3MnO1xuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBDU1Mgc3RyaW5nIGZyb20gdGhlIHN0eWxlcyBvYmplY3RcbiAgICAgICAgbGV0IGNzc1N0cmluZyA9IF9jc3M7XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWxlY3RvciBpbiBfc3R5bGVzaGVldCkge1xuICAgICAgICAgICAgY3NzU3RyaW5nICs9IGAke3NlbGVjdG9yfSB7IGA7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gX3N0eWxlc2hlZXRbc2VsZWN0b3JdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgY3NzU3RyaW5nICs9IGAke3Byb3BlcnR5fTogJHtwcm9wZXJ0aWVzW3Byb3BlcnR5XX07IGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjc3NTdHJpbmcgKz0gJ30gJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgQ1NTIHN0cmluZyBhcyB0aGUgY29udGVudCBvZiB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIHN0eWxlVGFnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzc1N0cmluZykpO1xuICAgICAgICBzdHlsZVRhZy5pZCA9IF90YWdJZDtcbiAgICAgICAgLy8gQXBwZW5kIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xuXG4gICAgfSwgKCkgPT4ge1xuICAgIH0sIHtcbiAgICAgICAgX3N0eWxlc2hlZXQ6IHN0eWxlc2hlZXQsXG4gICAgICAgIF9jc3MgOiBjc3MgPyBjc3MgOiAnJyxcbiAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgIH0pKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IGRvY3VtZW50KS5nZXRFbGVtZW50QnlJZChfdGFnSWQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIF90YWdJZDogdGFnSWRcbiAgICAgICAgfSkpXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgYXBwbHlTdHlsZXNoZWV0TGluayA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBsaW5rOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0YWdJZCA9IGBteW9wLWNzcy0ke3V1aWR2NCgpfWA7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3RhZ0lkLCBfbGlua30pID0+IHtcbiAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIGxpbmtFbGVtZW50LmlkID0gX3RhZ0lkO1xuICAgICAgICBsaW5rRWxlbWVudC5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBfbGluaztcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgLy8gQXBwZW5kIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikuYXBwZW5kQ2hpbGQobGlua0VsZW1lbnQpO1xuICAgIH0sICgpID0+IHtcbiAgICB9LCB7XG4gICAgICAgIF9saW5rIDogbGluayxcbiAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgIH0pKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IGRvY3VtZW50KS5nZXRFbGVtZW50QnlJZChfdGFnSWQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIF90YWdJZDogdGFnSWRcbiAgICAgICAgfSkpXG4gICAgfVxufVxuIiwgImltcG9ydCB7SUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IHR5cGUgVG9rZW5NYXAgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8IG51bWJlcj5cblxuY29uc3QgcmVwbGFjZVRva2VucyA9IChpbnB1dDogc3RyaW5nLCB0b2tlbk1hcDogVG9rZW5NYXApOiBzdHJpbmcgPT4ge1xuICAgIC8vIENyZWF0ZSBhIHJlZ2V4IHBhdHRlcm4gZnJvbSB0aGUga2V5cyBvZiB0aGUgdG9rZW5NYXBcbiAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyh0b2tlbk1hcCkuam9pbignfCcpLCAnZycpO1xuXG4gICAgLy8gUmVwbGFjZSB0b2tlbnMgaW4gdGhlIGlucHV0IHN0cmluZyB1c2luZyB0aGUgcmVnZXhcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZShwYXR0ZXJuLCAobWF0Y2hlZCkgPT4ge1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHJlcGxhY2VtZW50IHZhbHVlIGZyb20gdGhlIHRva2VuTWFwXG4gICAgICAgIHJldHVybiAodG9rZW5NYXBbbWF0Y2hlZF0gfHwgbWF0Y2hlZCkudG9TdHJpbmcoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUlmcmFtZVNraW5CeVRva2VuaXplciA9IChzZWxlY3RlZFNraW46IElTa2luQ29uZmlnLCB0b2tlbk1hcDogVG9rZW5NYXApID0+IHtcbiAgICBjb25zdCB0eXBlZFNraW5Db25maWcgPSAoc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKVxuICAgIGlmICh0eXBlZFNraW5Db25maWcudHlwZSAhPT0gJ0lmcmFtZUxvYWRlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpZnJhbWVTa2luVXJsVG9rZW5pemVyIHJlY2VpdmVkIHNraW4gd2l0aCBsb2FkZXIgdHlwZSBcIiR7dHlwZWRTa2luQ29uZmlnLnR5cGV9XCIsIGN1cnJlbnRseSBvbmx5IFwiSWZyYW1lTG9hZGVyXCIgaXMgc3VwcG9ydGVkYClcbiAgICB9XG5cbiAgICBzZWxlY3RlZFNraW4ubG9hZGVyID0ge1xuICAgICAgICAuLi5zZWxlY3RlZFNraW4ubG9hZGVyXG4gICAgfVxuXG4gICAgc2VsZWN0ZWRTa2luLmxvYWRlci51cmwgPSByZXBsYWNlVG9rZW5zKHNlbGVjdGVkU2tpbi5sb2FkZXIudXJsLCB0b2tlbk1hcCk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRTa2luO1xufVxuXG5leHBvcnQgY29uc3QgY2hhbmdlU2tpblVybEJ5VG9rZW5pemVyID0gKHRva2VuTWFwOiBUb2tlbk1hcCkgPT4ge1xuICAgIHJldHVybiBhc3luYyAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlSWZyYW1lU2tpbkJ5VG9rZW5pemVyKHNlbGVjdGVkU2tpbiwgdG9rZW5NYXApO1xuICAgIH1cbn0iLCAiaW1wb3J0IHtDdXN0b21SZWZNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5cbi8vIGNvbnN0IHNwYWNlID0gJyAnO1xuLy8gZXhwb3J0IGNvbnN0IGdldENsYXNzZXMgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiAoYXdhaXQgZXhlYyhhY3RBczxIVE1MRGl2RWxlbWVudD4oY29ubmVjdGVkUmVmKS5jbGFzc0xpc3QpKS52YWx1ZS5zcGxpdChzcGFjZSk7XG4vLyBleHBvcnQgY29uc3QgYWRkQ2xhc3MgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYsIGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4vLyAgICAgY29uc3QgY2xhc3NlcyA9IGF3YWl0IGdldENsYXNzZXMoY29ubmVjdGVkUmVmKTtcbi8vICAgICBjbGFzc2VzLmluY2x1ZGVzKGNsYXNzTmFtZSkgfHwgY2xhc3Nlcy5wdXNoKGNsYXNzTmFtZSk7XG4vLyAgICAgLy8gQHRzLWlnbm9yZVxuLy8gICAgIGNvbm5lY3RlZFJlZi5jbGFzc0xpc3QgPSBjbGFzc2VzLmpvaW4oc3BhY2UpO1xuLy8gfVxuLy8gZXhwb3J0IGNvbnN0IHJlbW92ZUNsYXNzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmLCBjbGFzc05hbWU6IHN0cmluZywpID0+IHtcbi8vICAgICBsZXQgY2xhc3NlcyA9IGF3YWl0IGdldENsYXNzZXMoY29ubmVjdGVkUmVmKTtcbi8vICAgICAvLyBAdHMtaWdub3JlXG4vLyAgICAgY29ubmVjdGVkUmVmLmNsYXNzTGlzdCA9IGNsYXNzZXMuZmlsdGVyKGMgPT4gYyAhPT0gY2xhc3NOYW1lKS5qb2luKHNwYWNlKTtcbi8vIH1cbi8vXG4vL1xuXG5leHBvcnQgY29uc3QgYWRkQ2xhc3MgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY2xhc3NOYW1lOiBzdHJpbmcsIG15b3BJZDogc3RyaW5nKSA9PiB7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIF9jbGFzc05hbWV9KSA9PiB7XG4gICAgICAgIHJlZj8uY2xhc3NMaXN0LmFkZChfY2xhc3NOYW1lKTtcbiAgICB9LCB7XG4gICAgICAgIGVsZW1lbnRJZDogbXlvcElkLFxuICAgICAgICBfY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICB9KSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVDbGFzcyA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjbGFzc05hbWU6IHN0cmluZywgbXlvcElkOiBzdHJpbmcpID0+IHtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgX2NsYXNzTmFtZX0pID0+IHtcbiAgICAgICAgcmVmPy5jbGFzc0xpc3QucmVtb3ZlKF9jbGFzc05hbWUpO1xuICAgIH0sIHtcbiAgICAgICAgZWxlbWVudElkOiBteW9wSWQsXG4gICAgICAgIF9jbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgIH0pKTtcbn0iLCAiaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZywgSUhUTUxMb2FkZXJDb25maWcsIElSZWZDb25maWcsXG4gICAgSVNraW5Mb2FkZXJDb25maWcsXG4gICAgSVNraW5TZWxlY3RvckNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZywgSVNraW5Db25maWdcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlscy50c1wiO1xuXG5leHBvcnQgY2xhc3MgU2tpbkNvbmZpZyBpbXBsZW1lbnRzIElTa2luQ29uZmlnIHtcbiAgICBfcnVuVGltZUluc3RhbmNlSWQgPSAncnVudGltZS1pbnN0YW5jZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVJZCA9ICdydW50aW1lLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZU5hbWUgPSAncnVudGltZS1uYW1lLScgKyB1dWlkdjQoKTtcblxuICAgIHN0YXRpYyBjcmVhdGUgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2tpbkNvbmZpZygpO1xuICAgIH1cblxuICAgIGlkID0gdGhpcy5fcnVuVGltZUlkO1xuICAgIG5hbWUgPSB0aGlzLl9ydW5UaW1lTmFtZTtcbiAgICBkZXNjcmlwdGlvbiA9ICcnO1xuICAgIGxvYWRlciA9IG51bGwgYXMgdW5rbm93biBhcyBJU2tpbkxvYWRlckNvbmZpZztcblxuICAgIHdpdGhMb2FkZXIgPSAobG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aEhUTUxMb2FkZXIgPSAobG9hZGVyOiBPbWl0PElIVE1MTG9hZGVyQ29uZmlnLCAndHlwZSc+KSA9PiB7XG4gICAgICAgIGxvYWRlci50eXBlID0gJ0hUTUxMb2FkZXInO1xuICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYnVpbGQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudENvbmZpZyBpbXBsZW1lbnRzIElDb21wb25lbnRDb25maWcge1xuICAgIF9ydW5UaW1lSW5zdGFuY2VJZCA9ICdydW50aW1lLWluc3RhbmNlLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZUlkID0gJ3J1bnRpbWUtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lTmFtZSA9ICdydW50aW1lLW5hbWUtJyArIHV1aWR2NCgpO1xuXG4gICAgc3RhdGljIGNyZWF0ZSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRDb25maWcoKTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZSA9IHtcbiAgICAgICAgaWQ6IHRoaXMuX3J1blRpbWVJbnN0YW5jZUlkLFxuICAgICAgICBjb21wb25lbnRJZDogdGhpcy5fcnVuVGltZUlkLFxuICAgICAgICBjb21wb25lbnROYW1lOiB0aGlzLl9ydW5UaW1lTmFtZSxcbiAgICAgICAgc2tpblNlbGVjdG9yOiBudWxsIGFzIHVua25vd24gYXMgSVNraW5TZWxlY3RvckNvbmZpZ1xuICAgIH0gYXMgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnO1xuXG4gICAgbmFtZSA9IHRoaXMuX3J1blRpbWVOYW1lXG4gICAgdHlwZSA9IHtcbiAgICAgICAgaWQ6IHRoaXMuX3J1blRpbWVJZCxcbiAgICAgICAgbmFtZTogdGhpcy5fcnVuVGltZU5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICByZWZzOiBbXSxcbiAgICAgICAgc2tpbnM6IFtdLFxuICAgICAgICBkZWZhdWx0U2tpbjogMFxuICAgIH0gYXMgSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIHdpdGhJbnN0YW5jZSA9IChpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aFR5cGUgPSAodHlwZTogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aE5hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhEZWZhdWx0U2tpbiA9IChkZWZhdWx0U2tpbjogSVNraW5Db25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlLnNraW5zLnB1c2goZGVmYXVsdFNraW4pO1xuICAgICAgICB0aGlzLnR5cGUuZGVmYXVsdFNraW4gPSB0aGlzLnR5cGUuc2tpbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRGVkaWNhdGVkJyxcbiAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICBpZDogZGVmYXVsdFNraW4uaWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhSZWYgPSAocmVmOiBJUmVmQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZS5yZWZzLnB1c2gocmVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aEJhc2ljUmVmID0gKHJlZlNlbGVjdG9yOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgbmV3QmFzaWNSZWYgPSB7XG4gICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICBuYW1lOiByZWZTZWxlY3RvcixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICBzZWxlY3RvcjogcmVmU2VsZWN0b3IsXG4gICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGFzIElSZWZDb25maWdcblxuICAgICAgICB0aGlzLnR5cGUucmVmcy5wdXNoKG5ld0Jhc2ljUmVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYnVpbGQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMpKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge0lVc2VyRmxvdywgdjJfSVZhcmlhbnRDb25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcblxuLyoqXG4gKiBDbG91ZFJlcG9zaXRvcnkgLSBVbmlmaWVkIGNsb3VkIGRhdGEgYWNjZXNzIGxheWVyIGZvciBNeW9wIGNvbXBvbmVudHNcbiAqXG4gKiBTdXBwb3J0cyBib3RoIHYyIChkZWZhdWx0KSBhbmQgdjEgbW9kZXM6XG4gKiAtIHYyOiBVc2VzIC9jb25zdW1lIGVuZHBvaW50IGZvciBmZXRjaGluZyB2YXJpYW50c1xuICogLSB2MTogVXNlcyAvZmxvdyBlbmRwb2ludCBmb3IgZmV0Y2hpbmcgdXNlciBmbG93c1xuICovXG5leHBvcnQgY2xhc3MgQ2xvdWRSZXBvc2l0b3J5IHtcbiAgICBzdGF0aWMgTWFpbiA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoKTtcblxuICAgIC8vIHYyIGNhY2hlXG4gICAgcHJpdmF0ZSB2YXJpYW50czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTx2Ml9JVmFyaWFudENvbmZpZz4+ID0ge307XG5cbiAgICAvLyB2MSBjYWNoZVxuICAgIHByaXZhdGUgdXNlckZsb3dzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPElVc2VyRmxvdz4+ID0ge307XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYXNlVXJsID0gJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnKSB7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYyIE1ldGhvZHMgKERlZmF1bHQpID09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBjb21wb25lbnQgaXMgYWxyZWFkeSBjYWNoZWQvcHJlbG9hZGVkICh2MilcbiAgICAgKi9cbiAgICBpc1ByZWxvYWRlZChjb21wb25lbnRJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnRJZCBpbiB0aGlzLnZhcmlhbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgdjIgY29tcG9uZW50IHZhcmlhbnRcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudFYyKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudmlyb25tZW50SWRlbnRpZmllcj86IHN0cmluZyk6IFByb21pc2U8djJfSVZhcmlhbnRDb25maWc+IHtcbiAgICAgICAgaWYgKCF0aGlzLnZhcmlhbnRzW2NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudmFyaWFudHNbY29tcG9uZW50SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vY29uc3VtZT9pZD0ke2NvbXBvbmVudElkfSZlbnY9JHtlbnZpcm9ubWVudElkZW50aWZpZXJ9YFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudmFyaWFudHNbY29tcG9uZW50SWRdO1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PSBWMSBNZXRob2RzIChMZWdhY3kpID09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSB2MSBjb21wb25lbnQgZnJvbSBhIGZsb3dcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICBpZiAoZmxvd0lkKSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEZsb3coZmxvd0lkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHMuZmluZChjID0+IGMudHlwZS5pZCA9PT0gY29tcG9uZW50SWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IHRoaXMuZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXR1cm4gZmxvdy5jb21wb25lbnRzWzBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2NvbXBvbmVudElkfSZhdXRvPXRydWVgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdO1xuICAgIH1cblxuICAgIGFzeW5jIGZldGNoRmxvdyhmbG93SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2Zsb3dJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tmbG93SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2Zsb3dJZF07XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZmV0Y2hDb21wb25lbnRWMiBvciBmZXRjaENvbXBvbmVudFYxIGV4cGxpY2l0bHlcbiAgICAgKiBEZWZhdWx0cyB0byB2MSBiZWhhdmlvciBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGVcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBmbG93SWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hDb21wb25lbnRWMShjb21wb25lbnRJZCwgZmxvd0lkKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIENsb3VkUmVwb3NpdG9yeSBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBjb25zdCB2Ml9DbG91ZFJlcG9zaXRvcnkgPSBDbG91ZFJlcG9zaXRvcnk7XG4iLCAiZXhwb3J0IGNvbnN0IGV4ZWMgPSBhc3luYyAoZ2V0dGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2V0dGVyKClcbn1cbiIsICJleHBvcnQgKiBmcm9tIFwiLi9hcHBseVN0eWxlc2hlZXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2lmcmFtZVNraW5VcmxUb2tlbml6ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NsYXNzTGlzdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uZmlnQnVpbGRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ2xvdWRSZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leGVjXCI7IiwgImltcG9ydCB7ZGVjb21wcmVzc1VVSURzfSBmcm9tIFwiLi4vdXRpbHMvdXVpZC50c1wiO1xuaW1wb3J0IHtDbG91ZFJlcG9zaXRvcnl9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQge1xuICAgIEV4cGVyaWVuY2VUeXBlcyxcbiAgICBJQ29tcG9uZW50Q29uZmlnLCBJRGVkaWNhdGVkU2tpbkNvbmZpZyxcbiAgICBJU2VnbWVudGVkU2tpbkNvbmZpZyxcbiAgICBJU2VnbWVudEV4cGVyaWVuY2UsIElTa2luSW5zdGFuY2VDb25maWcsXG4gICAgU2tpblNlbGVjdG9yVHlwZXNcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY29uc3QgY2hlY2tNeW9wT3ZlcnJpZGUgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnIHwgbnVsbD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIC8vVE9ETzogc3VwcG9ydCBkaXNhYmxpbmcgdGhlIG1lY2hhbmlzbVxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwuc2VhcmNoKTtcbiAgICAgICAgY29uc3QgbXlvcE92ZXJyaWRlID0gcGFyYW1zLmdldCgnbXlvcE92ZXJyaWRlJyk7XG4gICAgICAgIGlmIChteW9wT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IFtzb3VyY2UsIC4uLnV1aWRzXSA9IGRlY29tcHJlc3NVVUlEcyhteW9wT3ZlcnJpZGUpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbXBvbmVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2NvbXBvbmVudElkLCBza2luSWRdID0gdXVpZHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvT3ZlcnJpZGUgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaENvbXBvbmVudChjb21wb25lbnRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiBjaGVjayBmZXRjaEF1dG9GbG93LiBMb29rcyBsaWtlIG9ubHkgb25lIHNraW4gaXMgcmV0dXJuZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNraW4gPSBjb21wb25lbnRUb092ZXJyaWRlLnR5cGUuc2tpbnMuZmluZChza2luID0+IHNraW4uaWQgPT09IHNraW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGZvciBub3cganVzdCBzZXQgc2tpbiBpZC4gQ2hlY2sgdGhlIGNsb3VkIGltcGxlbWVudGF0aW9uXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogc2tpbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSVNraW5JbnN0YW5jZUNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUb092ZXJyaWRlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gICAgY2FzZSAnZmxvdyc6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0IDoge1xuICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IFtmbG93SWQsIGV4cGVyaW1lbnRJZF0gPSB1dWlkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2Zsb3dJZCwgZXhwZXJpbWVudElkXSA9IGRlY29tcHJlc3NVVUlEcyhteW9wT3ZlcnJpZGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hGbG93KGZsb3dJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvT3ZlcnJpZGUgPSBmbG93LmNvbXBvbmVudHMuZmluZChjID0+IGMudHlwZS5pZCA9PT0gY29tcG9uZW50Q29uZmlnLnR5cGUuaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLnR5cGUgPT09IFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZEV4cGVyaWVuY2UgPSBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMuZmluZChlID0+IGUuaWQgPT09IGV4cGVyaW1lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkRXhwZXJpZW5jZT8udHlwZSA9PT0gRXhwZXJpZW5jZVR5cGVzLlNlZ21lbnQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRSZXNvbHZlZEV4cGVyaWVuY2UgPSByZXNvbHZlZEV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgYXMgSVNlZ21lbnRlZFNraW5Db25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0eXBlZFNraW5TZWxlY3Rvci5zZWdtZW50cy5maW5kKHMgPT4gcy5zZWdtZW50SWQgPT09IHR5cGVkUmVzb2x2ZWRFeHBlcmllbmNlLnNlZ21lbnQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHNlZ21lbnQ/LnNraW5TZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50VG9PdmVycmlkZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgSG9zdCBTREsgaXMgZGVzaWduZWQgZm9yIGludGVncmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyBhcyB0aGUgY29udGFpbmVyIGZvciBNeW9wICBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIEl0IHByb3ZpZGVzIGVzc2VudGlhbCBmdW5jdGlvbmFsaXRpZXMgYW5kIEFQSXMgZm9yIHJlZ2lzdGVyaW5nLCBtYW5hZ2luZywgYW5kIGNvbW11bmljYXRpbmcgd2l0aCBNeW9wIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogVGhpcyBTREsgZW5hYmxlcyBzZWFtbGVzcyBlbWJlZGRpbmcgb2YgaW5kZXBlbmRlbnRseSBkZXZlbG9wZWQgY29tcG9uZW50cyBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uLCBlbnN1cmluZyBzbW9vdGggaW50ZXJvcGVyYWJpbGl0eSBhbmQgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UgYWNyb3NzIHZhcmlvdXMgTXlvcCBjb21wb25lbnQgaW1wbGVtZW50YXRpb25zLlxuICovXG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7SU15b3BMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRW52ZWxvcGVkTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsIE1lc3NhZ2VEaXJlY3Rpb24sIFJlZlxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcElmcmFtZUxvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9pZnJhbWVMb2FkZXJcIjtcbmltcG9ydCB7V2ViY29tcG9uZW50TG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHR5cGUge0lmcmFtZVNES30gZnJvbSBcIi4uL0lmcmFtZVwiO1xuaW1wb3J0IHtjb25uZWN0UHJvcHMsIGNvbm5lY3RSZWZzLCBjcmVhdGVSZWZDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7XG4gICAgRXhwZXJpZW5jZVR5cGVzLFxuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSURlZGljYXRlZFNraW5Db25maWcsIElFeHBlcmllbmNlLCBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudCwgSVNlZ21lbnRlZFNraW5Db25maWcsIElTZWdtZW50RXhwZXJpZW5jZSxcbiAgICBJU2tpbkNvbmZpZywgSVNraW5TZWxlY3RvckNvbmZpZywgU2tpblNlbGVjdG9yVHlwZXMsXG5cblxufSBmcm9tIFwiLi4vY29tbW9uXCI7XG4vLyBAdHMtaWdub3JlIGhhbmRsZWQgYnkgY3VzdG9tIGVzYnVpbGQgcGx1Z2luXG5pbXBvcnQgdmVyc2lvbiBmcm9tIFwibXlvcC1zZGstdmVyc2lvblwiO1xuaW1wb3J0IHtIVE1MQ29tcG9uZW50TG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL0hUTUxDb21wb25lbnRMb2FkZXJcIjtcbmltcG9ydCB7Y2hlY2tNeW9wT3ZlcnJpZGV9IGZyb20gXCIuL215b3BPdmVycmlkZS50c1wiO1xuXG5pbnRlcmZhY2UgY29tcG9uZW50TG9hZGVyQ3JlYXRvciB7XG4gICAgbmV3KGxvYWRlcnM6IElNeW9wTG9hZGVyW10pOiBhbnk7XG59XG5cbi8vIGNvbnN0IGdldENvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBhc3luYyAoaWQ6IHN0cmluZykgPT4ge1xuLy8gICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGBodHRwOi8vbG9jYWxob3N0OjMwMDAvY29tcG9uZW50P2lkPSR7aWR9YCk7XG4vLyAgICAgY29uc3QgY29tcG9uZW50RGVmOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IChhd2FpdCByZXMuanNvbigpKS5pdGVtO1xuLy8gICAgIHJldHVybiBjb21wb25lbnREZWZcbi8vIH1cblxuLy9jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2RmZGxrMnAxbTE4N3YuY2xvdWRmcm9udC5uZXQvbXlvcF9zZGsubWluLmpzJ1xuY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQvbXlvcF9zZGsubWluLmpzJ1xuXG4vKipcbiAqIFRoZSBIb3N0IFNESyBpcyBkZXNpZ25lZCBmb3IgaW50ZWdyYXRpb24gd2l0aGluIHRoZSBob3N0IGFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIGFzIHRoZSBjb250YWluZXIgZm9yIE15b3AgIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogSXQgcHJvdmlkZXMgZXNzZW50aWFsIGZ1bmN0aW9uYWxpdGllcyBhbmQgQVBJcyBmb3IgcmVnaXN0ZXJpbmcsIG1hbmFnaW5nLCBhbmQgY29tbXVuaWNhdGluZyB3aXRoIE15b3AgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBUaGlzIFNESyBlbmFibGVzIHNlYW1sZXNzIGVtYmVkZGluZyBvZiBpbmRlcGVuZGVudGx5IGRldmVsb3BlZCBjb21wb25lbnRzIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24sIGVuc3VyaW5nIHNtb290aCBpbnRlcm9wZXJhYmlsaXR5IGFuZCBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZSBhY3Jvc3MgdmFyaW91cyBNeW9wIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3N0U0RLIHtcbiAgICBzdGF0aWMgSW5zdGFuY2UgPSAoKSA9PiB3aW5kb3cubXlvcC5ob3N0U0RLO1xuXG4gICAgY29tcG9uZW50czJpbml0OiBJTXlvcENvbXBvbmVudFtdID0gW107XG4gICAgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSA9IFtdO1xuICAgIGNvbXBvbmVudHNMb2FkZXJzOiBJTXlvcExvYWRlcltdID0gW107XG5cbiAgICBwdWJsaWMgaW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgdmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICB0eXBlMkluc3RhbmNlQ291bnQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBwdWJsaWMgYXNzaWduSWQgPSAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXSkge1xuICAgICAgICAgICAgdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtjb21wb25lbnREZWZpbml0aW9uLmlkfV8keysrdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF19YDtcbiAgICB9XG5cbiAgICAvL1RPRE8gOiBmaXggdGhlIGluc3BlY3QgaW1wbGVtZW50YXRpb24gaW5zaWRlIHJlZkNvbXBvbmVudFxuICAgIC8vdGhlbiBpbnNwZWN0ZWQgbWF5YmUgY2FuIGJlIGRyb3BwZWRcbiAgICBwcml2YXRlIGluc3BlY3RlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyBpbnNwZWN0ID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbnNwZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5pbnNwZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50Lmluc3BlY3QpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5zcGVjdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmNvbWluZ01lc3NhZ2VIYW5kbGVyID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPikgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdpbmNvbWluZ01lc3NhZ2VIYW5kbGVyIEdPVCAnLCBldmVudClcbiAgICAgICAgLy9UT0RPIDogIGlmIChldmVudC5vcmlnaW4gIT09IFwiaHR0cDovL2V4YW1wbGUub3JnOjgwODBcIikgcmV0dXJuO1xuICAgICAgICBpZiAoZXZlbnQub3JpZ2luID09PSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ0kgS25vdyB0aGF0ICEhIScpO1xuICAgICAgICAgICAgLy8gIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvL2NvbnNvbGUubG9nKFwiZXZlbnQgb24gaG9zdCBzaWRlIFwiLCBldmVudCk7XG5cbiAgICAgICAgaWYgKGV2ZW50LmRhdGEubXlvcCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuZGlyZWN0aW9uICE9PSBNZXNzYWdlRGlyZWN0aW9uLnVwICYmIGV2ZW50LmRhdGEubWVzc2FnZVR5cGUgIT09IE15b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbWVzc2FnZSBkcm9wcGVkIGluIGhvc3RzZGssIGRpcmVjdGlvbiB3YXMgJywgZXZlbnQuZGF0YS5kaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJldmVudCBvbiBob3N0IHNpZGUgXCIsIGV2ZW50KTtcblxuICAgICAgICAgICAgY29uc3QgbXlvcE1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSA9IGV2ZW50LmRhdGE7XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgSW5pdE1lc3NhZ2UoY29tcG9uZW50LmlkKSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGNvbXBvbmVudHMgMiBpbml0XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0ID0gdGhpcy5jb21wb25lbnRzMmluaXQuZmlsdGVyKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgIT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQuaWQpXG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWF0ZWRDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSAobXlvcE1lc3NhZ2UgYXMgSW5pdFJlc3BvbnNlKS5jb250ZW50Py5pZCk7XG4gICAgICAgICAgICAgICAgaW5pdGlhdGVkQ29tcG9uZW50Py5zZXRJbml0aWF0ZWQoKVxuICAgICAgICAgICAgICAgIC8vaW5pdGlhdGVkQ29tcG9uZW50Py5wYXJlbnQ/LnNldEluaXRpYXRlZCgpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBpcyBpdCB0cnVlIHRvIG5vdCBwYXNzIGZ1cnRoZXIgKCB0byB0aGUgY29tcG9uZW50IClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG15b3BNZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSB0eXBlZE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRNZXNzYWdlLmRpcmVjdGlvbiA9PT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRNZXNzYWdlLm1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IEV4ZWN1dGVDb21wb25lbnRNZXRob2QubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5vbk1lc3NhZ2VSZWNlaXZlZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZE1lc3NhZ2UubWVzc2FnZS5yb3V0ZSA9IHR5cGVkTWVzc2FnZS5yb3V0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuc2VuZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbm5lckNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5tZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyA6IGxvZyA/XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vY29tcG9uZW50LnJlZnMuYm9keS5vbk1lc3NhZ2VSZWNlaXZlZChteW9wTWVzc2FnZS5tZXNzYWdlKTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gbXlvcE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIC8vbm8gaW4gbWVtIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIC8vcGFzcyB0byBwYXJlbnQgSG9zdFNESyB0byB0cnkgcHJvY2VzcyB0aGVyZVxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLLm1lc3NhZ2VUb0hvc3QobXlvcE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9ub3QgcHJvY2Vzc2VkIGluIG9uTWVzc2FnZVJlY2VpdmVkXG4gICAgICAgICAgICAgICAgICAgIC8vcGFzcyB0byBwYXJlbnQgSG9zdFNESyB0byB0cnkgcHJvY2VzcyB0aGVyZVxuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Lm15b3AuSWZyYW1lU0RLKVxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLLm1lc3NhZ2VUb0hvc3QobXlvcE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGV2ZW50LnNvdXJjZS5wb3N0TWVzc2FnZShcbiAgICAgICAgLy8gICAgIFwiaGkgdGhlcmUgeW91cnNlbGYhICB0aGUgc2VjcmV0IHJlc3BvbnNlIFwiICsgXCJpczogcmhlZWVlZXQhXCIsXG4gICAgICAgIC8vICAgICBldmVudC5vcmlnaW4sXG4gICAgICAgIC8vICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3Qgc3ludGhldGljRXZlbnQgPSBuZXcgTWVzc2FnZUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4oJycsXG4gICAgICAgICAgICB7ZGF0YTogbWVzc2FnZX1cbiAgICAgICAgKVxuXG4gICAgICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlSGFuZGxlcihzeW50aGV0aWNFdmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQgPSAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnM/OiBjb21wb25lbnRMb2FkZXJDcmVhdG9yW10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hvc3RTREsgYWxyZWFkeSBpbml0aWF0ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2ljTG9hZGVycyA9IFtcbiAgICAgICAgICAgIG5ldyBNeW9wSWZyYW1lTG9hZGVyKCksXG4gICAgICAgICAgICBuZXcgV2ViY29tcG9uZW50TG9hZGVyKCksXG4gICAgICAgICAgICBuZXcgSFRNTENvbXBvbmVudExvYWRlcigpXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycyA9IFtcbiAgICAgICAgICAgIC4uLmJhc2ljTG9hZGVyc1xuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycykge1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlckJ5VHlwZTogUmVjb3JkPHN0cmluZywgSU15b3BMb2FkZXI+ID0ge307XG5cbiAgICAgICAgICAgIGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzLmZvckVhY2goY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvciA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tTG9hZGVyID0gbmV3IGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3IodGhpcy5jb21wb25lbnRzTG9hZGVycyk7XG4gICAgICAgICAgICAgICAgbG9hZGVyQnlUeXBlW2N1c3RvbUxvYWRlci50eXBlXSA9IGN1c3RvbUxvYWRlcjtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMuZm9yRWFjaChsb2FkZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghbG9hZGVyQnlUeXBlW2xvYWRlci50eXBlXSlcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyQnlUeXBlW2xvYWRlci50eXBlXSA9IGxvYWRlcjtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMgPSBPYmplY3QudmFsdWVzKGxvYWRlckJ5VHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmNvbW1pbmcgbWVzc2FnZXMgZnJvbSBJRnJhbWVzXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICB0aGlzLmluY29taW5nTWVzc2FnZUhhbmRsZXIsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zb2xlLmxvZygnbXlvcCBob3N0U0RLIGluaXRpYXRlZCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICB0aGlzLmluaXRpYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0U2tpbklkQnlTa2luU2VsZWN0b3IgPSBhc3luYyAoc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnLCBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXSA9IFtdLCBob29rcz86IGxvYWRlckhvb2tzKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gYXN5bmNGaW5kPFQ+KFxuICAgICAgICAgICAgYXJyYXk6IFRbXSxcbiAgICAgICAgICAgIHByZWRpY2F0ZTogKGl0ZW06IFQpID0+IFByb21pc2U8Ym9vbGVhbj5cbiAgICAgICAgKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyYXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgcHJlZGljYXRlKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIFJldHVybiB1bmRlZmluZWQgaWYgbm8gbWF0Y2ggaXMgZm91bmRcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoc2tpblNlbGVjdG9yLnR5cGUpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNhc2UgXCJEZWRpY2F0ZWRTa2luXCIgOiAvL2JhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgIGNhc2UgU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkOiB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU2tpbklkID0gKHNraW5TZWxlY3RvciBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZykuc2tpbj8uaWRcbiAgICAgICAgICAgICAgICAgICAgfHwgKHNraW5TZWxlY3RvciBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZykuc2tpbnMhWzBdLmlkO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkU2tpbklkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNraW5TZWxlY3RvciA9IChza2luU2VsZWN0b3IgYXMgSVNlZ21lbnRlZFNraW5Db25maWcpXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IGF3YWl0IGFzeW5jRmluZCh0eXBlZFNraW5TZWxlY3Rvci5zZWdtZW50cywgYXN5bmMgc2VnbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50LnNlZ21lbnRJZCA9PT0gJ0RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVyaWVuY2UgPSBleHBlcmllbmNlcy5maW5kKGV4cGVyaWVuY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVyaWVuY2UudHlwZSA9PT0gRXhwZXJpZW5jZVR5cGVzLlNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlKS5zZWdtZW50LmlkID09PSBzZWdtZW50LnNlZ21lbnRJZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cGVyaWVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImV4cGVyaWVuY2Ugbm90IGZvdW5kXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRFeHBlcmllbmNlID0gZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2VnbWVudCA9ICh0eXBlZEV4cGVyaWVuY2Uuc2VnbWVudCBhcyBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudClcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50RnVuY3Rpb24gPSAoaG9va3MgPyBob29rcyA6IHt9KVt0eXBlZFNlZ21lbnQuZnVuY3Rpb25dO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgc2VnbWVudEZ1bmN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybihgc2VnbWVudElkOiR7c2VnbWVudC5zZWdtZW50SWR9LCAke3R5cGVkU2VnbWVudC5mdW5jdGlvbn0gZnVuY3Rpb24gbm90IHByb3ZpZGVkICFgKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTa2luSWRCeVNraW5TZWxlY3RvcihzZWdtZW50LnNraW5TZWxlY3RvciwgZXhwZXJpZW5jZXMpO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnIC8vVE9ET1xuICAgIH1cblxuICAgIHByaXZhdGUgcnVuU2tpblNlbGVjdG9yID0gYXN5bmMgKGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgaG9va3M/OiBsb2FkZXJIb29rcykgPT4ge1xuICAgICAgICBjb25zdCBza2luSWQgPSBhd2FpdCB0aGlzLl9nZXRTa2luSWRCeVNraW5TZWxlY3Rvcihjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLCBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcywgaG9va3MpO1xuICAgICAgICByZXR1cm4gY29tcG9uZW50Q29uZmlnLnR5cGUuc2tpbnMuZmluZChza2luID0+IHNraW4uaWQgPT09IHNraW5JZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRlckhvb2tzPzogbG9hZGVySG9va3M7XG5cbiAgICBwdWJsaWMgbG9hZENvbXBvbmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4oY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb250YWluZXI/OiBIVE1MRWxlbWVudCB8IFJlZiwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpOlxuICAgICAgICBQcm9taXNlPFQ+ID0+IHtcblxuICAgICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGNvbnRhaW5lciB3YXMgZm91bmQgZm9yIHRoaXMgY29tcG9uZW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdmVycmlkZGVuQ29uZmlnID0gYXdhaXQgY2hlY2tNeW9wT3ZlcnJpZGUoY29tcG9uZW50Q29uZmlnKTtcbiAgICAgICAgaWYgKG92ZXJyaWRkZW5Db25maWcpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IGxvZ1xuICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gb3ZlcnJpZGRlbkNvbmZpZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gaWYgKCFjb250YWluZXIuX19ub25Qcm94aWVkKSB7XG4gICAgICAgIC8vICAgICBjb25zdCByZWZDb21wb25lbnQgPSAoY29udGFpbmVyIGFzIHVua25vd24gYXMgTXlvcFJlZkNvbXBvbmVudCk7XG4gICAgICAgIC8vICAgICAvL2lmIHdlIGdvdCBsb2FkQ29tcG9uZW50IG92ZXIgTXlvcFJlZkNvbXBvbmVudFxuICAgICAgICAvLyAgICAgaWYgKHJlZkNvbXBvbmVudC5pZCAmJiByZWZDb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMubG9hZENvbXBvbmVudChjb21wb25lbnRDb25maWcsIHJlZkNvbXBvbmVudC5yZWYsIG9wdGlvbnMpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIC8vIGxldCByb290Q29tcG9uZW50OiBJTXlvcENvbXBvbmVudCA9IHJlZkNvbXBvbmVudDtcbiAgICAgICAgLy8gICAgICAgICAvLyB3aGlsZSghcm9vdENvbXBvbmVudC5lbGVtZW50ICYmIHJvb3RDb21wb25lbnQucGFyZW50KXtcbiAgICAgICAgLy8gICAgICAgICAvLyAgICAgcm9vdENvbXBvbmVudCA9IHJvb3RDb21wb25lbnQucGFyZW50XG4gICAgICAgIC8vICAgICAgICAgLy8gfVxuICAgICAgICAvLyAgICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gcm9vdENvbXBvbmVudC5lbGVtZW50XG4gICAgICAgIC8vICAgICAgICAgLy8gLy93aGF0IG5vdyA/XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICBjb25zdCBob29rcyA9IHsuLi4odGhpcy5sb2FkZXJIb29rcyA/PyB7fSksIC4uLihvcHRpb25zPy5ob29rcyA/PyB7fSl9O1xuXG4gICAgICAgIGNvbnN0IHJlZiA9IGNvbnRhaW5lciBhcyBSZWY7XG4gICAgICAgIGlmIChyZWYubXlvcCkge1xuICAgICAgICAgICAgaWYgKHJlZi5jb21wb25lbnQpIHtcblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyA9IHsuLi5jb21wb25lbnRDb25maWd9O1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY29tcG9uZW50Q29uZmlnLmluc3RhbmNlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU2tpbiA9IGF3YWl0IHRoaXMucnVuU2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZywgaG9va3MpIVxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRTa2luKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lmhvb2tzPy5hZnRlclNraW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgIHNraW46IHNlbGVjdGVkU2tpblxuICAgICAgICAgICAgICAgICAgICAvLyAgc2tpbnM6IFtzZWxlY3RlZFNraW5dXG4gICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsuLi5vcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5ob29rc1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGF3YWl0IGNyZWF0ZVJlZkNvbXBvbmVudDxUPihyZWYsIGNvbXBvbmVudENvbmZpZywgdGhpcy5jb21wb25lbnRzLCBvcHRpb25zKTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNvbm5lY3QgcmVmcyBhbmQgcHJvcHMgaW5zb2RlIGNyZWF0ZVJlZkNvbXBvbmVudCwgZWxzZXdoZXJlIGl0cyBub3QgcmVhbGx5IDxUPlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbG9hZCBjb21wb25lbnQgZ290IGEgZGV0YWNoZWQgcmVmLicpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIGNob29zZSBza2luIG9uIHJ1bnRpbWUgLi4uXG4gICAgICAgICAqICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLnR5cGVcbiAgICAgICAgICovXG5cbiAgICAgICAgbGV0IHNlbGVjdGVkU2tpbiA9IGF3YWl0IHRoaXMucnVuU2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZywgaG9va3MpIVxuXG4gICAgICAgIGlmICghc2VsZWN0ZWRTa2luKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJydW5Ta2luU2VsZWN0b3IgZmFpbGVkIHRvIGNob29zZSBza2luLCBjaGVjayB0aGUgcHJvdmlkZWQgY29uZmlnXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/Lmhvb2tzPy5hZnRlclNraW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgc2VsZWN0ZWRTa2luID0gYXdhaXQgb3B0aW9ucy5ob29rcy5hZnRlclNraW5TZWxlY3RlZCh7Li4uc2VsZWN0ZWRTa2lufSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9uZW50TG9hZGVyID0gdGhpcy5jb21wb25lbnRzTG9hZGVycy5maW5kKGxvYWRlciA9PiBsb2FkZXIudHlwZSA9PT0gc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlKTtcblxuICAgICAgICBpZiAoIWNvbXBvbmVudExvYWRlcikge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIGxvYWRlciBcIiR7c2VsZWN0ZWRTa2luLmxvYWRlci50eXBlfVwiIHdhcyBmb3VuZCBmb3IgY29tcG9uZW50YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2ZvciBsb2FkZWQgd2ViY29tcG9uZW50IG1vZHVsZXMgdG8gZm9sbG93aW5nIGxpbmUgY3JlYXRlcyBhIHJhY2UgY29uZGl0aW9uIHdpdGggdGhlIGluaXQgbWVzc2FnZSBmbG93XG4gICAgICAgIGxldCBjb21wb25lbnQgPSBhd2FpdCBjb21wb25lbnRMb2FkZXIubG9hZChjb21wb25lbnRDb25maWcudHlwZSwgc2VsZWN0ZWRTa2luLCBjb250YWluZXIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFRPRE8gOiB3aGVuIHRoaXMgaXMgbm90IHRydWUgP1xuICAgICAgICBpZiAoIWNvbXBvbmVudC5pc0luaXRpYXRlZClcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0LnB1c2goY29tcG9uZW50KVxuXG4gICAgICAgIGNvbXBvbmVudC5iaW5kKCdvbkRpc3Bvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjb21wb25lbnQgZGlzcG9zZScsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMuZmlsdGVyKGMgPT4gYyAhPT0gY29tcG9uZW50KVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoYyA9PiBjICE9PSBjb21wb25lbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuXG4gICAgICAgIC8vIHRydWUgYnkgZGVmYXVsdFxuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5jb25uZWN0UHJvcHMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBtYWtlIHR5cGUgZmllbGQgY29uZGl0aW9uYWwgdHlwZSBpbmZlciBcInN0cmluZ1wiID4gc3RyaW5nLCBcIm51bWJlclwiID4gbnVtYmVyLCBldGMuLi5cbiAgICAgICAgICAgIGNvbXBvbmVudCA9IGNvbm5lY3RQcm9wcyhjb21wb25lbnQsIGNvbXBvbmVudENvbmZpZy50eXBlLnByb3BzLCBzZWxlY3RlZFNraW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vVE9ETyA6IG1ha2Ugb3B0aW9uYWw/XG4gICAgICAgICAgICAvL1RPRE8gOiBmaXggaXNzdWVzIHdpdGggdGltZW91dCBhbmQgd3JvbmcgcmVmIG5hbWVzIGZyb20gY29uZmlnIHZzIGN1cnJlbnQgc2tpblxuICAgICAgICAgICAgYXdhaXQgY29ubmVjdFJlZnMoY29tcG9uZW50LCBjb21wb25lbnRDb25maWcsIHRoaXMuY29tcG9uZW50cyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gVE9PRCA6IHRocm93ID9cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnM/LnNraXBJbml0KVxuICAgICAgICAgICAgYXdhaXQgY29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG4gICAgICAgIHJldHVybiBjb21wb25lbnQgYXMgVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmF2aWdhdGUgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIG5ld0NvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgb3B0aW9ucz86IG5hdmlnYXRpb25PcHRpb25zKSA9PiB7XG4gICAgICAgIGlmIChjb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hdmlnYXRpbmcgb24gcmVtb3RlIHJlZiBjb21wb25lbnRzIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29tcG9uZW50Lm1hcmtlZEZvckRpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgICAvLyBpZiAob3B0aW9ucz8uaW5wbGFjZSkge1xuICAgICAgICAvLyAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgIC8vICAgICAgICAgbGV0IG5ld0NvbXBvbmVudCA9IGF3YWl0IHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5lbGVtZW50KTtcbiAgICAgICAgLy8gICAgICAgICBhd2FpdCBuZXdDb21wb25lbnQuaW5pdGlhdGVkKCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgaWYgKG9wdGlvbnMuaW5pdClcbiAgICAgICAgLy8gICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5pbml0KG5ld0NvbXBvbmVudCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIG5ld0NvbXBvbmVudDtcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCcuLi4nKVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnN0YWdlZCkge1xuICAgICAgICAgICAgLy9jb25zdCBzZWxlY3RlZFNraW4gPSB0aGlzLnJ1blNraW5TZWxlY3RvcihuZXdDb21wb25lbnRDb25maWcpXG4gICAgICAgICAgICBsZXQgbmV3Q29tcG9uZW50ID0gYXdhaXQgdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmNvbnRhaW5lciwge1xuICAgICAgICAgICAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZWxhdGl2ZToge2RpcmVjdGlvbjogJ2FmdGVyJywgY2hpbGQ6IGNvbXBvbmVudC5lbGVtZW50IX0sXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmluaXQpXG4gICAgICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5pbml0KG5ld0NvbXBvbmVudCk7XG5cbiAgICAgICAgICAgIG5ld0NvbXBvbmVudC5zaG93KCk7XG4gICAgICAgICAgICBjb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0NvbXBvbmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gY29tcG9uZW50LmVsZW1lbnQhLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICBjb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5jb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICByZWxhdGl2ZToge1xuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246IFwiYmVmb3JlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkOiBuZXh0U2libGluZyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBuYXZpZ2F0aW9uT3B0aW9ucyA9IHtcbiAgICBzdGFnZWQ/OiBib29sZWFuLFxuICAgIC8vaW5wbGFjZT86IGJvb2xlYW4sXG4gICAgaW5pdD86IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50KSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgc2tpcEluaXQ/OiBib29sZWFuXG59ICYgbG9hZGVyT3B0aW9uc1xuXG50eXBlIHJlbGF0aXZlTG9hZENvbmZpZ0RpcmVjdGlvbiA9ICdiZWZvcmUnIHwgJ2FmdGVyJztcblxuXG5leHBvcnQgdHlwZSBsb2FkZXJIb29rcyA9IHtcbiAgICBhZnRlclNraW5TZWxlY3RlZD86IChzZWxlY3RlZFNraW46IElTa2luQ29uZmlnKSA9PiBQcm9taXNlPElTa2luQ29uZmlnPlxufSAmXG4gICAgLy8gc2VnbWVudGF0aW9uIGhvb2tzXG4gICAgKHsgW2tleTogc3RyaW5nXTogKCkgPT4gUHJvbWlzZTxib29sZWFuPiB8IGJvb2xlYW4gfSB8IHt9KVxuXG4vL1RPRE86IHN1cHBvcnQgc2VyaWFsaXphYmxlIHZlcnNpb24gb2YgdGhhdCBvYmplY3RcbmV4cG9ydCBpbnRlcmZhY2UgcmVsYXRpdmVMb2FkQ29uZmlnIHtcbiAgICAvL0lmIHRoaXMgaXMgbnVsbCwgdGhlbiBuZXdOb2RlIGlzIGluc2VydGVkIGF0IHRoZSBlbmQgb2Ygbm9kZSdzIGNoaWxkIG5vZGVzLlxuICAgIC8vaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05vZGUvaW5zZXJ0QmVmb3JlXG4gICAgY2hpbGQ6IENoaWxkTm9kZSB8IG51bGxcbiAgICBkaXJlY3Rpb246IHJlbGF0aXZlTG9hZENvbmZpZ0RpcmVjdGlvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFbnZpcm9ubWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbnR5cGUgRWxlbWVudEF0dHJpYnV0ZXMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGw7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIGxvYWRlck9wdGlvbnMge1xuICAgIGlkPzogc3RyaW5nXG4gICAgaGlkZGVuPzogYm9vbGVhblxuICAgIGNvbm5lY3RQcm9wcz86IGJvb2xlYW5cbiAgICB0aW1lb3V0PzogbnVtYmVyXG4gICAgc2tpcEluaXQ/OiBib29sZWFuXG4gICAgcmVsYXRpdmU/OiByZWxhdGl2ZUxvYWRDb25maWdcbiAgICBob29rcz86IGxvYWRlckhvb2tzXG4gICAgZWxlbWVudEF0dHJpYnV0ZXM/OiBFbGVtZW50QXR0cmlidXRlc1xuICAgIF9lbnZpcm9ubWVudD86IElFbnZpcm9ubWVudFxuICAgIF9oYXNQYXJlbnQ/OiBib29sZWFuXG4gICAgX2luc3BlY3Rpb24/OiBib29sZWFuXG59XG5cbmlmICghd2luZG93Lm15b3ApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgfTtcbn1cblxuaWYgKCF3aW5kb3cubXlvcC5ob3N0U0RLKSB7XG4gICAgY29uc3QgX2hvc3RTREsgPSBuZXcgSG9zdFNESygpO1xuICAgIC8vVE9ETzogZW5hYmxlIGxhenkgaW5pdD9cbiAgICBfaG9zdFNESy5pbml0KCk7XG5cbiAgICBpZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgICAgICB9O1xuICAgIH1cbiAgICB3aW5kb3cubXlvcC5ob3N0U0RLID0gX2hvc3RTREs7XG59XG5cbi8vIEB0cy1pZ25vcmVcbmV4cG9ydCBjb25zdCBob3N0U0RLOiBIb3N0U0RLID0gd2luZG93Lm15b3AuaG9zdFNESztcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnaG9zdFNESycsIGhvc3RTREspO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIG15b3A6IHtcbiAgICAgICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fOiBzdHJpbmcsXG4gICAgICAgICAgICBob3N0U0RLOiBIb3N0U0RLLFxuICAgICAgICAgICAgSWZyYW1lU0RLOiBJbnN0YW5jZVR5cGU8dHlwZW9mIElmcmFtZVNESz5cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyLCBJRWxlbWVudFJlZiwgTXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRGV0ZWN0TXlvcFJlZnNNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAobWVzc2FnZTogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcbiAgICAgICAgLy9jb25zdCBhbGxNeW9wSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAqYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBJRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgLy9sZXQgY291bnRlcnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgaWYgKG15b3BJZCkge1xuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSlcbiAgICAgICAgICAgIH0gLy9lbHNlIHtcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWNvdW50ZXJzW2l0ZW0udGFnTmFtZV0pIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgY291bnRlcnNbaXRlbS50YWdOYW1lXSA9IDA7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gPSBjb3VudGVyc1tpdGVtLnRhZ05hbWVdICsgMTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgICAgbXlvcFJlZnMucHVzaChuZXcgWFBhdGhFbGVtZW50UmVmKGAke2l0ZW0udGFnTmFtZX0oJHtjb3VudGVyc1tpdGVtLnRhZ05hbWVdfSlgLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UobWVzc2FnZS5oYW5kbGVyVW5pcXVlSWQsIG15b3BSZWZzKSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBCaW5kQ2xpY2tNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKCksIGV2ZW50KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsZWFuVXBUYXNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goY2xlYW5VcFRhc2spO1xuICAgICAgICB9KTtcblxuICAgICAgICAvL2NsZWFuIHVwXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgTXlvcE1lc3NhZ2VzIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8Q2hhbmdlVGV4dE1lc3NhZ2U+IHtcbiAgXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ2hhbmdlVGV4dE1lc3NhZ2U7XG4gICAgXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENoYW5nZVRleHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXIsIFJvb3RSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCByZXBsaWVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIG5ldyBSb290UmVmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKG1lc3NhZ2U6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlKSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKG1lc3NhZ2UucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogYW55W10gPSBbXTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy9UT0RPOiB0aGluayBhYm91dCB0aGF0IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZShtZXNzYWdlLmhhbmRsZXJVbmlxdWVJZCwgbWFrZVNlcmlhbGl6YWJsZShlLCBtZXNzYWdlLnNlcmlhbGl6YWJsZVNrZWxldG9uKSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihtZXNzYWdlLnR5cGUsIGhhbmRsZXIpXG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKG1lc3NhZ2UudHlwZSwgaGFuZGxlcilcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4ge1xuICAgICAgICAgICAgICAgIHRhc2soKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldEF0dHJpYnV0ZU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldEF0dHJpYnV0ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UudHNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgY3JlYXRlUmVmID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy9UT0RPIDogdXNlIHJlZiBoZWxwZXIgaGVyZVxuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgaXQgdG8gcGFzcyB0aGUgYXNzaWduZWQgaWRzXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkUmVmQ29uZmlnOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVmQ29tcG9uZW50LnJlZnMpLmZvckVhY2gocmVmTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWYgPSByZWZDb21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWF0ZVJlZigpLnRoZW4oKTtcbiAgICAgICAgLy9yZXR1cm5pbmcgdW5kZWZpbmVkIHNvIGl0IHdvbid0IGFjdCBhcyBhIGNsZWFudXBcbiAgICB9XG59XG4iLCAiLy8gQHRzLW5vY2hlY2tcbmV4cG9ydCBjb25zdCBvYnNlcnZlRE9NID0gKG9iajogSFRNTEVsZW1lbnQgfCBudWxsLCBjYWxsYmFjazogKG11dGF0aW9uUmVjb3Jkcz86IE11dGF0aW9uUmVjb3JkW10pID0+IHZvaWQpID0+IHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICBjb25zb2xlLmxvZygnbicpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBNdXRhdGlvbk9ic2VydmVyID0gd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG5cbiAgICBpZiAoIW9iaiB8fCBvYmoubm9kZVR5cGUgIT09IDEpIHJldHVybjtcblxuICAgIGlmIChNdXRhdGlvbk9ic2VydmVyKSB7XG4gICAgICAgIC8vIGRlZmluZSBhIG5ldyBvYnNlcnZlclxuICAgICAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spXG4gICAgICAgIC8vIGhhdmUgdGhlIG9ic2VydmVyIG9ic2VydmUgZm9yIGNoYW5nZXMgaW4gY2hpbGRyZW5cbiAgICAgICAgY29uc3QgY29uZmlnID0ge2F0dHJpYnV0ZXM6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZX07XG4gICAgICAgIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShvYmosIGNvbmZpZylcbiAgICAgICAgcmV0dXJuIG11dGF0aW9uT2JzZXJ2ZXJcbiAgICB9XG5cbiAgICAvLyBicm93c2VyIHN1cHBvcnQgZmFsbGJhY2tcbiAgICBlbHNlIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZUluc2VydGVkJywgY2FsbGJhY2ssIGZhbHNlKVxuICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZVJlbW92ZWQnLCBjYWxsYmFjaywgZmFsc2UpXG4gICAgfVxufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge29ic2VydmVET019IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvZG9tT2JzZXJ2ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuc291cmNlKSB7XG4gICAgICAgICAgICBvYnNlcnZlRE9NKGRvY3VtZW50LmJvZHksICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlKClcbiAgICAgICAgICAgICAgICAgICAgLy8gIG5ldyBFbnZlbG9wZWRNZXNzYWdlKGV2ZW50LnNvdXJjZSEsIG5ldyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSgpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlLCBGb3JtRGF0YUVudHJ5LCBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBJbnB1dEVsZW1lbnRWYWx1ZSx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5jb25zdCBnZXRJbnB1dFZhbHVlID0gKGVsZW1lbnQpOiBJbnB1dEVsZW1lbnRWYWx1ZSA9PiB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBmb3JtXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBkYXRhT2JqZWN0OiBJbnB1dEVsZW1lbnRWYWx1ZSA9IHtcbiAgICAgICAgICAgIGZvcm1EYXRhOiB7fSxcbiAgICAgICAgICAgIHVubWFwcGVkRGF0YTogW11cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBNYW51YWxseSBhZGQgZWxlbWVudHMgd2l0aG91dCBuYW1lc1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKTtcbiAgICAgICAgbGV0IGF1dG9OYW1lSW5kZXhlciA9IC0xO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gYF8keygrK2F1dG9OYW1lSW5kZXhlcil9YFxuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZURhdGE6IEZvcm1EYXRhRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRJbnB1dFZhbHVlKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZWxlbWVudC5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHk6IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudC52YWxpZGl0eSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIG15b3BJZCxcbiAgICAgICAgICAgICAgICB9O1xuXG5cbiAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBpZighZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSB8fCAhZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSB8fCBub2RlRGF0YS52YWx1ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjaGVja2JveCBvciByYWRpbyBidXR0b25cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3QgZWxlbWVudHMgKGRyb3Bkb3ducylcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZWRpdGFibGUgZGl2cyAoY29udGVudEVkaXRhYmxlKVxuICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYW4gdW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogR2V0RWxlbWVudFZhbHVlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgZ2V0SW5wdXRWYWx1ZShpdGVtKVxuICAgICAgICAgICAgKSwgZXZlbnQpO1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0dldEF0dHJpYnV0ZU1lc3NhZ2UsIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRGaXJzdEVsZW1lbnRCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgR2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxHZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEdldEF0dHJpYnV0ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGdldEZpcnN0RWxlbWVudEJ5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpXG4gICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UoaXRlbS5nZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSkpLCBldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtSZXNpemVPYnNlcnZlck1lc3NhZ2UsIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZX0gZnJvbSAnLi4vLi4vbWVzc2FnZXMnXG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRSZXNpemVPYnNlcnZlckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlXG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICAvL1RPRE8gOiBwYXNzIHRoZSBoZWlnaHRcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVzaXplT2JzZXJ2ZXJNZXNzYWdlKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldElubmVySHRtbH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWxIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFNldElubmVySHRtbD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0SW5uZXJIdG1sO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldElubmVySHRtbCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgSWZyYW1lIFNESyBpcyBpbnRlbmRlZCBmb3Igc2NlbmFyaW9zIHdoZXJlIGRldmVsb3BlcnMgd2lzaCB0byBpbXBsZW1lbnQgTXlvcCBjb21wb25lbnRzIGFzIHNlcGFyYXRlIHdlYiBhcHBsaWNhdGlvbnMgaG9zdGVkIHdpdGhpbiBpZnJhbWVzLjxici8+PGJyLz5cbiAqIEJ5IGltcG9ydGluZyB0aGUgSWZyYW1lIFNESywgZGV2ZWxvcGVycyBnYWluIGFjY2VzcyB0byB0b29scyBhbmQgdXRpbGl0aWVzIG5lY2Vzc2FyeSBmb3IgaGFuZGxpbmcgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGFwcGxpY2F0aW9uIGFuZCB0aGUgZW1iZWRkZWQgaWZyYW1lLWJhc2VkIE15b3AgY29tcG9uZW50czxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGZhY2lsaXRhdGVzIHNlY3VyZSBpc29sYXRpb24sIGFsbG93aW5nIGNvbXBvbmVudHMgdG8gZnVuY3Rpb24gaW5kZXBlbmRlbnRseSB3aGlsZSBzdGlsbCBiZW5lZml0aW5nIGZyb20gdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbi48YnIvPjxici8+XG4gKlxuIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiBgYGBqc1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuIG9yXG4gYGBgdHNcbiBpbXBvcnQge2dldElmcmFtZU1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCBnZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7SWZyYW1lU0RLfSBmcm9tICdAbXlvcC9zZGsvaWZyYW1lJztcbiBgYGBcbiAqXG4gKi9cbmltcG9ydCB7QmFzZU15b3BTREt9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7RGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge0JpbmRPbkNsaWNrSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlclwiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXJcIjtcbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyXCI7XG5pbXBvcnQge3NldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyXCI7XG5pbXBvcnQge1xuICAgIEluaXRSZXF1ZXN0LFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL1NldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyXCI7XG5pbXBvcnQge0dldEVsZW1lbnRWYWx1ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzXCI7XG4vLyBAdHMtaWdub3JlIGhhbmRsZWQgYnkgY3VzdG9tIGVzYnVpbGQgcGx1Z2luXG5pbXBvcnQgdmVyc2lvbiBmcm9tIFwibXlvcC1zZGstdmVyc2lvblwiO1xuaW1wb3J0IHtHZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZ2V0QXR0cmlidXRlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRSZXNpemVPYnNlcnZlckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9TZXRSZXNpemVPYnNlcnZlckhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHNcIjtcblxuLyoqXG4gVGhlIElmcmFtZSBTREsgaXMgaW50ZW5kZWQgZm9yIHNjZW5hcmlvcyB3aGVyZSBkZXZlbG9wZXJzIHdpc2ggdG8gaW1wbGVtZW50IE15b3AgY29tcG9uZW50cyBhcyBzZXBhcmF0ZSB3ZWIgYXBwbGljYXRpb25zIGhvc3RlZCB3aXRoaW4gaWZyYW1lcy48YnIvPjxici8+XG4gQnkgaW1wb3J0aW5nIHRoZSBJZnJhbWUgU0RLLCBkZXZlbG9wZXJzIGdhaW4gYWNjZXNzIHRvIHRvb2xzIGFuZCB1dGlsaXRpZXMgbmVjZXNzYXJ5IGZvciBoYW5kbGluZyBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGhvc3QgYXBwbGljYXRpb24gYW5kIHRoZSBlbWJlZGRlZCBpZnJhbWUtYmFzZWQgTXlvcCBjb21wb25lbnRzPGJyLz48YnIvPlxuIFRoaXMgU0RLIGZhY2lsaXRhdGVzIHNlY3VyZSBpc29sYXRpb24sIGFsbG93aW5nIGNvbXBvbmVudHMgdG8gZnVuY3Rpb24gaW5kZXBlbmRlbnRseSB3aGlsZSBzdGlsbCBiZW5lZml0aW5nIGZyb20gdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbi48YnIvPjxici8+XG5cbiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gYGBganNcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiBvclxuIGBgYHRzXG4gaW1wb3J0IHtnZXRJZnJhbWVNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuICovXG5leHBvcnQgY2xhc3MgSWZyYW1lU0RLIGV4dGVuZHMgQmFzZU15b3BTREsge1xuXG4gICAgcHVibGljIHZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKCF3aW5kb3cubXlvcCkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgd2luZG93Lm15b3AgPSB7fVxuICAgICAgICB9XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLID0gdGhpcztcbiAgICB9XG5cbiAgICBtZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKCFtZXNzYWdlLnJlcGxheVRvSGFuZGxlciAmJiByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkKVxuICAgICAgICAgICAgbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUby5oYW5kbGVyVW5pcXVlSWRcblxuICAgICAgICBjb25zdCBjb21wb25lbnRJZHMgPSBPYmplY3Qua2V5cyh0aGlzLmNvbXBvbmVudHMpO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5kZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgaWYgKHJlcGxheVRvPy5yb3V0ZSkge1xuICAgICAgICAgICAgICAgIC8vIHRha2luZyB0aGUgZmlyc3QgY29tcG9uZW50IHRoYXQgaW5pdGlhdGVkIHRoYXQgY3ljbGVcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gcmVwbGF5VG8ucm91dGVbcmVwbGF5VG8ucm91dGUubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSBjb21wb25lbnRJZHNbMF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2Uuc291cmNlKVxuICAgICAgICAgICAgbWVzc2FnZS5zb3VyY2UgPSBjb21wb25lbnRJZHNbMF07XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLnVwXG5cbiAgICAgICAgd2luZG93LnBhcmVudD8ucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgLi4ubWVzc2FnZVxuICAgICAgICB9LCAnKicpO1xuICAgIH1cblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXSA9IFtcbiAgICAgICAgbmV3IENoYW5nZVRleHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRJbm5lckh0bWxIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBCaW5kT25DbGlja0hhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEV4ZWN1dGVTY3JpcHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBBZGRFdmVudExpc3RlbmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgc2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgR2V0RWxlbWVudFZhbHVlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldFJlc2l6ZU9ic2VydmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgR2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuXG4gICAgICAgIC8vY29tcG9zaXRlIHN1cHBvcnQgbWVzc2FnZXMgOlxuICAgICAgICBuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KVxuICAgIF07XG5cbiAgICBwdWJsaWMgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgd2luZG93Lm9ubWVzc2FnZSA9IHRoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXMuYmluZCh0aGlzKVxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXF1ZXN0KCkpXG4gICAgfVxuXG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ0lmcmFtZVNESycsIElmcmFtZVNESyk7XG4iLCAiaW1wb3J0ICogYXMgYWxsIGZyb20gJy4vaW5kZXgnXG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcblxuY29uc3QgTXlvcE1lc3NhZ2VzID0ge1xuICAgIC4uLmFsbFxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdNeW9wTWVzc2FnZXMnLCBNeW9wTWVzc2FnZXMpO1xuIiwgImltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50c1wiO1xuaW1wb3J0ICogYXMgTXlvcEhlbHBlcnMgZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnTXlvcEhlbHBlcnMnLCBNeW9wSGVscGVycyk7XG4iLCAiaW1wb3J0ICcuL2R5bmFtaWNJbXBvcnQvbG9hZF9fZmVkZXJhdGlvbl9fJztcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5cbmNvbnNvbGUubG9nKCdteW9wIHJvb3Qgc2RrIC0gbG9hZGVkJywgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKTtcblxuLy8gVE9ETyA6IHJlYWQgdmFsdWUgZnJvbSB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ10gP1xuLy9jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2RmZGxrMnAxbTE4N3YuY2xvdWRmcm9udC5uZXQvbXlvcF9zZGsubWluLmpzJ1xuY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQvbXlvcF9zZGsubWluLmpzJ1xuXG5jb25zdCBnZXRIb3N0TW9kdWxlID0gKCkgPT4gaW1wb3J0KCcuL2hvc3QvaG9zdFNESycpXG5jb25zdCBnZXRJZnJhbWVNb2R1bGUgPSAoKSA9PiBpbXBvcnQoJy4vSWZyYW1lL0lmcmFtZVNESycpXG5jb25zdCBnZXRXZWJjb21wb25lbnRNb2R1bGUgPSAoKSA9PiBpbXBvcnQoJy4vd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESycpXG5jb25zdCBnZXRNeW9wTWVzc2FnZXMgPSAoKSA9PiBpbXBvcnQoJy4vbWVzc2FnZXMvTXlvcE1lc3NhZ2VzJylcbmNvbnN0IGdldE15b3BIZWxwZXJzID0gKCkgPT4gaW1wb3J0KCcuL2hlbHBlcnMvTXlvcEhlbHBlcnMnKVxuXG5jb25zdCBleHBvc2VHbG9iYWxseSA9IChpbXBvcnRGdW5jdGlvbjogKCkgPT4gUHJvbWlzZTxhbnk+KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBhc3luYyAoKSA9PiAoYXdhaXQgaW1wb3J0RnVuY3Rpb24oKSkuZ2V0KClcbn1cblxuLy8gRm9yIHNjcmlwdC9nbG9iYWwgdXNhZ2UgOlxuY29uc3Qgcm9vdFNESyA9IHtcbiAgICB2ZXJzaW9uIDogdmVyc2lvbixcbiAgICBnZXRIb3N0TW9kdWxlOiBleHBvc2VHbG9iYWxseShnZXRIb3N0TW9kdWxlKSxcbiAgICBnZXRJZnJhbWVNb2R1bGU6IGV4cG9zZUdsb2JhbGx5KGdldElmcmFtZU1vZHVsZSksXG4gICAgZ2V0V2ViY29tcG9uZW50TW9kdWxlOiBleHBvc2VHbG9iYWxseShnZXRXZWJjb21wb25lbnRNb2R1bGUpLFxuICAgIGdldE15b3BNZXNzYWdlczogZXhwb3NlR2xvYmFsbHkoZ2V0TXlvcE1lc3NhZ2VzKSxcbiAgICBnZXRNeW9wSGVscGVyczogZXhwb3NlR2xvYmFsbHkoZ2V0TXlvcEhlbHBlcnMpXG59O1xuXG4vLyBAdHMtaWdub3JlXG5pZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgIH1cbn1cblxuLy8gQHRzLWlnbm9yZVxuaWYgKCF3aW5kb3cubXlvcC5yb290U0RLKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJvb3RTREssXG4gICAgICAgIC4uLndpbmRvdy5teW9wXG4gICAgfTtcbn0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coXCJteW9wIHJvb3QgaG9zdCBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuXCIpO1xufVxuXG4vLyBGb3IgYnVuZGxlcnMgdXNhZ2UgOlxuY29uc3Qgc2RrTW9kdWxlID0ge1xuICAgIGdldEhvc3RNb2R1bGUsXG4gICAgZ2V0SWZyYW1lTW9kdWxlLFxuICAgIGdldFdlYmNvbXBvbmVudE1vZHVsZVxufVxuZXhwb3J0IHR5cGUgcm9vdFNES1R5cGUgPSB0eXBlb2Ygc2RrTW9kdWxlO1xuXG5leHBvcnQge1xuICAgIGdldEhvc3RNb2R1bGUsXG4gICAgZ2V0SWZyYW1lTW9kdWxlLFxuICAgIGdldFdlYmNvbXBvbmVudE1vZHVsZVxufVxuXG4vLyBkZWNsYXJlIGdsb2JhbCB7XG4vLyAgICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4vLyAgICAgICAgIG15b3A6IHtcbi8vICAgICAgICAgICAgIHJvb3RTREs6IHR5cGVvZiByb290U0RLXG4vLyAgICAgICAgIH1cbi8vICAgICB9XG4vLyB9XG4iLCAiLy8gQHRzLW5vY2hlY2tcbmltcG9ydCB7bW9kdWxlSW5zdGFuY2VLZXksIG9uTG9hZEtleX0gZnJvbSBcIi4vZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuXG5pZiAoIXdpbmRvd1snX19mZWRlcmF0aW9uX18nXSkge1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHNjcmlwdFNyYyA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/LnNyYztcbiAgICBjb25zdCBfX3B1YmxpY19hdXRvX3BhdGhfXyA9IHNjcmlwdFNyYyA/IHNjcmlwdFNyYy5zcGxpdCgnLycpLnNsaWNlKDAsIC0xKS5qb2luKCcvJykgOiAnJztcblxuICAgIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXSA9IHtcbiAgICAgICAgX19wdWJsaWNfYXV0b19wYXRoX18sXG4gICAgICAgIF9fdXNlX3B1YmxpY19hdXRvX3BhdGhfXzogdHJ1ZSxcbiAgICAgICAgX19wdWJsaWNfcGF0aF9fOiB1bmRlZmluZWQsXG4gICAgICAgIF9fbG9hZGluZ190aW1lb3V0X18gOiA1ICogMTAwMFxuICAgIH07XG59IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKCdfX2ZlZGVyYXRpb25fXyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuJyk7XG59XG5cbndpbmRvd1snX19mZWRlcmF0aW9uX18nXVsnbG9hZF9fZmVkZXJhdGlvbl9fJ10gPSAoc2NyaXB0RmlsZVBhdGgsIG1vZHVsZU5hbWUsIG9uTG9hZCkgPT4ge1xuXG4gICAgaWYgKCF3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV0pIHtcbiAgICAgICAgbGV0IHNjcmlwdFRhZztcblxuICAgICAgICB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV0gPSB7fTtcbiAgICAgICAgd2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdW29uTG9hZEtleV0gPSAobW9kdWxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2NyaXB0VGFnKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChzY3JpcHRUYWcpO1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIHRoYXQ6XG4gICAgICAgICAgICAgICAgc2NyaXB0VGFnID0gbnVsbDtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnc2NyaXB0IHJlbW92ZWQuLi4gJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2cobW9kdWxlKTtcblxuICAgICAgICAgICAgd2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdW21vZHVsZUluc3RhbmNlS2V5XSA9IG1vZHVsZTtcbiAgICAgICAgICAgIG9uTG9hZChtb2R1bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2NyaXB0VGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIC8vc2NyaXB0VGFnLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgICAgICAgc2NyaXB0VGFnLnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgc2NyaXB0VGFnLnNyYyA9IHNjcmlwdEZpbGVQYXRoO1xuXG4gICAgICAgIHNjcmlwdFRhZy5hc3luYyA9IHRydWU7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0VGFnKTtcblxuICAgICAgICAvLyBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG4gICAgICAgIC8vIGxpbmsudHlwZSA9IFwidGV4dC9jc3NcIjtcbiAgICAgICAgLy8gbGluay5yZWwgPSBcInN0eWxlc2hlZXRcIjtcbiAgICAgICAgLy8gbGluay5ocmVmID0gZmlsZU5hbWUucmVwbGFjZSgnLmpzJywgJy5jc3MnKTtcbiAgICAgICAgLy8gZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBfX2ZlZGVyYXRpb25fXyBtb2R1bGUgJHttb2R1bGVOYW1lfSBhbHJlYWR5IGxvYWRlZC5gKVxuICAgICAgICBvbkxvYWQod2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdW21vZHVsZUluc3RhbmNlS2V5XSk7XG4gICAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsTUFBYSxnQkFDQSxXQUNBLG1CQUVBO0FBSmI7QUFBQTtBQUFBO0FBQU8sTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sb0JBQW9CO0FBRTFCLE1BQU0sc0JBQXNCLENBQUMsWUFBb0IsV0FBZ0I7QUFFcEUsWUFBSSxPQUFPLGNBQWMsS0FBSyxPQUFPLGNBQWMsRUFBRSxVQUFVLEtBQUssT0FBTyxjQUFjLEVBQUUsVUFBVSxFQUFFLFNBQVMsR0FBRztBQUUvRyxpQkFBTyxjQUFjLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUFDLENBQUMsVUFBVSxHQUFHLE9BQU0sQ0FBQztBQUFBLFFBQ3hFLE9BQU87QUFBQSxRQUVQO0FBQUEsTUFDSjtBQUFBO0FBQUE7OztBQ1pBLE1BQU87QUFBUDtBQUFBO0FBQUEsTUFBTywyQkFBUTtBQUFBO0FBQUE7OztBQ0FmLE1BSWE7QUFK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QUFNO0FBRWQsV0FBTyxPQUFPO0FBQUEsTUFDVix5QkFBQUE7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUdBLE1BQUksQ0FBQyxPQUFPLEtBQUssU0FBUztBQUV0QixXQUFPLE9BQU87QUFBQTtBQUFBLE1BRVY7QUFBQSxPQUNHLE9BQU87QUFBQSxFQUVsQixPQUFPO0FBQ0gsWUFBUSxJQUFJLHVDQUF1QztBQUFBLEVBQ3ZEOyIsCiAgIm5hbWVzIjogWyJSZXBsYXlNZXNzYWdlS2V5IiwgIm1hdGNoIiwgInNjcmlwdElucHV0cyIsICJzY3JpcHRJbnB1dHMiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAic2VlbiIsICJ0YXJnZXQiLCAibWFrZVNlcmlhbGl6YWJsZSIsICJfYSIsICJoZWlnaHQiLCAid2lkdGgiLCAiX2EiLCAiX2EiLCAiX2EiLCAiaW5pdF9jb25zdHMiLCAiaW5pdF9jb25zdHMiLCAiaW5pdF9jb25zdHMiLCAiaW5pdF9jb25zdHMiLCAiaG9zdFNESyIsICJpbml0X2V4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgImluaXRfY29uc3RzIiwgImVsZW1lbnQiLCAiaW5pdF9leGVjdXRlU2NyaXB0SGFuZGxlciIsICJzZGsiLCAic2VlbiIsICJkb21JZCIsICJpbml0X2hlbHBlcnMiLCAiaW5pdF9oZWxwZXJzIiwgInNraW4iLCAiY29tcG9uZW50IiwgIl9hIiwgInNlZ21lbnQiLCAiZXhwZXJpZW5jZSIsICJzZWxlY3RlZFNraW4iLCAiRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJpbml0X0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiQmluZE9uQ2xpY2tIYW5kbGVyIiwgImluaXRfYmluZE9uQ2xpY2tIYW5kbGVyIiwgIkNoYW5nZVRleHRIYW5kbGVyIiwgImluaXRfY2hhbmdlVGV4dEhhbmRsZXIiLCAiRXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiaW5pdF9leGVjdXRlU2NyaXB0SGFuZGxlciIsICJBZGRFdmVudExpc3RlbmVySGFuZGxlciIsICJpbml0X2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgInNldEF0dHJpYnV0ZUhhbmRsZXIiLCAiaW5pdF9zZXRBdHRyaWJ1dGVIYW5kbGVyIiwgIkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIiwgImluaXRfQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiaG9zdFNESyIsICJnZXRJbnB1dFZhbHVlIiwgIkdldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiaW5pdF9HZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgImluaXRfY29uc3RzIiwgImVsZW1lbnQiLCAiU2V0SW5uZXJIdG1sSGFuZGxlciIsICJpbml0X3NldElubmVySHRtbEhhbmRsZXIiLCAiaW5pdF9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIiwgImluaXRfYmluZE9uQ2xpY2tIYW5kbGVyIiwgImluaXRfY2hhbmdlVGV4dEhhbmRsZXIiLCAiaW5pdF9leGVjdXRlU2NyaXB0SGFuZGxlciIsICJpbml0X2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgImluaXRfc2V0QXR0cmlidXRlSGFuZGxlciIsICJpbml0X0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIiwgImluaXRfR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJpbml0X3NldElubmVySHRtbEhhbmRsZXIiLCAiX2EiLCAiQ2hhbmdlVGV4dEhhbmRsZXIiLCAiU2V0SW5uZXJIdG1sSGFuZGxlciIsICJCaW5kT25DbGlja0hhbmRsZXIiLCAiRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJFeGVjdXRlU2NyaXB0SGFuZGxlciIsICJBZGRFdmVudExpc3RlbmVySGFuZGxlciIsICJzZXRBdHRyaWJ1dGVIYW5kbGVyIiwgIkdldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiTXlvcE1lc3NhZ2VzIiwgImluaXRfTXlvcE1lc3NhZ2VzIiwgImluaXRfaGVscGVycyIsICJfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyJdCn0K
|