@dbx-tools/appkit-model-gateway 0.9.189 → 0.9.193
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/index.ts +7 -1
- package/lib/index.d.ts +7 -1
- package/lib/index.js +6 -2
- package/lib/src/ai-decide.d.ts +50 -0
- package/lib/src/ai-decide.js +406 -0
- package/lib/src/gateway.d.ts +6 -2
- package/lib/src/gateway.js +72 -16
- package/lib/src/model-context.d.ts +32 -0
- package/lib/src/model-context.js +270 -0
- package/lib/src/models.d.ts +3 -3
- package/lib/src/models.js +55 -8
- package/lib/src/reasoning-adapt.js +2 -5
- package/lib/src/routes.js +18 -2
- package/lib/src/smart-router.d.ts +4 -7
- package/lib/src/smart-router.js +7 -175
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
- package/src/ai-decide.ts +552 -0
- package/src/gateway.ts +96 -14
- package/src/model-context.ts +306 -0
- package/src/models.ts +66 -4
- package/src/reasoning-adapt.ts +1 -5
- package/src/routes.ts +16 -0
- package/src/smart-router.ts +8 -187
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forgiving model-context normalization for routing and suggestion generation.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { isRecord } from "@dbx-tools/shared-core";
|
|
7
|
+
import { convertToModelMessages, modelMessageSchema, pruneMessages, safeValidateUIMessages, } from "ai";
|
|
8
|
+
import { Tiktoken } from "js-tiktoken/lite";
|
|
9
|
+
import o200kBase from "js-tiktoken/ranks/o200k_base";
|
|
10
|
+
const CONTEXT_ENCODING = new Tiktoken(o200kBase);
|
|
11
|
+
const DEFAULT_TOKEN_LIMIT = 4_096;
|
|
12
|
+
/**
|
|
13
|
+
* Normalize strings, JSON, AI SDK messages, Responses input, and task-shaped objects.
|
|
14
|
+
*
|
|
15
|
+
* AI SDK UI/model message parsing is preferred. The fallback handles external wire
|
|
16
|
+
* shapes and arbitrary JSON without retaining credentials, metadata, or tool arguments.
|
|
17
|
+
*/
|
|
18
|
+
export async function normalizeModelContext(input, options = {}) {
|
|
19
|
+
const tokenLimit = Math.max(0, options.tokenLimit ?? DEFAULT_TOKEN_LIMIT);
|
|
20
|
+
const removeNonUsefulMessages = options.removeNonUsefulMessages ?? true;
|
|
21
|
+
const normalized = parseJsonString(input);
|
|
22
|
+
const conversation = conversationValue(normalized);
|
|
23
|
+
const sdkMessages = await aiSdkModelMessages(conversation);
|
|
24
|
+
const events = sdkMessages
|
|
25
|
+
? modelMessageEvents(sdkMessages, removeNonUsefulMessages)
|
|
26
|
+
: conversationEvents(conversation, removeNonUsefulMessages);
|
|
27
|
+
const rawEvents = conversationEvents(conversation, false);
|
|
28
|
+
const stateEvents = rawEvents.length > 0 ? rawEvents : events;
|
|
29
|
+
if (events.length > 0)
|
|
30
|
+
return contextFromEvents(events, tokenLimit, stateEvents);
|
|
31
|
+
const values = collectTaskStrings(normalized);
|
|
32
|
+
const task = truncateText(values.join("\n"), tokenLimit, "start");
|
|
33
|
+
return {
|
|
34
|
+
task,
|
|
35
|
+
logicalTurn: task,
|
|
36
|
+
continuation: false,
|
|
37
|
+
events: task ? [{ role: "user", text: task }] : [],
|
|
38
|
+
tokenCount: countTokens(task),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
async function aiSdkModelMessages(input) {
|
|
42
|
+
if (!Array.isArray(input) || input.length === 0)
|
|
43
|
+
return undefined;
|
|
44
|
+
const modelMessages = input.map((value) => modelMessageSchema.safeParse(value));
|
|
45
|
+
if (modelMessages.every((result) => result.success)) {
|
|
46
|
+
return modelMessages.map((result) => result.data);
|
|
47
|
+
}
|
|
48
|
+
const uiMessages = await safeValidateUIMessages({ messages: input });
|
|
49
|
+
if (!uiMessages.success)
|
|
50
|
+
return undefined;
|
|
51
|
+
try {
|
|
52
|
+
return await convertToModelMessages(uiMessages.data, { ignoreIncompleteToolCalls: true });
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function modelMessageEvents(messages, removeNonUsefulMessages) {
|
|
59
|
+
const useful = removeNonUsefulMessages
|
|
60
|
+
? pruneMessages({ messages, reasoning: "all", toolCalls: "all" })
|
|
61
|
+
: messages;
|
|
62
|
+
return useful.flatMap((message) => {
|
|
63
|
+
const role = message.role;
|
|
64
|
+
if (role === "tool" && removeNonUsefulMessages)
|
|
65
|
+
return [];
|
|
66
|
+
const text = modelContentText(message.content, removeNonUsefulMessages);
|
|
67
|
+
return text ? [{ role, text }] : [];
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
function modelContentText(value, removeNonUsefulMessages) {
|
|
71
|
+
if (typeof value === "string")
|
|
72
|
+
return value.trim();
|
|
73
|
+
if (!Array.isArray(value))
|
|
74
|
+
return "";
|
|
75
|
+
return value
|
|
76
|
+
.flatMap((part) => {
|
|
77
|
+
if (!isRecord(part))
|
|
78
|
+
return [];
|
|
79
|
+
if (typeof part.text === "string")
|
|
80
|
+
return [part.text.trim()];
|
|
81
|
+
if (!removeNonUsefulMessages && typeof part.output === "string")
|
|
82
|
+
return [part.output.trim()];
|
|
83
|
+
return [];
|
|
84
|
+
})
|
|
85
|
+
.filter(Boolean)
|
|
86
|
+
.join("\n");
|
|
87
|
+
}
|
|
88
|
+
function conversationValue(input) {
|
|
89
|
+
if (!isRecord(input))
|
|
90
|
+
return input;
|
|
91
|
+
for (const key of ["messages", "input"]) {
|
|
92
|
+
const value = input[key];
|
|
93
|
+
if (Array.isArray(value))
|
|
94
|
+
return value;
|
|
95
|
+
if (typeof value === "string" && value.trim())
|
|
96
|
+
return value;
|
|
97
|
+
}
|
|
98
|
+
return input;
|
|
99
|
+
}
|
|
100
|
+
function contextFromEvents(events, tokenLimit, stateEvents = events) {
|
|
101
|
+
const latestUserIndex = lastEventIndex(events, "user");
|
|
102
|
+
const taskEvent = latestUserIndex >= 0 ? events[latestUserIndex] : events.at(-1);
|
|
103
|
+
const task = truncateText(taskEvent?.text ?? "", tokenLimit, "start");
|
|
104
|
+
let remaining = Math.max(0, tokenLimit - countTokens(task));
|
|
105
|
+
const context = [];
|
|
106
|
+
for (let index = (taskEvent ? events.indexOf(taskEvent) : events.length) - 1; index >= 0; index -= 1) {
|
|
107
|
+
const event = events[index];
|
|
108
|
+
if (!event || !event.text || event.role === "tool")
|
|
109
|
+
continue;
|
|
110
|
+
const value = `${event.role}: ${event.text}`;
|
|
111
|
+
const retained = truncateText(value, remaining, "end");
|
|
112
|
+
if (!retained)
|
|
113
|
+
break;
|
|
114
|
+
context.unshift(retained);
|
|
115
|
+
remaining -= countTokens(retained);
|
|
116
|
+
}
|
|
117
|
+
const combined = [...context, task].filter(Boolean).join("\n");
|
|
118
|
+
const stateLatestUserIndex = lastEventIndex(stateEvents, "user");
|
|
119
|
+
const logicalEvents = stateLatestUserIndex >= 0 ? stateEvents.slice(0, stateLatestUserIndex + 1) : stateEvents;
|
|
120
|
+
return {
|
|
121
|
+
task: combined,
|
|
122
|
+
logicalTurn: logicalEvents.map((event) => `${event.role}:${event.text}`).join("\n"),
|
|
123
|
+
continuation: stateLatestUserIndex >= 0 &&
|
|
124
|
+
stateEvents.slice(stateLatestUserIndex + 1).some((event) => event.role !== "system"),
|
|
125
|
+
events,
|
|
126
|
+
tokenCount: countTokens(combined),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function conversationEvents(input, removeNonUsefulMessages) {
|
|
130
|
+
if (typeof input === "string")
|
|
131
|
+
return input.trim() ? [{ role: "user", text: input.trim() }] : [];
|
|
132
|
+
if (Array.isArray(input)) {
|
|
133
|
+
return input.flatMap((value) => messageEvent(value, removeNonUsefulMessages));
|
|
134
|
+
}
|
|
135
|
+
if (!isRecord(input))
|
|
136
|
+
return [];
|
|
137
|
+
for (const key of ["messages", "input"]) {
|
|
138
|
+
const value = input[key];
|
|
139
|
+
if (typeof value === "string" && value.trim())
|
|
140
|
+
return [{ role: "user", text: value.trim() }];
|
|
141
|
+
if (Array.isArray(value)) {
|
|
142
|
+
const events = value.flatMap((item) => messageEvent(item, removeNonUsefulMessages));
|
|
143
|
+
if (events.length > 0)
|
|
144
|
+
return events;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return [];
|
|
148
|
+
}
|
|
149
|
+
function messageEvent(value, removeNonUsefulMessages) {
|
|
150
|
+
if (typeof value === "string")
|
|
151
|
+
return value.trim() ? [{ role: "user", text: value.trim() }] : [];
|
|
152
|
+
if (!isRecord(value))
|
|
153
|
+
return [];
|
|
154
|
+
const role = messageRole(value);
|
|
155
|
+
if (!role || (removeNonUsefulMessages && role === "tool"))
|
|
156
|
+
return [];
|
|
157
|
+
if (removeNonUsefulMessages && (value.type === "function_call" || value.type === "reasoning")) {
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
const text = contentText(value.content ?? value.text ?? value.input_text ?? value.output_text);
|
|
161
|
+
return text ? [{ role, text }] : [];
|
|
162
|
+
}
|
|
163
|
+
function messageRole(value) {
|
|
164
|
+
if (value.role === "user" || value.role === "assistant" || value.role === "system") {
|
|
165
|
+
return value.role;
|
|
166
|
+
}
|
|
167
|
+
if (value.role === "tool" ||
|
|
168
|
+
value.type === "function_call_output" ||
|
|
169
|
+
value.type === "tool_result") {
|
|
170
|
+
return "tool";
|
|
171
|
+
}
|
|
172
|
+
if (value.type === "function_call" || value.type === "reasoning")
|
|
173
|
+
return "assistant";
|
|
174
|
+
if (value.type === "message" && value.role === undefined)
|
|
175
|
+
return "user";
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
function contentText(value) {
|
|
179
|
+
if (typeof value === "string")
|
|
180
|
+
return value.trim();
|
|
181
|
+
if (Array.isArray(value))
|
|
182
|
+
return value.map(contentText).filter(Boolean).join("\n");
|
|
183
|
+
if (!isRecord(value))
|
|
184
|
+
return "";
|
|
185
|
+
for (const key of ["text", "input_text", "output_text", "content"]) {
|
|
186
|
+
const text = contentText(value[key]);
|
|
187
|
+
if (text)
|
|
188
|
+
return text;
|
|
189
|
+
}
|
|
190
|
+
return "";
|
|
191
|
+
}
|
|
192
|
+
const TASK_KEYS = [
|
|
193
|
+
"prompt",
|
|
194
|
+
"task",
|
|
195
|
+
"query",
|
|
196
|
+
"question",
|
|
197
|
+
"request",
|
|
198
|
+
"description",
|
|
199
|
+
"message",
|
|
200
|
+
"text",
|
|
201
|
+
"input",
|
|
202
|
+
];
|
|
203
|
+
const IGNORED_KEYS = new Set([
|
|
204
|
+
"api_key",
|
|
205
|
+
"authorization",
|
|
206
|
+
"arguments",
|
|
207
|
+
"credentials",
|
|
208
|
+
"headers",
|
|
209
|
+
"metadata",
|
|
210
|
+
"password",
|
|
211
|
+
"provider_options",
|
|
212
|
+
"raw_input",
|
|
213
|
+
"secret",
|
|
214
|
+
"token",
|
|
215
|
+
"tool_calls",
|
|
216
|
+
"tools",
|
|
217
|
+
]);
|
|
218
|
+
function collectTaskStrings(input) {
|
|
219
|
+
if (typeof input === "string")
|
|
220
|
+
return input.trim() ? [input.trim()] : [];
|
|
221
|
+
const preferred = [];
|
|
222
|
+
if (isRecord(input)) {
|
|
223
|
+
for (const key of TASK_KEYS)
|
|
224
|
+
preferred.push(...stringLeaves(input[key], key, 0));
|
|
225
|
+
}
|
|
226
|
+
return preferred.length > 0 ? preferred.slice(0, 32) : stringLeaves(input, "", 0).slice(0, 32);
|
|
227
|
+
}
|
|
228
|
+
function stringLeaves(value, key, depth) {
|
|
229
|
+
if (depth > 6 || IGNORED_KEYS.has(key.toLowerCase()))
|
|
230
|
+
return [];
|
|
231
|
+
if (typeof value === "string")
|
|
232
|
+
return value.trim() ? [value.trim()] : [];
|
|
233
|
+
if (Array.isArray(value))
|
|
234
|
+
return value.flatMap((item) => stringLeaves(item, key, depth + 1));
|
|
235
|
+
if (!isRecord(value))
|
|
236
|
+
return [];
|
|
237
|
+
return Object.entries(value).flatMap(([childKey, child]) => stringLeaves(child, childKey, depth + 1));
|
|
238
|
+
}
|
|
239
|
+
function parseJsonString(input) {
|
|
240
|
+
if (typeof input !== "string")
|
|
241
|
+
return input;
|
|
242
|
+
const trimmed = input.trim();
|
|
243
|
+
if (!trimmed || (!trimmed.startsWith("{") && !trimmed.startsWith("[")))
|
|
244
|
+
return input;
|
|
245
|
+
try {
|
|
246
|
+
return JSON.parse(trimmed);
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return input;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function countTokens(text) {
|
|
253
|
+
return CONTEXT_ENCODING.encode(text, [], []).length;
|
|
254
|
+
}
|
|
255
|
+
function truncateText(text, tokenLimit, edge) {
|
|
256
|
+
if (tokenLimit <= 0 || !text)
|
|
257
|
+
return "";
|
|
258
|
+
const tokens = CONTEXT_ENCODING.encode(text, [], []);
|
|
259
|
+
if (tokens.length <= tokenLimit)
|
|
260
|
+
return text;
|
|
261
|
+
return CONTEXT_ENCODING.decode(edge === "start" ? tokens.slice(0, tokenLimit) : tokens.slice(-tokenLimit));
|
|
262
|
+
}
|
|
263
|
+
function lastEventIndex(events, role) {
|
|
264
|
+
for (let index = events.length - 1; index >= 0; index -= 1) {
|
|
265
|
+
if (events[index]?.role === role)
|
|
266
|
+
return index;
|
|
267
|
+
}
|
|
268
|
+
return -1;
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbC1jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLHNCQUFzQixHQUV2QixNQUFNLElBQUksQ0FBQztBQUNaLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLFNBQVMsTUFBTSw4QkFBOEIsQ0FBQztBQUVyRCxNQUFNLGdCQUFnQixHQUFHLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2pELE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0FBeUJsQzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLEtBQWMsRUFDZCxVQUF3QyxFQUFFO0lBRTFDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxVQUFVLElBQUksbUJBQW1CLENBQUMsQ0FBQztJQUMxRSxNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUM7SUFDeEUsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sV0FBVyxHQUFHLE1BQU0sa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDM0QsTUFBTSxNQUFNLEdBQUcsV0FBVztRQUN4QixDQUFDLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLHVCQUF1QixDQUFDO1FBQzFELENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsdUJBQXVC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Y2VzQ29udGVudCI6WyIvKipcbiAqIEZvcmdpdmluZyBtb2RlbC1jb250ZXh0IG5vcm1hbGl6YXRpb24gZm9yIHJvdXRpbmcgYW5kIHN1Z2dlc3Rpb24gZ2VuZXJhdGlvbi5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgaXNSZWNvcmQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgY29udmVydFRvTW9kZWxNZXNzYWdlcyxcbiAgbW9kZWxNZXNzYWdlU2NoZW1hLFxuICBwcnVuZU1lc3NhZ2VzLFxuICBzYWZlVmFsaWRhdGVVSU1lc3NhZ2VzLFxuICB0eXBlIE1vZGVsTWVzc2FnZSxcbn0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyBUaWt0b2tlbiB9IGZyb20gXCJqcy10aWt0b2tlbi9saXRlXCI7XG5pbXBvcnQgbzIwMGtCYXNlIGZyb20gXCJqcy10aWt0b2tlbi9yYW5rcy9vMjAwa19iYXNlXCI7XG5cbmNvbnN0IENPTlRFWFRfRU5DT0RJTkcgPSBuZXcgVGlrdG9rZW4obzIwMGtCYXNlKTtcbmNvbnN0IERFRkFVTFRfVE9LRU5fTElNSVQgPSA0XzA5NjtcblxuLyoqIE9uZSB1c2VmdWwgY29udmVyc2F0aW9uYWwgZXZlbnQgcmV0YWluZWQgZnJvbSBhcmJpdHJhcnkgY2FsbGVyIGlucHV0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbENvbnRleHRFdmVudCB7XG4gIHJlYWRvbmx5IHJvbGU6IFwiYXNzaXN0YW50XCIgfCBcInN5c3RlbVwiIHwgXCJ0b29sXCIgfCBcInVzZXJcIjtcbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG4vKiogQ29udHJvbHMgZm9yIGNvbnZlcnRpbmcgYXJiaXRyYXJ5IHZhbHVlcyBpbnRvIGJvdW5kZWQgbW9kZWwgY29udGV4dC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplTW9kZWxDb250ZXh0T3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIHJldGFpbmVkIHRva2Vucy4gRGVmYXVsdHMgdG8gNDA5Ni4gKi9cbiAgcmVhZG9ubHkgdG9rZW5MaW1pdD86IG51bWJlcjtcbiAgLyoqIFJlbW92ZSByZWFzb25pbmcsIHRvb2wgY2FsbHMvcmVzdWx0cywgbWV0YWRhdGEsIGFuZCBvdGhlciBub24tY29udmVyc2F0aW9uYWwgbm9pc2UuICovXG4gIHJlYWRvbmx5IHJlbW92ZU5vblVzZWZ1bE1lc3NhZ2VzPzogYm9vbGVhbjtcbn1cblxuLyoqIEJvdW5kZWQgY29udGV4dCBwbHVzIGxvZ2ljYWwtdHVybiBtZXRhZGF0YSB1c2VkIGJ5IG1vZGVsIHJvdXRlcnMuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vcm1hbGl6ZWRNb2RlbENvbnRleHQge1xuICByZWFkb25seSBjb250aW51YXRpb246IGJvb2xlYW47XG4gIHJlYWRvbmx5IGV2ZW50czogcmVhZG9ubHkgTW9kZWxDb250ZXh0RXZlbnRbXTtcbiAgcmVhZG9ubHkgbG9naWNhbFR1cm46IHN0cmluZztcbiAgcmVhZG9ubHkgdGFzazogc3RyaW5nO1xuICByZWFkb25seSB0b2tlbkNvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIHN0cmluZ3MsIEpTT04sIEFJIFNESyBtZXNzYWdlcywgUmVzcG9uc2VzIGlucHV0LCBhbmQgdGFzay1zaGFwZWQgb2JqZWN0cy5cbiAqXG4gKiBBSSBTREsgVUkvbW9kZWwgbWVzc2FnZSBwYXJzaW5nIGlzIHByZWZlcnJlZC4gVGhlIGZhbGxiYWNrIGhhbmRsZXMgZXh0ZXJuYWwgd2lyZVxuICogc2hhcGVzIGFuZCBhcmJpdHJhcnkgSlNPTiB3aXRob3V0IHJldGFpbmluZyBjcmVkZW50aWFscywgbWV0YWRhdGEsIG9yIHRvb2wgYXJndW1lbnRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplTW9kZWxDb250ZXh0KFxuICBpbnB1dDogdW5rbm93bixcbiAgb3B0aW9uczogTm9ybWFsaXplTW9kZWxDb250ZXh0T3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxOb3JtYWxpemVkTW9kZWxDb250ZXh0PiB7XG4gIGNvbnN0IHRva2VuTGltaXQgPSBNYXRoLm1heCgwLCBvcHRpb25zLnRva2VuTGltaXQgPz8gREVGQVVMVF9UT0tFTl9MSU1JVCk7XG4gIGNvbnN0IHJlbW92ZU5vblVzZWZ1bE1lc3NhZ2VzID0gb3B0aW9ucy5yZW1vdmVOb25Vc2VmdWxNZXNzYWdlcyA/PyB0cnVlO1xuICBjb25zdCBub3JtYWxpemVkID0gcGFyc2VKc29uU3RyaW5nKGlucHV0KTtcbiAgY29uc3QgY29udmVyc2F0aW9uID0gY29udmVyc2F0aW9uVmFsdWUobm9ybWFsaXplZCk7XG4gIGNvbnN0IHNka01lc3NhZ2VzID0gYXdhaXQgYWlTZGtNb2RlbE1lc3NhZ2VzKGNvbnZlcnNhdGlvbik7XG4gIGNvbnN0IGV2ZW50cyA9IHNka01lc3NhZ2VzXG4gICAgPyBtb2RlbE1lc3NhZ2VFdmVudHMoc2RrTWVzc2FnZXMsIHJlbW92ZU5vblVzZWZ1bE1lc3NhZ2VzKVxuICAgIDogY29udmVyc2F0aW9uRXZlbnRzKGNvbnZlcnNhdGlvbiwgcmVtb3ZlTm9uVXNlZnVsTWVzc2FnZXMpO1xuICBjb25zdCByYXdFdmVudHMgPSBjb252ZXJzYXRpb25FdmVudHMoY29udmVyc2F0aW9uLCBmYWxzZSk7XG4gIGNvbnN0IHN0YXRlRXZlbnRzID0gcmF3RXZlbnRzLmxlbmd0aCA+IDAgPyByYXdFdmVudHMgOiBldmVudHM7XG4gIGlmIChldmVudHMubGVuZ3RoID4gMCkgcmV0dXJuIGNvbnRleHRGcm9tRXZlbnRzKGV2ZW50cywgdG9rZW5MaW1pdCwgc3RhdGVFdmVudHMpO1xuXG4gIGNvbnN0IHZhbHVlcyA9IGNvbGxlY3RUYXNrU3RyaW5ncyhub3JtYWxpemVkKTtcbiAgY29uc3QgdGFzayA9IHRydW5jYXRlVGV4dCh2YWx1ZXMuam9pbihcIlxcblwiKSwgdG9rZW5MaW1pdCwgXCJzdGFydFwiKTtcbiAgcmV0dXJuIHtcbiAgICB0YXNrLFxuICAgIGxvZ2ljYWxUdXJuOiB0YXNrLFxuICAgIGNvbnRpbnVhdGlvbjogZmFsc2UsXG4gICAgZXZlbnRzOiB0YXNrID8gW3sgcm9sZTogXCJ1c2VyXCIsIHRleHQ6IHRhc2sgfV0gOiBbXSxcbiAgICB0b2tlbkNvdW50OiBjb3VudFRva2Vucyh0YXNrKSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYWlTZGtNb2RlbE1lc3NhZ2VzKGlucHV0OiB1bmtub3duKTogUHJvbWlzZTxNb2RlbE1lc3NhZ2VbXSB8IHVuZGVmaW5lZD4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpIHx8IGlucHV0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbW9kZWxNZXNzYWdlcyA9IGlucHV0Lm1hcCgodmFsdWUpID0+IG1vZGVsTWVzc2FnZVNjaGVtYS5zYWZlUGFyc2UodmFsdWUpKTtcbiAgaWYgKG1vZGVsTWVzc2FnZXMuZXZlcnkoKHJlc3VsdCkgPT4gcmVzdWx0LnN1Y2Nlc3MpKSB7XG4gICAgcmV0dXJuIG1vZGVsTWVzc2FnZXMubWFwKChyZXN1bHQpID0+IHJlc3VsdC5kYXRhKTtcbiAgfVxuXG4gIGNvbnN0IHVpTWVzc2FnZXMgPSBhd2FpdCBzYWZlVmFsaWRhdGVVSU1lc3NhZ2VzKHsgbWVzc2FnZXM6IGlucHV0IH0pO1xuICBpZiAoIXVpTWVzc2FnZXMuc3VjY2VzcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgY29udmVydFRvTW9kZWxNZXNzYWdlcyh1aU1lc3NhZ2VzLmRhdGEsIHsgaWdub3JlSW5jb21wbGV0ZVRvb2xDYWxsczogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb2RlbE1lc3NhZ2VFdmVudHMoXG4gIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXSxcbiAgcmVtb3ZlTm9uVXNlZnVsTWVzc2FnZXM6IGJvb2xlYW4sXG4pOiBNb2RlbENvbnRleHRFdmVudFtdIHtcbiAgY29uc3QgdXNlZnVsID0gcmVtb3ZlTm9uVXNlZnVsTWVzc2FnZXNcbiAgICA/IHBydW5lTWVzc2FnZXMoeyBtZXNzYWdlcywgcmVhc29uaW5nOiBcImFsbFwiLCB0b29sQ2FsbHM6IFwiYWxsXCIgfSlcbiAgICA6IG1lc3NhZ2VzO1xuICByZXR1cm4gdXNlZnVsLmZsYXRNYXAoKG1lc3NhZ2UpID0+IHtcbiAgICBjb25zdCByb2xlID0gbWVzc2FnZS5yb2xlO1xuICAgIGlmIChyb2xlID09PSBcInRvb2xcIiAmJiByZW1vdmVOb25Vc2VmdWxNZXNzYWdlcykgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHRleHQgPSBtb2RlbENvbnRlbnRUZXh0KG1lc3NhZ2UuY29udGVudCwgcmVtb3ZlTm9uVXNlZnVsTWVzc2FnZXMpO1xuICAgIHJldHVybiB0ZXh0ID8gW3sgcm9sZSwgdGV4dCB9XSA6IFtdO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbW9kZWxDb250ZW50VGV4dCh2YWx1ZTogdW5rbm93biwgcmVtb3ZlTm9uVXNlZnVsTWVzc2FnZXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWUudHJpbSgpO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIHZhbHVlXG4gICAgLmZsYXRNYXAoKHBhcnQpID0+IHtcbiAgICAgIGlmICghaXNSZWNvcmQocGFydCkpIHJldHVybiBbXTtcbiAgICAgIGlmICh0eXBlb2YgcGFydC50ZXh0ID09PSBcInN0cmluZ1wiKSByZXR1cm4gW3BhcnQudGV4dC50cmltKCldO1xuICAgICAgaWYgKCFyZW1vdmVOb25Vc2VmdWxNZXNzYWdlcyAmJiB0eXBlb2YgcGFydC5vdXRwdXQgPT09IFwic3RyaW5nXCIpIHJldHVybiBbcGFydC5vdXRwdXQudHJpbSgpXTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gY29udmVyc2F0aW9uVmFsdWUoaW5wdXQ6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiBpbnB1dDtcbiAgZm9yIChjb25zdCBrZXkgb2YgW1wibWVzc2FnZXNcIiwgXCJpbnB1dFwiXSBhcyBjb25zdCkge1xuICAgIGNvbnN0IHZhbHVlID0gaW5wdXRba2V5XTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnRyaW0oKSkgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBpbnB1dDtcbn1cblxuZnVuY3Rpb24gY29udGV4dEZyb21FdmVudHMoXG4gIGV2ZW50czogcmVhZG9ubHkgTW9kZWxDb250ZXh0RXZlbnRbXSxcbiAgdG9rZW5MaW1pdDogbnVtYmVyLFxuICBzdGF0ZUV2ZW50czogcmVhZG9ubHkgTW9kZWxDb250ZXh0RXZlbnRbXSA9IGV2ZW50cyxcbik6IE5vcm1hbGl6ZWRNb2RlbENvbnRleHQge1xuICBjb25zdCBsYXRlc3RVc2VySW5kZXggPSBsYXN0RXZlbnRJbmRleChldmVudHMsIFwidXNlclwiKTtcbiAgY29uc3QgdGFza0V2ZW50ID0gbGF0ZXN0VXNlckluZGV4ID49IDAgPyBldmVudHNbbGF0ZXN0VXNlckluZGV4XSA6IGV2ZW50cy5hdCgtMSk7XG4gIGNvbnN0IHRhc2sgPSB0cnVuY2F0ZVRleHQodGFza0V2ZW50Py50ZXh0ID8/IFwiXCIsIHRva2VuTGltaXQsIFwic3RhcnRcIik7XG4gIGxldCByZW1haW5pbmcgPSBNYXRoLm1heCgwLCB0b2tlbkxpbWl0IC0gY291bnRUb2tlbnModGFzaykpO1xuICBjb25zdCBjb250ZXh0OiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKFxuICAgIGxldCBpbmRleCA9ICh0YXNrRXZlbnQgPyBldmVudHMuaW5kZXhPZih0YXNrRXZlbnQpIDogZXZlbnRzLmxlbmd0aCkgLSAxO1xuICAgIGluZGV4ID49IDA7XG4gICAgaW5kZXggLT0gMVxuICApIHtcbiAgICBjb25zdCBldmVudCA9IGV2ZW50c1tpbmRleF07XG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQudGV4dCB8fCBldmVudC5yb2xlID09PSBcInRvb2xcIikgY29udGludWU7XG4gICAgY29uc3QgdmFsdWUgPSBgJHtldmVudC5yb2xlfTogJHtldmVudC50ZXh0fWA7XG4gICAgY29uc3QgcmV0YWluZWQgPSB0cnVuY2F0ZVRleHQodmFsdWUsIHJlbWFpbmluZywgXCJlbmRcIik7XG4gICAgaWYgKCFyZXRhaW5lZCkgYnJlYWs7XG4gICAgY29udGV4dC51bnNoaWZ0KHJldGFpbmVkKTtcbiAgICByZW1haW5pbmcgLT0gY291bnRUb2tlbnMocmV0YWluZWQpO1xuICB9XG4gIGNvbnN0IGNvbWJpbmVkID0gWy4uLmNvbnRleHQsIHRhc2tdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiXFxuXCIpO1xuICBjb25zdCBzdGF0ZUxhdGVzdFVzZXJJbmRleCA9IGxhc3RFdmVudEluZGV4KHN0YXRlRXZlbnRzLCBcInVzZXJcIik7XG4gIGNvbnN0IGxvZ2ljYWxFdmVudHMgPVxuICAgIHN0YXRlTGF0ZXN0VXNlckluZGV4ID49IDAgPyBzdGF0ZUV2ZW50cy5zbGljZSgwLCBzdGF0ZUxhdGVzdFVzZXJJbmRleCArIDEpIDogc3RhdGVFdmVudHM7XG4gIHJldHVybiB7XG4gICAgdGFzazogY29tYmluZWQsXG4gICAgbG9naWNhbFR1cm46IGxvZ2ljYWxFdmVudHMubWFwKChldmVudCkgPT4gYCR7ZXZlbnQucm9sZX06JHtldmVudC50ZXh0fWApLmpvaW4oXCJcXG5cIiksXG4gICAgY29udGludWF0aW9uOlxuICAgICAgc3RhdGVMYXRlc3RVc2VySW5kZXggPj0gMCAmJlxuICAgICAgc3RhdGVFdmVudHMuc2xpY2Uoc3RhdGVMYXRlc3RVc2VySW5kZXggKyAxKS5zb21lKChldmVudCkgPT4gZXZlbnQucm9sZSAhPT0gXCJzeXN0ZW1cIiksXG4gICAgZXZlbnRzLFxuICAgIHRva2VuQ291bnQ6IGNvdW50VG9rZW5zKGNvbWJpbmVkKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29udmVyc2F0aW9uRXZlbnRzKGlucHV0OiB1bmtub3duLCByZW1vdmVOb25Vc2VmdWxNZXNzYWdlczogYm9vbGVhbik6IE1vZGVsQ29udGV4dEV2ZW50W10ge1xuICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSByZXR1cm4gaW5wdXQudHJpbSgpID8gW3sgcm9sZTogXCJ1c2VyXCIsIHRleHQ6IGlucHV0LnRyaW0oKSB9XSA6IFtdO1xuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICByZXR1cm4gaW5wdXQuZmxhdE1hcCgodmFsdWUpID0+IG1lc3NhZ2VFdmVudCh2YWx1ZSwgcmVtb3ZlTm9uVXNlZnVsTWVzc2FnZXMpKTtcbiAgfVxuICBpZiAoIWlzUmVjb3JkKGlucHV0KSkgcmV0dXJuIFtdO1xuICBmb3IgKGNvbnN0IGtleSBvZiBbXCJtZXNzYWdlc1wiLCBcImlucHV0XCJdIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBpbnB1dFtrZXldO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUudHJpbSgpKSByZXR1cm4gW3sgcm9sZTogXCJ1c2VyXCIsIHRleHQ6IHZhbHVlLnRyaW0oKSB9XTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IGV2ZW50cyA9IHZhbHVlLmZsYXRNYXAoKGl0ZW0pID0+IG1lc3NhZ2VFdmVudChpdGVtLCByZW1vdmVOb25Vc2VmdWxNZXNzYWdlcykpO1xuICAgICAgaWYgKGV2ZW50cy5sZW5ndGggPiAwKSByZXR1cm4gZXZlbnRzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIG1lc3NhZ2VFdmVudCh2YWx1ZTogdW5rbm93biwgcmVtb3ZlTm9uVXNlZnVsTWVzc2FnZXM6IGJvb2xlYW4pOiBNb2RlbENvbnRleHRFdmVudFtdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbHVlLnRyaW0oKSA/IFt7IHJvbGU6IFwidXNlclwiLCB0ZXh0OiB2YWx1ZS50cmltKCkgfV0gOiBbXTtcbiAgaWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBbXTtcbiAgY29uc3Qgcm9sZSA9IG1lc3NhZ2VSb2xlKHZhbHVlKTtcbiAgaWYgKCFyb2xlIHx8IChyZW1vdmVOb25Vc2VmdWxNZXNzYWdlcyAmJiByb2xlID09PSBcInRvb2xcIikpIHJldHVybiBbXTtcbiAgaWYgKHJlbW92ZU5vblVzZWZ1bE1lc3NhZ2VzICYmICh2YWx1ZS50eXBlID09PSBcImZ1bmN0aW9uX2NhbGxcIiB8fCB2YWx1ZS50eXBlID09PSBcInJlYXNvbmluZ1wiKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCB0ZXh0ID0gY29udGVudFRleHQodmFsdWUuY29udGVudCA/PyB2YWx1ZS50ZXh0ID8/IHZhbHVlLmlucHV0X3RleHQgPz8gdmFsdWUub3V0cHV0X3RleHQpO1xuICByZXR1cm4gdGV4dCA/IFt7IHJvbGUsIHRleHQgfV0gOiBbXTtcbn1cblxuZnVuY3Rpb24gbWVzc2FnZVJvbGUoXG4gIHZhbHVlOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBNb2RlbENvbnRleHRFdmVudFtcInJvbGVcIl0gfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUucm9sZSA9PT0gXCJ1c2VyXCIgfHwgdmFsdWUucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiB8fCB2YWx1ZS5yb2xlID09PSBcInN5c3RlbVwiKSB7XG4gICAgcmV0dXJuIHZhbHVlLnJvbGU7XG4gIH1cbiAgaWYgKFxuICAgIHZhbHVlLnJvbGUgPT09IFwidG9vbFwiIHx8XG4gICAgdmFsdWUudHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsX291dHB1dFwiIHx8XG4gICAgdmFsdWUudHlwZSA9PT0gXCJ0b29sX3Jlc3VsdFwiXG4gICkge1xuICAgIHJldHVybiBcInRvb2xcIjtcbiAgfVxuICBpZiAodmFsdWUudHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsXCIgfHwgdmFsdWUudHlwZSA9PT0gXCJyZWFzb25pbmdcIikgcmV0dXJuIFwiYXNzaXN0YW50XCI7XG4gIGlmICh2YWx1ZS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiB2YWx1ZS5yb2xlID09PSB1bmRlZmluZWQpIHJldHVybiBcInVzZXJcIjtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY29udGVudFRleHQodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWUudHJpbSgpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5tYXAoY29udGVudFRleHQpLmZpbHRlcihCb29sZWFuKS5qb2luKFwiXFxuXCIpO1xuICBpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIFwiXCI7XG4gIGZvciAoY29uc3Qga2V5IG9mIFtcInRleHRcIiwgXCJpbnB1dF90ZXh0XCIsIFwib3V0cHV0X3RleHRcIiwgXCJjb250ZW50XCJdIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdGV4dCA9IGNvbnRlbnRUZXh0KHZhbHVlW2tleV0pO1xuICAgIGlmICh0ZXh0KSByZXR1cm4gdGV4dDtcbiAgfVxuICByZXR1cm4gXCJcIjtcbn1cblxuY29uc3QgVEFTS19LRVlTID0gW1xuICBcInByb21wdFwiLFxuICBcInRhc2tcIixcbiAgXCJxdWVyeVwiLFxuICBcInF1ZXN0aW9uXCIsXG4gIFwicmVxdWVzdFwiLFxuICBcImRlc2NyaXB0aW9uXCIsXG4gIFwibWVzc2FnZVwiLFxuICBcInRleHRcIixcbiAgXCJpbnB1dFwiLFxuXSBhcyBjb25zdDtcbmNvbnN0IElHTk9SRURfS0VZUyA9IG5ldyBTZXQoW1xuICBcImFwaV9rZXlcIixcbiAgXCJhdXRob3JpemF0aW9uXCIsXG4gIFwiYXJndW1lbnRzXCIsXG4gIFwiY3JlZGVudGlhbHNcIixcbiAgXCJoZWFkZXJzXCIsXG4gIFwibWV0YWRhdGFcIixcbiAgXCJwYXNzd29yZFwiLFxuICBcInByb3ZpZGVyX29wdGlvbnNcIixcbiAgXCJyYXdfaW5wdXRcIixcbiAgXCJzZWNyZXRcIixcbiAgXCJ0b2tlblwiLFxuICBcInRvb2xfY2FsbHNcIixcbiAgXCJ0b29sc1wiLFxuXSk7XG5cbmZ1bmN0aW9uIGNvbGxlY3RUYXNrU3RyaW5ncyhpbnB1dDogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGlucHV0LnRyaW0oKSA/IFtpbnB1dC50cmltKCldIDogW107XG4gIGNvbnN0IHByZWZlcnJlZDogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGlzUmVjb3JkKGlucHV0KSkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIFRBU0tfS0VZUykgcHJlZmVycmVkLnB1c2goLi4uc3RyaW5nTGVhdmVzKGlucHV0W2tleV0sIGtleSwgMCkpO1xuICB9XG4gIHJldHVybiBwcmVmZXJyZWQubGVuZ3RoID4gMCA/IHByZWZlcnJlZC5zbGljZSgwLCAzMikgOiBzdHJpbmdMZWF2ZXMoaW5wdXQsIFwiXCIsIDApLnNsaWNlKDAsIDMyKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nTGVhdmVzKHZhbHVlOiB1bmtub3duLCBrZXk6IHN0cmluZywgZGVwdGg6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgaWYgKGRlcHRoID4gNiB8fCBJR05PUkVEX0tFWVMuaGFzKGtleS50b0xvd2VyQ2FzZSgpKSkgcmV0dXJuIFtdO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWUudHJpbSgpID8gW3ZhbHVlLnRyaW0oKV0gOiBbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuZmxhdE1hcCgoaXRlbSkgPT4gc3RyaW5nTGVhdmVzKGl0ZW0sIGtleSwgZGVwdGggKyAxKSk7XG4gIGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiBPYmplY3QuZW50cmllcyh2YWx1ZSkuZmxhdE1hcCgoW2NoaWxkS2V5LCBjaGlsZF0pID0+XG4gICAgc3RyaW5nTGVhdmVzKGNoaWxkLCBjaGlsZEtleSwgZGVwdGggKyAxKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VKc29uU3RyaW5nKGlucHV0OiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmICh0eXBlb2YgaW5wdXQgIT09IFwic3RyaW5nXCIpIHJldHVybiBpbnB1dDtcbiAgY29uc3QgdHJpbW1lZCA9IGlucHV0LnRyaW0oKTtcbiAgaWYgKCF0cmltbWVkIHx8ICghdHJpbW1lZC5zdGFydHNXaXRoKFwie1wiKSAmJiAhdHJpbW1lZC5zdGFydHNXaXRoKFwiW1wiKSkpIHJldHVybiBpbnB1dDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0cmltbWVkKSBhcyB1bmtub3duO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY291bnRUb2tlbnModGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIENPTlRFWFRfRU5DT0RJTkcuZW5jb2RlKHRleHQsIFtdLCBbXSkubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiB0cnVuY2F0ZVRleHQodGV4dDogc3RyaW5nLCB0b2tlbkxpbWl0OiBudW1iZXIsIGVkZ2U6IFwic3RhcnRcIiB8IFwiZW5kXCIpOiBzdHJpbmcge1xuICBpZiAodG9rZW5MaW1pdCA8PSAwIHx8ICF0ZXh0KSByZXR1cm4gXCJcIjtcbiAgY29uc3QgdG9rZW5zID0gQ09OVEVYVF9FTkNPRElORy5lbmNvZGUodGV4dCwgW10sIFtdKTtcbiAgaWYgKHRva2Vucy5sZW5ndGggPD0gdG9rZW5MaW1pdCkgcmV0dXJuIHRleHQ7XG4gIHJldHVybiBDT05URVhUX0VOQ09ESU5HLmRlY29kZShcbiAgICBlZGdlID09PSBcInN0YXJ0XCIgPyB0b2tlbnMuc2xpY2UoMCwgdG9rZW5MaW1pdCkgOiB0b2tlbnMuc2xpY2UoLXRva2VuTGltaXQpLFxuICApO1xufVxuXG5mdW5jdGlvbiBsYXN0RXZlbnRJbmRleChcbiAgZXZlbnRzOiByZWFkb25seSBNb2RlbENvbnRleHRFdmVudFtdLFxuICByb2xlOiBNb2RlbENvbnRleHRFdmVudFtcInJvbGVcIl0sXG4pOiBudW1iZXIge1xuICBmb3IgKGxldCBpbmRleCA9IGV2ZW50cy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleCAtPSAxKSB7XG4gICAgaWYgKGV2ZW50c1tpbmRleF0/LnJvbGUgPT09IHJvbGUpIHJldHVybiBpbmRleDtcbiAgfVxuICByZXR1cm4gLTE7XG59XG4iXX0=
|
package/lib/src/models.d.ts
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { CodexModelListResponse, ModelListResponse, ModelTarget, OpenAIModelListResponse } from "@dbx-tools/shared-model-gateway";
|
|
7
7
|
/** Build the combined OpenAI and optional Codex model catalogue. */
|
|
8
|
-
export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: true, preserveOrder?: boolean, preferSystemModels?: boolean, includeSmartRouter?: boolean): CodexModelListResponse;
|
|
9
|
-
export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: false, preserveOrder?: boolean, preferSystemModels?: boolean, includeSmartRouter?: boolean): OpenAIModelListResponse;
|
|
10
|
-
export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: boolean, preserveOrder?: boolean, preferSystemModels?: boolean, includeSmartRouter?: boolean): ModelListResponse;
|
|
8
|
+
export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: true, preserveOrder?: boolean, preferSystemModels?: boolean, includeSmartRouter?: boolean, includeAiDecide?: boolean, includeMetadata?: boolean): CodexModelListResponse;
|
|
9
|
+
export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: false, preserveOrder?: boolean, preferSystemModels?: boolean, includeSmartRouter?: boolean, includeAiDecide?: boolean, includeMetadata?: boolean): OpenAIModelListResponse;
|
|
10
|
+
export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: boolean, preserveOrder?: boolean, preferSystemModels?: boolean, includeSmartRouter?: boolean, includeAiDecide?: boolean, includeMetadata?: boolean): ModelListResponse;
|
|
11
11
|
/** Codex `/v1/models` slug: the `system.ai.*` service when preferred, else the endpoint id. */
|
|
12
12
|
export declare function codexModelSlug(target: ModelTarget, preferSystemModels: boolean): string;
|
package/lib/src/models.js
CHANGED
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import { CHAT_CLASS_ORDER, compareVersionTuples, isChatClass, isOpenWeightsGpt, ModelFamily, modelFamily, modelFamilyRank, versionTuple, } from "@dbx-tools/model";
|
|
6
|
+
import { CHAT_CLASS_ORDER, compareVersionTuples, isChatClass, isOpenWeightsGpt, ModelFamily, modelFamily, modelFamilyRank, modelMetadataFor, versionTuple, } from "@dbx-tools/model";
|
|
7
7
|
import { ModelClass, ReasoningEffort } from "@dbx-tools/shared-model";
|
|
8
|
-
import { SMART_ROUTER_MODEL_ID } from "@dbx-tools/shared-model-gateway";
|
|
8
|
+
import { AI_DECIDE_MODEL_ID, SMART_ROUTER_MODEL_ID } from "@dbx-tools/shared-model-gateway";
|
|
9
9
|
const CODEX_BASE_INSTRUCTIONS = "You are a coding agent. Follow the user's instructions and use the available tools to work in the current repository.";
|
|
10
10
|
const CODEX_SMART_ROUTER_PRIORITY = 9_000;
|
|
11
|
+
const CODEX_AI_DECIDE_PRIORITY = 9_001;
|
|
11
12
|
const CODEX_MODEL_PRIORITY_BASE = 10_000;
|
|
12
13
|
const CODEX_FAMILY_ORDER = [
|
|
13
14
|
ModelFamily.Gpt,
|
|
@@ -22,7 +23,7 @@ const REASONING_DESCRIPTIONS = {
|
|
|
22
23
|
xhigh: "Use an extra-high reasoning budget",
|
|
23
24
|
max: "Use the largest available reasoning budget",
|
|
24
25
|
};
|
|
25
|
-
export function listModelsPayload(targets, includeCodex, preserveOrder = false, preferSystemModels = false, includeSmartRouter = false) {
|
|
26
|
+
export function listModelsPayload(targets, includeCodex, preserveOrder = false, preferSystemModels = false, includeSmartRouter = false, includeAiDecide = false, includeMetadata = false) {
|
|
26
27
|
const available = targets
|
|
27
28
|
.filter((target) => target.endpoint?.status?.deprecated !== true)
|
|
28
29
|
.filter((target) => !includeCodex || hasChatClass(target));
|
|
@@ -32,6 +33,9 @@ export function listModelsPayload(targets, includeCodex, preserveOrder = false,
|
|
|
32
33
|
: (left, right) => compareCatalogueTargets(left, right, (target) => target.displayName));
|
|
33
34
|
}
|
|
34
35
|
const smartRouterCandidates = available.filter((target) => target.capabilities.chat);
|
|
36
|
+
if (includeAiDecide && smartRouterCandidates.length > 0) {
|
|
37
|
+
available.unshift(aiDecideModelTarget(smartRouterCandidates));
|
|
38
|
+
}
|
|
35
39
|
if (includeSmartRouter && smartRouterCandidates.length > 0) {
|
|
36
40
|
available.unshift(smartRouterModelTarget(smartRouterCandidates));
|
|
37
41
|
}
|
|
@@ -40,25 +44,30 @@ export function listModelsPayload(targets, includeCodex, preserveOrder = false,
|
|
|
40
44
|
return {
|
|
41
45
|
models: available.map((target) => codexModel(target, target.id === SMART_ROUTER_MODEL_ID
|
|
42
46
|
? CODEX_SMART_ROUTER_PRIORITY
|
|
43
|
-
:
|
|
47
|
+
: target.id === AI_DECIDE_MODEL_ID
|
|
48
|
+
? CODEX_AI_DECIDE_PRIORITY
|
|
49
|
+
: CODEX_MODEL_PRIORITY_BASE + modelIndex++, preferSystemModels, includeMetadata)),
|
|
44
50
|
};
|
|
45
51
|
}
|
|
46
52
|
return {
|
|
47
53
|
object: "list",
|
|
48
|
-
data: available.map(openAiModel),
|
|
54
|
+
data: available.map((target) => openAiModel(target, includeMetadata)),
|
|
49
55
|
};
|
|
50
56
|
}
|
|
51
|
-
function openAiModel(target) {
|
|
57
|
+
function openAiModel(target, includeMetadata) {
|
|
52
58
|
return {
|
|
53
59
|
id: target.id,
|
|
54
60
|
object: "model",
|
|
55
61
|
created: 0,
|
|
56
62
|
owned_by: "databricks",
|
|
57
63
|
name: target.displayName,
|
|
64
|
+
model_source: target.endpoint?.modelSource ?? "custom",
|
|
58
65
|
task: target.endpoint?.task,
|
|
59
66
|
status: target.endpoint?.status ?? { deprecated: false },
|
|
67
|
+
...(includeMetadata ? { metadata: modelMetadataFor(target.endpoint ?? target.id) } : {}),
|
|
60
68
|
capabilities: {
|
|
61
69
|
smart_router: target.id === SMART_ROUTER_MODEL_ID,
|
|
70
|
+
ai_decide: target.id === AI_DECIDE_MODEL_ID,
|
|
62
71
|
tools: target.capabilities.tools,
|
|
63
72
|
reasoning: target.reasoningEfforts,
|
|
64
73
|
responses: target.capabilities.responses,
|
|
@@ -73,6 +82,42 @@ function openAiModel(target) {
|
|
|
73
82
|
},
|
|
74
83
|
};
|
|
75
84
|
}
|
|
85
|
+
function aiDecideModelTarget(candidates) {
|
|
86
|
+
const has = (capability) => candidates.some((target) => target.capabilities[capability]);
|
|
87
|
+
const reasoningEfforts = Object.values(ReasoningEffort).filter((effort) => candidates.some((target) => target.reasoningEfforts.includes(effort)));
|
|
88
|
+
return {
|
|
89
|
+
id: AI_DECIDE_MODEL_ID,
|
|
90
|
+
aliases: [AI_DECIDE_MODEL_ID],
|
|
91
|
+
displayName: "AI Decide",
|
|
92
|
+
endpoint: {
|
|
93
|
+
name: AI_DECIDE_MODEL_ID,
|
|
94
|
+
displayName: "AI Decide",
|
|
95
|
+
description: "Uses Databricks ai_decide to choose a sufficient foundation model.",
|
|
96
|
+
task: "llm/v1/chat",
|
|
97
|
+
class: ModelClass.ChatBalanced,
|
|
98
|
+
modelSource: "foundation",
|
|
99
|
+
status: { deprecated: false },
|
|
100
|
+
},
|
|
101
|
+
capabilities: {
|
|
102
|
+
responses: true,
|
|
103
|
+
openResponses: true,
|
|
104
|
+
chat: true,
|
|
105
|
+
anthropic: true,
|
|
106
|
+
embeddings: false,
|
|
107
|
+
aiGatewayCodex: true,
|
|
108
|
+
tools: has("tools"),
|
|
109
|
+
reasoning: reasoningEfforts.length > 0,
|
|
110
|
+
streaming: true,
|
|
111
|
+
parallelTools: has("parallelTools"),
|
|
112
|
+
customTools: has("customTools"),
|
|
113
|
+
structuredOutput: has("structuredOutput"),
|
|
114
|
+
webSearch: has("webSearch"),
|
|
115
|
+
imageInput: has("imageInput"),
|
|
116
|
+
applyPatch: has("applyPatch"),
|
|
117
|
+
},
|
|
118
|
+
reasoningEfforts,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
76
121
|
function smartRouterModelTarget(candidates) {
|
|
77
122
|
const has = (capability) => candidates.some((target) => target.capabilities[capability]);
|
|
78
123
|
const reasoningEfforts = Object.values(ReasoningEffort).filter((effort) => candidates.some((target) => target.reasoningEfforts.includes(effort)));
|
|
@@ -86,6 +131,7 @@ function smartRouterModelTarget(candidates) {
|
|
|
86
131
|
description: "Uses Databricks task_v3 Smart Router to select a compatible system model for each turn.",
|
|
87
132
|
task: "llm/v1/chat",
|
|
88
133
|
class: ModelClass.ChatBalanced,
|
|
134
|
+
modelSource: "foundation",
|
|
89
135
|
status: { deprecated: false },
|
|
90
136
|
},
|
|
91
137
|
capabilities: {
|
|
@@ -115,7 +161,7 @@ export function codexModelSlug(target, preferSystemModels) {
|
|
|
115
161
|
: target.id;
|
|
116
162
|
return `databricks/${model}`;
|
|
117
163
|
}
|
|
118
|
-
function codexModel(target, priority, preferSystemModels) {
|
|
164
|
+
function codexModel(target, priority, preferSystemModels, includeMetadata) {
|
|
119
165
|
const efforts = target.reasoningEfforts;
|
|
120
166
|
return {
|
|
121
167
|
slug: codexModelSlug(target, preferSystemModels),
|
|
@@ -123,6 +169,7 @@ function codexModel(target, priority, preferSystemModels) {
|
|
|
123
169
|
description: target.endpoint?.description ?? "Databricks model service",
|
|
124
170
|
base_instructions: CODEX_BASE_INSTRUCTIONS,
|
|
125
171
|
status: target.endpoint?.status ?? { deprecated: false },
|
|
172
|
+
...(includeMetadata ? { metadata: modelMetadataFor(target.endpoint ?? target.id) } : {}),
|
|
126
173
|
supported_reasoning_levels: efforts.map((effort) => ({
|
|
127
174
|
effort,
|
|
128
175
|
description: REASONING_DESCRIPTIONS[effort] ?? `Use the ${effort} reasoning budget`,
|
|
@@ -253,4 +300,4 @@ function hasChatClass(target) {
|
|
|
253
300
|
const modelClass = target.endpoint?.class;
|
|
254
301
|
return modelClass !== undefined && isChatClass(modelClass);
|
|
255
302
|
}
|
|
256
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsV0FBVyxFQUNYLGVBQWUsRUFDZixZQUFZLEdBQ2IsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBV3hFLE1BQU0sdUJBQXVCLEdBQzNCLHVIQUF1SCxDQUFDO0FBQzFILE1BQU0sMkJBQTJCLEdBQUcsS0FBSyxDQUFDO0FBQzFDLE1BQU0seUJBQXlCLEdBQUcsTUFBTSxDQUFDO0FBQ3pDLE1BQU0sa0JBQWtCLEdBQUc7SUFDekIsV0FBVyxDQUFDLEdBQUc7SUFDZixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEtBQUssV0FBVyxDQUFDLEdBQUcsQ0FBQztDQUNwRSxDQUFDO0FBRVgsTUFBTSxzQkFBc0IsR0FBcUM7SUFDL0QsSUFBSSxFQUFFLDRCQUE0QjtJQUNsQyxPQUFPLEVBQUUsNkNBQTZDO0lBQ3RELEdBQUcsRUFBRSw0QkFBNEI7SUFDakMsTUFBTSxFQUFFLCtCQUErQjtJQUN2QyxJQUFJLEVBQUUsNkJBQTZCO0lBQ25DLEtBQUssRUFBRSxvQ0FBb0M7SUFDM0MsR0FBRyxFQUFFLDRDQUE0QztDQUNsRCxDQUFDO0FBd0JGLE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsT0FBK0IsRUFDL0IsWUFBcUIsRUFDckIsYUFBYSxHQUFHLEtBQUssRUFDckIsa0JBQWtCLEdBQUcsS0FBSyxFQUMxQixrQkFB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QUFLLFNBQVMsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDN0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3BlbkFJIGFuZCBDb2RleCBtb2RlbC1saXN0IHBheWxvYWRzIGRlcml2ZWQgZnJvbSB0aGUgbGl2ZSByZWdpc3RyeS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgQ0hBVF9DTEFTU19PUkRFUixcbiAgY29tcGFyZVZlcnNpb25UdXBsZXMsXG4gIGlzQ2hhdENsYXNzLFxuICBpc09wZW5XZWlnaHRzR3B0LFxuICBNb2RlbEZhbWlseSxcbiAgbW9kZWxGYW1pbHksXG4gIG1vZGVsRmFtaWx5UmFuayxcbiAgdmVyc2lvblR1cGxlLFxufSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgTW9kZWxDbGFzcywgUmVhc29uaW5nRWZmb3J0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgeyBTTUFSVF9ST1VURVJfTU9ERUxfSUQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuaW1wb3J0IHR5cGUge1xuICBDb2RleE1vZGVsLFxuICBDb2RleE1vZGVsTGlzdFJlc3BvbnNlLFxuICBNb2RlbENhcGFiaWxpdGllcyxcbiAgTW9kZWxMaXN0UmVzcG9uc2UsXG4gIE1vZGVsVGFyZ2V0LFxuICBPcGVuQUlNb2RlbCxcbiAgT3BlbkFJTW9kZWxMaXN0UmVzcG9uc2UsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbmNvbnN0IENPREVYX0JBU0VfSU5TVFJVQ1RJT05TID1cbiAgXCJZb3UgYXJlIGEgY29kaW5nIGFnZW50LiBGb2xsb3cgdGhlIHVzZXIncyBpbnN0cnVjdGlvbnMgYW5kIHVzZSB0aGUgYXZhaWxhYmxlIHRvb2xzIHRvIHdvcmsgaW4gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeS5cIjtcbmNvbnN0IENPREVYX1NNQVJUX1JPVVRFUl9QUklPUklUWSA9IDlfMDAwO1xuY29uc3QgQ09ERVhfTU9ERUxfUFJJT1JJVFlfQkFTRSA9IDEwXzAwMDtcbmNvbnN0IENPREVYX0ZBTUlMWV9PUkRFUiA9IFtcbiAgTW9kZWxGYW1pbHkuR3B0LFxuICAuLi5PYmplY3QudmFsdWVzKE1vZGVsRmFtaWx5KS5maWx0ZXIoKGZhbWlseSkgPT4gZmFtaWx5ICE9PSBNb2RlbEZhbWlseS5HcHQpLFxuXSBhcyBjb25zdDtcblxuY29uc3QgUkVBU09OSU5HX0RFU0NSSVBUSU9OUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPSB7XG4gIG5vbmU6IFwiRGlzYWJsZSBleHBsaWNpdCByZWFzb25pbmdcIixcbiAgbWluaW1hbDogXCJVc2UgdGhlIHNtYWxsZXN0IGF2YWlsYWJsZSByZWFzb25pbmcgYnVkZ2V0XCIsXG4gIGxvdzogXCJVc2UgYSBsb3cgcmVhc29uaW5nIGJ1ZGdldFwiLFxuICBtZWRpdW06IFwiVXNlIGEgbWVkaXVtIHJlYXNvbmluZyBidWRnZXRcIixcbiAgaGlnaDogXCJVc2UgYSBoaWdoIHJlYXNvbmluZyBidWRnZXRcIixcbiAgeGhpZ2g6IFwiVXNlIGFuIGV4dHJhLWhpZ2ggcmVhc29uaW5nIGJ1ZGdldFwiLFxuICBtYXg6IFwiVXNlIHRoZSBsYXJnZXN0IGF2YWlsYWJsZSByZWFzb25pbmcgYnVkZ2V0XCIsXG59O1xuXG4vKiogQnVpbGQgdGhlIGNvbWJpbmVkIE9wZW5BSSBhbmQgb3B0aW9uYWwgQ29kZXggbW9kZWwgY2F0YWxvZ3VlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RNb2RlbHNQYXlsb2FkKFxuICB0YXJnZXRzOiByZWFkb25seSBNb2RlbFRhcmdldFtdLFxuICBpbmNsdWRlQ29kZXg6IHRydWUsXG4gIHByZXNlcnZlT3JkZXI/OiBib29sZWFuLFxuICBwcmVmZXJTeXN0ZW1Nb2RlbHM/OiBib29sZWFuLFxuICBpbmNsdWRlU21hcnRSb3V0ZXI/OiBib29sZWFuLFxuKTogQ29kZXhNb2RlbExpc3RSZXNwb25zZTtcbmV4cG9ydCBmdW5jdGlvbiBsaXN0TW9kZWxzUGF5bG9hZChcbiAgdGFyZ2V0czogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSxcbiAgaW5jbHVkZUNvZGV4OiBmYWxzZSxcbiAgcHJlc2VydmVPcmRlcj86IGJvb2xlYW4sXG4gIHByZWZlclN5c3RlbU1vZGVscz86IGJvb2xlYW4sXG4gIGluY2x1ZGVTbWFydFJvdXRlcj86IGJvb2xlYW4sXG4pOiBPcGVuQUlNb2RlbExpc3RSZXNwb25zZTtcbmV4cG9ydCBmdW5jdGlvbiBsaXN0TW9kZWxzUGF5bG9hZChcbiAgdGFyZ2V0czogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSxcbiAgaW5jbHVkZUNvZGV4OiBib29sZWFuLFxuICBwcmVzZXJ2ZU9yZGVyPzogYm9vbGVhbixcbiAgcHJlZmVyU3lzdGVtTW9kZWxzPzogYm9vbGVhbixcbiAgaW5jbHVkZVNtYXJ0Um91dGVyPzogYm9vbGVhbixcbik6IE1vZGVsTGlzdFJlc3BvbnNlO1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RNb2RlbHNQYXlsb2FkKFxuICB0YXJnZXRzOiByZWFkb25seSBNb2RlbFRhcmdldFtdLFxuICBpbmNsdWRlQ29kZXg6IGJvb2xlYW4sXG4gIHByZXNlcnZlT3JkZXIgPSBmYWxzZSxcbiAgcHJlZmVyU3lzdGVtTW9kZWxzID0gZmFsc2UsXG4gIGluY2x1ZGVTbWFydFJvdXRlciA9IGZhbHNlLFxuKTogTW9kZWxMaXN0UmVzcG9uc2Uge1xuICBjb25zdCBhdmFpbGFibGUgPSB0YXJnZXRzXG4gICAgLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuZW5kcG9pbnQ/LnN0YXR1cz8uZGVwcmVjYXRlZCAhPT0gdHJ1ZSlcbiAgICAuZmlsdGVyKCh0YXJnZXQpID0+ICFpbmNsdWRlQ29kZXggfHwgaGFzQ2hhdENsYXNzKHRhcmdldCkpO1xuICBpZiAoIXByZXNlcnZlT3JkZXIpIHtcbiAgICBhdmFpbGFibGUuc29ydChcbiAgICAgIGluY2x1ZGVDb2RleFxuICAgICAgICA/IGNvbXBhcmVDb2RleENhdGFsb2d1ZVRhcmdldHNcbiAgICAgICAgOiAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVDYXRhbG9ndWVUYXJnZXRzKGxlZnQsIHJpZ2h0LCAodGFyZ2V0KSA9PiB0YXJnZXQuZGlzcGxheU5hbWUpLFxuICAgICk7XG4gIH1cbiAgY29uc3Qgc21hcnRSb3V0ZXJDYW5kaWRhdGVzID0gYXZhaWxhYmxlLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuY2FwYWJpbGl0aWVzLmNoYXQpO1xuICBpZiAoaW5jbHVkZVNtYXJ0Um91dGVyICYmIHNtYXJ0Um91dGVyQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgYXZhaWxhYmxlLnVuc2hpZnQoc21hcnRSb3V0ZXJNb2RlbFRhcmdldChzbWFydFJvdXRlckNhbmRpZGF0ZXMpKTtcbiAgfVxuICBpZiAoaW5jbHVkZUNvZGV4KSB7XG4gICAgbGV0IG1vZGVsSW5kZXggPSAwO1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlbHM6IGF2YWlsYWJsZS5tYXAoKHRhcmdldCkgPT5cbiAgICAgICAgY29kZXhNb2RlbChcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgdGFyZ2V0LmlkID09PSBTTUFSVF9ST1VURVJfTU9ERUxfSURcbiAgICAgICAgICAgID8gQ09ERVhfU01BUlRfUk9VVEVSX1BSSU9SSVRZXG4gICAgICAgICAgICA6IENPREVYX01PREVMX1BSSU9SSVRZX0JBU0UgKyBtb2RlbEluZGV4KyssXG4gICAgICAgICAgcHJlZmVyU3lzdGVtTW9kZWxzLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgb2JqZWN0OiBcImxpc3RcIixcbiAgICBkYXRhOiBhdmFpbGFibGUubWFwKG9wZW5BaU1vZGVsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gb3BlbkFpTW9kZWwodGFyZ2V0OiBNb2RlbFRhcmdldCk6IE9wZW5BSU1vZGVsIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogdGFyZ2V0LmlkLFxuICAgIG9iamVjdDogXCJtb2RlbFwiLFxuICAgIGNyZWF0ZWQ6IDAsXG4gICAgb3duZWRfYnk6IFwiZGF0YWJyaWNrc1wiLFxuICAgIG5hbWU6IHRhcmdldC5kaXNwbGF5TmFtZSxcbiAgICB0YXNrOiB0YXJnZXQuZW5kcG9pbnQ/LnRhc2ssXG4gICAgc3RhdHVzOiB0YXJnZXQuZW5kcG9pbnQ/LnN0YXR1cyA/PyB7IGRlcHJlY2F0ZWQ6IGZhbHNlIH0sXG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICBzbWFydF9yb3V0ZXI6IHRhcmdldC5pZCA9PT0gU01BUlRfUk9VVEVSX01PREVMX0lELFxuICAgICAgdG9vbHM6IHRhcmdldC5jYXBhYmlsaXRpZXMudG9vbHMsXG4gICAgICByZWFzb25pbmc6IHRhcmdldC5yZWFzb25pbmdFZmZvcnRzLFxuICAgICAgcmVzcG9uc2VzOiB0YXJnZXQuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcyxcbiAgICAgIG9wZW5fcmVzcG9uc2VzOiB0YXJnZXQuY2FwYWJpbGl0aWVzLm9wZW5SZXNwb25zZXMsXG4gICAgICBhbnRocm9waWM6IHRhcmdldC5jYXBhYmlsaXRpZXMuYW50aHJvcGljLFxuICAgICAgZW1iZWRkaW5nczogdGFyZ2V0LmNhcGFiaWxpdGllcy5lbWJlZGRpbmdzLFxuICAgICAgYWlfZ2F0ZXdheV9jb2RleDogdGFyZ2V0LmNhcGFiaWxpdGllcy5haUdhdGV3YXlDb2RleCxcbiAgICAgIHN0cmVhbWluZzogdGFyZ2V0LmNhcGFiaWxpdGllcy5zdHJlYW1pbmcsXG4gICAgICB3ZWJfc2VhcmNoOiB0YXJnZXQuY2FwYWJpbGl0aWVzLndlYlNlYXJjaCxcbiAgICAgIGltYWdlX2lucHV0OiB0YXJnZXQuY2FwYWJpbGl0aWVzLmltYWdlSW5wdXQsXG4gICAgICBhcHBseV9wYXRjaDogdGFyZ2V0LmNhcGFiaWxpdGllcy5hcHBseVBhdGNoLFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNtYXJ0Um91dGVyTW9kZWxUYXJnZXQoY2FuZGlkYXRlczogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSk6IE1vZGVsVGFyZ2V0IHtcbiAgY29uc3QgaGFzID0gKGNhcGFiaWxpdHk6IGtleW9mIE1vZGVsQ2FwYWJpbGl0aWVzKSA9PlxuICAgIGNhbmRpZGF0ZXMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuY2FwYWJpbGl0aWVzW2NhcGFiaWxpdHldKTtcbiAgY29uc3QgcmVhc29uaW5nRWZmb3J0cyA9IE9iamVjdC52YWx1ZXMoUmVhc29uaW5nRWZmb3J0KS5maWx0ZXIoKGVmZm9ydCkgPT5cbiAgICBjYW5kaWRhdGVzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LnJlYXNvbmluZ0VmZm9ydHMuaW5jbHVkZXMoZWZmb3J0KSksXG4gICk7XG4gIHJldHVybiB7XG4gICAgaWQ6IFNNQVJUX1JPVVRFUl9NT0RFTF9JRCxcbiAgICBhbGlhc2VzOiBbU01BUlRfUk9VVEVSX01PREVMX0lEXSxcbiAgICBkaXNwbGF5TmFtZTogXCJTbWFydCBSb3V0ZXJcIixcbiAgICBlbmRwb2ludDoge1xuICAgICAgbmFtZTogU01BUlRfUk9VVEVSX01PREVMX0lELFxuICAgICAgZGlzcGxheU5hbWU6IFwiU21hcnQgUm91dGVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJVc2VzIERhdGFicmlja3MgdGFza192MyBTbWFydCBSb3V0ZXIgdG8gc2VsZWN0IGEgY29tcGF0aWJsZSBzeXN0ZW0gbW9kZWwgZm9yIGVhY2ggdHVybi5cIixcbiAgICAgIHRhc2s6IFwibGxtL3YxL2NoYXRcIixcbiAgICAgIGNsYXNzOiBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCxcbiAgICAgIHN0YXR1czogeyBkZXByZWNhdGVkOiBmYWxzZSB9LFxuICAgIH0sXG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICByZXNwb25zZXM6IHRydWUsXG4gICAgICBvcGVuUmVzcG9uc2VzOiB0cnVlLFxuICAgICAgY2hhdDogdHJ1ZSxcbiAgICAgIGFudGhyb3BpYzogdHJ1ZSxcbiAgICAgIGVtYmVkZGluZ3M6IGZhbHNlLFxuICAgICAgYWlHYXRld2F5Q29kZXg6IHRydWUsXG4gICAgICB0b29sczogaGFzKFwidG9vbHNcIiksXG4gICAgICByZWFzb25pbmc6IHJlYXNvbmluZ0VmZm9ydHMubGVuZ3RoID4gMCxcbiAgICAgIHN0cmVhbWluZzogdHJ1ZSxcbiAgICAgIHBhcmFsbGVsVG9vbHM6IGhhcyhcInBhcmFsbGVsVG9vbHNcIiksXG4gICAgICBjdXN0b21Ub29sczogaGFzKFwiY3VzdG9tVG9vbHNcIiksXG4gICAgICBzdHJ1Y3R1cmVkT3V0cHV0OiBoYXMoXCJzdHJ1Y3R1cmVkT3V0cHV0XCIpLFxuICAgICAgd2ViU2VhcmNoOiBoYXMoXCJ3ZWJTZWFyY2hcIiksXG4gICAgICBpbWFnZUlucHV0OiBoYXMoXCJpbWFnZUlucHV0XCIpLFxuICAgICAgYXBwbHlQYXRjaDogaGFzKFwiYXBwbHlQYXRjaFwiKSxcbiAgICB9LFxuICAgIHJlYXNvbmluZ0VmZm9ydHMsXG4gIH07XG59XG5cbi8qKiBDb2RleCBgL3YxL21vZGVsc2Agc2x1ZzogdGhlIGBzeXN0ZW0uYWkuKmAgc2VydmljZSB3aGVuIHByZWZlcnJlZCwgZWxzZSB0aGUgZW5kcG9pbnQgaWQuICovXG5leHBvcnQgZnVuY3Rpb24gY29kZXhNb2RlbFNsdWcodGFyZ2V0OiBNb2RlbFRhcmdldCwgcHJlZmVyU3lzdGVtTW9kZWxzOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgbW9kZWwgPVxuICAgIHByZWZlclN5c3RlbU1vZGVscyAmJiB0YXJnZXQuY2FwYWJpbGl0aWVzLmFpR2F0ZXdheUNvZGV4ICYmIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lXG4gICAgICA/IHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lXG4gICAgICA6IHRhcmdldC5pZDtcbiAgcmV0dXJuIGBkYXRhYnJpY2tzLyR7bW9kZWx9YDtcbn1cblxuZnVuY3Rpb24gY29kZXhNb2RlbChcbiAgdGFyZ2V0OiBNb2RlbFRhcmdldCxcbiAgcHJpb3JpdHk6IG51bWJlcixcbiAgcHJlZmVyU3lzdGVtTW9kZWxzOiBib29sZWFuLFxuKTogQ29kZXhNb2RlbCB7XG4gIGNvbnN0IGVmZm9ydHMgPSB0YXJnZXQucmVhc29uaW5nRWZmb3J0cztcbiAgcmV0dXJuIHtcbiAgICBzbHVnOiBjb2RleE1vZGVsU2x1Zyh0YXJnZXQsIHByZWZlclN5c3RlbU1vZGVscyksXG4gICAgZGlzcGxheV9uYW1lOiBjb2RleERpc3BsYXlOYW1lKHRhcmdldCksXG4gICAgZGVzY3JpcHRpb246IHRhcmdldC5lbmRwb2ludD8uZGVzY3JpcHRpb24gPz8gXCJEYXRhYnJpY2tzIG1vZGVsIHNlcnZpY2VcIixcbiAgICBiYXNlX2luc3RydWN0aW9uczogQ09ERVhfQkFTRV9JTlNUUlVDVElPTlMsXG4gICAgc3RhdHVzOiB0YXJnZXQuZW5kcG9pbnQ/LnN0YXR1cyA/PyB7IGRlcHJlY2F0ZWQ6IGZhbHNlIH0sXG4gICAgc3VwcG9ydGVkX3JlYXNvbmluZ19sZXZlbHM6IGVmZm9ydHMubWFwKChlZmZvcnQpID0+ICh7XG4gICAgICBlZmZvcnQsXG4gICAgICBkZXNjcmlwdGlvbjogUkVBU09OSU5HX0RFU0NSSVBUSU9OU1tlZmZvcnRdID8/IGBVc2UgdGhlICR7ZWZmb3J0fSByZWFzb25pbmcgYnVkZ2V0YCxcbiAgICB9KSksXG4gICAgLi4uKGVmZm9ydHMubGVuZ3RoID4gMFxuICAgICAgPyB7IGRlZmF1bHRfcmVhc29uaW5nX2xldmVsOiBlZmZvcnRzLmluY2x1ZGVzKFwibWVkaXVtXCIpID8gXCJtZWRpdW1cIiA6IGVmZm9ydHNbMF0gfVxuICAgICAgOiB7fSksXG4gICAgc2hlbGxfdHlwZTogXCJ1bmlmaWVkX2V4ZWNcIixcbiAgICB2aXNpYmlsaXR5OiBcImxpc3RcIixcbiAgICBzdXBwb3J0ZWRfaW5fYXBpOiB0cnVlLFxuICAgIHByaW9yaXR5LFxuICAgIGF2YWlsYWJpbGl0eV9udXg6IG51bGwsXG4gICAgdXBncmFkZTogbnVsbCxcbiAgICBzdXBwb3J0X3ZlcmJvc2l0eTogZmFsc2UsXG4gICAgZGVmYXVsdF92ZXJib3NpdHk6IG51bGwsXG4gICAgYXBwbHlfcGF0Y2hfdG9vbF90eXBlOiB0YXJnZXQuY2FwYWJpbGl0aWVzLmN1c3RvbVRvb2xzID8gXCJmcmVlZm9ybVwiIDogbnVsbCxcbiAgICB0cnVuY2F0aW9uX3BvbGljeTogeyBtb2RlOiBcInRva2Vuc1wiLCBsaW1pdDogMTI4XzAwMCB9LFxuICAgIGNvbnRleHRfd2luZG93OiBudWxsLFxuICAgIGV4cGVyaW1lbnRhbF9zdXBwb3J0ZWRfdG9vbHM6IFtdLFxuICAgIGlucHV0X21vZGFsaXRpZXM6IFtcInRleHRcIl0sXG4gICAgd2ViX3NlYXJjaF90b29sX3R5cGU6IFwidGV4dFwiLFxuICAgIHN1cHBvcnRzX3NlYXJjaF90b29sOiB0YXJnZXQuY2FwYWJpbGl0aWVzLndlYlNlYXJjaCxcbiAgICBzdXBwb3J0c19pbWFnZV9kZXRhaWxfb3JpZ2luYWw6IGZhbHNlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb2RleERpc3BsYXlOYW1lKHRhcmdldDogTW9kZWxUYXJnZXQpOiBzdHJpbmcge1xuICBpZiAoY2F0YWxvZ3VlRmFtaWx5KHRhcmdldCkgIT09IE1vZGVsRmFtaWx5LkdwdCkgcmV0dXJuIHRhcmdldC5kaXNwbGF5TmFtZTtcbiAgY29uc3QgZGlzcGxheU5hbWUgPSB0YXJnZXQuZGlzcGxheU5hbWUucmVwbGFjZSgvXmdwdCg/PVtcXHMuXy1dKS9pLCBcIkdQVFwiKTtcbiAgcmV0dXJuIGBEYXRhYnJpY2tzICR7ZGlzcGxheU5hbWV9YDtcbn1cblxuZnVuY3Rpb24gY29tcGFyZUNvZGV4Q2F0YWxvZ3VlVGFyZ2V0cyhsZWZ0OiBNb2RlbFRhcmdldCwgcmlnaHQ6IE1vZGVsVGFyZ2V0KTogbnVtYmVyIHtcbiAgY29uc3QgZmFtaWx5T3JkZXIgPSBjb2RleEZhbWlseVJhbmsobGVmdCkgLSBjb2RleEZhbWlseVJhbmsocmlnaHQpO1xuICBpZiAoZmFtaWx5T3JkZXIgIT09IDApIHJldHVybiBmYW1pbHlPcmRlcjtcbiAgY29uc3QgbW9kZWxLaW5kT3JkZXIgPSBjb2RleE1vZGVsS2luZFJhbmsobGVmdCkgLSBjb2RleE1vZGVsS2luZFJhbmsocmlnaHQpO1xuICBpZiAobW9kZWxLaW5kT3JkZXIgIT09IDApIHJldHVybiBtb2RlbEtpbmRPcmRlcjtcbiAgY29uc3QgdmVyc2lvbk9yZGVyID0gY29tcGFyZVZlcnNpb25UdXBsZXMoY29kZXhWZXJzaW9uKHJpZ2h0KSwgY29kZXhWZXJzaW9uKGxlZnQpKTtcbiAgaWYgKHZlcnNpb25PcmRlciAhPT0gMCkgcmV0dXJuIHZlcnNpb25PcmRlcjtcbiAgY29uc3QgY2xhc3NPcmRlciA9IGNvZGV4Q2xhc3NSYW5rKGxlZnQpIC0gY29kZXhDbGFzc1JhbmsocmlnaHQpO1xuICBpZiAoY2xhc3NPcmRlciAhPT0gMCkgcmV0dXJuIGNsYXNzT3JkZXI7XG4gIHJldHVybiBjb21wYXJlQ2F0YWxvZ3VlTGFiZWwobGVmdC5kaXNwbGF5TmFtZSwgcmlnaHQuZGlzcGxheU5hbWUpO1xufVxuXG5mdW5jdGlvbiBjb2RleE1vZGVsS2luZFJhbmsodGFyZ2V0OiBNb2RlbFRhcmdldCk6IG51bWJlciB7XG4gIHJldHVybiBbdGFyZ2V0LmRpc3BsYXlOYW1lLCB0YXJnZXQuaWQsIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lXS5zb21lKFxuICAgIChpZGVudGl0eSkgPT4gaWRlbnRpdHkgJiYgaXNPcGVuV2VpZ2h0c0dwdChpZGVudGl0eSksXG4gIClcbiAgICA/IDFcbiAgICA6IDA7XG59XG5cbmZ1bmN0aW9uIGNvZGV4RmFtaWx5UmFuayh0YXJnZXQ6IE1vZGVsVGFyZ2V0KTogbnVtYmVyIHtcbiAgY29uc3QgZmFtaWx5ID0gY2F0YWxvZ3VlRmFtaWx5KHRhcmdldCk7XG4gIGNvbnN0IGluZGV4ID0gZmFtaWx5ID8gQ09ERVhfRkFNSUxZX09SREVSLmluZGV4T2YoZmFtaWx5IGFzIE1vZGVsRmFtaWx5KSA6IC0xO1xuICByZXR1cm4gaW5kZXggPj0gMCA/IGluZGV4IDogQ09ERVhfRkFNSUxZX09SREVSLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gY29kZXhWZXJzaW9uKHRhcmdldDogTW9kZWxUYXJnZXQpOiByZWFkb25seSBudW1iZXJbXSB7XG4gIHJldHVybiB2ZXJzaW9uVHVwbGUodGFyZ2V0LmRpc3BsYXlOYW1lKTtcbn1cblxuZnVuY3Rpb24gY29kZXhDbGFzc1JhbmsodGFyZ2V0OiBNb2RlbFRhcmdldCk6IG51bWJlciB7XG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSB0YXJnZXQuZW5kcG9pbnQ/LmNsYXNzO1xuICBjb25zdCBpbmRleCA9IG1vZGVsQ2xhc3MgPyBDSEFUX0NMQVNTX09SREVSLmluZGV4T2YobW9kZWxDbGFzcykgOiAtMTtcbiAgcmV0dXJuIGluZGV4ID49IDAgPyBpbmRleCA6IENIQVRfQ0xBU1NfT1JERVIubGVuZ3RoO1xufVxuXG4vKipcbiAqIE9yZGVyIGxpc3RlZCBtb2RlbHMgaW4gdGhyZWUgZ3JvdXBzOiBtYWpvci1wcm92aWRlciBjaGF0IGZhbWlsaWVzLCB0aGVcbiAqIHJlbWFpbmluZyBjaGF0IG1vZGVscywgdGhlbiBlbWJlZGRpbmdzLiBGYW1pbGllcyBrZWVwIGEgZml4ZWQgcHJvdmlkZXJcbiAqIG9yZGVyOyBlYWNoIGZhbWlseSBhbmQgdGhlIGxhdGVyIGdyb3VwcyBzb3J0IGJ5IHRoZSBwdWJsaXNoZWQgbGFiZWxcbiAqIChgZGlzcGxheV9uYW1lYCBmb3IgQ29kZXgsIGBuYW1lYCBvdGhlcndpc2UpLiBOdW1lcmljIHNlZ21lbnRzIHNvcnRcbiAqIG5hdHVyYWxseSBzbyBcIlZlbyAzLjFcIiBwcmVjZWRlcyBcIlZlbyAzLjEwXCIuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVDYXRhbG9ndWVUYXJnZXRzKFxuICBsZWZ0OiBNb2RlbFRhcmdldCxcbiAgcmlnaHQ6IE1vZGVsVGFyZ2V0LFxuICBsYWJlbDogKHRhcmdldDogTW9kZWxUYXJnZXQpID0+IHN0cmluZyxcbik6IG51bWJlciB7XG4gIGNvbnN0IGdyb3VwID0gY2F0YWxvZ3VlR3JvdXAobGVmdCkgLSBjYXRhbG9ndWVHcm91cChyaWdodCk7XG4gIGlmIChncm91cCAhPT0gMCkgcmV0dXJuIGdyb3VwO1xuICBjb25zdCBsZWZ0RmFtaWx5ID0gY2F0YWxvZ3VlRmFtaWx5KGxlZnQpO1xuICBjb25zdCByaWdodEZhbWlseSA9IGNhdGFsb2d1ZUZhbWlseShyaWdodCk7XG4gIGlmIChsZWZ0RmFtaWx5ICYmIHJpZ2h0RmFtaWx5KSB7XG4gICAgY29uc3QgZmFtaWx5T3JkZXIgPSBtb2RlbEZhbWlseVJhbmsobGVmdEZhbWlseSkgLSBtb2RlbEZhbWlseVJhbmsocmlnaHRGYW1pbHkpO1xuICAgIGlmIChmYW1pbHlPcmRlciAhPT0gMCkgcmV0dXJuIGZhbWlseU9yZGVyO1xuICB9XG4gIHJldHVybiBjb21wYXJlQ2F0YWxvZ3VlTGFiZWwobGFiZWwobGVmdCksIGxhYmVsKHJpZ2h0KSk7XG59XG5cbmZ1bmN0aW9uIGNhdGFsb2d1ZUdyb3VwKHRhcmdldDogTW9kZWxUYXJnZXQpOiBudW1iZXIge1xuICBpZiAoaXNFbWJlZGRpbmdUYXJnZXQodGFyZ2V0KSkgcmV0dXJuIDI7XG4gIHJldHVybiBjYXRhbG9ndWVGYW1pbHkodGFyZ2V0KSA/IDAgOiAxO1xufVxuXG5jb25zdCBJREVOVElUWV9QUkVGSVhFUyA9IG5ldyBTZXQoW1xuICBcImRhdGFicmlja3NcIixcbiAgXCJzeXN0ZW1cIixcbiAgXCJhaVwiLFxuICBcIm1ldGFcIixcbiAgXCJnb29nbGVcIixcbiAgXCJvcGVuYWlcIixcbiAgXCJhbnRocm9waWNcIixcbl0pO1xuXG5mdW5jdGlvbiBjYXRhbG9ndWVGYW1pbHkodGFyZ2V0OiBNb2RlbFRhcmdldCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0VtYmVkZGluZ1RhcmdldCh0YXJnZXQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIFt0YXJnZXQuZGlzcGxheU5hbWUsIHRhcmdldC5pZCwgdGFyZ2V0LmVuZHBvaW50Py5uYW1lXSkge1xuICAgIGlmICghaWRlbnRpdHkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGZhbWlseSA9IGNhdGFsb2d1ZUZhbWlseUZyb21JZGVudGl0eShpZGVudGl0eSk7XG4gICAgaWYgKGZhbWlseSkgcmV0dXJuIGZhbWlseTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVGYW1pbHlGcm9tSWRlbnRpdHkoaWRlbnRpdHk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRva2VucyA9IGlkZW50aXR5LnRvTG93ZXJDYXNlKCkubWF0Y2goL1thLXowLTldKy9nKSA/PyBbXTtcbiAgY29uc3Qgc3RhcnQgPSB0b2tlbnMuZmluZCgodG9rZW4pID0+ICFJREVOVElUWV9QUkVGSVhFUy5oYXModG9rZW4pKTtcbiAgaWYgKCFzdGFydCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHN0YXJ0ID09PSBcInZlb1wiKSByZXR1cm4gXCJnZW1pbmlcIjtcbiAgY29uc3QgZmFtaWx5ID0gbW9kZWxGYW1pbHkoaWRlbnRpdHkpO1xuICByZXR1cm4gZmFtaWx5ICYmIHN0YXJ0ID09PSBmYW1pbHkgPyBmYW1pbHkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzRW1iZWRkaW5nVGFyZ2V0KHRhcmdldDogTW9kZWxUYXJnZXQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRhcmdldC5jYXBhYmlsaXRpZXMuZW1iZWRkaW5ncyA9PT0gdHJ1ZSB8fCB0YXJnZXQuZW5kcG9pbnQ/LnRhc2sgPT09IFwibGxtL3YxL2VtYmVkZGluZ3NcIjtcbn1cblxuZnVuY3Rpb24gY29tcGFyZUNhdGFsb2d1ZUxhYmVsKGxlZnQ6IHN0cmluZywgcmlnaHQ6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBsZWZ0LmxvY2FsZUNvbXBhcmUocmlnaHQsIHVuZGVmaW5lZCwgeyBudW1lcmljOiB0cnVlLCBzZW5zaXRpdml0eTogXCJiYXNlXCIgfSk7XG59XG5cbmZ1bmN0aW9uIGhhc0NoYXRDbGFzcyh0YXJnZXQ6IE1vZGVsVGFyZ2V0KTogYm9vbGVhbiB7XG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSB0YXJnZXQuZW5kcG9pbnQ/LmNsYXNzO1xuICByZXR1cm4gbW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkICYmIGlzQ2hhdENsYXNzKG1vZGVsQ2xhc3MpO1xufVxuIl19
|
|
303
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsV0FBVyxFQUNYLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsWUFBWSxHQUNiLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQVc1RixNQUFNLHVCQUF1QixHQUMzQix1SEFBdUgsQ0FBQztBQUMxSCxNQUFNLDJCQUEyQixHQUFHLEtBQUssQ0FBQztBQUMxQyxNQUFNLHdCQUF3QixHQUFHLEtBQUssQ0FBQztBQUN2QyxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQztBQUN6QyxNQUFNLGtCQUFrQixHQUFHO0lBQ3pCLFdBQVcsQ0FBQyxHQUFHO0lBQ2YsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxLQUFLLFdBQVcsQ0FBQyxHQUFHLENBQUM7Q0FDcEUsQ0FBQztBQUVYLE1BQU0sc0JBQXNCLEdBQXFDO0lBQy9ELElBQUksRUFBRSw0QkFBNEI7SUFDbEMsT0FBTyxFQUFFLDZDQUE2QztJQUN0RCxHQUFHLEVBQUUsNEJBQTRCO0lBQ2pDLE1BQU0sRUFBRSwrQkFBK0I7SUFDdkMsSUFBSSxFQUFFLDZCQUE2QjtJQUNuQyxLQUFLLEVBQUUsb0NBQW9DO0lBQzNDLEdBQUcsRUFBRSw0Q0FBNEM7Q0FDbEQsQ0FBQztBQThCRixNQUFNLFVBQVUsaUJBQWlCLENBQy9CLE9BQStCLEVBQy9CLFlB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dEYsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLE1BQW1CO0lBQ3ZDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDO0lBQzFDLE9BQU8sVUFBVSxLQUFLLFNBQVMsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDN0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3BlbkFJIGFuZCBDb2RleCBtb2RlbC1saXN0IHBheWxvYWRzIGRlcml2ZWQgZnJvbSB0aGUgbGl2ZSByZWdpc3RyeS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgQ0hBVF9DTEFTU19PUkRFUixcbiAgY29tcGFyZVZlcnNpb25UdXBsZXMsXG4gIGlzQ2hhdENsYXNzLFxuICBpc09wZW5XZWlnaHRzR3B0LFxuICBNb2RlbEZhbWlseSxcbiAgbW9kZWxGYW1pbHksXG4gIG1vZGVsRmFtaWx5UmFuayxcbiAgbW9kZWxNZXRhZGF0YUZvcixcbiAgdmVyc2lvblR1cGxlLFxufSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgTW9kZWxDbGFzcywgUmVhc29uaW5nRWZmb3J0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgeyBBSV9ERUNJREVfTU9ERUxfSUQsIFNNQVJUX1JPVVRFUl9NT0RFTF9JRCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvZGV4TW9kZWwsXG4gIENvZGV4TW9kZWxMaXN0UmVzcG9uc2UsXG4gIE1vZGVsQ2FwYWJpbGl0aWVzLFxuICBNb2RlbExpc3RSZXNwb25zZSxcbiAgTW9kZWxUYXJnZXQsXG4gIE9wZW5BSU1vZGVsLFxuICBPcGVuQUlNb2RlbExpc3RSZXNwb25zZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcblxuY29uc3QgQ09ERVhfQkFTRV9JTlNUUlVDVElPTlMgPVxuICBcIllvdSBhcmUgYSBjb2RpbmcgYWdlbnQuIEZvbGxvdyB0aGUgdXNlcidzIGluc3RydWN0aW9ucyBhbmQgdXNlIHRoZSBhdmFpbGFibGUgdG9vbHMgdG8gd29yayBpbiB0aGUgY3VycmVudCByZXBvc2l0b3J5LlwiO1xuY29uc3QgQ09ERVhfU01BUlRfUk9VVEVSX1BSSU9SSVRZID0gOV8wMDA7XG5jb25zdCBDT0RFWF9BSV9ERUNJREVfUFJJT1JJVFkgPSA5XzAwMTtcbmNvbnN0IENPREVYX01PREVMX1BSSU9SSVRZX0JBU0UgPSAxMF8wMDA7XG5jb25zdCBDT0RFWF9GQU1JTFlfT1JERVIgPSBbXG4gIE1vZGVsRmFtaWx5LkdwdCxcbiAgLi4uT2JqZWN0LnZhbHVlcyhNb2RlbEZhbWlseSkuZmlsdGVyKChmYW1pbHkpID0+IGZhbWlseSAhPT0gTW9kZWxGYW1pbHkuR3B0KSxcbl0gYXMgY29uc3Q7XG5cbmNvbnN0IFJFQVNPTklOR19ERVNDUklQVElPTlM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0ge1xuICBub25lOiBcIkRpc2FibGUgZXhwbGljaXQgcmVhc29uaW5nXCIsXG4gIG1pbmltYWw6IFwiVXNlIHRoZSBzbWFsbGVzdCBhdmFpbGFibGUgcmVhc29uaW5nIGJ1ZGdldFwiLFxuICBsb3c6IFwiVXNlIGEgbG93IHJlYXNvbmluZyBidWRnZXRcIixcbiAgbWVkaXVtOiBcIlVzZSBhIG1lZGl1bSByZWFzb25pbmcgYnVkZ2V0XCIsXG4gIGhpZ2g6IFwiVXNlIGEgaGlnaCByZWFzb25pbmcgYnVkZ2V0XCIsXG4gIHhoaWdoOiBcIlVzZSBhbiBleHRyYS1oaWdoIHJlYXNvbmluZyBidWRnZXRcIixcbiAgbWF4OiBcIlVzZSB0aGUgbGFyZ2VzdCBhdmFpbGFibGUgcmVhc29uaW5nIGJ1ZGdldFwiLFxufTtcblxuLyoqIEJ1aWxkIHRoZSBjb21iaW5lZCBPcGVuQUkgYW5kIG9wdGlvbmFsIENvZGV4IG1vZGVsIGNhdGFsb2d1ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0TW9kZWxzUGF5bG9hZChcbiAgdGFyZ2V0czogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSxcbiAgaW5jbHVkZUNvZGV4OiB0cnVlLFxuICBwcmVzZXJ2ZU9yZGVyPzogYm9vbGVhbixcbiAgcHJlZmVyU3lzdGVtTW9kZWxzPzogYm9vbGVhbixcbiAgaW5jbHVkZVNtYXJ0Um91dGVyPzogYm9vbGVhbixcbiAgaW5jbHVkZUFpRGVjaWRlPzogYm9vbGVhbixcbiAgaW5jbHVkZU1ldGFkYXRhPzogYm9vbGVhbixcbik6IENvZGV4TW9kZWxMaXN0UmVzcG9uc2U7XG5leHBvcnQgZnVuY3Rpb24gbGlzdE1vZGVsc1BheWxvYWQoXG4gIHRhcmdldHM6IHJlYWRvbmx5IE1vZGVsVGFyZ2V0W10sXG4gIGluY2x1ZGVDb2RleDogZmFsc2UsXG4gIHByZXNlcnZlT3JkZXI/OiBib29sZWFuLFxuICBwcmVmZXJTeXN0ZW1Nb2RlbHM/OiBib29sZWFuLFxuICBpbmNsdWRlU21hcnRSb3V0ZXI/OiBib29sZWFuLFxuICBpbmNsdWRlQWlEZWNpZGU/OiBib29sZWFuLFxuICBpbmNsdWRlTWV0YWRhdGE/OiBib29sZWFuLFxuKTogT3BlbkFJTW9kZWxMaXN0UmVzcG9uc2U7XG5leHBvcnQgZnVuY3Rpb24gbGlzdE1vZGVsc1BheWxvYWQoXG4gIHRhcmdldHM6IHJlYWRvbmx5IE1vZGVsVGFyZ2V0W10sXG4gIGluY2x1ZGVDb2RleDogYm9vbGVhbixcbiAgcHJlc2VydmVPcmRlcj86IGJvb2xlYW4sXG4gIHByZWZlclN5c3RlbU1vZGVscz86IGJvb2xlYW4sXG4gIGluY2x1ZGVTbWFydFJvdXRlcj86IGJvb2xlYW4sXG4gIGluY2x1ZGVBaURlY2lkZT86IGJvb2xlYW4sXG4gIGluY2x1ZGVNZXRhZGF0YT86IGJvb2xlYW4sXG4pOiBNb2RlbExpc3RSZXNwb25zZTtcbmV4cG9ydCBmdW5jdGlvbiBsaXN0TW9kZWxzUGF5bG9hZChcbiAgdGFyZ2V0czogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSxcbiAgaW5jbHVkZUNvZGV4OiBib29sZWFuLFxuICBwcmVzZXJ2ZU9yZGVyID0gZmFsc2UsXG4gIHByZWZlclN5c3RlbU1vZGVscyA9IGZhbHNlLFxuICBpbmNsdWRlU21hcnRSb3V0ZXIgPSBmYWxzZSxcbiAgaW5jbHVkZUFpRGVjaWRlID0gZmFsc2UsXG4gIGluY2x1ZGVNZXRhZGF0YSA9IGZhbHNlLFxuKTogTW9kZWxMaXN0UmVzcG9uc2Uge1xuICBjb25zdCBhdmFpbGFibGUgPSB0YXJnZXRzXG4gICAgLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuZW5kcG9pbnQ/LnN0YXR1cz8uZGVwcmVjYXRlZCAhPT0gdHJ1ZSlcbiAgICAuZmlsdGVyKCh0YXJnZXQpID0+ICFpbmNsdWRlQ29kZXggfHwgaGFzQ2hhdENsYXNzKHRhcmdldCkpO1xuICBpZiAoIXByZXNlcnZlT3JkZXIpIHtcbiAgICBhdmFpbGFibGUuc29ydChcbiAgICAgIGluY2x1ZGVDb2RleFxuICAgICAgICA/IGNvbXBhcmVDb2RleENhdGFsb2d1ZVRhcmdldHNcbiAgICAgICAgOiAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVDYXRhbG9ndWVUYXJnZXRzKGxlZnQsIHJpZ2h0LCAodGFyZ2V0KSA9PiB0YXJnZXQuZGlzcGxheU5hbWUpLFxuICAgICk7XG4gIH1cbiAgY29uc3Qgc21hcnRSb3V0ZXJDYW5kaWRhdGVzID0gYXZhaWxhYmxlLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuY2FwYWJpbGl0aWVzLmNoYXQpO1xuICBpZiAoaW5jbHVkZUFpRGVjaWRlICYmIHNtYXJ0Um91dGVyQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgYXZhaWxhYmxlLnVuc2hpZnQoYWlEZWNpZGVNb2RlbFRhcmdldChzbWFydFJvdXRlckNhbmRpZGF0ZXMpKTtcbiAgfVxuICBpZiAoaW5jbHVkZVNtYXJ0Um91dGVyICYmIHNtYXJ0Um91dGVyQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgYXZhaWxhYmxlLnVuc2hpZnQoc21hcnRSb3V0ZXJNb2RlbFRhcmdldChzbWFydFJvdXRlckNhbmRpZGF0ZXMpKTtcbiAgfVxuICBpZiAoaW5jbHVkZUNvZGV4KSB7XG4gICAgbGV0IG1vZGVsSW5kZXggPSAwO1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlbHM6IGF2YWlsYWJsZS5tYXAoKHRhcmdldCkgPT5cbiAgICAgICAgY29kZXhNb2RlbChcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgdGFyZ2V0LmlkID09PSBTTUFSVF9ST1VURVJfTU9ERUxfSURcbiAgICAgICAgICAgID8gQ09ERVhfU01BUlRfUk9VVEVSX1BSSU9SSVRZXG4gICAgICAgICAgICA6IHRhcmdldC5pZCA9PT0gQUlfREVDSURFX01PREVMX0lEXG4gICAgICAgICAgICAgID8gQ09ERVhfQUlfREVDSURFX1BSSU9SSVRZXG4gICAgICAgICAgICAgIDogQ09ERVhfTU9ERUxfUFJJT1JJVFlfQkFTRSArIG1vZGVsSW5kZXgrKyxcbiAgICAgICAgICBwcmVmZXJTeXN0ZW1Nb2RlbHMsXG4gICAgICAgICAgaW5jbHVkZU1ldGFkYXRhLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgb2JqZWN0OiBcImxpc3RcIixcbiAgICBkYXRhOiBhdmFpbGFibGUubWFwKCh0YXJnZXQpID0+IG9wZW5BaU1vZGVsKHRhcmdldCwgaW5jbHVkZU1ldGFkYXRhKSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIG9wZW5BaU1vZGVsKHRhcmdldDogTW9kZWxUYXJnZXQsIGluY2x1ZGVNZXRhZGF0YTogYm9vbGVhbik6IE9wZW5BSU1vZGVsIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogdGFyZ2V0LmlkLFxuICAgIG9iamVjdDogXCJtb2RlbFwiLFxuICAgIGNyZWF0ZWQ6IDAsXG4gICAgb3duZWRfYnk6IFwiZGF0YWJyaWNrc1wiLFxuICAgIG5hbWU6IHRhcmdldC5kaXNwbGF5TmFtZSxcbiAgICBtb2RlbF9zb3VyY2U6IHRhcmdldC5lbmRwb2ludD8ubW9kZWxTb3VyY2UgPz8gXCJjdXN0b21cIixcbiAgICB0YXNrOiB0YXJnZXQuZW5kcG9pbnQ/LnRhc2ssXG4gICAgc3RhdHVzOiB0YXJnZXQuZW5kcG9pbnQ/LnN0YXR1cyA/PyB7IGRlcHJlY2F0ZWQ6IGZhbHNlIH0sXG4gICAgLi4uKGluY2x1ZGVNZXRhZGF0YSA/IHsgbWV0YWRhdGE6IG1vZGVsTWV0YWRhdGFGb3IodGFyZ2V0LmVuZHBvaW50ID8/IHRhcmdldC5pZCkgfSA6IHt9KSxcbiAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgIHNtYXJ0X3JvdXRlcjogdGFyZ2V0LmlkID09PSBTTUFSVF9ST1VURVJfTU9ERUxfSUQsXG4gICAgICBhaV9kZWNpZGU6IHRhcmdldC5pZCA9PT0gQUlfREVDSURFX01PREVMX0lELFxuICAgICAgdG9vbHM6IHRhcmdldC5jYXBhYmlsaXRpZXMudG9vbHMsXG4gICAgICByZWFzb25pbmc6IHRhcmdldC5yZWFzb25pbmdFZmZvcnRzLFxuICAgICAgcmVzcG9uc2VzOiB0YXJnZXQuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcyxcbiAgICAgIG9wZW5fcmVzcG9uc2VzOiB0YXJnZXQuY2FwYWJpbGl0aWVzLm9wZW5SZXNwb25zZXMsXG4gICAgICBhbnRocm9waWM6IHRhcmdldC5jYXBhYmlsaXRpZXMuYW50aHJvcGljLFxuICAgICAgZW1iZWRkaW5nczogdGFyZ2V0LmNhcGFiaWxpdGllcy5lbWJlZGRpbmdzLFxuICAgICAgYWlfZ2F0ZXdheV9jb2RleDogdGFyZ2V0LmNhcGFiaWxpdGllcy5haUdhdGV3YXlDb2RleCxcbiAgICAgIHN0cmVhbWluZzogdGFyZ2V0LmNhcGFiaWxpdGllcy5zdHJlYW1pbmcsXG4gICAgICB3ZWJfc2VhcmNoOiB0YXJnZXQuY2FwYWJpbGl0aWVzLndlYlNlYXJjaCxcbiAgICAgIGltYWdlX2lucHV0OiB0YXJnZXQuY2FwYWJpbGl0aWVzLmltYWdlSW5wdXQsXG4gICAgICBhcHBseV9wYXRjaDogdGFyZ2V0LmNhcGFiaWxpdGllcy5hcHBseVBhdGNoLFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFpRGVjaWRlTW9kZWxUYXJnZXQoY2FuZGlkYXRlczogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSk6IE1vZGVsVGFyZ2V0IHtcbiAgY29uc3QgaGFzID0gKGNhcGFiaWxpdHk6IGtleW9mIE1vZGVsQ2FwYWJpbGl0aWVzKSA9PlxuICAgIGNhbmRpZGF0ZXMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuY2FwYWJpbGl0aWVzW2NhcGFiaWxpdHldKTtcbiAgY29uc3QgcmVhc29uaW5nRWZmb3J0cyA9IE9iamVjdC52YWx1ZXMoUmVhc29uaW5nRWZmb3J0KS5maWx0ZXIoKGVmZm9ydCkgPT5cbiAgICBjYW5kaWRhdGVzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LnJlYXNvbmluZ0VmZm9ydHMuaW5jbHVkZXMoZWZmb3J0KSksXG4gICk7XG4gIHJldHVybiB7XG4gICAgaWQ6IEFJX0RFQ0lERV9NT0RFTF9JRCxcbiAgICBhbGlhc2VzOiBbQUlfREVDSURFX01PREVMX0lEXSxcbiAgICBkaXNwbGF5TmFtZTogXCJBSSBEZWNpZGVcIixcbiAgICBlbmRwb2ludDoge1xuICAgICAgbmFtZTogQUlfREVDSURFX01PREVMX0lELFxuICAgICAgZGlzcGxheU5hbWU6IFwiQUkgRGVjaWRlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJVc2VzIERhdGFicmlja3MgYWlfZGVjaWRlIHRvIGNob29zZSBhIHN1ZmZpY2llbnQgZm91bmRhdGlvbiBtb2RlbC5cIixcbiAgICAgIHRhc2s6IFwibGxtL3YxL2NoYXRcIixcbiAgICAgIGNsYXNzOiBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCxcbiAgICAgIG1vZGVsU291cmNlOiBcImZvdW5kYXRpb25cIixcbiAgICAgIHN0YXR1czogeyBkZXByZWNhdGVkOiBmYWxzZSB9LFxuICAgIH0sXG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICByZXNwb25zZXM6IHRydWUsXG4gICAgICBvcGVuUmVzcG9uc2VzOiB0cnVlLFxuICAgICAgY2hhdDogdHJ1ZSxcbiAgICAgIGFudGhyb3BpYzogdHJ1ZSxcbiAgICAgIGVtYmVkZGluZ3M6IGZhbHNlLFxuICAgICAgYWlHYXRld2F5Q29kZXg6IHRydWUsXG4gICAgICB0b29sczogaGFzKFwidG9vbHNcIiksXG4gICAgICByZWFzb25pbmc6IHJlYXNvbmluZ0VmZm9ydHMubGVuZ3RoID4gMCxcbiAgICAgIHN0cmVhbWluZzogdHJ1ZSxcbiAgICAgIHBhcmFsbGVsVG9vbHM6IGhhcyhcInBhcmFsbGVsVG9vbHNcIiksXG4gICAgICBjdXN0b21Ub29sczogaGFzKFwiY3VzdG9tVG9vbHNcIiksXG4gICAgICBzdHJ1Y3R1cmVkT3V0cHV0OiBoYXMoXCJzdHJ1Y3R1cmVkT3V0cHV0XCIpLFxuICAgICAgd2ViU2VhcmNoOiBoYXMoXCJ3ZWJTZWFyY2hcIiksXG4gICAgICBpbWFnZUlucHV0OiBoYXMoXCJpbWFnZUlucHV0XCIpLFxuICAgICAgYXBwbHlQYXRjaDogaGFzKFwiYXBwbHlQYXRjaFwiKSxcbiAgICB9LFxuICAgIHJlYXNvbmluZ0VmZm9ydHMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNtYXJ0Um91dGVyTW9kZWxUYXJnZXQoY2FuZGlkYXRlczogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSk6IE1vZGVsVGFyZ2V0IHtcbiAgY29uc3QgaGFzID0gKGNhcGFiaWxpdHk6IGtleW9mIE1vZGVsQ2FwYWJpbGl0aWVzKSA9PlxuICAgIGNhbmRpZGF0ZXMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuY2FwYWJpbGl0aWVzW2NhcGFiaWxpdHldKTtcbiAgY29uc3QgcmVhc29uaW5nRWZmb3J0cyA9IE9iamVjdC52YWx1ZXMoUmVhc29uaW5nRWZmb3J0KS5maWx0ZXIoKGVmZm9ydCkgPT5cbiAgICBjYW5kaWRhdGVzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LnJlYXNvbmluZ0VmZm9ydHMuaW5jbHVkZXMoZWZmb3J0KSksXG4gICk7XG4gIHJldHVybiB7XG4gICAgaWQ6IFNNQVJUX1JPVVRFUl9NT0RFTF9JRCxcbiAgICBhbGlhc2VzOiBbU01BUlRfUk9VVEVSX01PREVMX0lEXSxcbiAgICBkaXNwbGF5TmFtZTogXCJTbWFydCBSb3V0ZXJcIixcbiAgICBlbmRwb2ludDoge1xuICAgICAgbmFtZTogU01BUlRfUk9VVEVSX01PREVMX0lELFxuICAgICAgZGlzcGxheU5hbWU6IFwiU21hcnQgUm91dGVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJVc2VzIERhdGFicmlja3MgdGFza192MyBTbWFydCBSb3V0ZXIgdG8gc2VsZWN0IGEgY29tcGF0aWJsZSBzeXN0ZW0gbW9kZWwgZm9yIGVhY2ggdHVybi5cIixcbiAgICAgIHRhc2s6IFwibGxtL3YxL2NoYXRcIixcbiAgICAgIGNsYXNzOiBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCxcbiAgICAgIG1vZGVsU291cmNlOiBcImZvdW5kYXRpb25cIixcbiAgICAgIHN0YXR1czogeyBkZXByZWNhdGVkOiBmYWxzZSB9LFxuICAgIH0sXG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICByZXNwb25zZXM6IHRydWUsXG4gICAgICBvcGVuUmVzcG9uc2VzOiB0cnVlLFxuICAgICAgY2hhdDogdHJ1ZSxcbiAgICAgIGFudGhyb3BpYzogdHJ1ZSxcbiAgICAgIGVtYmVkZGluZ3M6IGZhbHNlLFxuICAgICAgYWlHYXRld2F5Q29kZXg6IHRydWUsXG4gICAgICB0b29sczogaGFzKFwidG9vbHNcIiksXG4gICAgICByZWFzb25pbmc6IHJlYXNvbmluZ0VmZm9ydHMubGVuZ3RoID4gMCxcbiAgICAgIHN0cmVhbWluZzogdHJ1ZSxcbiAgICAgIHBhcmFsbGVsVG9vbHM6IGhhcyhcInBhcmFsbGVsVG9vbHNcIiksXG4gICAgICBjdXN0b21Ub29sczogaGFzKFwiY3VzdG9tVG9vbHNcIiksXG4gICAgICBzdHJ1Y3R1cmVkT3V0cHV0OiBoYXMoXCJzdHJ1Y3R1cmVkT3V0cHV0XCIpLFxuICAgICAgd2ViU2VhcmNoOiBoYXMoXCJ3ZWJTZWFyY2hcIiksXG4gICAgICBpbWFnZUlucHV0OiBoYXMoXCJpbWFnZUlucHV0XCIpLFxuICAgICAgYXBwbHlQYXRjaDogaGFzKFwiYXBwbHlQYXRjaFwiKSxcbiAgICB9LFxuICAgIHJlYXNvbmluZ0VmZm9ydHMsXG4gIH07XG59XG5cbi8qKiBDb2RleCBgL3YxL21vZGVsc2Agc2x1ZzogdGhlIGBzeXN0ZW0uYWkuKmAgc2VydmljZSB3aGVuIHByZWZlcnJlZCwgZWxzZSB0aGUgZW5kcG9pbnQgaWQuICovXG5leHBvcnQgZnVuY3Rpb24gY29kZXhNb2RlbFNsdWcodGFyZ2V0OiBNb2RlbFRhcmdldCwgcHJlZmVyU3lzdGVtTW9kZWxzOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgbW9kZWwgPVxuICAgIHByZWZlclN5c3RlbU1vZGVscyAmJiB0YXJnZXQuY2FwYWJpbGl0aWVzLmFpR2F0ZXdheUNvZGV4ICYmIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lXG4gICAgICA/IHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lXG4gICAgICA6IHRhcmdldC5pZDtcbiAgcmV0dXJuIGBkYXRhYnJpY2tzLyR7bW9kZWx9YDtcbn1cblxuZnVuY3Rpb24gY29kZXhNb2RlbChcbiAgdGFyZ2V0OiBNb2RlbFRhcmdldCxcbiAgcHJpb3JpdHk6IG51bWJlcixcbiAgcHJlZmVyU3lzdGVtTW9kZWxzOiBib29sZWFuLFxuICBpbmNsdWRlTWV0YWRhdGE6IGJvb2xlYW4sXG4pOiBDb2RleE1vZGVsIHtcbiAgY29uc3QgZWZmb3J0cyA9IHRhcmdldC5yZWFzb25pbmdFZmZvcnRzO1xuICByZXR1cm4ge1xuICAgIHNsdWc6IGNvZGV4TW9kZWxTbHVnKHRhcmdldCwgcHJlZmVyU3lzdGVtTW9kZWxzKSxcbiAgICBkaXNwbGF5X25hbWU6IGNvZGV4RGlzcGxheU5hbWUodGFyZ2V0KSxcbiAgICBkZXNjcmlwdGlvbjogdGFyZ2V0LmVuZHBvaW50Py5kZXNjcmlwdGlvbiA/PyBcIkRhdGFicmlja3MgbW9kZWwgc2VydmljZVwiLFxuICAgIGJhc2VfaW5zdHJ1Y3Rpb25zOiBDT0RFWF9CQVNFX0lOU1RSVUNUSU9OUyxcbiAgICBzdGF0dXM6IHRhcmdldC5lbmRwb2ludD8uc3RhdHVzID8/IHsgZGVwcmVjYXRlZDogZmFsc2UgfSxcbiAgICAuLi4oaW5jbHVkZU1ldGFkYXRhID8geyBtZXRhZGF0YTogbW9kZWxNZXRhZGF0YUZvcih0YXJnZXQuZW5kcG9pbnQgPz8gdGFyZ2V0LmlkKSB9IDoge30pLFxuICAgIHN1cHBvcnRlZF9yZWFzb25pbmdfbGV2ZWxzOiBlZmZvcnRzLm1hcCgoZWZmb3J0KSA9PiAoe1xuICAgICAgZWZmb3J0LFxuICAgICAgZGVzY3JpcHRpb246IFJFQVNPTklOR19ERVNDUklQVElPTlNbZWZmb3J0XSA/PyBgVXNlIHRoZSAke2VmZm9ydH0gcmVhc29uaW5nIGJ1ZGdldGAsXG4gICAgfSkpLFxuICAgIC4uLihlZmZvcnRzLmxlbmd0aCA+IDBcbiAgICAgID8geyBkZWZhdWx0X3JlYXNvbmluZ19sZXZlbDogZWZmb3J0cy5pbmNsdWRlcyhcIm1lZGl1bVwiKSA/IFwibWVkaXVtXCIgOiBlZmZvcnRzWzBdIH1cbiAgICAgIDoge30pLFxuICAgIHNoZWxsX3R5cGU6IFwidW5pZmllZF9leGVjXCIsXG4gICAgdmlzaWJpbGl0eTogXCJsaXN0XCIsXG4gICAgc3VwcG9ydGVkX2luX2FwaTogdHJ1ZSxcbiAgICBwcmlvcml0eSxcbiAgICBhdmFpbGFiaWxpdHlfbnV4OiBudWxsLFxuICAgIHVwZ3JhZGU6IG51bGwsXG4gICAgc3VwcG9ydF92ZXJib3NpdHk6IGZhbHNlLFxuICAgIGRlZmF1bHRfdmVyYm9zaXR5OiBudWxsLFxuICAgIGFwcGx5X3BhdGNoX3Rvb2xfdHlwZTogdGFyZ2V0LmNhcGFiaWxpdGllcy5jdXN0b21Ub29scyA/IFwiZnJlZWZvcm1cIiA6IG51bGwsXG4gICAgdHJ1bmNhdGlvbl9wb2xpY3k6IHsgbW9kZTogXCJ0b2tlbnNcIiwgbGltaXQ6IDEyOF8wMDAgfSxcbiAgICBjb250ZXh0X3dpbmRvdzogbnVsbCxcbiAgICBleHBlcmltZW50YWxfc3VwcG9ydGVkX3Rvb2xzOiBbXSxcbiAgICBpbnB1dF9tb2RhbGl0aWVzOiBbXCJ0ZXh0XCJdLFxuICAgIHdlYl9zZWFyY2hfdG9vbF90eXBlOiBcInRleHRcIixcbiAgICBzdXBwb3J0c19zZWFyY2hfdG9vbDogdGFyZ2V0LmNhcGFiaWxpdGllcy53ZWJTZWFyY2gsXG4gICAgc3VwcG9ydHNfaW1hZ2VfZGV0YWlsX29yaWdpbmFsOiBmYWxzZSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29kZXhEaXNwbGF5TmFtZSh0YXJnZXQ6IE1vZGVsVGFyZ2V0KTogc3RyaW5nIHtcbiAgaWYgKGNhdGFsb2d1ZUZhbWlseSh0YXJnZXQpICE9PSBNb2RlbEZhbWlseS5HcHQpIHJldHVybiB0YXJnZXQuZGlzcGxheU5hbWU7XG4gIGNvbnN0IGRpc3BsYXlOYW1lID0gdGFyZ2V0LmRpc3BsYXlOYW1lLnJlcGxhY2UoL15ncHQoPz1bXFxzLl8tXSkvaSwgXCJHUFRcIik7XG4gIHJldHVybiBgRGF0YWJyaWNrcyAke2Rpc3BsYXlOYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVDb2RleENhdGFsb2d1ZVRhcmdldHMobGVmdDogTW9kZWxUYXJnZXQsIHJpZ2h0OiBNb2RlbFRhcmdldCk6IG51bWJlciB7XG4gIGNvbnN0IGZhbWlseU9yZGVyID0gY29kZXhGYW1pbHlSYW5rKGxlZnQpIC0gY29kZXhGYW1pbHlSYW5rKHJpZ2h0KTtcbiAgaWYgKGZhbWlseU9yZGVyICE9PSAwKSByZXR1cm4gZmFtaWx5T3JkZXI7XG4gIGNvbnN0IG1vZGVsS2luZE9yZGVyID0gY29kZXhNb2RlbEtpbmRSYW5rKGxlZnQpIC0gY29kZXhNb2RlbEtpbmRSYW5rKHJpZ2h0KTtcbiAgaWYgKG1vZGVsS2luZE9yZGVyICE9PSAwKSByZXR1cm4gbW9kZWxLaW5kT3JkZXI7XG4gIGNvbnN0IHZlcnNpb25PcmRlciA9IGNvbXBhcmVWZXJzaW9uVHVwbGVzKGNvZGV4VmVyc2lvbihyaWdodCksIGNvZGV4VmVyc2lvbihsZWZ0KSk7XG4gIGlmICh2ZXJzaW9uT3JkZXIgIT09IDApIHJldHVybiB2ZXJzaW9uT3JkZXI7XG4gIGNvbnN0IGNsYXNzT3JkZXIgPSBjb2RleENsYXNzUmFuayhsZWZ0KSAtIGNvZGV4Q2xhc3NSYW5rKHJpZ2h0KTtcbiAgaWYgKGNsYXNzT3JkZXIgIT09IDApIHJldHVybiBjbGFzc09yZGVyO1xuICByZXR1cm4gY29tcGFyZUNhdGFsb2d1ZUxhYmVsKGxlZnQuZGlzcGxheU5hbWUsIHJpZ2h0LmRpc3BsYXlOYW1lKTtcbn1cblxuZnVuY3Rpb24gY29kZXhNb2RlbEtpbmRSYW5rKHRhcmdldDogTW9kZWxUYXJnZXQpOiBudW1iZXIge1xuICByZXR1cm4gW3RhcmdldC5kaXNwbGF5TmFtZSwgdGFyZ2V0LmlkLCB0YXJnZXQubW9kZWxTZXJ2aWNlTmFtZV0uc29tZShcbiAgICAoaWRlbnRpdHkpID0+IGlkZW50aXR5ICYmIGlzT3BlbldlaWdodHNHcHQoaWRlbnRpdHkpLFxuICApXG4gICAgPyAxXG4gICAgOiAwO1xufVxuXG5mdW5jdGlvbiBjb2RleEZhbWlseVJhbmsodGFyZ2V0OiBNb2RlbFRhcmdldCk6IG51bWJlciB7XG4gIGNvbnN0IGZhbWlseSA9IGNhdGFsb2d1ZUZhbWlseSh0YXJnZXQpO1xuICBjb25zdCBpbmRleCA9IGZhbWlseSA/IENPREVYX0ZBTUlMWV9PUkRFUi5pbmRleE9mKGZhbWlseSBhcyBNb2RlbEZhbWlseSkgOiAtMTtcbiAgcmV0dXJuIGluZGV4ID49IDAgPyBpbmRleCA6IENPREVYX0ZBTUlMWV9PUkRFUi5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIGNvZGV4VmVyc2lvbih0YXJnZXQ6IE1vZGVsVGFyZ2V0KTogcmVhZG9ubHkgbnVtYmVyW10ge1xuICByZXR1cm4gdmVyc2lvblR1cGxlKHRhcmdldC5kaXNwbGF5TmFtZSk7XG59XG5cbmZ1bmN0aW9uIGNvZGV4Q2xhc3NSYW5rKHRhcmdldDogTW9kZWxUYXJnZXQpOiBudW1iZXIge1xuICBjb25zdCBtb2RlbENsYXNzID0gdGFyZ2V0LmVuZHBvaW50Py5jbGFzcztcbiAgY29uc3QgaW5kZXggPSBtb2RlbENsYXNzID8gQ0hBVF9DTEFTU19PUkRFUi5pbmRleE9mKG1vZGVsQ2xhc3MpIDogLTE7XG4gIHJldHVybiBpbmRleCA+PSAwID8gaW5kZXggOiBDSEFUX0NMQVNTX09SREVSLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBPcmRlciBsaXN0ZWQgbW9kZWxzIGluIHRocmVlIGdyb3VwczogbWFqb3ItcHJvdmlkZXIgY2hhdCBmYW1pbGllcywgdGhlXG4gKiByZW1haW5pbmcgY2hhdCBtb2RlbHMsIHRoZW4gZW1iZWRkaW5ncy4gRmFtaWxpZXMga2VlcCBhIGZpeGVkIHByb3ZpZGVyXG4gKiBvcmRlcjsgZWFjaCBmYW1pbHkgYW5kIHRoZSBsYXRlciBncm91cHMgc29ydCBieSB0aGUgcHVibGlzaGVkIGxhYmVsXG4gKiAoYGRpc3BsYXlfbmFtZWAgZm9yIENvZGV4LCBgbmFtZWAgb3RoZXJ3aXNlKS4gTnVtZXJpYyBzZWdtZW50cyBzb3J0XG4gKiBuYXR1cmFsbHkgc28gXCJWZW8gMy4xXCIgcHJlY2VkZXMgXCJWZW8gMy4xMFwiLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQ2F0YWxvZ3VlVGFyZ2V0cyhcbiAgbGVmdDogTW9kZWxUYXJnZXQsXG4gIHJpZ2h0OiBNb2RlbFRhcmdldCxcbiAgbGFiZWw6ICh0YXJnZXQ6IE1vZGVsVGFyZ2V0KSA9PiBzdHJpbmcsXG4pOiBudW1iZXIge1xuICBjb25zdCBncm91cCA9IGNhdGFsb2d1ZUdyb3VwKGxlZnQpIC0gY2F0YWxvZ3VlR3JvdXAocmlnaHQpO1xuICBpZiAoZ3JvdXAgIT09IDApIHJldHVybiBncm91cDtcbiAgY29uc3QgbGVmdEZhbWlseSA9IGNhdGFsb2d1ZUZhbWlseShsZWZ0KTtcbiAgY29uc3QgcmlnaHRGYW1pbHkgPSBjYXRhbG9ndWVGYW1pbHkocmlnaHQpO1xuICBpZiAobGVmdEZhbWlseSAmJiByaWdodEZhbWlseSkge1xuICAgIGNvbnN0IGZhbWlseU9yZGVyID0gbW9kZWxGYW1pbHlSYW5rKGxlZnRGYW1pbHkpIC0gbW9kZWxGYW1pbHlSYW5rKHJpZ2h0RmFtaWx5KTtcbiAgICBpZiAoZmFtaWx5T3JkZXIgIT09IDApIHJldHVybiBmYW1pbHlPcmRlcjtcbiAgfVxuICByZXR1cm4gY29tcGFyZUNhdGFsb2d1ZUxhYmVsKGxhYmVsKGxlZnQpLCBsYWJlbChyaWdodCkpO1xufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVHcm91cCh0YXJnZXQ6IE1vZGVsVGFyZ2V0KTogbnVtYmVyIHtcbiAgaWYgKGlzRW1iZWRkaW5nVGFyZ2V0KHRhcmdldCkpIHJldHVybiAyO1xuICByZXR1cm4gY2F0YWxvZ3VlRmFtaWx5KHRhcmdldCkgPyAwIDogMTtcbn1cblxuY29uc3QgSURFTlRJVFlfUFJFRklYRVMgPSBuZXcgU2V0KFtcbiAgXCJkYXRhYnJpY2tzXCIsXG4gIFwic3lzdGVtXCIsXG4gIFwiYWlcIixcbiAgXCJtZXRhXCIsXG4gIFwiZ29vZ2xlXCIsXG4gIFwib3BlbmFpXCIsXG4gIFwiYW50aHJvcGljXCIsXG5dKTtcblxuZnVuY3Rpb24gY2F0YWxvZ3VlRmFtaWx5KHRhcmdldDogTW9kZWxUYXJnZXQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaXNFbWJlZGRpbmdUYXJnZXQodGFyZ2V0KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBpZGVudGl0eSBvZiBbdGFyZ2V0LmRpc3BsYXlOYW1lLCB0YXJnZXQuaWQsIHRhcmdldC5lbmRwb2ludD8ubmFtZV0pIHtcbiAgICBpZiAoIWlkZW50aXR5KSBjb250aW51ZTtcbiAgICBjb25zdCBmYW1pbHkgPSBjYXRhbG9ndWVGYW1pbHlGcm9tSWRlbnRpdHkoaWRlbnRpdHkpO1xuICAgIGlmIChmYW1pbHkpIHJldHVybiBmYW1pbHk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY2F0YWxvZ3VlRmFtaWx5RnJvbUlkZW50aXR5KGlkZW50aXR5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0b2tlbnMgPSBpZGVudGl0eS50b0xvd2VyQ2FzZSgpLm1hdGNoKC9bYS16MC05XSsvZykgPz8gW107XG4gIGNvbnN0IHN0YXJ0ID0gdG9rZW5zLmZpbmQoKHRva2VuKSA9PiAhSURFTlRJVFlfUFJFRklYRVMuaGFzKHRva2VuKSk7XG4gIGlmICghc3RhcnQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChzdGFydCA9PT0gXCJ2ZW9cIikgcmV0dXJuIFwiZ2VtaW5pXCI7XG4gIGNvbnN0IGZhbWlseSA9IG1vZGVsRmFtaWx5KGlkZW50aXR5KTtcbiAgcmV0dXJuIGZhbWlseSAmJiBzdGFydCA9PT0gZmFtaWx5ID8gZmFtaWx5IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0VtYmVkZGluZ1RhcmdldCh0YXJnZXQ6IE1vZGVsVGFyZ2V0KTogYm9vbGVhbiB7XG4gIHJldHVybiB0YXJnZXQuY2FwYWJpbGl0aWVzLmVtYmVkZGluZ3MgPT09IHRydWUgfHwgdGFyZ2V0LmVuZHBvaW50Py50YXNrID09PSBcImxsbS92MS9lbWJlZGRpbmdzXCI7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVDYXRhbG9ndWVMYWJlbChsZWZ0OiBzdHJpbmcsIHJpZ2h0OiBzdHJpbmcpOiBudW1iZXIge1xuICByZXR1cm4gbGVmdC5sb2NhbGVDb21wYXJlKHJpZ2h0LCB1bmRlZmluZWQsIHsgbnVtZXJpYzogdHJ1ZSwgc2Vuc2l0aXZpdHk6IFwiYmFzZVwiIH0pO1xufVxuXG5mdW5jdGlvbiBoYXNDaGF0Q2xhc3ModGFyZ2V0OiBNb2RlbFRhcmdldCk6IGJvb2xlYW4ge1xuICBjb25zdCBtb2RlbENsYXNzID0gdGFyZ2V0LmVuZHBvaW50Py5jbGFzcztcbiAgcmV0dXJuIG1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCAmJiBpc0NoYXRDbGFzcyhtb2RlbENsYXNzKTtcbn1cbiJdfQ==
|