experimental-agent 0.0.2 → 0.0.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/README.md +13 -2
- package/dist/agent-workflow.d.mts +11 -3
- package/dist/agent-workflow.d.ts +11 -3
- package/dist/agent-workflow.js +1921 -1144
- package/dist/agent-workflow.mjs +7 -3
- package/dist/chunk-3ODWQVIA.mjs +12 -0
- package/dist/chunk-64THY7Y7.mjs +155 -0
- package/dist/chunk-GSRJYPWF.mjs +284 -0
- package/dist/chunk-HJGPUEFC.mjs +42 -0
- package/dist/chunk-JCPQQWIK.mjs +2057 -0
- package/dist/chunk-JEE2FQ4O.mjs +844 -0
- package/dist/chunk-T7PMZLOX.mjs +79 -0
- package/dist/chunk-TQRCSTCF.mjs +103 -0
- package/dist/chunk-VBLZWXVE.mjs +318 -0
- package/dist/{types-DPXFq_r6.d.ts → client-6g79J0s3.d.mts} +866 -31
- package/dist/{types-DPXFq_r6.d.mts → client-6g79J0s3.d.ts} +866 -31
- package/dist/client-SREKHM6I.mjs +15 -0
- package/dist/client.d.mts +37 -0
- package/dist/client.d.ts +37 -0
- package/dist/client.js +58 -0
- package/dist/client.mjs +30 -0
- package/dist/{client-HUG4HT5L.mjs → handler-36FM5H35.mjs} +4 -5
- package/dist/index.d.mts +3 -4
- package/dist/index.d.ts +3 -4
- package/dist/index.js +3102 -1438
- package/dist/index.mjs +720 -147
- package/dist/lifecycle-workflow.d.mts +3 -10
- package/dist/lifecycle-workflow.d.ts +3 -10
- package/dist/lifecycle-workflow.js +170 -1246
- package/dist/lifecycle-workflow.mjs +5 -41
- package/dist/local-fs-handlers-P4WGW3QY.mjs +235 -0
- package/dist/next/loader.d.mts +14 -0
- package/dist/next/loader.d.ts +14 -0
- package/dist/next/loader.js +206 -0
- package/dist/next/loader.mjs +103 -0
- package/dist/next.d.mts +34 -0
- package/dist/next.d.ts +34 -0
- package/dist/next.js +329 -0
- package/dist/next.mjs +224 -0
- package/dist/process-manager-JAKAXROL.mjs +10 -0
- package/dist/{client-4Y3UPWFR.mjs → sandbox-QAPGBVYM.mjs} +4 -3
- package/dist/storage-Q376OZH3.mjs +20 -0
- package/dist/{vercel-2CFDMEHB.mjs → vercel-LLXAHKVJ.mjs} +3 -1
- package/dist/vercel-sdk-VHKEX2GQ.mjs +8 -0
- package/package.json +32 -19
- package/dist/chunk-24DJSI7C.mjs +0 -374
- package/dist/chunk-4RGMKC2M.mjs +0 -755
- package/dist/chunk-6ICYKNCC.mjs +0 -284
- package/dist/chunk-PGYYQ3WZ.mjs +0 -1088
- package/dist/client-BBpD9kKL.d.ts +0 -193
- package/dist/client-BGJViybU.d.mts +0 -193
- package/dist/lifecycle-workflow-steps-HHN46ZAD.mjs +0 -20
- package/dist/local-BYPFRMLZ.mjs +0 -282
- package/dist/process-manager-H2HF6G4G.mjs +0 -153
- package/dist/sandbox-BFA4ECEQ.mjs +0 -10
- package/dist/storage-2U2QFNWI.mjs +0 -27
- /package/dist/{chunk-36X6L7SK.mjs → chunk-TAXLUVIC.mjs} +0 -0
|
@@ -30,6 +30,19 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
30
30
|
));
|
|
31
31
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
32
32
|
|
|
33
|
+
// src/sandbox/bindings/vercel-sdk.ts
|
|
34
|
+
var vercel_sdk_exports = {};
|
|
35
|
+
__export(vercel_sdk_exports, {
|
|
36
|
+
Sandbox: () => import_sandbox.Sandbox
|
|
37
|
+
});
|
|
38
|
+
var import_sandbox;
|
|
39
|
+
var init_vercel_sdk = __esm({
|
|
40
|
+
"src/sandbox/bindings/vercel-sdk.ts"() {
|
|
41
|
+
"use strict";
|
|
42
|
+
import_sandbox = require("sandbox");
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
33
46
|
// src/errors.ts
|
|
34
47
|
var errore, SessionNotFoundError, SessionError, SandboxNotFoundError, StorageError, SandboxError, MessageNotFoundError;
|
|
35
48
|
var init_errors = __esm({
|
|
@@ -69,343 +82,14 @@ var init_errors = __esm({
|
|
|
69
82
|
}
|
|
70
83
|
});
|
|
71
84
|
|
|
72
|
-
// src/utils/paginate.ts
|
|
73
|
-
function paginate(opts) {
|
|
74
|
-
const { items, cursor, limit = 50 } = opts;
|
|
75
|
-
const startIndex = cursor ? items.findIndex((m) => m.id === cursor) + 1 : 0;
|
|
76
|
-
const sliced = items.slice(startIndex, startIndex + limit);
|
|
77
|
-
const nextCursor = startIndex + limit < items.length ? sliced.at(-1)?.id ?? null : null;
|
|
78
|
-
return { items: sliced, nextCursor };
|
|
79
|
-
}
|
|
80
|
-
var init_paginate = __esm({
|
|
81
|
-
"src/utils/paginate.ts"() {
|
|
82
|
-
"use strict";
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
// src/storage/bindings/local-fs-handlers.ts
|
|
87
|
-
function createFilesystemHandlers(basePath) {
|
|
88
|
-
const sessionDir = (0, import_node_path.join)(basePath, "session");
|
|
89
|
-
const messageDir = (0, import_node_path.join)(basePath, "message");
|
|
90
|
-
const partDir = (0, import_node_path.join)(basePath, "part");
|
|
91
|
-
const sandboxDir = (0, import_node_path.join)(basePath, "sandbox");
|
|
92
|
-
const commandDir = (0, import_node_path.join)(basePath, "command");
|
|
93
|
-
async function ensureDir(dir) {
|
|
94
|
-
await (0, import_promises.mkdir)(dir, { recursive: true });
|
|
95
|
-
}
|
|
96
|
-
async function readJson(filePath) {
|
|
97
|
-
try {
|
|
98
|
-
const content = await (0, import_promises.readFile)(filePath, "utf-8");
|
|
99
|
-
return JSON.parse(content);
|
|
100
|
-
} catch {
|
|
101
|
-
return null;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
async function writeJsonFile(filePath, data) {
|
|
105
|
-
await ensureDir((0, import_node_path.dirname)(filePath));
|
|
106
|
-
await (0, import_promises.writeFile)(filePath, JSON.stringify(data, null, 2));
|
|
107
|
-
}
|
|
108
|
-
async function readAllFromDir(dir) {
|
|
109
|
-
try {
|
|
110
|
-
const files = await (0, import_promises.readdir)(dir);
|
|
111
|
-
const results = await Promise.all(
|
|
112
|
-
files.filter((f) => f.endsWith(".json")).map((f) => readJson((0, import_node_path.join)(dir, f)))
|
|
113
|
-
);
|
|
114
|
-
return results.filter((r) => r !== null);
|
|
115
|
-
} catch {
|
|
116
|
-
return [];
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
return {
|
|
120
|
-
"session.get": async ({ id }) => {
|
|
121
|
-
const session = await readJson((0, import_node_path.join)(sessionDir, `${id}.json`));
|
|
122
|
-
return session ?? null;
|
|
123
|
-
},
|
|
124
|
-
"session.set": async (session) => {
|
|
125
|
-
const now = Date.now();
|
|
126
|
-
const sessionPath = (0, import_node_path.join)(sessionDir, `${session.id}.json`);
|
|
127
|
-
const existing = await readJson(sessionPath);
|
|
128
|
-
const newSession = {
|
|
129
|
-
...session,
|
|
130
|
-
tags: session.tags ?? existing?.tags ?? {},
|
|
131
|
-
createdAt: existing?.createdAt ?? session.createdAt ?? now,
|
|
132
|
-
updatedAt: now
|
|
133
|
-
};
|
|
134
|
-
await writeJsonFile(sessionPath, newSession);
|
|
135
|
-
return newSession;
|
|
136
|
-
},
|
|
137
|
-
"session.list": async ({ tags, cursor, limit }) => {
|
|
138
|
-
const allSessions = await readAllFromDir(sessionDir);
|
|
139
|
-
let filtered = allSessions;
|
|
140
|
-
if (tags && Object.keys(tags).length > 0) {
|
|
141
|
-
filtered = filtered.filter((s) => {
|
|
142
|
-
const sessionTags = s.tags ?? {};
|
|
143
|
-
return Object.entries(tags).every(
|
|
144
|
-
([key, value]) => sessionTags[key] === value
|
|
145
|
-
);
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
filtered.sort((a, b) => a.createdAt - b.createdAt);
|
|
149
|
-
return paginate({ items: filtered, cursor, limit });
|
|
150
|
-
},
|
|
151
|
-
"session.listBySandbox": async ({ sandboxId, tags, cursor, limit }) => {
|
|
152
|
-
const allSessions = await readAllFromDir(sessionDir);
|
|
153
|
-
let filtered = allSessions.filter((s) => s.sandboxId === sandboxId);
|
|
154
|
-
if (tags && Object.keys(tags).length > 0) {
|
|
155
|
-
filtered = filtered.filter((s) => {
|
|
156
|
-
const sessionTags = s.tags ?? {};
|
|
157
|
-
return Object.entries(tags).every(
|
|
158
|
-
([key, value]) => sessionTags[key] === value
|
|
159
|
-
);
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
filtered.sort((a, b) => a.createdAt - b.createdAt);
|
|
163
|
-
return paginate({ items: filtered, cursor, limit });
|
|
164
|
-
},
|
|
165
|
-
"session.tag.set": async ({ sessionId, tags }) => {
|
|
166
|
-
const sessionPath = (0, import_node_path.join)(sessionDir, `${sessionId}.json`);
|
|
167
|
-
const existing = await readJson(sessionPath);
|
|
168
|
-
if (!existing) {
|
|
169
|
-
throw new Error(`Session ${sessionId} not found`);
|
|
170
|
-
}
|
|
171
|
-
const mergedTags = { ...existing.tags, ...tags };
|
|
172
|
-
const now = Date.now();
|
|
173
|
-
const updatedSession = {
|
|
174
|
-
...existing,
|
|
175
|
-
tags: mergedTags,
|
|
176
|
-
updatedAt: now
|
|
177
|
-
};
|
|
178
|
-
await writeJsonFile(sessionPath, updatedSession);
|
|
179
|
-
return updatedSession;
|
|
180
|
-
},
|
|
181
|
-
"message.get": async ({ id }) => {
|
|
182
|
-
return await readJson((0, import_node_path.join)(messageDir, `${id}.json`));
|
|
183
|
-
},
|
|
184
|
-
"message.set": async (message) => {
|
|
185
|
-
await writeJsonFile((0, import_node_path.join)(messageDir, `${message.id}.json`), message);
|
|
186
|
-
return message;
|
|
187
|
-
},
|
|
188
|
-
"message.list": async ({ sessionId, cursor, limit }) => {
|
|
189
|
-
const allMessages = await readAllFromDir(messageDir);
|
|
190
|
-
const filtered = allMessages.filter((m) => m.sessionId === sessionId).sort((a, b) => a.createdAt - b.createdAt);
|
|
191
|
-
return paginate({ items: filtered, cursor, limit });
|
|
192
|
-
},
|
|
193
|
-
"part.listByMessage": async ({ messageId, cursor, limit }) => {
|
|
194
|
-
const allParts = await readAllFromDir(partDir);
|
|
195
|
-
const filtered = allParts.filter((p) => p.messageId === messageId).sort((a, b) => a.index - b.index);
|
|
196
|
-
return paginate({ items: filtered, cursor, limit });
|
|
197
|
-
},
|
|
198
|
-
"part.listBySession": async ({ sessionId, cursor, limit }) => {
|
|
199
|
-
const allParts = await readAllFromDir(partDir);
|
|
200
|
-
const filtered = allParts.filter((p) => p.sessionId === sessionId).sort((a, b) => {
|
|
201
|
-
if (a.messageId !== b.messageId) {
|
|
202
|
-
return a.messageId.localeCompare(b.messageId);
|
|
203
|
-
}
|
|
204
|
-
return a.index - b.index;
|
|
205
|
-
});
|
|
206
|
-
return paginate({ items: filtered, cursor, limit });
|
|
207
|
-
},
|
|
208
|
-
"part.set": async (part) => {
|
|
209
|
-
await writeJsonFile((0, import_node_path.join)(partDir, `${part.id}.json`), part);
|
|
210
|
-
return part;
|
|
211
|
-
},
|
|
212
|
-
"sandbox.get": async ({ key }) => {
|
|
213
|
-
const safeName = Buffer.from(key).toString("base64url");
|
|
214
|
-
const sandboxPath = (0, import_node_path.join)(sandboxDir, `${safeName}.json`);
|
|
215
|
-
const data = await readJson(sandboxPath);
|
|
216
|
-
if (!data) {
|
|
217
|
-
return null;
|
|
218
|
-
}
|
|
219
|
-
return data;
|
|
220
|
-
},
|
|
221
|
-
"sandbox.set": async (record) => {
|
|
222
|
-
const safeName = Buffer.from(record.id).toString("base64url");
|
|
223
|
-
const sandboxPath = (0, import_node_path.join)(sandboxDir, `${safeName}.json`);
|
|
224
|
-
const existing = await readJson(sandboxPath);
|
|
225
|
-
const newRecord = {
|
|
226
|
-
...record,
|
|
227
|
-
tags: record.tags ?? existing?.tags ?? null
|
|
228
|
-
};
|
|
229
|
-
await writeJsonFile(sandboxPath, newRecord);
|
|
230
|
-
},
|
|
231
|
-
"sandbox.list": async ({ tags, order, cursor, limit }) => {
|
|
232
|
-
const allSandboxes = await readAllFromDir(sandboxDir);
|
|
233
|
-
let filtered = allSandboxes;
|
|
234
|
-
if (tags && Object.keys(tags).length > 0) {
|
|
235
|
-
filtered = filtered.filter((s) => {
|
|
236
|
-
const sandboxTags = s.tags ?? {};
|
|
237
|
-
return Object.entries(tags).every(
|
|
238
|
-
([key, value]) => sandboxTags[key] === value
|
|
239
|
-
);
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
const sortField = order?.startsWith("lastActivityAt") ? "lastActivityAt" : "createdAt";
|
|
243
|
-
const sortDir = order?.endsWith("_desc") ? -1 : 1;
|
|
244
|
-
filtered.sort(
|
|
245
|
-
(a, b) => sortDir * ((a[sortField] ?? 0) - (b[sortField] ?? 0))
|
|
246
|
-
);
|
|
247
|
-
return paginate({ items: filtered, cursor, limit });
|
|
248
|
-
},
|
|
249
|
-
"sandbox.tag.set": async ({ sandboxId, tags }) => {
|
|
250
|
-
const safeName = Buffer.from(sandboxId).toString("base64url");
|
|
251
|
-
const sandboxPath = (0, import_node_path.join)(sandboxDir, `${safeName}.json`);
|
|
252
|
-
const existing = await readJson(sandboxPath);
|
|
253
|
-
if (!existing) {
|
|
254
|
-
throw new Error(`Sandbox ${sandboxId} not found`);
|
|
255
|
-
}
|
|
256
|
-
const mergedTags = { ...existing.tags, ...tags };
|
|
257
|
-
const updatedSandbox = {
|
|
258
|
-
...existing,
|
|
259
|
-
tags: mergedTags
|
|
260
|
-
};
|
|
261
|
-
await writeJsonFile(sandboxPath, updatedSandbox);
|
|
262
|
-
return updatedSandbox;
|
|
263
|
-
},
|
|
264
|
-
"sandbox.getBySession": async ({ sessionId }) => {
|
|
265
|
-
const allSandboxes = await readAllFromDir(sandboxDir);
|
|
266
|
-
const matching = allSandboxes.filter(
|
|
267
|
-
(s) => s.id.startsWith(`${sessionId}-`)
|
|
268
|
-
);
|
|
269
|
-
if (matching.length === 0) {
|
|
270
|
-
return null;
|
|
271
|
-
}
|
|
272
|
-
matching.sort(
|
|
273
|
-
(a, b) => (b.lastActivityAt ?? 0) - (a.lastActivityAt ?? 0)
|
|
274
|
-
);
|
|
275
|
-
return matching[0];
|
|
276
|
-
},
|
|
277
|
-
"command.get": async ({ id }) => {
|
|
278
|
-
return await readJson((0, import_node_path.join)(commandDir, `${id}.json`));
|
|
279
|
-
},
|
|
280
|
-
"command.set": async (command) => {
|
|
281
|
-
await writeJsonFile((0, import_node_path.join)(commandDir, `${command.id}.json`), command);
|
|
282
|
-
return command;
|
|
283
|
-
},
|
|
284
|
-
"command.list": async ({ sessionId, includeFinished, cursor, limit }) => {
|
|
285
|
-
const allCommands = await readAllFromDir(commandDir);
|
|
286
|
-
let filtered = allCommands.filter((c) => c.sessionId === sessionId);
|
|
287
|
-
if (!includeFinished) {
|
|
288
|
-
filtered = filtered.filter((c) => c.status === "running");
|
|
289
|
-
}
|
|
290
|
-
filtered.sort((a, b) => a.startedAt - b.startedAt);
|
|
291
|
-
return paginate({ items: filtered, cursor, limit });
|
|
292
|
-
}
|
|
293
|
-
};
|
|
294
|
-
}
|
|
295
|
-
var import_promises, import_node_path;
|
|
296
|
-
var init_local_fs_handlers = __esm({
|
|
297
|
-
"src/storage/bindings/local-fs-handlers.ts"() {
|
|
298
|
-
"use strict";
|
|
299
|
-
import_promises = require("fs/promises");
|
|
300
|
-
import_node_path = require("path");
|
|
301
|
-
init_paginate();
|
|
302
|
-
}
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
// src/storage/bindings/local.ts
|
|
306
|
-
var local_exports = {};
|
|
307
|
-
__export(local_exports, {
|
|
308
|
-
startLocalStorage: () => startLocalStorage,
|
|
309
|
-
stopLocalStorage: () => stopLocalStorage
|
|
310
|
-
});
|
|
311
|
-
function startLocalStorage(opts) {
|
|
312
|
-
if (startPromise) {
|
|
313
|
-
return startPromise;
|
|
314
|
-
}
|
|
315
|
-
startPromise = new Promise((resolve) => {
|
|
316
|
-
const handlers = createFilesystemHandlers(
|
|
317
|
-
opts?.path ?? DEFAULT_STORAGE_DIR
|
|
318
|
-
);
|
|
319
|
-
const app = new import_hono.Hono();
|
|
320
|
-
app.post("/", async (c) => {
|
|
321
|
-
const body = await c.req.json();
|
|
322
|
-
const response = await handleStorageRpc(body, handlers);
|
|
323
|
-
return c.json(response);
|
|
324
|
-
});
|
|
325
|
-
const port = opts?.port ?? 0;
|
|
326
|
-
const server = (0, import_node_server.serve)({
|
|
327
|
-
fetch: app.fetch,
|
|
328
|
-
port
|
|
329
|
-
});
|
|
330
|
-
server.on("listening", () => {
|
|
331
|
-
const address = server.address();
|
|
332
|
-
const actualPort = typeof address === "object" ? address?.port : port;
|
|
333
|
-
const url = `http://localhost:${actualPort}`;
|
|
334
|
-
serverInstance = { url, server };
|
|
335
|
-
console.log(`[agent] Local storage server started at ${url}`);
|
|
336
|
-
resolve(url);
|
|
337
|
-
});
|
|
338
|
-
});
|
|
339
|
-
return startPromise;
|
|
340
|
-
}
|
|
341
|
-
function stopLocalStorage() {
|
|
342
|
-
if (serverInstance) {
|
|
343
|
-
serverInstance.server.close();
|
|
344
|
-
serverInstance = null;
|
|
345
|
-
startPromise = null;
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
var import_node_server, import_hono, DEFAULT_STORAGE_DIR, startPromise, serverInstance;
|
|
349
|
-
var init_local = __esm({
|
|
350
|
-
"src/storage/bindings/local.ts"() {
|
|
351
|
-
"use strict";
|
|
352
|
-
import_node_server = require("@hono/node-server");
|
|
353
|
-
import_hono = require("hono");
|
|
354
|
-
init_storage();
|
|
355
|
-
init_local_fs_handlers();
|
|
356
|
-
DEFAULT_STORAGE_DIR = ".agent-storage";
|
|
357
|
-
startPromise = null;
|
|
358
|
-
serverInstance = null;
|
|
359
|
-
if (typeof process !== "undefined") {
|
|
360
|
-
process.on("SIGTERM", stopLocalStorage);
|
|
361
|
-
process.on("SIGINT", stopLocalStorage);
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
});
|
|
365
|
-
|
|
366
|
-
// src/storage/bindings/vercel.ts
|
|
367
|
-
var vercel_exports = {};
|
|
368
|
-
__export(vercel_exports, {
|
|
369
|
-
getVercelStorageConfig: () => getVercelStorageConfig
|
|
370
|
-
});
|
|
371
|
-
async function getVercelStorageConfig() {
|
|
372
|
-
let token = null;
|
|
373
|
-
try {
|
|
374
|
-
const { getVercelOidcToken } = await import("@vercel/oidc");
|
|
375
|
-
token = await getVercelOidcToken();
|
|
376
|
-
} catch {
|
|
377
|
-
}
|
|
378
|
-
return {
|
|
379
|
-
url: VERCEL_STORAGE_URL,
|
|
380
|
-
headers: token ? { Authorization: `Bearer ${token}` } : {}
|
|
381
|
-
};
|
|
382
|
-
}
|
|
383
|
-
var VERCEL_STORAGE_URL;
|
|
384
|
-
var init_vercel = __esm({
|
|
385
|
-
"src/storage/bindings/vercel.ts"() {
|
|
386
|
-
"use strict";
|
|
387
|
-
VERCEL_STORAGE_URL = "https://agent-sdk-storage-nine.labs.vercel.dev/api/storage";
|
|
388
|
-
}
|
|
389
|
-
});
|
|
390
|
-
|
|
391
85
|
// src/storage/client.ts
|
|
392
|
-
function getStorageClient(
|
|
86
|
+
function getStorageClient(rpcFn, name) {
|
|
393
87
|
async function rpc(method, params) {
|
|
394
|
-
const
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
body: JSON.stringify({ method, params })
|
|
398
|
-
});
|
|
399
|
-
if (!res.ok) {
|
|
400
|
-
throw new StorageError({
|
|
401
|
-
reason: `HTTP ${res.status}: ${res.statusText}`
|
|
402
|
-
});
|
|
88
|
+
const result = await rpcFn({ name, method, params });
|
|
89
|
+
if ("error" in result) {
|
|
90
|
+
throw new StorageError({ reason: result.error.message });
|
|
403
91
|
}
|
|
404
|
-
|
|
405
|
-
if ("error" in json) {
|
|
406
|
-
throw new StorageError({ reason: json.error.message });
|
|
407
|
-
}
|
|
408
|
-
return json.result;
|
|
92
|
+
return result.result;
|
|
409
93
|
}
|
|
410
94
|
return {
|
|
411
95
|
session: {
|
|
@@ -541,6 +225,16 @@ function getStorageClient({ url, headers }) {
|
|
|
541
225
|
}
|
|
542
226
|
return new StorageError({ reason: String(e), cause: e });
|
|
543
227
|
}
|
|
228
|
+
},
|
|
229
|
+
delete: async (id) => {
|
|
230
|
+
try {
|
|
231
|
+
await rpc("part.delete", { id });
|
|
232
|
+
} catch (e) {
|
|
233
|
+
if (e instanceof StorageError) {
|
|
234
|
+
return e;
|
|
235
|
+
}
|
|
236
|
+
return new StorageError({ reason: String(e), cause: e });
|
|
237
|
+
}
|
|
544
238
|
}
|
|
545
239
|
},
|
|
546
240
|
sandbox: {
|
|
@@ -651,76 +345,17 @@ function getStorageClient({ url, headers }) {
|
|
|
651
345
|
}
|
|
652
346
|
};
|
|
653
347
|
}
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
const { startLocalStorage: startLocalStorage2 } = await Promise.resolve().then(() => (init_local(), local_exports));
|
|
658
|
-
return { url: await startLocalStorage2({ path: config.path }) };
|
|
659
|
-
}
|
|
660
|
-
case "vercel": {
|
|
661
|
-
const { getVercelStorageConfig: getVercelStorageConfig2 } = await Promise.resolve().then(() => (init_vercel(), vercel_exports));
|
|
662
|
-
return getVercelStorageConfig2();
|
|
663
|
-
}
|
|
664
|
-
case "custom": {
|
|
665
|
-
return { url: config.url, headers: config.headers };
|
|
666
|
-
}
|
|
667
|
-
default: {
|
|
668
|
-
config;
|
|
669
|
-
throw new Error(
|
|
670
|
-
`Unknown storage type: ${config.type}`
|
|
671
|
-
);
|
|
672
|
-
}
|
|
673
|
-
}
|
|
674
|
-
}
|
|
675
|
-
function getStorage(storageConfig) {
|
|
676
|
-
let clientPromise = null;
|
|
677
|
-
const getClient = () => {
|
|
678
|
-
if (!clientPromise) {
|
|
679
|
-
clientPromise = resolveStorageUrl(storageConfig).then(
|
|
680
|
-
(resolved) => getStorageClient(resolved)
|
|
681
|
-
);
|
|
682
|
-
}
|
|
683
|
-
return clientPromise;
|
|
684
|
-
};
|
|
685
|
-
return {
|
|
686
|
-
session: {
|
|
687
|
-
get: async (id) => (await getClient()).session.get(id),
|
|
688
|
-
set: async (session) => (await getClient()).session.set(session),
|
|
689
|
-
list: async (opts) => (await getClient()).session.list(opts),
|
|
690
|
-
tag: {
|
|
691
|
-
set: async (opts) => (await getClient()).session.tag.set(opts)
|
|
692
|
-
}
|
|
693
|
-
},
|
|
694
|
-
message: {
|
|
695
|
-
list: async (sessionId, opts) => (await getClient()).message.list(sessionId, opts),
|
|
696
|
-
get: async (id) => (await getClient()).message.get(id),
|
|
697
|
-
set: async (message) => (await getClient()).message.set(message)
|
|
698
|
-
},
|
|
699
|
-
part: {
|
|
700
|
-
listByMessage: async (messageId, opts) => (await getClient()).part.listByMessage(messageId, opts),
|
|
701
|
-
listBySession: async (sessionId, opts) => (await getClient()).part.listBySession(sessionId, opts),
|
|
702
|
-
set: async (part) => (await getClient()).part.set(part)
|
|
703
|
-
},
|
|
704
|
-
sandbox: {
|
|
705
|
-
get: async (key) => (await getClient()).sandbox.get(key),
|
|
706
|
-
set: async (opts) => (await getClient()).sandbox.set(opts),
|
|
707
|
-
getBySession: async (sessionId) => (await getClient()).sandbox.getBySession(sessionId),
|
|
708
|
-
list: async (opts) => (await getClient()).sandbox.list(opts),
|
|
709
|
-
tag: {
|
|
710
|
-
set: async (opts) => (await getClient()).sandbox.tag.set(opts)
|
|
711
|
-
}
|
|
712
|
-
},
|
|
713
|
-
command: {
|
|
714
|
-
get: async (id) => (await getClient()).command.get(id),
|
|
715
|
-
set: async (command) => (await getClient()).command.set(command),
|
|
716
|
-
list: async (sessionId, opts) => (await getClient()).command.list(sessionId, opts)
|
|
717
|
-
}
|
|
718
|
-
};
|
|
348
|
+
function getStorage(opts) {
|
|
349
|
+
const name = opts.config.name ?? DEFAULT_NAMESPACE;
|
|
350
|
+
return getStorageClient(opts.rpc, name);
|
|
719
351
|
}
|
|
352
|
+
var DEFAULT_NAMESPACE, LOCAL_STORAGE_VERSION;
|
|
720
353
|
var init_client = __esm({
|
|
721
354
|
"src/storage/client.ts"() {
|
|
722
355
|
"use strict";
|
|
723
356
|
init_errors();
|
|
357
|
+
DEFAULT_NAMESPACE = "default";
|
|
358
|
+
LOCAL_STORAGE_VERSION = "v1";
|
|
724
359
|
}
|
|
725
360
|
});
|
|
726
361
|
|
|
@@ -731,12 +366,13 @@ function ListResultSchema(itemSchema) {
|
|
|
731
366
|
nextCursor: import_zod.z.string().nullable()
|
|
732
367
|
});
|
|
733
368
|
}
|
|
734
|
-
var import_zod, VercelLifecycleConfigSchema, SandboxConfigSchema, SessionSchema, MessageSchema, PartSchema, CommandResultSchema, SandboxRecordSchema, CommandBaseSchema, CommandSchema, methods;
|
|
369
|
+
var import_zod, VercelLifecycleConfigSchema, SandboxConfigSchema, GenerationSchema, SessionSchema, StepUsageSchema, UsageSummarySchema, MessageUsageSchema, MessageSchema, PartSchema, CommandResultSchema, SandboxRecordSchema, CommandBaseSchema, CommandSchema, methods, STORAGE_RPC_METHODS;
|
|
735
370
|
var init_rpc = __esm({
|
|
736
371
|
"src/storage/rpc.ts"() {
|
|
737
372
|
"use strict";
|
|
738
373
|
import_zod = require("zod");
|
|
739
374
|
VercelLifecycleConfigSchema = import_zod.z.object({
|
|
375
|
+
pollIntervalMs: import_zod.z.number().optional(),
|
|
740
376
|
stopAfterInactiveMs: import_zod.z.number().optional(),
|
|
741
377
|
snapshotBeforeTimeoutMs: import_zod.z.number().optional(),
|
|
742
378
|
snapshotId: import_zod.z.string().optional(),
|
|
@@ -759,6 +395,16 @@ var init_rpc = __esm({
|
|
|
759
395
|
headers: import_zod.z.record(import_zod.z.string(), import_zod.z.string()).optional()
|
|
760
396
|
})
|
|
761
397
|
]);
|
|
398
|
+
GenerationSchema = import_zod.z.object({
|
|
399
|
+
maxSteps: import_zod.z.number().optional(),
|
|
400
|
+
temperature: import_zod.z.number().optional(),
|
|
401
|
+
topK: import_zod.z.number().optional(),
|
|
402
|
+
topP: import_zod.z.number().optional(),
|
|
403
|
+
frequencyPenalty: import_zod.z.number().optional(),
|
|
404
|
+
presencePenalty: import_zod.z.number().optional(),
|
|
405
|
+
maxOutputTokens: import_zod.z.number().optional(),
|
|
406
|
+
headers: import_zod.z.record(import_zod.z.string(), import_zod.z.string()).optional()
|
|
407
|
+
});
|
|
762
408
|
SessionSchema = import_zod.z.object({
|
|
763
409
|
id: import_zod.z.string(),
|
|
764
410
|
createdAt: import_zod.z.number(),
|
|
@@ -766,22 +412,47 @@ var init_rpc = __esm({
|
|
|
766
412
|
runId: import_zod.z.string().nullable(),
|
|
767
413
|
lastMessageId: import_zod.z.string().nullable(),
|
|
768
414
|
tags: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).nullable(),
|
|
769
|
-
|
|
415
|
+
system: import_zod.z.string().nullable(),
|
|
770
416
|
model: import_zod.z.string().nullable(),
|
|
771
|
-
mcp: import_zod.z.unknown().nullable(),
|
|
772
|
-
// TODO
|
|
773
417
|
sandboxId: import_zod.z.string().nullable(),
|
|
774
418
|
skillsDir: import_zod.z.array(import_zod.z.string()).nullable(),
|
|
775
|
-
hookToken: import_zod.z.string().nullable()
|
|
419
|
+
hookToken: import_zod.z.string().nullable(),
|
|
420
|
+
activeTools: import_zod.z.array(import_zod.z.string()).nullable(),
|
|
421
|
+
generation: GenerationSchema.nullable().default(null)
|
|
422
|
+
});
|
|
423
|
+
StepUsageSchema = import_zod.z.object({
|
|
424
|
+
stepIndex: import_zod.z.number(),
|
|
425
|
+
model: import_zod.z.string(),
|
|
426
|
+
inputTokens: import_zod.z.number(),
|
|
427
|
+
outputTokens: import_zod.z.number(),
|
|
428
|
+
totalTokens: import_zod.z.number(),
|
|
429
|
+
cacheReadTokens: import_zod.z.number(),
|
|
430
|
+
cacheWriteTokens: import_zod.z.number(),
|
|
431
|
+
reasoningTokens: import_zod.z.number()
|
|
432
|
+
});
|
|
433
|
+
UsageSummarySchema = import_zod.z.object({
|
|
434
|
+
model: import_zod.z.string(),
|
|
435
|
+
inputTokens: import_zod.z.number(),
|
|
436
|
+
outputTokens: import_zod.z.number(),
|
|
437
|
+
totalTokens: import_zod.z.number(),
|
|
438
|
+
cacheReadTokens: import_zod.z.number(),
|
|
439
|
+
cacheWriteTokens: import_zod.z.number(),
|
|
440
|
+
reasoningTokens: import_zod.z.number(),
|
|
441
|
+
stepCount: import_zod.z.number()
|
|
442
|
+
});
|
|
443
|
+
MessageUsageSchema = import_zod.z.object({
|
|
444
|
+
steps: import_zod.z.array(StepUsageSchema),
|
|
445
|
+
summary: UsageSummarySchema
|
|
776
446
|
});
|
|
777
447
|
MessageSchema = import_zod.z.object({
|
|
778
448
|
id: import_zod.z.string(),
|
|
779
449
|
sessionId: import_zod.z.string(),
|
|
780
450
|
role: import_zod.z.enum(["user", "assistant", "system"]),
|
|
781
451
|
createdAt: import_zod.z.number(),
|
|
452
|
+
startedAt: import_zod.z.number().nullable(),
|
|
782
453
|
completedAt: import_zod.z.number().nullable(),
|
|
783
454
|
interruptedAt: import_zod.z.number().nullable(),
|
|
784
|
-
|
|
455
|
+
usage: MessageUsageSchema.nullable()
|
|
785
456
|
});
|
|
786
457
|
PartSchema = import_zod.z.object({
|
|
787
458
|
id: import_zod.z.string(),
|
|
@@ -915,6 +586,10 @@ var init_rpc = __esm({
|
|
|
915
586
|
params: PartSchema,
|
|
916
587
|
result: PartSchema
|
|
917
588
|
},
|
|
589
|
+
"part.delete": {
|
|
590
|
+
params: import_zod.z.object({ id: import_zod.z.string() }),
|
|
591
|
+
result: import_zod.z.void()
|
|
592
|
+
},
|
|
918
593
|
"sandbox.get": {
|
|
919
594
|
params: import_zod.z.object({ key: import_zod.z.string() }),
|
|
920
595
|
result: SandboxRecordSchema.nullable()
|
|
@@ -966,6 +641,7 @@ var init_rpc = __esm({
|
|
|
966
641
|
result: ListResultSchema(CommandSchema)
|
|
967
642
|
}
|
|
968
643
|
};
|
|
644
|
+
STORAGE_RPC_METHODS = Object.keys(methods);
|
|
969
645
|
}
|
|
970
646
|
});
|
|
971
647
|
|
|
@@ -1011,16 +687,11 @@ var init_handler = __esm({
|
|
|
1011
687
|
// src/storage/index.ts
|
|
1012
688
|
var storage_exports = {};
|
|
1013
689
|
__export(storage_exports, {
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
PartSchema: () => PartSchema,
|
|
1018
|
-
SandboxConfigSchema: () => SandboxConfigSchema,
|
|
1019
|
-
SandboxRecordSchema: () => SandboxRecordSchema,
|
|
1020
|
-
SessionSchema: () => SessionSchema,
|
|
690
|
+
DEFAULT_NAMESPACE: () => DEFAULT_NAMESPACE,
|
|
691
|
+
LOCAL_STORAGE_VERSION: () => LOCAL_STORAGE_VERSION,
|
|
692
|
+
STORAGE_RPC_METHODS: () => STORAGE_RPC_METHODS,
|
|
1021
693
|
getStorage: () => getStorage,
|
|
1022
|
-
handleStorageRpc: () => handleStorageRpc
|
|
1023
|
-
methods: () => methods
|
|
694
|
+
handleStorageRpc: () => handleStorageRpc
|
|
1024
695
|
});
|
|
1025
696
|
var init_storage = __esm({
|
|
1026
697
|
"src/storage/index.ts"() {
|
|
@@ -1031,858 +702,111 @@ var init_storage = __esm({
|
|
|
1031
702
|
}
|
|
1032
703
|
});
|
|
1033
704
|
|
|
1034
|
-
// src/sandbox/
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
705
|
+
// src/sandbox/bindings/lifecycle-workflow.ts
|
|
706
|
+
var lifecycle_workflow_exports = {};
|
|
707
|
+
__export(lifecycle_workflow_exports, {
|
|
708
|
+
sandboxLifecycleWorkflow: () => sandboxLifecycleWorkflow
|
|
709
|
+
});
|
|
710
|
+
module.exports = __toCommonJS(lifecycle_workflow_exports);
|
|
711
|
+
var import_workflow = require("workflow");
|
|
712
|
+
|
|
713
|
+
// src/sandbox/bindings/lifecycle-workflow-steps.ts
|
|
714
|
+
var DEFAULT_POLL_INTERVAL_MS = 2 * 60 * 1e3;
|
|
715
|
+
var DEFAULT_IDLE_TIMEOUT_MS = 5 * 60 * 1e3;
|
|
716
|
+
var SNAPSHOT_BEFORE_TIMEOUT_MS = 10 * 60 * 1e3;
|
|
717
|
+
var getTestCredentials = () => process.env.NODE_ENV === "test" ? {
|
|
718
|
+
token: process.env.TEST_VERCEL_TOKEN,
|
|
719
|
+
teamId: process.env.TEST_VERCEL_TEAM_ID,
|
|
720
|
+
projectId: process.env.TEST_VERCEL_PROJECT_ID
|
|
721
|
+
} : {};
|
|
722
|
+
async function checkAndSnapshotStep(input) {
|
|
723
|
+
"use step";
|
|
724
|
+
const { Sandbox: VercelSandboxSDK } = await Promise.resolve().then(() => (init_vercel_sdk(), vercel_sdk_exports));
|
|
725
|
+
const { getStorage: getStorage2 } = await Promise.resolve().then(() => (init_storage(), storage_exports));
|
|
726
|
+
const storage = getStorage2({
|
|
727
|
+
config: input.storageConfig,
|
|
728
|
+
rpc: input.rpc
|
|
1050
729
|
});
|
|
1051
|
-
|
|
1052
|
-
|
|
730
|
+
const record = await storage.sandbox.get(input.id);
|
|
731
|
+
if (record instanceof Error) {
|
|
732
|
+
return { action: "exit", reason: "not_found" };
|
|
733
|
+
}
|
|
734
|
+
const currentSandboxId = record.providerMetadata?.provider === "vercel" ? record.providerMetadata.sandboxId : null;
|
|
735
|
+
if (currentSandboxId !== input.vercelSandboxId) {
|
|
736
|
+
return { action: "exit", reason: "sandboxId_changed" };
|
|
737
|
+
}
|
|
738
|
+
if (!currentSandboxId) {
|
|
739
|
+
return { action: "exit", reason: "not_found" };
|
|
740
|
+
}
|
|
741
|
+
const config = record.config;
|
|
742
|
+
if (config.type !== "vercel") {
|
|
743
|
+
return { action: "exit", reason: "not_found" };
|
|
744
|
+
}
|
|
745
|
+
const pollIntervalMs = config.lifecycle?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
746
|
+
const idleTimeoutMs = config.lifecycle?.stopAfterInactiveMs ?? DEFAULT_IDLE_TIMEOUT_MS;
|
|
747
|
+
const snapshotBeforeTimeoutMs = config.lifecycle?.snapshotBeforeTimeoutMs ?? SNAPSHOT_BEFORE_TIMEOUT_MS;
|
|
748
|
+
const now = Date.now();
|
|
749
|
+
const lastActivity = record.lastActivityAt ?? record.createdAt ?? now;
|
|
750
|
+
const idleDuration = now - lastActivity;
|
|
751
|
+
const shouldSnapshotDueToIdle = idleDuration > idleTimeoutMs;
|
|
752
|
+
let shouldSnapshotDueToTimeout = false;
|
|
753
|
+
try {
|
|
754
|
+
const sandbox = await VercelSandboxSDK.get({
|
|
755
|
+
sandboxId: currentSandboxId,
|
|
756
|
+
...getTestCredentials()
|
|
757
|
+
});
|
|
758
|
+
if (sandbox.timeout < snapshotBeforeTimeoutMs) {
|
|
759
|
+
shouldSnapshotDueToTimeout = true;
|
|
760
|
+
}
|
|
761
|
+
} catch {
|
|
762
|
+
return { action: "exit", reason: "not_found" };
|
|
1053
763
|
}
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
const base64Content = toBase64(file.content);
|
|
1060
|
-
if (base64Content.length < CHUNK_SIZE) {
|
|
1061
|
-
const marker = `EOF_${i}`;
|
|
1062
|
-
const execResult = await sandbox.exec({
|
|
1063
|
-
command: "bash",
|
|
1064
|
-
args: [
|
|
1065
|
-
"-c",
|
|
1066
|
-
`base64 -d > ${quote(fullPath)} << '${marker}'
|
|
1067
|
-
${base64Content}
|
|
1068
|
-
${marker}`
|
|
1069
|
-
]
|
|
1070
|
-
});
|
|
1071
|
-
if (execResult instanceof Error) {
|
|
1072
|
-
throw execResult;
|
|
1073
|
-
}
|
|
1074
|
-
const { exitCode, stderr } = await execResult.result;
|
|
1075
|
-
if (exitCode !== 0) {
|
|
1076
|
-
throw new Error(
|
|
1077
|
-
`writeFiles failed with exit code ${exitCode}: ${stderr}`
|
|
1078
|
-
);
|
|
1079
|
-
}
|
|
1080
|
-
} else {
|
|
1081
|
-
const tempB64 = `/tmp/chunk-${Date.now()}-${i}.b64`;
|
|
1082
|
-
const clearResult = await sandbox.exec({
|
|
1083
|
-
command: "bash",
|
|
1084
|
-
args: ["-c", `> ${quote(tempB64)}`]
|
|
764
|
+
if (shouldSnapshotDueToIdle || shouldSnapshotDueToTimeout) {
|
|
765
|
+
try {
|
|
766
|
+
const sandbox = await VercelSandboxSDK.get({
|
|
767
|
+
sandboxId: currentSandboxId,
|
|
768
|
+
...getTestCredentials()
|
|
1085
769
|
});
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
args: [
|
|
1096
|
-
"-c",
|
|
1097
|
-
`cat >> ${quote(tempB64)} << '${marker}'
|
|
1098
|
-
${chunk}
|
|
1099
|
-
${marker}`
|
|
1100
|
-
]
|
|
1101
|
-
});
|
|
1102
|
-
if (appendResult instanceof Error) {
|
|
1103
|
-
throw appendResult;
|
|
1104
|
-
}
|
|
1105
|
-
const { exitCode: exitCode2, stderr: stderr2 } = await appendResult.result;
|
|
1106
|
-
if (exitCode2 !== 0) {
|
|
1107
|
-
throw new Error(
|
|
1108
|
-
`writeFiles chunk failed with exit code ${exitCode2}: ${stderr2}`
|
|
1109
|
-
);
|
|
770
|
+
const snapshot = await sandbox.snapshot();
|
|
771
|
+
await storage.sandbox.set({
|
|
772
|
+
...record,
|
|
773
|
+
acquiringLockId: null,
|
|
774
|
+
acquiringLockAt: null,
|
|
775
|
+
providerMetadata: {
|
|
776
|
+
provider: "vercel",
|
|
777
|
+
sandboxId: null,
|
|
778
|
+
snapshotId: snapshot.snapshotId
|
|
1110
779
|
}
|
|
1111
|
-
}
|
|
1112
|
-
const decodeResult = await sandbox.exec({
|
|
1113
|
-
command: "bash",
|
|
1114
|
-
args: [
|
|
1115
|
-
"-c",
|
|
1116
|
-
`base64 -d < ${quote(tempB64)} > ${quote(fullPath)} && rm -f ${quote(tempB64)}`
|
|
1117
|
-
]
|
|
1118
780
|
});
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
}
|
|
1122
|
-
const { exitCode, stderr } = await decodeResult.result;
|
|
1123
|
-
if (exitCode !== 0) {
|
|
1124
|
-
throw new Error(
|
|
1125
|
-
`writeFiles decode failed with exit code ${exitCode}: ${stderr}`
|
|
1126
|
-
);
|
|
1127
|
-
}
|
|
1128
|
-
}
|
|
1129
|
-
}
|
|
1130
|
-
if (shellScripts.length > 0) {
|
|
1131
|
-
const chmodResult = await sandbox.exec({
|
|
1132
|
-
command: "chmod",
|
|
1133
|
-
args: ["+x", ...shellScripts]
|
|
1134
|
-
});
|
|
1135
|
-
if (chmodResult instanceof Error) {
|
|
1136
|
-
throw chmodResult;
|
|
781
|
+
} catch (e) {
|
|
782
|
+
return e instanceof Error ? e : new Error(String(e));
|
|
1137
783
|
}
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
function toBase64(content) {
|
|
1142
|
-
if (typeof content === "string") {
|
|
1143
|
-
return Buffer.from(content).toString("base64");
|
|
1144
|
-
}
|
|
1145
|
-
return content.toString("base64");
|
|
1146
|
-
}
|
|
1147
|
-
function quote(s) {
|
|
1148
|
-
return `'${s.replace(/'/g, "'\\''")}'`;
|
|
1149
|
-
}
|
|
1150
|
-
var path;
|
|
1151
|
-
var init_write_files = __esm({
|
|
1152
|
-
"src/sandbox/write-files.ts"() {
|
|
1153
|
-
"use strict";
|
|
1154
|
-
path = __toESM(require("path"));
|
|
1155
|
-
}
|
|
1156
|
-
});
|
|
1157
|
-
|
|
1158
|
-
// src/sandbox/bindings/local.ts
|
|
1159
|
-
var import_node_child_process, errore2, import_ulid, localSandbox;
|
|
1160
|
-
var init_local2 = __esm({
|
|
1161
|
-
"src/sandbox/bindings/local.ts"() {
|
|
1162
|
-
"use strict";
|
|
1163
|
-
import_node_child_process = require("child_process");
|
|
1164
|
-
errore2 = __toESM(require("errore"));
|
|
1165
|
-
import_ulid = require("ulid");
|
|
1166
|
-
init_errors();
|
|
1167
|
-
init_storage();
|
|
1168
|
-
init_write_files();
|
|
1169
|
-
localSandbox = ({
|
|
1170
|
-
sandboxRecord,
|
|
1171
|
-
storageConfig
|
|
1172
|
-
}) => {
|
|
1173
|
-
const config = sandboxRecord.config;
|
|
1174
|
-
const basePath = config.path ?? process.cwd();
|
|
1175
|
-
const processes = /* @__PURE__ */ new Map();
|
|
1176
|
-
const storage = getStorage(storageConfig);
|
|
1177
|
-
const sandbox = {
|
|
1178
|
-
id: sandboxRecord.id,
|
|
1179
|
-
config: sandboxRecord.config,
|
|
1180
|
-
exec: ({ command, args, signal }) => {
|
|
1181
|
-
return errore2.tryAsync({
|
|
1182
|
-
try: () => {
|
|
1183
|
-
const commandId = `command_${(0, import_ulid.ulid)()}`;
|
|
1184
|
-
const child = (0, import_node_child_process.spawn)(command, args, {
|
|
1185
|
-
cwd: basePath,
|
|
1186
|
-
signal
|
|
1187
|
-
});
|
|
1188
|
-
processes.set(commandId, child);
|
|
1189
|
-
let stdout = "";
|
|
1190
|
-
let stderr = "";
|
|
1191
|
-
const logQueue = [];
|
|
1192
|
-
let logResolve = null;
|
|
1193
|
-
let closed = false;
|
|
1194
|
-
child.stdout.on("data", (data) => {
|
|
1195
|
-
const str = String(data);
|
|
1196
|
-
stdout += str;
|
|
1197
|
-
logQueue.push({ stream: "stdout", data: str });
|
|
1198
|
-
logResolve?.();
|
|
1199
|
-
});
|
|
1200
|
-
child.stderr.on("data", (data) => {
|
|
1201
|
-
const str = String(data);
|
|
1202
|
-
stderr += str;
|
|
1203
|
-
logQueue.push({ stream: "stderr", data: str });
|
|
1204
|
-
logResolve?.();
|
|
1205
|
-
});
|
|
1206
|
-
const result = new Promise((resolve, reject) => {
|
|
1207
|
-
child.on("error", (err) => {
|
|
1208
|
-
processes.delete(commandId);
|
|
1209
|
-
closed = true;
|
|
1210
|
-
logResolve?.();
|
|
1211
|
-
reject(err);
|
|
1212
|
-
});
|
|
1213
|
-
child.on("close", (code) => {
|
|
1214
|
-
processes.delete(commandId);
|
|
1215
|
-
closed = true;
|
|
1216
|
-
logResolve?.();
|
|
1217
|
-
resolve({ stdout, stderr, exitCode: code ?? 0 });
|
|
1218
|
-
});
|
|
1219
|
-
});
|
|
1220
|
-
async function* logs() {
|
|
1221
|
-
while (!closed || logQueue.length > 0) {
|
|
1222
|
-
const entry = logQueue.shift();
|
|
1223
|
-
if (entry) {
|
|
1224
|
-
yield entry;
|
|
1225
|
-
} else if (!closed) {
|
|
1226
|
-
await new Promise((resolve) => {
|
|
1227
|
-
logResolve = resolve;
|
|
1228
|
-
});
|
|
1229
|
-
logResolve = null;
|
|
1230
|
-
}
|
|
1231
|
-
}
|
|
1232
|
-
}
|
|
1233
|
-
return Promise.resolve({ commandId, logs, result });
|
|
1234
|
-
},
|
|
1235
|
-
catch: (e) => new SandboxError({ reason: String(e), cause: e })
|
|
1236
|
-
});
|
|
1237
|
-
},
|
|
1238
|
-
getDomain: (port) => {
|
|
1239
|
-
return Promise.resolve(`http://localhost:${port}`);
|
|
1240
|
-
},
|
|
1241
|
-
kill: async ({ commandId, storage: storage2 }) => {
|
|
1242
|
-
const child = processes.get(commandId);
|
|
1243
|
-
if (!child) {
|
|
1244
|
-
return new SandboxError({
|
|
1245
|
-
reason: `Command ${commandId} not found or already finished`
|
|
1246
|
-
});
|
|
1247
|
-
}
|
|
1248
|
-
child.kill("SIGTERM");
|
|
1249
|
-
const cmd = await storage2.command.get(commandId);
|
|
1250
|
-
if (cmd instanceof Error) {
|
|
1251
|
-
return new SandboxError({ reason: cmd.message, cause: cmd });
|
|
1252
|
-
}
|
|
1253
|
-
if (cmd && cmd.status === "running") {
|
|
1254
|
-
const result = await storage2.command.set({
|
|
1255
|
-
...cmd,
|
|
1256
|
-
status: "killed"
|
|
1257
|
-
});
|
|
1258
|
-
if (result instanceof Error) {
|
|
1259
|
-
return new SandboxError({ reason: result.message, cause: result });
|
|
1260
|
-
}
|
|
1261
|
-
}
|
|
1262
|
-
},
|
|
1263
|
-
writeFiles: (opts) => writeFiles({ sandbox, ...opts }),
|
|
1264
|
-
tag: {
|
|
1265
|
-
list: async () => {
|
|
1266
|
-
const sandboxRecord2 = await storage.sandbox.get(sandbox.id);
|
|
1267
|
-
if (sandboxRecord2 instanceof Error) {
|
|
1268
|
-
return sandboxRecord2;
|
|
1269
|
-
}
|
|
1270
|
-
return sandboxRecord2.tags ?? {};
|
|
1271
|
-
},
|
|
1272
|
-
get: async (key) => {
|
|
1273
|
-
const sandboxRecord2 = await storage.sandbox.get(sandbox.id);
|
|
1274
|
-
if (sandboxRecord2 instanceof Error) {
|
|
1275
|
-
return sandboxRecord2;
|
|
1276
|
-
}
|
|
1277
|
-
return sandboxRecord2.tags?.[key];
|
|
1278
|
-
},
|
|
1279
|
-
set: async (key, value) => {
|
|
1280
|
-
const result = await storage.sandbox.tag.set({
|
|
1281
|
-
sandboxId: sandbox.id,
|
|
1282
|
-
tags: { [key]: value }
|
|
1283
|
-
});
|
|
1284
|
-
if (result instanceof Error) {
|
|
1285
|
-
return result;
|
|
1286
|
-
}
|
|
1287
|
-
return void 0;
|
|
1288
|
-
},
|
|
1289
|
-
setMany: async (tags) => {
|
|
1290
|
-
const result = await storage.sandbox.tag.set({
|
|
1291
|
-
sandboxId: sandbox.id,
|
|
1292
|
-
tags
|
|
1293
|
-
});
|
|
1294
|
-
if (result instanceof Error) {
|
|
1295
|
-
return result;
|
|
1296
|
-
}
|
|
1297
|
-
return void 0;
|
|
1298
|
-
}
|
|
1299
|
-
}
|
|
1300
|
-
};
|
|
1301
|
-
return sandbox;
|
|
1302
|
-
};
|
|
1303
|
-
}
|
|
1304
|
-
});
|
|
1305
|
-
|
|
1306
|
-
// src/sandbox/bindings/vercel.ts
|
|
1307
|
-
var errore3, import_sandbox, VERCEL_MAX_TIMEOUT_MS, LOCK_TIMEOUT_MS, LOCK_POLL_INTERVAL_MS, getTestCredentials, createPromises, ACTIVITY_THROTTLE_MS, lastActivitySent, DEFAULT_VCPUS, vercelSandbox;
|
|
1308
|
-
var init_vercel2 = __esm({
|
|
1309
|
-
"src/sandbox/bindings/vercel.ts"() {
|
|
1310
|
-
"use strict";
|
|
1311
|
-
errore3 = __toESM(require("errore"));
|
|
1312
|
-
import_sandbox = require("sandbox");
|
|
1313
|
-
init_errors();
|
|
1314
|
-
init_storage();
|
|
1315
|
-
init_write_files();
|
|
1316
|
-
VERCEL_MAX_TIMEOUT_MS = 5 * 60 * 60 * 1e3;
|
|
1317
|
-
LOCK_TIMEOUT_MS = 2 * 60 * 1e3;
|
|
1318
|
-
LOCK_POLL_INTERVAL_MS = 200;
|
|
1319
|
-
getTestCredentials = () => process.env.NODE_ENV === "test" ? {
|
|
1320
|
-
token: process.env.TEST_VERCEL_TOKEN,
|
|
1321
|
-
teamId: process.env.TEST_VERCEL_TEAM_ID,
|
|
1322
|
-
projectId: process.env.TEST_VERCEL_PROJECT_ID
|
|
1323
|
-
} : {};
|
|
1324
|
-
createPromises = /* @__PURE__ */ new Map();
|
|
1325
|
-
ACTIVITY_THROTTLE_MS = 1e4;
|
|
1326
|
-
lastActivitySent = /* @__PURE__ */ new Map();
|
|
1327
|
-
DEFAULT_VCPUS = 2;
|
|
1328
|
-
vercelSandbox = ({
|
|
1329
|
-
sandboxRecord,
|
|
1330
|
-
storageConfig,
|
|
1331
|
-
enableLifecycleWorkflow = true,
|
|
1332
|
-
storage: storageOverride
|
|
1333
|
-
}) => {
|
|
1334
|
-
const { id, config } = sandboxRecord;
|
|
1335
|
-
const vcpus = config.resources?.vcpus ?? DEFAULT_VCPUS;
|
|
1336
|
-
const ports = config.ports;
|
|
1337
|
-
const storage = storageOverride ?? getStorage(storageConfig);
|
|
1338
|
-
const initialVercel = sandboxRecord.providerMetadata?.provider === "vercel" ? sandboxRecord.providerMetadata : null;
|
|
1339
|
-
let sandboxPromise = null;
|
|
1340
|
-
const HOME_DIR = "/home/vercel-sandbox";
|
|
1341
|
-
async function pollForSandboxId() {
|
|
1342
|
-
const deadline = Date.now() + LOCK_TIMEOUT_MS;
|
|
1343
|
-
while (Date.now() < deadline) {
|
|
1344
|
-
await new Promise((r) => setTimeout(r, LOCK_POLL_INTERVAL_MS));
|
|
1345
|
-
const record = await storage.sandbox.get(id);
|
|
1346
|
-
if (record instanceof Error) {
|
|
1347
|
-
return new SandboxError({ reason: record.message, cause: record });
|
|
1348
|
-
}
|
|
1349
|
-
const vercelSandboxId = record?.providerMetadata?.provider === "vercel" ? record.providerMetadata.sandboxId : null;
|
|
1350
|
-
if (vercelSandboxId) {
|
|
1351
|
-
return vercelSandboxId;
|
|
1352
|
-
}
|
|
1353
|
-
if (!record?.acquiringLockAt) {
|
|
1354
|
-
const finalCheck = await storage.sandbox.get(id);
|
|
1355
|
-
if (finalCheck instanceof Error) {
|
|
1356
|
-
return new SandboxError({
|
|
1357
|
-
reason: finalCheck.message,
|
|
1358
|
-
cause: finalCheck
|
|
1359
|
-
});
|
|
1360
|
-
}
|
|
1361
|
-
const finalVercelSandboxId = finalCheck?.providerMetadata?.provider === "vercel" ? finalCheck.providerMetadata.sandboxId : null;
|
|
1362
|
-
if (finalVercelSandboxId) {
|
|
1363
|
-
return finalVercelSandboxId;
|
|
1364
|
-
}
|
|
1365
|
-
return doGetOrCreateSandboxId();
|
|
1366
|
-
}
|
|
1367
|
-
}
|
|
1368
|
-
return new SandboxError({
|
|
1369
|
-
reason: "Timed out waiting for sandbox creation by another process"
|
|
1370
|
-
});
|
|
1371
|
-
}
|
|
1372
|
-
async function createSandboxFromSnapshot(snapshotId) {
|
|
1373
|
-
return await errore3.tryAsync({
|
|
1374
|
-
try: async () => {
|
|
1375
|
-
const sandbox2 = await import_sandbox.Sandbox.create({
|
|
1376
|
-
source: { type: "snapshot", snapshotId },
|
|
1377
|
-
resources: { vcpus },
|
|
1378
|
-
timeout: VERCEL_MAX_TIMEOUT_MS,
|
|
1379
|
-
ports,
|
|
1380
|
-
...getTestCredentials()
|
|
1381
|
-
});
|
|
1382
|
-
const now = Date.now();
|
|
1383
|
-
await storage.sandbox.set({
|
|
1384
|
-
id,
|
|
1385
|
-
config,
|
|
1386
|
-
tags: sandboxRecord.tags,
|
|
1387
|
-
createdAt: now,
|
|
1388
|
-
lastActivityAt: now,
|
|
1389
|
-
acquiringLockId: null,
|
|
1390
|
-
acquiringLockAt: null,
|
|
1391
|
-
providerMetadata: {
|
|
1392
|
-
provider: "vercel",
|
|
1393
|
-
sandboxId: sandbox2.sandboxId,
|
|
1394
|
-
snapshotId
|
|
1395
|
-
}
|
|
1396
|
-
});
|
|
1397
|
-
return sandbox2.sandboxId;
|
|
1398
|
-
},
|
|
1399
|
-
catch: (e) => new SandboxError({ reason: String(e), cause: e })
|
|
1400
|
-
});
|
|
1401
|
-
}
|
|
1402
|
-
async function createFreshSandbox() {
|
|
1403
|
-
return await errore3.tryAsync({
|
|
1404
|
-
try: async () => {
|
|
1405
|
-
const sandbox2 = await import_sandbox.Sandbox.create({
|
|
1406
|
-
resources: { vcpus },
|
|
1407
|
-
timeout: VERCEL_MAX_TIMEOUT_MS,
|
|
1408
|
-
ports,
|
|
1409
|
-
...getTestCredentials()
|
|
1410
|
-
});
|
|
1411
|
-
const now = Date.now();
|
|
1412
|
-
await storage.sandbox.set({
|
|
1413
|
-
id,
|
|
1414
|
-
config,
|
|
1415
|
-
tags: sandboxRecord.tags,
|
|
1416
|
-
createdAt: now,
|
|
1417
|
-
lastActivityAt: now,
|
|
1418
|
-
acquiringLockId: null,
|
|
1419
|
-
acquiringLockAt: null,
|
|
1420
|
-
providerMetadata: {
|
|
1421
|
-
provider: "vercel",
|
|
1422
|
-
sandboxId: sandbox2.sandboxId,
|
|
1423
|
-
snapshotId: null
|
|
1424
|
-
}
|
|
1425
|
-
});
|
|
1426
|
-
return sandbox2.sandboxId;
|
|
1427
|
-
},
|
|
1428
|
-
catch: (e) => new SandboxError({ reason: String(e), cause: e })
|
|
1429
|
-
});
|
|
1430
|
-
}
|
|
1431
|
-
async function doGetOrCreateSandboxId() {
|
|
1432
|
-
if (initialVercel?.sandboxId) {
|
|
1433
|
-
return initialVercel.sandboxId;
|
|
1434
|
-
}
|
|
1435
|
-
const existing = await storage.sandbox.get(id);
|
|
1436
|
-
if (existing instanceof Error) {
|
|
1437
|
-
if (existing instanceof SandboxNotFoundError) {
|
|
1438
|
-
} else {
|
|
1439
|
-
return new SandboxError({ reason: existing.message, cause: existing });
|
|
1440
|
-
}
|
|
1441
|
-
}
|
|
1442
|
-
const existingRecord = existing instanceof SandboxNotFoundError ? null : existing;
|
|
1443
|
-
const existingVercel = existingRecord?.providerMetadata?.provider === "vercel" ? existingRecord.providerMetadata : null;
|
|
1444
|
-
if (existingVercel?.sandboxId) {
|
|
1445
|
-
return existingVercel.sandboxId;
|
|
1446
|
-
}
|
|
1447
|
-
const hasActiveLock = existingRecord?.acquiringLockId && existingRecord.acquiringLockAt && Date.now() - existingRecord.acquiringLockAt < LOCK_TIMEOUT_MS;
|
|
1448
|
-
if (hasActiveLock) {
|
|
1449
|
-
return pollForSandboxId();
|
|
1450
|
-
}
|
|
1451
|
-
const lockId = crypto.randomUUID();
|
|
1452
|
-
const now = Date.now();
|
|
1453
|
-
await storage.sandbox.set({
|
|
1454
|
-
id,
|
|
1455
|
-
config,
|
|
1456
|
-
tags: existingRecord?.tags ?? sandboxRecord.tags,
|
|
1457
|
-
createdAt: existingRecord?.createdAt ?? sandboxRecord.createdAt,
|
|
1458
|
-
lastActivityAt: existingRecord?.lastActivityAt ?? sandboxRecord.lastActivityAt,
|
|
1459
|
-
acquiringLockId: lockId,
|
|
1460
|
-
acquiringLockAt: now,
|
|
1461
|
-
providerMetadata: {
|
|
1462
|
-
provider: "vercel",
|
|
1463
|
-
sandboxId: null,
|
|
1464
|
-
snapshotId: existingVercel?.snapshotId ?? initialVercel?.snapshotId ?? null
|
|
1465
|
-
}
|
|
1466
|
-
});
|
|
1467
|
-
const afterLock = await storage.sandbox.get(id);
|
|
1468
|
-
if (afterLock instanceof Error) {
|
|
1469
|
-
return new SandboxError({ reason: afterLock.message, cause: afterLock });
|
|
1470
|
-
}
|
|
1471
|
-
if (afterLock?.acquiringLockId !== lockId) {
|
|
1472
|
-
return pollForSandboxId();
|
|
1473
|
-
}
|
|
1474
|
-
const snapshotId = existingVercel?.snapshotId ?? initialVercel?.snapshotId ?? config.lifecycle?.snapshotId;
|
|
1475
|
-
if (snapshotId) {
|
|
1476
|
-
const result = await createSandboxFromSnapshot(snapshotId);
|
|
1477
|
-
if (!(result instanceof Error)) {
|
|
1478
|
-
return result;
|
|
1479
|
-
}
|
|
1480
|
-
}
|
|
1481
|
-
return createFreshSandbox();
|
|
1482
|
-
}
|
|
1483
|
-
function getOrCreateSandboxId() {
|
|
1484
|
-
const cached = createPromises.get(id);
|
|
1485
|
-
if (cached) {
|
|
1486
|
-
return cached;
|
|
1487
|
-
}
|
|
1488
|
-
const promise = doGetOrCreateSandboxId().finally(() => {
|
|
1489
|
-
createPromises.delete(id);
|
|
1490
|
-
});
|
|
1491
|
-
createPromises.set(id, promise);
|
|
1492
|
-
return promise;
|
|
1493
|
-
}
|
|
1494
|
-
async function doGetSandbox() {
|
|
1495
|
-
const vercelSandboxId = await getOrCreateSandboxId();
|
|
1496
|
-
if (vercelSandboxId instanceof Error) {
|
|
1497
|
-
return vercelSandboxId;
|
|
1498
|
-
}
|
|
1499
|
-
return errore3.tryAsync({
|
|
1500
|
-
try: () => import_sandbox.Sandbox.get({
|
|
1501
|
-
sandboxId: vercelSandboxId,
|
|
1502
|
-
...getTestCredentials()
|
|
1503
|
-
}),
|
|
1504
|
-
catch: (e) => new SandboxError({ reason: String(e), cause: e })
|
|
1505
|
-
});
|
|
1506
|
-
}
|
|
1507
|
-
function getSandbox2() {
|
|
1508
|
-
if (!sandboxPromise) {
|
|
1509
|
-
sandboxPromise = doGetSandbox();
|
|
1510
|
-
}
|
|
1511
|
-
return sandboxPromise;
|
|
1512
|
-
}
|
|
1513
|
-
async function updateLastActivity() {
|
|
1514
|
-
const now = Date.now();
|
|
1515
|
-
const lastSent = lastActivitySent.get(id);
|
|
1516
|
-
if (lastSent && now - lastSent < ACTIVITY_THROTTLE_MS) {
|
|
1517
|
-
return;
|
|
1518
|
-
}
|
|
1519
|
-
lastActivitySent.set(id, now);
|
|
1520
|
-
const existing = await storage.sandbox.get(id);
|
|
1521
|
-
if (existing instanceof Error || !existing) {
|
|
1522
|
-
return;
|
|
1523
|
-
}
|
|
1524
|
-
const existingVercel = existing.providerMetadata?.provider === "vercel" ? existing.providerMetadata : null;
|
|
1525
|
-
await storage.sandbox.set({
|
|
1526
|
-
id: existing.id,
|
|
1527
|
-
config: existing.config,
|
|
1528
|
-
tags: existing.tags,
|
|
1529
|
-
createdAt: existing.createdAt,
|
|
1530
|
-
lastActivityAt: now,
|
|
1531
|
-
acquiringLockId: null,
|
|
1532
|
-
acquiringLockAt: null,
|
|
1533
|
-
providerMetadata: existingVercel ?? {
|
|
1534
|
-
provider: "vercel",
|
|
1535
|
-
sandboxId: null,
|
|
1536
|
-
snapshotId: null
|
|
1537
|
-
}
|
|
1538
|
-
});
|
|
1539
|
-
if (enableLifecycleWorkflow) {
|
|
1540
|
-
}
|
|
1541
|
-
}
|
|
1542
|
-
const lifecycle = {
|
|
1543
|
-
start: async () => {
|
|
1544
|
-
const sandbox2 = await getSandbox2();
|
|
1545
|
-
if (sandbox2 instanceof Error) {
|
|
1546
|
-
return sandbox2;
|
|
1547
|
-
}
|
|
1548
|
-
await updateLastActivity();
|
|
1549
|
-
return sandbox2.status;
|
|
1550
|
-
},
|
|
1551
|
-
snapshot: async () => {
|
|
1552
|
-
const sandbox2 = await getSandbox2();
|
|
1553
|
-
if (sandbox2 instanceof Error) {
|
|
1554
|
-
return sandbox2;
|
|
1555
|
-
}
|
|
1556
|
-
return errore3.tryAsync({
|
|
1557
|
-
try: async () => {
|
|
1558
|
-
const existing = await storage.sandbox.get(id);
|
|
1559
|
-
const snapshot = await sandbox2.snapshot();
|
|
1560
|
-
await storage.sandbox.set({
|
|
1561
|
-
id,
|
|
1562
|
-
config,
|
|
1563
|
-
tags: existing instanceof Error ? null : existing?.tags ?? null,
|
|
1564
|
-
createdAt: existing instanceof Error ? null : existing?.createdAt ?? null,
|
|
1565
|
-
lastActivityAt: existing instanceof Error ? null : existing?.lastActivityAt ?? null,
|
|
1566
|
-
acquiringLockId: null,
|
|
1567
|
-
acquiringLockAt: null,
|
|
1568
|
-
providerMetadata: {
|
|
1569
|
-
provider: "vercel",
|
|
1570
|
-
sandboxId: null,
|
|
1571
|
-
snapshotId: snapshot.snapshotId
|
|
1572
|
-
}
|
|
1573
|
-
});
|
|
1574
|
-
return { snapshotId: snapshot.snapshotId };
|
|
1575
|
-
},
|
|
1576
|
-
catch: (e) => new SandboxError({ reason: String(e), cause: e })
|
|
1577
|
-
});
|
|
1578
|
-
},
|
|
1579
|
-
stop: async () => {
|
|
1580
|
-
const sandbox2 = await getSandbox2();
|
|
1581
|
-
if (sandbox2 instanceof Error) {
|
|
1582
|
-
return sandbox2;
|
|
1583
|
-
}
|
|
1584
|
-
return errore3.tryAsync({
|
|
1585
|
-
try: async () => {
|
|
1586
|
-
await sandbox2.stop();
|
|
1587
|
-
const existing = await storage.sandbox.get(id);
|
|
1588
|
-
if (existing instanceof Error || !existing) {
|
|
1589
|
-
return void 0;
|
|
1590
|
-
}
|
|
1591
|
-
await storage.sandbox.set({
|
|
1592
|
-
id: existing.id,
|
|
1593
|
-
config: existing.config,
|
|
1594
|
-
tags: existing.tags,
|
|
1595
|
-
createdAt: existing.createdAt,
|
|
1596
|
-
lastActivityAt: existing.lastActivityAt,
|
|
1597
|
-
acquiringLockId: null,
|
|
1598
|
-
acquiringLockAt: null,
|
|
1599
|
-
providerMetadata: {
|
|
1600
|
-
provider: "vercel",
|
|
1601
|
-
sandboxId: null,
|
|
1602
|
-
snapshotId: null
|
|
1603
|
-
}
|
|
1604
|
-
});
|
|
1605
|
-
return void 0;
|
|
1606
|
-
},
|
|
1607
|
-
catch: (e) => new SandboxError({ reason: String(e), cause: e })
|
|
1608
|
-
});
|
|
1609
|
-
},
|
|
1610
|
-
getStatus: async () => {
|
|
1611
|
-
const sandbox2 = await getSandbox2();
|
|
1612
|
-
if (sandbox2 instanceof Error) {
|
|
1613
|
-
return sandbox2;
|
|
1614
|
-
}
|
|
1615
|
-
return sandbox2.status;
|
|
1616
|
-
},
|
|
1617
|
-
getCreatedAt: async () => {
|
|
1618
|
-
const sandbox2 = await getSandbox2();
|
|
1619
|
-
if (sandbox2 instanceof Error) {
|
|
1620
|
-
return sandbox2;
|
|
1621
|
-
}
|
|
1622
|
-
return sandbox2.createdAt;
|
|
1623
|
-
},
|
|
1624
|
-
getRemainingTimeout: async () => {
|
|
1625
|
-
const sandbox2 = await getSandbox2();
|
|
1626
|
-
if (sandbox2 instanceof Error) {
|
|
1627
|
-
return sandbox2;
|
|
1628
|
-
}
|
|
1629
|
-
return sandbox2.timeout;
|
|
1630
|
-
}
|
|
1631
|
-
};
|
|
1632
|
-
const sandbox = {
|
|
1633
|
-
id,
|
|
1634
|
-
config,
|
|
1635
|
-
exec: async ({ command, args, signal }) => {
|
|
1636
|
-
const instance = await getSandbox2();
|
|
1637
|
-
if (instance instanceof Error) {
|
|
1638
|
-
return instance;
|
|
1639
|
-
}
|
|
1640
|
-
const updatePromise = updateLastActivity();
|
|
1641
|
-
const execResult = await errore3.tryAsync({
|
|
1642
|
-
try: async () => {
|
|
1643
|
-
const output = await instance.runCommand({
|
|
1644
|
-
cwd: HOME_DIR,
|
|
1645
|
-
args,
|
|
1646
|
-
cmd: command,
|
|
1647
|
-
signal
|
|
1648
|
-
});
|
|
1649
|
-
let stdout = "";
|
|
1650
|
-
let stderr = "";
|
|
1651
|
-
const logBuffer = [];
|
|
1652
|
-
const state = {
|
|
1653
|
-
resolve: null,
|
|
1654
|
-
consumed: false
|
|
1655
|
-
};
|
|
1656
|
-
const consumeLogs = (async () => {
|
|
1657
|
-
for await (const log of output.logs()) {
|
|
1658
|
-
const entry = log.stream === "stdout" ? { stream: "stdout", data: log.data } : { stream: "stderr", data: log.data };
|
|
1659
|
-
if (log.stream === "stdout") {
|
|
1660
|
-
stdout += log.data;
|
|
1661
|
-
} else {
|
|
1662
|
-
stderr += log.data;
|
|
1663
|
-
}
|
|
1664
|
-
logBuffer.push(entry);
|
|
1665
|
-
state.resolve?.();
|
|
1666
|
-
}
|
|
1667
|
-
state.consumed = true;
|
|
1668
|
-
state.resolve?.();
|
|
1669
|
-
})();
|
|
1670
|
-
async function* logs() {
|
|
1671
|
-
let index = 0;
|
|
1672
|
-
while (!state.consumed || index < logBuffer.length) {
|
|
1673
|
-
if (index < logBuffer.length) {
|
|
1674
|
-
yield logBuffer[index++];
|
|
1675
|
-
} else {
|
|
1676
|
-
await new Promise((resolve) => {
|
|
1677
|
-
state.resolve = resolve;
|
|
1678
|
-
});
|
|
1679
|
-
state.resolve = null;
|
|
1680
|
-
}
|
|
1681
|
-
}
|
|
1682
|
-
}
|
|
1683
|
-
const result = consumeLogs.then(() => ({
|
|
1684
|
-
stdout,
|
|
1685
|
-
stderr,
|
|
1686
|
-
exitCode: output.exitCode
|
|
1687
|
-
}));
|
|
1688
|
-
return { commandId: output.cmdId, logs, result };
|
|
1689
|
-
},
|
|
1690
|
-
catch: (e) => new SandboxError({ reason: String(e), cause: e })
|
|
1691
|
-
});
|
|
1692
|
-
await updatePromise;
|
|
1693
|
-
return execResult;
|
|
1694
|
-
},
|
|
1695
|
-
getDomain: async (port) => {
|
|
1696
|
-
const sandbox2 = await getSandbox2();
|
|
1697
|
-
if (sandbox2 instanceof Error) {
|
|
1698
|
-
return sandbox2;
|
|
1699
|
-
}
|
|
1700
|
-
try {
|
|
1701
|
-
return sandbox2.domain(port);
|
|
1702
|
-
} catch (e) {
|
|
1703
|
-
return new SandboxError({ reason: String(e), cause: e });
|
|
1704
|
-
}
|
|
1705
|
-
},
|
|
1706
|
-
kill: async ({ commandId, storage: cmdStorage }) => {
|
|
1707
|
-
const instance = await getSandbox2();
|
|
1708
|
-
if (instance instanceof Error) {
|
|
1709
|
-
return instance;
|
|
1710
|
-
}
|
|
1711
|
-
const cmd = await cmdStorage.command.get(commandId);
|
|
1712
|
-
if (cmd instanceof Error) {
|
|
1713
|
-
return new SandboxError({ reason: cmd.message, cause: cmd });
|
|
1714
|
-
}
|
|
1715
|
-
if (cmd && cmd.status === "running") {
|
|
1716
|
-
const result = await cmdStorage.command.set({
|
|
1717
|
-
...cmd,
|
|
1718
|
-
status: "killed"
|
|
1719
|
-
});
|
|
1720
|
-
if (result instanceof Error) {
|
|
1721
|
-
return new SandboxError({ reason: result.message, cause: result });
|
|
1722
|
-
}
|
|
1723
|
-
}
|
|
1724
|
-
return void 0;
|
|
1725
|
-
},
|
|
1726
|
-
writeFiles: (opts) => writeFiles({ sandbox, ...opts }),
|
|
1727
|
-
lifecycle,
|
|
1728
|
-
tag: {
|
|
1729
|
-
list: async () => {
|
|
1730
|
-
const sandboxRecord2 = await storage.sandbox.get(id);
|
|
1731
|
-
if (sandboxRecord2 instanceof Error) {
|
|
1732
|
-
return sandboxRecord2;
|
|
1733
|
-
}
|
|
1734
|
-
return sandboxRecord2.tags ?? {};
|
|
1735
|
-
},
|
|
1736
|
-
get: async (key) => {
|
|
1737
|
-
const sandboxRecord2 = await storage.sandbox.get(id);
|
|
1738
|
-
if (sandboxRecord2 instanceof Error) {
|
|
1739
|
-
return sandboxRecord2;
|
|
1740
|
-
}
|
|
1741
|
-
return sandboxRecord2.tags?.[key];
|
|
1742
|
-
},
|
|
1743
|
-
set: async (key, value) => {
|
|
1744
|
-
const result = await storage.sandbox.tag.set({
|
|
1745
|
-
sandboxId: id,
|
|
1746
|
-
tags: { [key]: value }
|
|
1747
|
-
});
|
|
1748
|
-
if (result instanceof Error) {
|
|
1749
|
-
return result;
|
|
1750
|
-
}
|
|
1751
|
-
return void 0;
|
|
1752
|
-
},
|
|
1753
|
-
setMany: async (tags) => {
|
|
1754
|
-
const result = await storage.sandbox.tag.set({
|
|
1755
|
-
sandboxId: id,
|
|
1756
|
-
tags
|
|
1757
|
-
});
|
|
1758
|
-
if (result instanceof Error) {
|
|
1759
|
-
return result;
|
|
1760
|
-
}
|
|
1761
|
-
return void 0;
|
|
1762
|
-
}
|
|
1763
|
-
}
|
|
1764
|
-
};
|
|
1765
|
-
if (config.lifecycle?.autoStart !== false) {
|
|
1766
|
-
sandboxPromise = doGetSandbox();
|
|
1767
|
-
}
|
|
1768
|
-
return sandbox;
|
|
784
|
+
return {
|
|
785
|
+
action: "exit",
|
|
786
|
+
reason: shouldSnapshotDueToIdle ? "idle" : "timeout"
|
|
1769
787
|
};
|
|
1770
788
|
}
|
|
1771
|
-
}
|
|
1772
|
-
|
|
1773
|
-
// src/sandbox/client.ts
|
|
1774
|
-
var client_exports = {};
|
|
1775
|
-
__export(client_exports, {
|
|
1776
|
-
getSandbox: () => getSandbox
|
|
1777
|
-
});
|
|
1778
|
-
function getSandbox({
|
|
1779
|
-
sandboxRecord,
|
|
1780
|
-
storageConfig
|
|
1781
|
-
}) {
|
|
1782
|
-
const { config } = sandboxRecord;
|
|
1783
|
-
switch (config.type) {
|
|
1784
|
-
case "local":
|
|
1785
|
-
return localSandbox({
|
|
1786
|
-
sandboxRecord,
|
|
1787
|
-
storageConfig
|
|
1788
|
-
});
|
|
1789
|
-
case "vercel":
|
|
1790
|
-
return vercelSandbox({
|
|
1791
|
-
sandboxRecord,
|
|
1792
|
-
storageConfig
|
|
1793
|
-
});
|
|
1794
|
-
case "custom":
|
|
1795
|
-
throw new Error("Custom sandboxes are not supported");
|
|
1796
|
-
default:
|
|
1797
|
-
config;
|
|
1798
|
-
throw new Error(
|
|
1799
|
-
`Unknown sandbox type: ${// biome-ignore lint/suspicious/noExplicitAny: .
|
|
1800
|
-
config.type}`
|
|
1801
|
-
);
|
|
1802
|
-
}
|
|
789
|
+
return { action: "continue", nextPollMs: pollIntervalMs };
|
|
1803
790
|
}
|
|
1804
|
-
var init_client2 = __esm({
|
|
1805
|
-
"src/sandbox/client.ts"() {
|
|
1806
|
-
"use strict";
|
|
1807
|
-
init_local2();
|
|
1808
|
-
init_vercel2();
|
|
1809
|
-
}
|
|
1810
|
-
});
|
|
1811
791
|
|
|
1812
|
-
// src/sandbox/lifecycle-workflow
|
|
1813
|
-
var
|
|
1814
|
-
__export(lifecycle_workflow_steps_exports, {
|
|
1815
|
-
snapshotSandboxStep: () => snapshotSandboxStep
|
|
1816
|
-
});
|
|
1817
|
-
async function snapshotSandboxStep(input) {
|
|
1818
|
-
"use step";
|
|
1819
|
-
const { getStorage: getStorage2 } = await Promise.resolve().then(() => (init_storage(), storage_exports));
|
|
1820
|
-
const { getSandbox: getSandbox2 } = await Promise.resolve().then(() => (init_client2(), client_exports));
|
|
1821
|
-
const storage = getStorage2(input.storageConfig);
|
|
1822
|
-
const sandboxRecord = await storage.sandbox.get(input.id);
|
|
1823
|
-
if (sandboxRecord instanceof Error) {
|
|
1824
|
-
return sandboxRecord;
|
|
1825
|
-
}
|
|
1826
|
-
const sandbox = getSandbox2({
|
|
1827
|
-
sandboxRecord,
|
|
1828
|
-
storageConfig: input.storageConfig
|
|
1829
|
-
});
|
|
1830
|
-
await sandbox.lifecycle?.snapshot();
|
|
1831
|
-
}
|
|
1832
|
-
var init_lifecycle_workflow_steps = __esm({
|
|
1833
|
-
"src/sandbox/lifecycle-workflow-steps.ts"() {
|
|
1834
|
-
"use strict";
|
|
1835
|
-
}
|
|
1836
|
-
});
|
|
1837
|
-
|
|
1838
|
-
// src/sandbox/lifecycle-workflow.ts
|
|
1839
|
-
var lifecycle_workflow_exports = {};
|
|
1840
|
-
__export(lifecycle_workflow_exports, {
|
|
1841
|
-
sandboxActivityHook: () => sandboxActivityHook,
|
|
1842
|
-
sandboxLifecycleWorkflow: () => sandboxLifecycleWorkflow
|
|
1843
|
-
});
|
|
1844
|
-
module.exports = __toCommonJS(lifecycle_workflow_exports);
|
|
1845
|
-
var import_workflow = require("workflow");
|
|
1846
|
-
var sandboxActivityHook = (0, import_workflow.defineHook)();
|
|
1847
|
-
var DEFAULT_IDLE_TIMEOUT_MS = 5 * 60 * 1e3;
|
|
792
|
+
// src/sandbox/bindings/lifecycle-workflow.ts
|
|
793
|
+
var DEFAULT_POLL_MS = 2 * 60 * 1e3;
|
|
1848
794
|
async function sandboxLifecycleWorkflow({
|
|
1849
795
|
input
|
|
1850
796
|
}) {
|
|
1851
797
|
"use workflow";
|
|
1852
|
-
|
|
1853
|
-
const iterator = activityHook[Symbol.asyncIterator]();
|
|
1854
|
-
let pendingNext = iterator.next();
|
|
1855
|
-
let sandboxConfig = input.initialConfig;
|
|
1856
|
-
if (sandboxConfig.type !== "vercel") {
|
|
1857
|
-
throw new Error("Sandbox config is not a Vercel sandbox");
|
|
1858
|
-
}
|
|
1859
|
-
const idleTimeoutMs = sandboxConfig.lifecycle?.stopAfterInactiveMs ?? DEFAULT_IDLE_TIMEOUT_MS;
|
|
798
|
+
let nextPollMs = DEFAULT_POLL_MS;
|
|
1860
799
|
while (true) {
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
]);
|
|
1865
|
-
if (result.type === "timeout") {
|
|
1866
|
-
const { snapshotSandboxStep: snapshotSandboxStep2 } = await Promise.resolve().then(() => (init_lifecycle_workflow_steps(), lifecycle_workflow_steps_exports));
|
|
1867
|
-
await snapshotSandboxStep2(input).catch((e) => {
|
|
1868
|
-
if (import_workflow.FatalError.is(e)) {
|
|
1869
|
-
console.error("Snapshot failed permanently:", e.message);
|
|
1870
|
-
return;
|
|
1871
|
-
}
|
|
1872
|
-
throw e;
|
|
1873
|
-
});
|
|
1874
|
-
break;
|
|
1875
|
-
}
|
|
1876
|
-
if (result.done) {
|
|
800
|
+
await (0, import_workflow.sleep)(nextPollMs);
|
|
801
|
+
const result = await checkAndSnapshotStep(input);
|
|
802
|
+
if (result instanceof Error || result.action === "exit") {
|
|
1877
803
|
break;
|
|
1878
804
|
}
|
|
1879
|
-
|
|
1880
|
-
pendingNext = iterator.next();
|
|
805
|
+
nextPollMs = result.nextPollMs;
|
|
1881
806
|
}
|
|
1882
807
|
}
|
|
1883
808
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1884
809
|
0 && (module.exports = {
|
|
1885
|
-
sandboxActivityHook,
|
|
1886
810
|
sandboxLifecycleWorkflow
|
|
1887
811
|
});
|
|
1888
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2Vycm9ycy50cyIsICIuLi9zcmMvdXRpbHMvcGFnaW5hdGUudHMiLCAiLi4vc3JjL3N0b3JhZ2UvYmluZGluZ3MvbG9jYWwtZnMtaGFuZGxlcnMudHMiLCAiLi4vc3JjL3N0b3JhZ2UvYmluZGluZ3MvbG9jYWwudHMiLCAiLi4vc3JjL3N0b3JhZ2UvYmluZGluZ3MvdmVyY2VsLnRzIiwgIi4uL3NyYy9zdG9yYWdlL2NsaWVudC50cyIsICIuLi9zcmMvc3RvcmFnZS9ycGMudHMiLCAiLi4vc3JjL3N0b3JhZ2UvaGFuZGxlci50cyIsICIuLi9zcmMvc3RvcmFnZS9pbmRleC50cyIsICIuLi9zcmMvc2FuZGJveC93cml0ZS1maWxlcy50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy9sb2NhbC50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy92ZXJjZWwudHMiLCAiLi4vc3JjL3NhbmRib3gvY2xpZW50LnRzIiwgIi4uL3NyYy9zYW5kYm94L2xpZmVjeWNsZS13b3JrZmxvdy1zdGVwcy50cyIsICIuLi9zcmMvc2FuZGJveC9saWZlY3ljbGUtd29ya2Zsb3cudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCAqIGFzIGVycm9yZSBmcm9tIFwiZXJyb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uTm90Rm91bmRFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2Vzc2lvbk5vdEZvdW5kRXJyb3JcIixcbiAgbWVzc2FnZTogXCJTZXNzaW9uICRpZCBub3QgZm91bmRcIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNlc3Npb25FcnJvclwiLFxuICBtZXNzYWdlOiBcIlNlc3Npb24gJGlkIGZhaWxlZDogJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFNhbmRib3hOb3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTYW5kYm94Tm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIlNhbmRib3ggJGlkIG5vdCBmb3VuZFwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU3RvcmFnZUVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFNhbmRib3hFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2FuZGJveEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VOb3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJNZXNzYWdlTm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIk1lc3NhZ2UgJGlkIG5vdCBmb3VuZFwiLFxufSkge31cbiIsICJpbXBvcnQgdHlwZSB7IExpc3RSZXN1bHQgfSBmcm9tIFwiLi4vc3RvcmFnZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFnaW5hdGU8VCBleHRlbmRzIHsgaWQ6IHN0cmluZyB9PihvcHRzOiB7XG4gIGl0ZW1zOiBUW107XG4gIGN1cnNvcj86IHN0cmluZztcbiAgbGltaXQ/OiBudW1iZXI7XG59KTogTGlzdFJlc3VsdDxUPiB7XG4gIGNvbnN0IHsgaXRlbXMsIGN1cnNvciwgbGltaXQgPSA1MCB9ID0gb3B0cztcbiAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnNvciA/IGl0ZW1zLmZpbmRJbmRleCgobSkgPT4gbS5pZCA9PT0gY3Vyc29yKSArIDEgOiAwO1xuICBjb25zdCBzbGljZWQgPSBpdGVtcy5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgbGltaXQpO1xuICBjb25zdCBuZXh0Q3Vyc29yID1cbiAgICBzdGFydEluZGV4ICsgbGltaXQgPCBpdGVtcy5sZW5ndGggPyAoc2xpY2VkLmF0KC0xKT8uaWQgPz8gbnVsbCkgOiBudWxsO1xuICByZXR1cm4geyBpdGVtczogc2xpY2VkLCBuZXh0Q3Vyc29yIH07XG59XG4iLCAiaW1wb3J0IHsgbWtkaXIsIHJlYWRkaXIsIHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHBhZ2luYXRlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3BhZ2luYXRlXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbW1hbmQsXG4gIEhhbmRsZXJzLFxuICBNZXNzYWdlLFxuICBQYXJ0LFxuICBTYW5kYm94UmVjb3JkLFxuICBTZXNzaW9uLFxufSBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZpbGVzeXN0ZW1IYW5kbGVycyhiYXNlUGF0aDogc3RyaW5nKTogSGFuZGxlcnMge1xuICBjb25zdCBzZXNzaW9uRGlyID0gam9pbihiYXNlUGF0aCwgXCJzZXNzaW9uXCIpO1xuICBjb25zdCBtZXNzYWdlRGlyID0gam9pbihiYXNlUGF0aCwgXCJtZXNzYWdlXCIpO1xuICBjb25zdCBwYXJ0RGlyID0gam9pbihiYXNlUGF0aCwgXCJwYXJ0XCIpO1xuICBjb25zdCBzYW5kYm94RGlyID0gam9pbihiYXNlUGF0aCwgXCJzYW5kYm94XCIpO1xuICBjb25zdCBjb21tYW5kRGlyID0gam9pbihiYXNlUGF0aCwgXCJjb21tYW5kXCIpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGVuc3VyZURpcihkaXI6IHN0cmluZykge1xuICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZWFkSnNvbjxUPihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsIFwidXRmLThcIik7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50KSBhcyBUO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd3JpdGVKc29uRmlsZShmaWxlUGF0aDogc3RyaW5nLCBkYXRhOiB1bmtub3duKSB7XG4gICAgYXdhaXQgZW5zdXJlRGlyKGRpcm5hbWUoZmlsZVBhdGgpKTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlYWRBbGxGcm9tRGlyPFQ+KGRpcjogc3RyaW5nKTogUHJvbWlzZTxUW10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyKGRpcik7XG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGZpbGVzXG4gICAgICAgICAgLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aChcIi5qc29uXCIpKVxuICAgICAgICAgIC5tYXAoKGYpID0+IHJlYWRKc29uPFQ+KGpvaW4oZGlyLCBmKSkpXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlc3VsdHMuZmlsdGVyKChyKTogciBpcyBOb25OdWxsYWJsZTx0eXBlb2Ygcj4gPT4gciAhPT0gbnVsbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBcInNlc3Npb24uZ2V0XCI6IGFzeW5jICh7IGlkIH0pID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCByZWFkSnNvbjxTZXNzaW9uPihqb2luKHNlc3Npb25EaXIsIGAke2lkfS5qc29uYCkpO1xuICAgICAgcmV0dXJuIHNlc3Npb24gPz8gbnVsbDtcbiAgICB9LFxuXG4gICAgXCJzZXNzaW9uLnNldFwiOiBhc3luYyAoc2Vzc2lvbikgPT4ge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHNlc3Npb25QYXRoID0gam9pbihzZXNzaW9uRGlyLCBgJHtzZXNzaW9uLmlkfS5qc29uYCk7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlYWRKc29uPFNlc3Npb24+KHNlc3Npb25QYXRoKTtcbiAgICAgIGNvbnN0IG5ld1Nlc3Npb246IFNlc3Npb24gPSB7XG4gICAgICAgIC4uLnNlc3Npb24sXG4gICAgICAgIHRhZ3M6IHNlc3Npb24udGFncyA/PyBleGlzdGluZz8udGFncyA/PyB7fSxcbiAgICAgICAgY3JlYXRlZEF0OiBleGlzdGluZz8uY3JlYXRlZEF0ID8/IHNlc3Npb24uY3JlYXRlZEF0ID8/IG5vdyxcbiAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICB9O1xuICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShzZXNzaW9uUGF0aCwgbmV3U2Vzc2lvbik7XG4gICAgICByZXR1cm4gbmV3U2Vzc2lvbjtcbiAgICB9LFxuXG4gICAgXCJzZXNzaW9uLmxpc3RcIjogYXN5bmMgKHsgdGFncywgY3Vyc29yLCBsaW1pdCB9KSA9PiB7XG4gICAgICBjb25zdCBhbGxTZXNzaW9ucyA9IGF3YWl0IHJlYWRBbGxGcm9tRGlyPFNlc3Npb24+KHNlc3Npb25EaXIpO1xuICAgICAgbGV0IGZpbHRlcmVkID0gYWxsU2Vzc2lvbnM7XG4gICAgICBpZiAodGFncyAmJiBPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChzKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2Vzc2lvblRhZ3MgPSBzLnRhZ3MgPz8ge307XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRhZ3MpLmV2ZXJ5KFxuICAgICAgICAgICAgKFtrZXksIHZhbHVlXSkgPT4gc2Vzc2lvblRhZ3Nba2V5XSA9PT0gdmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZpbHRlcmVkLnNvcnQoKGEsIGIpID0+IGEuY3JlYXRlZEF0IC0gYi5jcmVhdGVkQXQpO1xuICAgICAgcmV0dXJuIHBhZ2luYXRlKHsgaXRlbXM6IGZpbHRlcmVkLCBjdXJzb3IsIGxpbWl0IH0pO1xuICAgIH0sXG5cbiAgICBcInNlc3Npb24ubGlzdEJ5U2FuZGJveFwiOiBhc3luYyAoeyBzYW5kYm94SWQsIHRhZ3MsIGN1cnNvciwgbGltaXQgfSkgPT4ge1xuICAgICAgY29uc3QgYWxsU2Vzc2lvbnMgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxTZXNzaW9uPihzZXNzaW9uRGlyKTtcbiAgICAgIGxldCBmaWx0ZXJlZCA9IGFsbFNlc3Npb25zLmZpbHRlcigocykgPT4gcy5zYW5kYm94SWQgPT09IHNhbmRib3hJZCk7XG4gICAgICBpZiAodGFncyAmJiBPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChzKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2Vzc2lvblRhZ3MgPSBzLnRhZ3MgPz8ge307XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRhZ3MpLmV2ZXJ5KFxuICAgICAgICAgICAgKFtrZXksIHZhbHVlXSkgPT4gc2Vzc2lvblRhZ3Nba2V5XSA9PT0gdmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZpbHRlcmVkLnNvcnQoKGEsIGIpID0+IGEuY3JlYXRlZEF0IC0gYi5jcmVhdGVkQXQpO1xuICAgICAgcmV0dXJuIHBhZ2luYXRlKHsgaXRlbXM6IGZpbHRlcmVkLCBjdXJzb3IsIGxpbWl0IH0pO1xuICAgIH0sXG5cbiAgICBcInNlc3Npb24udGFnLnNldFwiOiBhc3luYyAoeyBzZXNzaW9uSWQsIHRhZ3MgfSkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvblBhdGggPSBqb2luKHNlc3Npb25EaXIsIGAke3Nlc3Npb25JZH0uanNvbmApO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkSnNvbjxTZXNzaW9uPihzZXNzaW9uUGF0aCk7XG4gICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2Vzc2lvbiAke3Nlc3Npb25JZH0gbm90IGZvdW5kYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBtZXJnZWRUYWdzID0geyAuLi5leGlzdGluZy50YWdzLCAuLi50YWdzIH07XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdXBkYXRlZFNlc3Npb246IFNlc3Npb24gPSB7XG4gICAgICAgIC4uLmV4aXN0aW5nLFxuICAgICAgICB0YWdzOiBtZXJnZWRUYWdzLFxuICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgIH07XG4gICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKHNlc3Npb25QYXRoLCB1cGRhdGVkU2Vzc2lvbik7XG4gICAgICByZXR1cm4gdXBkYXRlZFNlc3Npb247XG4gICAgfSxcblxuICAgIFwibWVzc2FnZS5nZXRcIjogYXN5bmMgKHsgaWQgfSkgPT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlYWRKc29uPE1lc3NhZ2U+KGpvaW4obWVzc2FnZURpciwgYCR7aWR9Lmpzb25gKSk7XG4gICAgfSxcblxuICAgIFwibWVzc2FnZS5zZXRcIjogYXN5bmMgKG1lc3NhZ2UpID0+IHtcbiAgICAgIGF3YWl0IHdyaXRlSnNvbkZpbGUoam9pbihtZXNzYWdlRGlyLCBgJHttZXNzYWdlLmlkfS5qc29uYCksIG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcblxuICAgIFwibWVzc2FnZS5saXN0XCI6IGFzeW5jICh7IHNlc3Npb25JZCwgY3Vyc29yLCBsaW1pdCB9KSA9PiB7XG4gICAgICBjb25zdCBhbGxNZXNzYWdlcyA9IGF3YWl0IHJlYWRBbGxGcm9tRGlyPE1lc3NhZ2U+KG1lc3NhZ2VEaXIpO1xuICAgICAgY29uc3QgZmlsdGVyZWQgPSBhbGxNZXNzYWdlc1xuICAgICAgICAuZmlsdGVyKChtKSA9PiBtLnNlc3Npb25JZCA9PT0gc2Vzc2lvbklkKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5jcmVhdGVkQXQgLSBiLmNyZWF0ZWRBdCk7XG4gICAgICByZXR1cm4gcGFnaW5hdGUoeyBpdGVtczogZmlsdGVyZWQsIGN1cnNvciwgbGltaXQgfSk7XG4gICAgfSxcblxuICAgIFwicGFydC5saXN0QnlNZXNzYWdlXCI6IGFzeW5jICh7IG1lc3NhZ2VJZCwgY3Vyc29yLCBsaW1pdCB9KSA9PiB7XG4gICAgICBjb25zdCBhbGxQYXJ0cyA9IGF3YWl0IHJlYWRBbGxGcm9tRGlyPFBhcnQ+KHBhcnREaXIpO1xuICAgICAgY29uc3QgZmlsdGVyZWQgPSBhbGxQYXJ0c1xuICAgICAgICAuZmlsdGVyKChwKSA9PiBwLm1lc3NhZ2VJZCA9PT0gbWVzc2FnZUlkKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuICAgICAgcmV0dXJuIHBhZ2luYXRlKHsgaXRlbXM6IGZpbHRlcmVkLCBjdXJzb3IsIGxpbWl0IH0pO1xuICAgIH0sXG5cbiAgICBcInBhcnQubGlzdEJ5U2Vzc2lvblwiOiBhc3luYyAoeyBzZXNzaW9uSWQsIGN1cnNvciwgbGltaXQgfSkgPT4ge1xuICAgICAgY29uc3QgYWxsUGFydHMgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxQYXJ0PihwYXJ0RGlyKTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gYWxsUGFydHNcbiAgICAgICAgLmZpbHRlcigocCkgPT4gcC5zZXNzaW9uSWQgPT09IHNlc3Npb25JZClcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICBpZiAoYS5tZXNzYWdlSWQgIT09IGIubWVzc2FnZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5tZXNzYWdlSWQubG9jYWxlQ29tcGFyZShiLm1lc3NhZ2VJZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDtcbiAgICAgICAgfSk7XG4gICAgICByZXR1cm4gcGFnaW5hdGUoeyBpdGVtczogZmlsdGVyZWQsIGN1cnNvciwgbGltaXQgfSk7XG4gICAgfSxcblxuICAgIFwicGFydC5zZXRcIjogYXN5bmMgKHBhcnQpID0+IHtcbiAgICAgIGF3YWl0IHdyaXRlSnNvbkZpbGUoam9pbihwYXJ0RGlyLCBgJHtwYXJ0LmlkfS5qc29uYCksIHBhcnQpO1xuICAgICAgcmV0dXJuIHBhcnQ7XG4gICAgfSxcblxuICAgIFwic2FuZGJveC5nZXRcIjogYXN5bmMgKHsga2V5IH0pID0+IHtcbiAgICAgIGNvbnN0IHNhZmVOYW1lID0gQnVmZmVyLmZyb20oa2V5KS50b1N0cmluZyhcImJhc2U2NHVybFwiKTtcbiAgICAgIGNvbnN0IHNhbmRib3hQYXRoID0gam9pbihzYW5kYm94RGlyLCBgJHtzYWZlTmFtZX0uanNvbmApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlYWRKc29uPFNhbmRib3hSZWNvcmQ+KHNhbmRib3hQYXRoKTtcbiAgICAgIGlmICghZGF0YSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0sXG5cbiAgICBcInNhbmRib3guc2V0XCI6IGFzeW5jIChyZWNvcmQpID0+IHtcbiAgICAgIGNvbnN0IHNhZmVOYW1lID0gQnVmZmVyLmZyb20ocmVjb3JkLmlkKS50b1N0cmluZyhcImJhc2U2NHVybFwiKTtcbiAgICAgIGNvbnN0IHNhbmRib3hQYXRoID0gam9pbihzYW5kYm94RGlyLCBgJHtzYWZlTmFtZX0uanNvbmApO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkSnNvbjxTYW5kYm94UmVjb3JkPihzYW5kYm94UGF0aCk7XG4gICAgICBjb25zdCBuZXdSZWNvcmQ6IFNhbmRib3hSZWNvcmQgPSB7XG4gICAgICAgIC4uLnJlY29yZCxcbiAgICAgICAgdGFnczogcmVjb3JkLnRhZ3MgPz8gZXhpc3Rpbmc/LnRhZ3MgPz8gbnVsbCxcbiAgICAgIH07XG4gICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKHNhbmRib3hQYXRoLCBuZXdSZWNvcmQpO1xuICAgIH0sXG5cbiAgICBcInNhbmRib3gubGlzdFwiOiBhc3luYyAoeyB0YWdzLCBvcmRlciwgY3Vyc29yLCBsaW1pdCB9KSA9PiB7XG4gICAgICBjb25zdCBhbGxTYW5kYm94ZXMgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxTYW5kYm94UmVjb3JkPihzYW5kYm94RGlyKTtcbiAgICAgIGxldCBmaWx0ZXJlZCA9IGFsbFNhbmRib3hlcztcbiAgICAgIGlmICh0YWdzICYmIE9iamVjdC5rZXlzKHRhZ3MpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZmlsdGVyZWQgPSBmaWx0ZXJlZC5maWx0ZXIoKHMpID0+IHtcbiAgICAgICAgICBjb25zdCBzYW5kYm94VGFncyA9IHMudGFncyA/PyB7fTtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGFncykuZXZlcnkoXG4gICAgICAgICAgICAoW2tleSwgdmFsdWVdKSA9PiBzYW5kYm94VGFnc1trZXldID09PSB2YWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgc29ydEZpZWxkID0gb3JkZXI/LnN0YXJ0c1dpdGgoXCJsYXN0QWN0aXZpdHlBdFwiKVxuICAgICAgICA/IFwibGFzdEFjdGl2aXR5QXRcIlxuICAgICAgICA6IFwiY3JlYXRlZEF0XCI7XG4gICAgICBjb25zdCBzb3J0RGlyID0gb3JkZXI/LmVuZHNXaXRoKFwiX2Rlc2NcIikgPyAtMSA6IDE7XG4gICAgICBmaWx0ZXJlZC5zb3J0KFxuICAgICAgICAoYSwgYikgPT4gc29ydERpciAqICgoYVtzb3J0RmllbGRdID8/IDApIC0gKGJbc29ydEZpZWxkXSA/PyAwKSlcbiAgICAgICk7XG4gICAgICByZXR1cm4gcGFnaW5hdGUoeyBpdGVtczogZmlsdGVyZWQsIGN1cnNvciwgbGltaXQgfSk7XG4gICAgfSxcblxuICAgIFwic2FuZGJveC50YWcuc2V0XCI6IGFzeW5jICh7IHNhbmRib3hJZCwgdGFncyB9KSA9PiB7XG4gICAgICBjb25zdCBzYWZlTmFtZSA9IEJ1ZmZlci5mcm9tKHNhbmRib3hJZCkudG9TdHJpbmcoXCJiYXNlNjR1cmxcIik7XG4gICAgICBjb25zdCBzYW5kYm94UGF0aCA9IGpvaW4oc2FuZGJveERpciwgYCR7c2FmZU5hbWV9Lmpzb25gKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZEpzb248U2FuZGJveFJlY29yZD4oc2FuZGJveFBhdGgpO1xuICAgICAgaWYgKCFleGlzdGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNhbmRib3ggJHtzYW5kYm94SWR9IG5vdCBmb3VuZGApO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVyZ2VkVGFncyA9IHsgLi4uZXhpc3RpbmcudGFncywgLi4udGFncyB9O1xuICAgICAgY29uc3QgdXBkYXRlZFNhbmRib3g6IFNhbmRib3hSZWNvcmQgPSB7XG4gICAgICAgIC4uLmV4aXN0aW5nLFxuICAgICAgICB0YWdzOiBtZXJnZWRUYWdzLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHdyaXRlSnNvbkZpbGUoc2FuZGJveFBhdGgsIHVwZGF0ZWRTYW5kYm94KTtcbiAgICAgIHJldHVybiB1cGRhdGVkU2FuZGJveDtcbiAgICB9LFxuXG4gICAgXCJzYW5kYm94LmdldEJ5U2Vzc2lvblwiOiBhc3luYyAoeyBzZXNzaW9uSWQgfSkgPT4ge1xuICAgICAgY29uc3QgYWxsU2FuZGJveGVzID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8U2FuZGJveFJlY29yZD4oc2FuZGJveERpcik7XG4gICAgICBjb25zdCBtYXRjaGluZyA9IGFsbFNhbmRib3hlcy5maWx0ZXIoKHMpID0+XG4gICAgICAgIHMuaWQuc3RhcnRzV2l0aChgJHtzZXNzaW9uSWR9LWApXG4gICAgICApO1xuICAgICAgaWYgKG1hdGNoaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIG1hdGNoaW5nLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiAoYi5sYXN0QWN0aXZpdHlBdCA/PyAwKSAtIChhLmxhc3RBY3Rpdml0eUF0ID8/IDApXG4gICAgICApO1xuICAgICAgcmV0dXJuIG1hdGNoaW5nWzBdO1xuICAgIH0sXG5cbiAgICBcImNvbW1hbmQuZ2V0XCI6IGFzeW5jICh7IGlkIH0pID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCByZWFkSnNvbjxDb21tYW5kPihqb2luKGNvbW1hbmREaXIsIGAke2lkfS5qc29uYCkpO1xuICAgIH0sXG5cbiAgICBcImNvbW1hbmQuc2V0XCI6IGFzeW5jIChjb21tYW5kKSA9PiB7XG4gICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKGpvaW4oY29tbWFuZERpciwgYCR7Y29tbWFuZC5pZH0uanNvbmApLCBjb21tYW5kKTtcbiAgICAgIHJldHVybiBjb21tYW5kO1xuICAgIH0sXG5cbiAgICBcImNvbW1hbmQubGlzdFwiOiBhc3luYyAoeyBzZXNzaW9uSWQsIGluY2x1ZGVGaW5pc2hlZCwgY3Vyc29yLCBsaW1pdCB9KSA9PiB7XG4gICAgICBjb25zdCBhbGxDb21tYW5kcyA9IGF3YWl0IHJlYWRBbGxGcm9tRGlyPENvbW1hbmQ+KGNvbW1hbmREaXIpO1xuICAgICAgbGV0IGZpbHRlcmVkID0gYWxsQ29tbWFuZHMuZmlsdGVyKChjKSA9PiBjLnNlc3Npb25JZCA9PT0gc2Vzc2lvbklkKTtcbiAgICAgIGlmICghaW5jbHVkZUZpbmlzaGVkKSB7XG4gICAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChjKSA9PiBjLnN0YXR1cyA9PT0gXCJydW5uaW5nXCIpO1xuICAgICAgfVxuICAgICAgZmlsdGVyZWQuc29ydCgoYSwgYikgPT4gYS5zdGFydGVkQXQgLSBiLnN0YXJ0ZWRBdCk7XG4gICAgICByZXR1cm4gcGFnaW5hdGUoeyBpdGVtczogZmlsdGVyZWQsIGN1cnNvciwgbGltaXQgfSk7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyB0eXBlIFNlcnZlclR5cGUsIHNlcnZlIH0gZnJvbSBcIkBob25vL25vZGUtc2VydmVyXCI7XG5pbXBvcnQgeyBIb25vIH0gZnJvbSBcImhvbm9cIjtcbmltcG9ydCB7IGhhbmRsZVN0b3JhZ2VScGMgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB7IGNyZWF0ZUZpbGVzeXN0ZW1IYW5kbGVycyB9IGZyb20gXCIuL2xvY2FsLWZzLWhhbmRsZXJzXCI7XG5cbmNvbnN0IERFRkFVTFRfU1RPUkFHRV9ESVIgPSBcIi5hZ2VudC1zdG9yYWdlXCI7XG5cbmxldCBzdGFydFByb21pc2U6IFByb21pc2U8c3RyaW5nPiB8IG51bGwgPSBudWxsO1xubGV0IHNlcnZlckluc3RhbmNlOiB7IHVybDogc3RyaW5nOyBzZXJ2ZXI6IFNlcnZlclR5cGUgfSB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRMb2NhbFN0b3JhZ2Uob3B0cz86IHtcbiAgcGF0aD86IHN0cmluZztcbiAgcG9ydD86IG51bWJlcjtcbn0pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoc3RhcnRQcm9taXNlKSB7XG4gICAgcmV0dXJuIHN0YXJ0UHJvbWlzZTtcbiAgfVxuXG4gIHN0YXJ0UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSBjcmVhdGVGaWxlc3lzdGVtSGFuZGxlcnMoXG4gICAgICBvcHRzPy5wYXRoID8/IERFRkFVTFRfU1RPUkFHRV9ESVJcbiAgICApO1xuICAgIGNvbnN0IGFwcCA9IG5ldyBIb25vKCk7XG5cbiAgICBhcHAucG9zdChcIi9cIiwgYXN5bmMgKGMpID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBjLnJlcS5qc29uKCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGhhbmRsZVN0b3JhZ2VScGMoYm9keSwgaGFuZGxlcnMpO1xuICAgICAgcmV0dXJuIGMuanNvbihyZXNwb25zZSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBwb3J0ID0gb3B0cz8ucG9ydCA/PyAwO1xuICAgIGNvbnN0IHNlcnZlciA9IHNlcnZlKHtcbiAgICAgIGZldGNoOiBhcHAuZmV0Y2gsXG4gICAgICBwb3J0LFxuICAgIH0pO1xuXG4gICAgc2VydmVyLm9uKFwibGlzdGVuaW5nXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBzZXJ2ZXIuYWRkcmVzcygpO1xuICAgICAgY29uc3QgYWN0dWFsUG9ydCA9IHR5cGVvZiBhZGRyZXNzID09PSBcIm9iamVjdFwiID8gYWRkcmVzcz8ucG9ydCA6IHBvcnQ7XG4gICAgICBjb25zdCB1cmwgPSBgaHR0cDovL2xvY2FsaG9zdDoke2FjdHVhbFBvcnR9YDtcblxuICAgICAgc2VydmVySW5zdGFuY2UgPSB7IHVybCwgc2VydmVyIH07XG4gICAgICBjb25zb2xlLmxvZyhgW2FnZW50XSBMb2NhbCBzdG9yYWdlIHNlcnZlciBzdGFydGVkIGF0ICR7dXJsfWApO1xuICAgICAgcmVzb2x2ZSh1cmwpO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gc3RhcnRQcm9taXNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RvcExvY2FsU3RvcmFnZSgpOiB2b2lkIHtcbiAgaWYgKHNlcnZlckluc3RhbmNlKSB7XG4gICAgc2VydmVySW5zdGFuY2Uuc2VydmVyLmNsb3NlKCk7XG4gICAgc2VydmVySW5zdGFuY2UgPSBudWxsO1xuICAgIHN0YXJ0UHJvbWlzZSA9IG51bGw7XG4gIH1cbn1cblxuaWYgKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIHN0b3BMb2NhbFN0b3JhZ2UpO1xuICBwcm9jZXNzLm9uKFwiU0lHSU5UXCIsIHN0b3BMb2NhbFN0b3JhZ2UpO1xufVxuIiwgImNvbnN0IFZFUkNFTF9TVE9SQUdFX1VSTCA9XG4gIFwiaHR0cHM6Ly9hZ2VudC1zZGstc3RvcmFnZS1uaW5lLmxhYnMudmVyY2VsLmRldi9hcGkvc3RvcmFnZVwiO1xuXG5leHBvcnQgdHlwZSBWZXJjZWxTdG9yYWdlQ29uZmlnID0ge1xuICB1cmw6IHN0cmluZztcbiAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRWZXJjZWxTdG9yYWdlQ29uZmlnKCk6IFByb21pc2U8VmVyY2VsU3RvcmFnZUNvbmZpZz4ge1xuICBsZXQgdG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgeyBnZXRWZXJjZWxPaWRjVG9rZW4gfSA9IGF3YWl0IGltcG9ydChcIkB2ZXJjZWwvb2lkY1wiKTtcbiAgICB0b2tlbiA9IGF3YWl0IGdldFZlcmNlbE9pZGNUb2tlbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBPSURDIG5vdCBhdmFpbGFibGUgKGxvY2FsIGRldiwgbm9uLVZlcmNlbCBlbnZpcm9ubWVudClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdXJsOiBWRVJDRUxfU1RPUkFHRV9VUkwsXG4gICAgaGVhZGVyczogdG9rZW4gPyB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gIH0gOiB7fSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQge1xuICBNZXNzYWdlTm90Rm91bmRFcnJvcixcbiAgU2FuZGJveE5vdEZvdW5kRXJyb3IsXG4gIFNlc3Npb25Ob3RGb3VuZEVycm9yLFxuICBTdG9yYWdlRXJyb3IsXG59IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgU3RvcmFnZU1ldGhvZHMgfSBmcm9tIFwiLi9ycGNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29tbWFuZCxcbiAgTGlzdFJlc3VsdCxcbiAgUGFydCxcbiAgUmVzb2x2ZWRTdG9yYWdlLFxuICBTdG9yYWdlLFxuICBTdG9yYWdlQ29uZmlnLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG50eXBlIFJwY1Jlc3BvbnNlPFQ+ID1cbiAgfCB7IHJlc3VsdDogVCB9XG4gIHwgeyBlcnJvcjogeyBjb2RlOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9IH07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlQ2xpZW50KHsgdXJsLCBoZWFkZXJzIH06IFJlc29sdmVkU3RvcmFnZSk6IFN0b3JhZ2Uge1xuICBhc3luYyBmdW5jdGlvbiBycGM8TSBleHRlbmRzIGtleW9mIFN0b3JhZ2VNZXRob2RzPihcbiAgICBtZXRob2Q6IE0sXG4gICAgcGFyYW1zOiB6LmluZmVyPFN0b3JhZ2VNZXRob2RzW01dW1wicGFyYW1zXCJdPlxuICApOiBQcm9taXNlPHouaW5mZXI8U3RvcmFnZU1ldGhvZHNbTV1bXCJyZXN1bHRcIl0+PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiwgLi4uaGVhZGVycyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBtZXRob2QsIHBhcmFtcyB9KSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgU3RvcmFnZUVycm9yKHtcbiAgICAgICAgcmVhc29uOiBgSFRUUCAke3Jlcy5zdGF0dXN9OiAke3Jlcy5zdGF0dXNUZXh0fWAsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIFJwY1Jlc3BvbnNlPFxuICAgICAgei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tNXVtcInJlc3VsdFwiXT5cbiAgICA+O1xuXG4gICAgaWYgKFwiZXJyb3JcIiBpbiBqc29uKSB7XG4gICAgICB0aHJvdyBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBqc29uLmVycm9yLm1lc3NhZ2UgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGpzb24ucmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzZXNzaW9uOiB7XG4gICAgICBnZXQ6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcInNlc3Npb24uZ2V0XCIsIHsgaWQgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uTm90Rm91bmRFcnJvcih7IGlkIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKHNlc3Npb24pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi5zZXRcIiwgc2Vzc2lvbik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGlzdDogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi5saXN0XCIsIHtcbiAgICAgICAgICAgIHRhZ3M6IG9wdHM/LnRhZ3MsXG4gICAgICAgICAgICBvcmRlcjogb3B0cz8ub3JkZXIsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0YWc6IHtcbiAgICAgICAgc2V0OiBhc3luYyAoeyBzZXNzaW9uSWQsIHRhZ3MgfSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi50YWcuc2V0XCIsIHsgc2Vzc2lvbklkLCB0YWdzIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG1lc3NhZ2U6IHtcbiAgICAgIGxpc3Q6IGFzeW5jIChzZXNzaW9uSWQsIG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwibWVzc2FnZS5saXN0XCIsIHtcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdldDogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwibWVzc2FnZS5nZXRcIiwgeyBpZCB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VOb3RGb3VuZEVycm9yKHsgaWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJtZXNzYWdlLnNldFwiLCBtZXNzYWdlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBwYXJ0OiB7XG4gICAgICBsaXN0QnlNZXNzYWdlOiBhc3luYyAobWVzc2FnZUlkLCBvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwicGFydC5saXN0QnlNZXNzYWdlXCIsIHtcbiAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgTGlzdFJlc3VsdDxQYXJ0PjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsaXN0QnlTZXNzaW9uOiBhc3luYyAoc2Vzc2lvbklkLCBvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwicGFydC5saXN0QnlTZXNzaW9uXCIsIHtcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgTGlzdFJlc3VsdDxQYXJ0PjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChwYXJ0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJwYXJ0LnNldFwiLCBwYXJ0KSkgYXMgUGFydDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBzYW5kYm94OiB7XG4gICAgICBnZXQ6IGFzeW5jIChrZXkpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJzYW5kYm94LmdldFwiLCB7IGtleSB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hOb3RGb3VuZEVycm9yKHsgaWQ6IGtleSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXRCeVNlc3Npb246IGFzeW5jIChzZXNzaW9uSWQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJzYW5kYm94LmdldEJ5U2Vzc2lvblwiLCB7IHNlc3Npb25JZCB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hOb3RGb3VuZEVycm9yKHsgaWQ6IHNlc3Npb25JZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChyZWNvcmQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBycGMoXCJzYW5kYm94LnNldFwiLCByZWNvcmQpO1xuICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGlzdDogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2FuZGJveC5saXN0XCIsIHtcbiAgICAgICAgICAgIHRhZ3M6IG9wdHM/LnRhZ3MsXG4gICAgICAgICAgICBvcmRlcjogb3B0cz8ub3JkZXIsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0YWc6IHtcbiAgICAgICAgc2V0OiBhc3luYyAoeyBzYW5kYm94SWQsIHRhZ3MgfSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2FuZGJveC50YWcuc2V0XCIsIHsgc2FuZGJveElkLCB0YWdzIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbW1hbmQ6IHtcbiAgICAgIGdldDogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJjb21tYW5kLmdldFwiLCB7IGlkIH0pKSBhcyBDb21tYW5kIHwgbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChjb21tYW5kKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJjb21tYW5kLnNldFwiLCBjb21tYW5kKSkgYXMgQ29tbWFuZDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsaXN0OiBhc3luYyAoc2Vzc2lvbklkLCBvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwiY29tbWFuZC5saXN0XCIsIHtcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIGluY2x1ZGVGaW5pc2hlZDogb3B0cz8uaW5jbHVkZUZpbmlzaGVkLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBMaXN0UmVzdWx0PENvbW1hbmQ+O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU3RvcmFnZVVybChcbiAgY29uZmlnOiBTdG9yYWdlQ29uZmlnXG4pOiBQcm9taXNlPFJlc29sdmVkU3RvcmFnZT4ge1xuICBzd2l0Y2ggKGNvbmZpZy50eXBlKSB7XG4gICAgY2FzZSBcImxvY2FsXCI6IHtcbiAgICAgIGNvbnN0IHsgc3RhcnRMb2NhbFN0b3JhZ2UgfSA9IGF3YWl0IGltcG9ydChcIi4vYmluZGluZ3MvbG9jYWxcIik7XG4gICAgICByZXR1cm4geyB1cmw6IGF3YWl0IHN0YXJ0TG9jYWxTdG9yYWdlKHsgcGF0aDogY29uZmlnLnBhdGggfSkgfTtcbiAgICB9XG4gICAgY2FzZSBcInZlcmNlbFwiOiB7XG4gICAgICBjb25zdCB7IGdldFZlcmNlbFN0b3JhZ2VDb25maWcgfSA9IGF3YWl0IGltcG9ydChcIi4vYmluZGluZ3MvdmVyY2VsXCIpO1xuICAgICAgcmV0dXJuIGdldFZlcmNlbFN0b3JhZ2VDb25maWcoKTtcbiAgICB9XG4gICAgY2FzZSBcImN1c3RvbVwiOiB7XG4gICAgICByZXR1cm4geyB1cmw6IGNvbmZpZy51cmwsIGhlYWRlcnM6IGNvbmZpZy5oZWFkZXJzIH07XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbmZpZyBzYXRpc2ZpZXMgbmV2ZXI7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbmtub3duIHN0b3JhZ2UgdHlwZTogJHsoY29uZmlnIGFzIHsgdHlwZTogc3RyaW5nIH0pLnR5cGV9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0b3JhZ2Uoc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZyk6IFN0b3JhZ2Uge1xuICBsZXQgY2xpZW50UHJvbWlzZTogUHJvbWlzZTxTdG9yYWdlPiB8IG51bGwgPSBudWxsO1xuICBjb25zdCBnZXRDbGllbnQgPSAoKSA9PiB7XG4gICAgaWYgKCFjbGllbnRQcm9taXNlKSB7XG4gICAgICBjbGllbnRQcm9taXNlID0gcmVzb2x2ZVN0b3JhZ2VVcmwoc3RvcmFnZUNvbmZpZykudGhlbigocmVzb2x2ZWQpID0+XG4gICAgICAgIGdldFN0b3JhZ2VDbGllbnQocmVzb2x2ZWQpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY2xpZW50UHJvbWlzZTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHNlc3Npb246IHtcbiAgICAgIGdldDogYXN5bmMgKGlkKSA9PiAoYXdhaXQgZ2V0Q2xpZW50KCkpLnNlc3Npb24uZ2V0KGlkKSxcbiAgICAgIHNldDogYXN5bmMgKHNlc3Npb24pID0+IChhd2FpdCBnZXRDbGllbnQoKSkuc2Vzc2lvbi5zZXQoc2Vzc2lvbiksXG4gICAgICBsaXN0OiBhc3luYyAob3B0cykgPT4gKGF3YWl0IGdldENsaWVudCgpKS5zZXNzaW9uLmxpc3Qob3B0cyksXG4gICAgICB0YWc6IHtcbiAgICAgICAgc2V0OiBhc3luYyAob3B0cykgPT4gKGF3YWl0IGdldENsaWVudCgpKS5zZXNzaW9uLnRhZy5zZXQob3B0cyksXG4gICAgICB9LFxuICAgIH0sXG4gICAgbWVzc2FnZToge1xuICAgICAgbGlzdDogYXN5bmMgKHNlc3Npb25JZCwgb3B0cykgPT5cbiAgICAgICAgKGF3YWl0IGdldENsaWVudCgpKS5tZXNzYWdlLmxpc3Qoc2Vzc2lvbklkLCBvcHRzKSxcbiAgICAgIGdldDogYXN5bmMgKGlkKSA9PiAoYXdhaXQgZ2V0Q2xpZW50KCkpLm1lc3NhZ2UuZ2V0KGlkKSxcbiAgICAgIHNldDogYXN5bmMgKG1lc3NhZ2UpID0+IChhd2FpdCBnZXRDbGllbnQoKSkubWVzc2FnZS5zZXQobWVzc2FnZSksXG4gICAgfSxcbiAgICBwYXJ0OiB7XG4gICAgICBsaXN0QnlNZXNzYWdlOiBhc3luYyAobWVzc2FnZUlkLCBvcHRzKSA9PlxuICAgICAgICAoYXdhaXQgZ2V0Q2xpZW50KCkpLnBhcnQubGlzdEJ5TWVzc2FnZShtZXNzYWdlSWQsIG9wdHMpLFxuICAgICAgbGlzdEJ5U2Vzc2lvbjogYXN5bmMgKHNlc3Npb25JZCwgb3B0cykgPT5cbiAgICAgICAgKGF3YWl0IGdldENsaWVudCgpKS5wYXJ0Lmxpc3RCeVNlc3Npb24oc2Vzc2lvbklkLCBvcHRzKSxcbiAgICAgIHNldDogYXN5bmMgKHBhcnQpID0+IChhd2FpdCBnZXRDbGllbnQoKSkucGFydC5zZXQocGFydCksXG4gICAgfSxcbiAgICBzYW5kYm94OiB7XG4gICAgICBnZXQ6IGFzeW5jIChrZXkpID0+IChhd2FpdCBnZXRDbGllbnQoKSkuc2FuZGJveC5nZXQoa2V5KSxcbiAgICAgIHNldDogYXN5bmMgKG9wdHMpID0+IChhd2FpdCBnZXRDbGllbnQoKSkuc2FuZGJveC5zZXQob3B0cyksXG4gICAgICBnZXRCeVNlc3Npb246IGFzeW5jIChzZXNzaW9uSWQpID0+XG4gICAgICAgIChhd2FpdCBnZXRDbGllbnQoKSkuc2FuZGJveC5nZXRCeVNlc3Npb24oc2Vzc2lvbklkKSxcbiAgICAgIGxpc3Q6IGFzeW5jIChvcHRzKSA9PiAoYXdhaXQgZ2V0Q2xpZW50KCkpLnNhbmRib3gubGlzdChvcHRzKSxcbiAgICAgIHRhZzoge1xuICAgICAgICBzZXQ6IGFzeW5jIChvcHRzKSA9PiAoYXdhaXQgZ2V0Q2xpZW50KCkpLnNhbmRib3gudGFnLnNldChvcHRzKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb21tYW5kOiB7XG4gICAgICBnZXQ6IGFzeW5jIChpZCkgPT4gKGF3YWl0IGdldENsaWVudCgpKS5jb21tYW5kLmdldChpZCksXG4gICAgICBzZXQ6IGFzeW5jIChjb21tYW5kKSA9PiAoYXdhaXQgZ2V0Q2xpZW50KCkpLmNvbW1hbmQuc2V0KGNvbW1hbmQpLFxuICAgICAgbGlzdDogYXN5bmMgKHNlc3Npb25JZCwgb3B0cykgPT5cbiAgICAgICAgKGF3YWl0IGdldENsaWVudCgpKS5jb21tYW5kLmxpc3Qoc2Vzc2lvbklkLCBvcHRzKSxcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmNvbnN0IFZlcmNlbExpZmVjeWNsZUNvbmZpZ1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3RvcEFmdGVySW5hY3RpdmVNczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBzbmFwc2hvdEJlZm9yZVRpbWVvdXRNczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBzbmFwc2hvdElkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGF1dG9TdGFydDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgU2FuZGJveENvbmZpZ1NjaGVtYSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gIHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJ2ZXJjZWxcIiksXG4gICAgcmVzb3VyY2VzOiB6Lm9iamVjdCh7IHZjcHVzOiB6Lm51bWJlcigpIH0pLm9wdGlvbmFsKCksXG4gICAgcG9ydHM6IHouYXJyYXkoei5udW1iZXIoKSkub3B0aW9uYWwoKSxcbiAgICBsaWZlY3ljbGU6IFZlcmNlbExpZmVjeWNsZUNvbmZpZ1NjaGVtYS5vcHRpb25hbCgpLFxuICB9KSxcbiAgei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbChcImxvY2FsXCIpLFxuICAgIHBhdGg6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgfSksXG4gIHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJjdXN0b21cIiksXG4gICAgdXJsOiB6LnN0cmluZygpLFxuICAgIGhlYWRlcnM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gIH0pLFxuXSk7XG5cbmV4cG9ydCB0eXBlIFNhbmRib3hDb25maWcgPSB6LmluZmVyPHR5cGVvZiBTYW5kYm94Q29uZmlnU2NoZW1hPjtcblxuZXhwb3J0IGNvbnN0IFNlc3Npb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBjcmVhdGVkQXQ6IHoubnVtYmVyKCksXG4gIHVwZGF0ZWRBdDogei5udW1iZXIoKSxcbiAgcnVuSWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgbGFzdE1lc3NhZ2VJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkubnVsbGFibGUoKSxcbiAgaW5zdHJ1Y3Rpb25zOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIG1vZGVsOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIG1jcDogei51bmtub3duKCkubnVsbGFibGUoKSwgLy8gVE9ET1xuICBzYW5kYm94SWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgc2tpbGxzRGlyOiB6LmFycmF5KHouc3RyaW5nKCkpLm51bGxhYmxlKCksXG4gIGhvb2tUb2tlbjogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBNZXNzYWdlU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICByb2xlOiB6LmVudW0oW1widXNlclwiLCBcImFzc2lzdGFudFwiLCBcInN5c3RlbVwiXSksXG4gIGNyZWF0ZWRBdDogei5udW1iZXIoKSxcbiAgY29tcGxldGVkQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgaW50ZXJydXB0ZWRBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBtY3BDb250ZXh0OiB6LnVua25vd24oKS5udWxsYWJsZSgpLFxufSk7XG5cbi8qKlxuICogVGhlIGBwYXJ0YCBmaWVsZCBjb3JyZXNwb25kcyB0byBgVUlNZXNzYWdlW1wicGFydHNcIl1bbnVtYmVyXWAgZnJvbSB0aGUgYGFpYCBwYWNrYWdlLlxuICogV2UgdXNlIGB6LnVua25vd24oKWAgYmVjYXVzZSB0aGUgZXhhY3Qgc2hhcGUgdmFyaWVzIGJ5IHBhcnQgdHlwZSAodGV4dCwgdG9vbC1jYWxsLFxuICogdG9vbC1yZXN1bHQsIGV0Yy4pIGFuZCBtYXkgZXZvbHZlIHdpdGggdGhlIEFJIFNESy4gVGhlIFJQQyBsYXllciBqdXN0IHBhc3NlcyBpdCB0aHJvdWdoLlxuICovXG5leHBvcnQgY29uc3QgUGFydFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIG1lc3NhZ2VJZDogei5zdHJpbmcoKSxcbiAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICBpbmRleDogei5udW1iZXIoKSxcbiAgcGFydDogei51bmtub3duKCksXG59KTtcblxuZXhwb3J0IGNvbnN0IENvbW1hbmRSZXN1bHRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHN0ZG91dDogei5zdHJpbmcoKSxcbiAgc3RkZXJyOiB6LnN0cmluZygpLFxuICBleGl0Q29kZTogei5udW1iZXIoKSxcbiAgY29tcGxldGVkQXQ6IHoubnVtYmVyKCksXG59KTtcblxuZXhwb3J0IGNvbnN0IFNhbmRib3hSZWNvcmRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBjb25maWc6IFNhbmRib3hDb25maWdTY2hlbWEsXG4gIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5udWxsYWJsZSgpLFxuICBjcmVhdGVkQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgbGFzdEFjdGl2aXR5QXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgYWNxdWlyaW5nTG9ja0lkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIGFjcXVpcmluZ0xvY2tBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBwcm92aWRlck1ldGFkYXRhOiB6XG4gICAgLmRpc2NyaW1pbmF0ZWRVbmlvbihcInByb3ZpZGVyXCIsIFtcbiAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgcHJvdmlkZXI6IHoubGl0ZXJhbChcInZlcmNlbFwiKSxcbiAgICAgICAgc2FuZGJveElkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgICAgIHNuYXBzaG90SWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgICAgIH0pLFxuICAgIF0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuY29uc3QgQ29tbWFuZEJhc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gIGNvbW1hbmQ6IHouc3RyaW5nKCksXG4gIGFyZ3M6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgc3RhcnRlZEF0OiB6Lm51bWJlcigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBDb21tYW5kU2NoZW1hID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJzdGF0dXNcIiwgW1xuICBDb21tYW5kQmFzZVNjaGVtYS5leHRlbmQoeyBzdGF0dXM6IHoubGl0ZXJhbChcInJ1bm5pbmdcIikgfSksXG4gIENvbW1hbmRCYXNlU2NoZW1hLmV4dGVuZCh7XG4gICAgc3RhdHVzOiB6LmxpdGVyYWwoXCJjb21wbGV0ZWRcIiksXG4gICAgcmVzdWx0OiBDb21tYW5kUmVzdWx0U2NoZW1hLFxuICB9KSxcbiAgQ29tbWFuZEJhc2VTY2hlbWEuZXh0ZW5kKHtcbiAgICBzdGF0dXM6IHoubGl0ZXJhbChcImtpbGxlZFwiKSxcbiAgICByZXN1bHQ6IENvbW1hbmRSZXN1bHRTY2hlbWEub3B0aW9uYWwoKSxcbiAgfSksXG4gIENvbW1hbmRCYXNlU2NoZW1hLmV4dGVuZCh7XG4gICAgc3RhdHVzOiB6LmxpdGVyYWwoXCJmYWlsZWRcIiksXG4gICAgcmVzdWx0OiBDb21tYW5kUmVzdWx0U2NoZW1hLFxuICB9KSxcbl0pO1xuXG5mdW5jdGlvbiBMaXN0UmVzdWx0U2NoZW1hPFQgZXh0ZW5kcyB6LlpvZFR5cGVBbnk+KGl0ZW1TY2hlbWE6IFQpIHtcbiAgcmV0dXJuIHoub2JqZWN0KHtcbiAgICBpdGVtczogei5hcnJheShpdGVtU2NoZW1hKSxcbiAgICBuZXh0Q3Vyc29yOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgbWV0aG9kcyA9IHtcbiAgXCJzZXNzaW9uLmdldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogU2Vzc2lvblNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcInNlc3Npb24uc2V0XCI6IHtcbiAgICBwYXJhbXM6IFNlc3Npb25TY2hlbWEsXG4gICAgcmVzdWx0OiBTZXNzaW9uU2NoZW1hLFxuICB9LFxuICBcInNlc3Npb24ubGlzdFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkub3B0aW9uYWwoKSxcbiAgICAgIG9yZGVyOiB6XG4gICAgICAgIC5lbnVtKFtcbiAgICAgICAgICBcImNyZWF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcImNyZWF0ZWRBdF9kZXNjXCIsXG4gICAgICAgICAgXCJ1cGRhdGVkQXRfYXNjXCIsXG4gICAgICAgICAgXCJ1cGRhdGVkQXRfZGVzY1wiLFxuICAgICAgICBdKVxuICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoU2Vzc2lvblNjaGVtYSksXG4gIH0sXG4gIFwic2Vzc2lvbi5saXN0QnlTYW5kYm94XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNhbmRib3hJZDogei5zdHJpbmcoKSxcbiAgICAgIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5vcHRpb25hbCgpLFxuICAgICAgb3JkZXI6IHpcbiAgICAgICAgLmVudW0oW1xuICAgICAgICAgIFwiY3JlYXRlZEF0X2FzY1wiLFxuICAgICAgICAgIFwiY3JlYXRlZEF0X2Rlc2NcIixcbiAgICAgICAgICBcInVwZGF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcInVwZGF0ZWRBdF9kZXNjXCIsXG4gICAgICAgIF0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShTZXNzaW9uU2NoZW1hKSxcbiAgfSxcbiAgXCJzZXNzaW9uLnRhZy5zZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICAgICAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogU2Vzc2lvblNjaGVtYSxcbiAgfSxcbiAgXCJtZXNzYWdlLmdldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogTWVzc2FnZVNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcIm1lc3NhZ2Uuc2V0XCI6IHtcbiAgICBwYXJhbXM6IE1lc3NhZ2VTY2hlbWEsXG4gICAgcmVzdWx0OiBNZXNzYWdlU2NoZW1hLFxuICB9LFxuICBcIm1lc3NhZ2UubGlzdFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKE1lc3NhZ2VTY2hlbWEpLFxuICB9LFxuICBcInBhcnQubGlzdEJ5TWVzc2FnZVwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBtZXNzYWdlSWQ6IHouc3RyaW5nKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKFBhcnRTY2hlbWEpLFxuICB9LFxuICBcInBhcnQubGlzdEJ5U2Vzc2lvblwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKFBhcnRTY2hlbWEpLFxuICB9LFxuICBcInBhcnQuc2V0XCI6IHtcbiAgICBwYXJhbXM6IFBhcnRTY2hlbWEsXG4gICAgcmVzdWx0OiBQYXJ0U2NoZW1hLFxuICB9LFxuICBcInNhbmRib3guZ2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsga2V5OiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogU2FuZGJveFJlY29yZFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcInNhbmRib3guZ2V0QnlTZXNzaW9uXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsgc2Vzc2lvbklkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogU2FuZGJveFJlY29yZFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcInNhbmRib3guc2V0XCI6IHtcbiAgICBwYXJhbXM6IFNhbmRib3hSZWNvcmRTY2hlbWEsXG4gICAgcmVzdWx0OiB6LnZvaWQoKSxcbiAgfSxcbiAgXCJzYW5kYm94Lmxpc3RcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLm9wdGlvbmFsKCksXG4gICAgICBvcmRlcjogelxuICAgICAgICAuZW51bShbXG4gICAgICAgICAgXCJjcmVhdGVkQXRfYXNjXCIsXG4gICAgICAgICAgXCJjcmVhdGVkQXRfZGVzY1wiLFxuICAgICAgICAgIFwibGFzdEFjdGl2aXR5QXRfYXNjXCIsXG4gICAgICAgICAgXCJsYXN0QWN0aXZpdHlBdF9kZXNjXCIsXG4gICAgICAgIF0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShTYW5kYm94UmVjb3JkU2NoZW1hKSxcbiAgfSxcbiAgXCJzYW5kYm94LnRhZy5zZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgc2FuZGJveElkOiB6LnN0cmluZygpLFxuICAgICAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogU2FuZGJveFJlY29yZFNjaGVtYSxcbiAgfSxcbiAgXCJjb21tYW5kLmdldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogQ29tbWFuZFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcImNvbW1hbmQuc2V0XCI6IHtcbiAgICBwYXJhbXM6IENvbW1hbmRTY2hlbWEsXG4gICAgcmVzdWx0OiBDb21tYW5kU2NoZW1hLFxuICB9LFxuICBcImNvbW1hbmQubGlzdFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gICAgICBpbmNsdWRlRmluaXNoZWQ6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKENvbW1hbmRTY2hlbWEpLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU3RvcmFnZU1ldGhvZHMgPSB0eXBlb2YgbWV0aG9kcztcbmV4cG9ydCB0eXBlIE1ldGhvZE5hbWUgPSBrZXlvZiBTdG9yYWdlTWV0aG9kcztcbiIsICJpbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyB0eXBlIE1ldGhvZE5hbWUsIG1ldGhvZHMsIHR5cGUgU3RvcmFnZU1ldGhvZHMgfSBmcm9tIFwiLi9ycGNcIjtcblxuZXhwb3J0IHR5cGUgSGFuZGxlcnMgPSB7XG4gIFtLIGluIE1ldGhvZE5hbWVdOiAoXG4gICAgcGFyYW1zOiB6LmluZmVyPFN0b3JhZ2VNZXRob2RzW0tdW1wicGFyYW1zXCJdPlxuICApID0+IFByb21pc2U8ei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tLXVtcInJlc3VsdFwiXT4+O1xufTtcblxuZXhwb3J0IHR5cGUgUnBjUmVxdWVzdCA9IHtcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHBhcmFtczogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIFJwY1N1Y2Nlc3NSZXNwb25zZTxUID0gdW5rbm93bj4gPSB7XG4gIHJlc3VsdDogVDtcbn07XG5cbmV4cG9ydCB0eXBlIFJwY0Vycm9yUmVzcG9uc2UgPSB7XG4gIGVycm9yOiB7IGNvZGU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH07XG59O1xuXG5leHBvcnQgdHlwZSBScGNSZXNwb25zZTxUID0gdW5rbm93bj4gPSBScGNTdWNjZXNzUmVzcG9uc2U8VD4gfCBScGNFcnJvclJlc3BvbnNlO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlU3RvcmFnZVJwYyhcbiAgYm9keTogUnBjUmVxdWVzdCxcbiAgaGFuZGxlcnM6IEhhbmRsZXJzXG4pOiBQcm9taXNlPFJwY1Jlc3BvbnNlPiB7XG4gIGNvbnN0IHsgbWV0aG9kLCBwYXJhbXMgfSA9IGJvZHk7XG5cbiAgaWYgKCEobWV0aG9kIGluIG1ldGhvZHMpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiB7IGNvZGU6IFwiTUVUSE9EX05PVF9GT1VORFwiLCBtZXNzYWdlOiBgVW5rbm93biBtZXRob2Q6ICR7bWV0aG9kfWAgfSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgbWV0aG9kTmFtZSA9IG1ldGhvZCBhcyBNZXRob2ROYW1lO1xuICBjb25zdCBzY2hlbWEgPSBtZXRob2RzW21ldGhvZE5hbWVdLnBhcmFtcztcbiAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnNhZmVQYXJzZShwYXJhbXMpO1xuXG4gIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogXCJJTlZBTElEX1BBUkFNU1wiLFxuICAgICAgICBtZXNzYWdlOiBwYXJzZWQuZXJyb3IuaXNzdWVzXG4gICAgICAgICAgLm1hcCgoaSkgPT4gYCR7aS5wYXRoLmpvaW4oXCIuXCIpfTogJHtpLm1lc3NhZ2V9YClcbiAgICAgICAgICAuam9pbihcIiwgXCIpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnNbbWV0aG9kTmFtZV0gYXMgKFxuICAgICAgcGFyYW1zOiB1bmtub3duXG4gICAgKSA9PiBQcm9taXNlPHVua25vd24+O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIocGFyc2VkLmRhdGEpO1xuICAgIHJldHVybiB7IHJlc3VsdCB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIGNvZGU6IFwiSU5URVJOQUxfRVJST1JcIixcbiAgICAgICAgbWVzc2FnZTogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCAiZXhwb3J0IHsgZ2V0U3RvcmFnZSB9IGZyb20gXCIuL2NsaWVudFwiO1xuZXhwb3J0IHtcbiAgdHlwZSBIYW5kbGVycyxcbiAgaGFuZGxlU3RvcmFnZVJwYyxcbiAgdHlwZSBScGNFcnJvclJlc3BvbnNlLFxuICB0eXBlIFJwY1JlcXVlc3QsXG4gIHR5cGUgUnBjUmVzcG9uc2UsXG4gIHR5cGUgUnBjU3VjY2Vzc1Jlc3BvbnNlLFxufSBmcm9tIFwiLi9oYW5kbGVyXCI7XG5leHBvcnQge1xuICBDb21tYW5kUmVzdWx0U2NoZW1hLFxuICBDb21tYW5kU2NoZW1hLFxuICBNZXNzYWdlU2NoZW1hLFxuICB0eXBlIE1ldGhvZE5hbWUsXG4gIG1ldGhvZHMsXG4gIFBhcnRTY2hlbWEsXG4gIHR5cGUgU2FuZGJveENvbmZpZyxcbiAgU2FuZGJveENvbmZpZ1NjaGVtYSxcbiAgU2FuZGJveFJlY29yZFNjaGVtYSxcbiAgU2Vzc2lvblNjaGVtYSxcbiAgdHlwZSBTdG9yYWdlTWV0aG9kcyxcbn0gZnJvbSBcIi4vcnBjXCI7XG5leHBvcnQgdHlwZSB7XG4gIENvbW1hbmQsXG4gIExpc3RSZXN1bHQsXG4gIE1lc3NhZ2UsXG4gIFBhcnQsXG4gIFJlc29sdmVkU3RvcmFnZSxcbiAgU2FuZGJveFJlY29yZCxcbiAgU2Vzc2lvbixcbiAgU3RvcmFnZSxcbiAgU3RvcmFnZUNvbmZpZyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbiIsICJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgVXBsb2FkYWJsZUZpbGUgfSBmcm9tIFwiLi4vc2tpbGxzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3ggfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIFdyaXRlcyBmaWxlcyB0byBhIHNhbmRib3ggYXQgdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbiBwYXRoLlxuICogU2hlbGwgc2NyaXB0cyAoLnNoIGZpbGVzKSBhcmUgYXV0b21hdGljYWxseSBtYWRlIGV4ZWN1dGFibGUuXG4gKlxuICogRm9yIHNtYWxsIGZpbGVzICg8MTAwS0IgdG90YWwpLCB1c2VzIHNpbmdsZSBleGVjIHdpdGggaGVyZWRvYy5cbiAqIEZvciBsYXJnZSBmaWxlcywgd3JpdGVzIGJhc2U2NCBjaHVua3MgdGhlbiBkZWNvZGVzIHRvIGF2b2lkIEFSR19NQVggbGltaXRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWxlcyhvcHRzOiB7XG4gIHNhbmRib3g6IFBpY2s8U2FuZGJveCwgXCJleGVjXCI+O1xuICBmaWxlczogVXBsb2FkYWJsZUZpbGVbXTtcbiAgZGVzdFBhdGg6IHN0cmluZztcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBmaWxlcywgZGVzdFBhdGggfSA9IG9wdHM7XG5cbiAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGZpbGVQYXRocyA9IGZpbGVzLm1hcCgoZmlsZSkgPT5cbiAgICBwYXRoLnBvc2l4LmpvaW4oZGVzdFBhdGgsIGZpbGUucGF0aClcbiAgKTtcbiAgY29uc3QgcGFyZW50RGlycyA9IEFycmF5LmZyb20oXG4gICAgbmV3IFNldChmaWxlUGF0aHMubWFwKChwKSA9PiBwYXRoLnBvc2l4LmRpcm5hbWUocCkpKVxuICApO1xuICBjb25zdCBzaGVsbFNjcmlwdHMgPSBmaWxlUGF0aHMuZmlsdGVyKChwKSA9PiBwLmVuZHNXaXRoKFwiLnNoXCIpKTtcblxuICBjb25zdCBta2RpclJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgY29tbWFuZDogXCJta2RpclwiLFxuICAgIGFyZ3M6IFtcIi1wXCIsIC4uLnBhcmVudERpcnNdLFxuICB9KTtcbiAgaWYgKG1rZGlyUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICB0aHJvdyBta2RpclJlc3VsdDtcbiAgfVxuICBhd2FpdCBta2RpclJlc3VsdC5yZXN1bHQ7XG5cbiAgY29uc3QgQ0hVTktfU0laRSA9IDUwXzAwMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZmlsZSA9IGZpbGVzW2ldO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gZmlsZVBhdGhzW2ldO1xuICAgIGNvbnN0IGJhc2U2NENvbnRlbnQgPSB0b0Jhc2U2NChmaWxlLmNvbnRlbnQpO1xuXG4gICAgaWYgKGJhc2U2NENvbnRlbnQubGVuZ3RoIDwgQ0hVTktfU0laRSkge1xuICAgICAgY29uc3QgbWFya2VyID0gYEVPRl8ke2l9YDtcbiAgICAgIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgICBjb21tYW5kOiBcImJhc2hcIixcbiAgICAgICAgYXJnczogW1xuICAgICAgICAgIFwiLWNcIixcbiAgICAgICAgICBgYmFzZTY0IC1kID4gJHtxdW90ZShmdWxsUGF0aCl9IDw8ICcke21hcmtlcn0nXG4ke2Jhc2U2NENvbnRlbnR9XG4ke21hcmtlcn1gLFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChleGVjUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXhlY1Jlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBleGl0Q29kZSwgc3RkZXJyIH0gPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcbiAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHdyaXRlRmlsZXMgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7ZXhpdENvZGV9OiAke3N0ZGVycn1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRlbXBCNjQgPSBgL3RtcC9jaHVuay0ke0RhdGUubm93KCl9LSR7aX0uYjY0YDtcblxuICAgICAgY29uc3QgY2xlYXJSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgICBjb21tYW5kOiBcImJhc2hcIixcbiAgICAgICAgYXJnczogW1wiLWNcIiwgYD4gJHtxdW90ZSh0ZW1wQjY0KX1gXSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGNsZWFyUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgY2xlYXJSZXN1bHQ7XG4gICAgICB9XG4gICAgICBhd2FpdCBjbGVhclJlc3VsdC5yZXN1bHQ7XG5cbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBvZmZzZXQgPCBiYXNlNjRDb250ZW50Lmxlbmd0aDtcbiAgICAgICAgb2Zmc2V0ICs9IENIVU5LX1NJWkVcbiAgICAgICkge1xuICAgICAgICBjb25zdCBjaHVuayA9IGJhc2U2NENvbnRlbnQuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBDSFVOS19TSVpFKTtcbiAgICAgICAgY29uc3QgbWFya2VyID0gYENIVU5LXyR7b2Zmc2V0fWA7XG4gICAgICAgIGNvbnN0IGFwcGVuZFJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgICAgICAgY29tbWFuZDogXCJiYXNoXCIsXG4gICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgXCItY1wiLFxuICAgICAgICAgICAgYGNhdCA+PiAke3F1b3RlKHRlbXBCNjQpfSA8PCAnJHttYXJrZXJ9J1xuJHtjaHVua31cbiR7bWFya2VyfWAsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGFwcGVuZFJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgYXBwZW5kUmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBleGl0Q29kZSwgc3RkZXJyIH0gPSBhd2FpdCBhcHBlbmRSZXN1bHQucmVzdWx0O1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgd3JpdGVGaWxlcyBjaHVuayBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJHtleGl0Q29kZX06ICR7c3RkZXJyfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29kZVJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgICAgIGNvbW1hbmQ6IFwiYmFzaFwiLFxuICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgXCItY1wiLFxuICAgICAgICAgIGBiYXNlNjQgLWQgPCAke3F1b3RlKHRlbXBCNjQpfSA+ICR7cXVvdGUoZnVsbFBhdGgpfSAmJiBybSAtZiAke3F1b3RlKHRlbXBCNjQpfWAsXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlY29kZVJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGRlY29kZVJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBleGl0Q29kZSwgc3RkZXJyIH0gPSBhd2FpdCBkZWNvZGVSZXN1bHQucmVzdWx0O1xuICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgd3JpdGVGaWxlcyBkZWNvZGUgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7ZXhpdENvZGV9OiAke3N0ZGVycn1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHNoZWxsU2NyaXB0cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgY2htb2RSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgY29tbWFuZDogXCJjaG1vZFwiLFxuICAgICAgYXJnczogW1wiK3hcIiwgLi4uc2hlbGxTY3JpcHRzXSxcbiAgICB9KTtcbiAgICBpZiAoY2htb2RSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhyb3cgY2htb2RSZXN1bHQ7XG4gICAgfVxuICAgIGF3YWl0IGNobW9kUmVzdWx0LnJlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0Jhc2U2NChjb250ZW50OiBzdHJpbmcgfCBCdWZmZXIpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oY29udGVudCkudG9TdHJpbmcoXCJiYXNlNjRcIik7XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnQudG9TdHJpbmcoXCJiYXNlNjRcIik7XG59XG5cbmZ1bmN0aW9uIHF1b3RlKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJyR7cy5yZXBsYWNlKC8nL2csIFwiJ1xcXFwnJ1wiKX0nYDtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENoaWxkUHJvY2VzcyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0ICogYXMgZXJyb3JlIGZyb20gXCJlcnJvcmVcIjtcbmltcG9ydCB7IHVsaWQgfSBmcm9tIFwidWxpZFwiO1xuaW1wb3J0IHsgU2FuZGJveEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yc1wiO1xuaW1wb3J0IHR5cGUgeyBUYWdzU2NoZW1hIH0gZnJvbSBcIi4uLy4uL2luZGV4XCI7XG5pbXBvcnQge1xuICBnZXRTdG9yYWdlLFxuICB0eXBlIFNhbmRib3hSZWNvcmQsXG4gIHR5cGUgU3RvcmFnZUNvbmZpZyxcbn0gZnJvbSBcIi4uLy4uL3N0b3JhZ2VcIjtcbmltcG9ydCB0eXBlIHsgTG9nRW50cnksIFNhbmRib3ggfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IHdyaXRlRmlsZXMgfSBmcm9tIFwiLi4vd3JpdGUtZmlsZXNcIjtcblxuZXhwb3J0IGNvbnN0IGxvY2FsU2FuZGJveCA9IDxUVGFncyBleHRlbmRzIFRhZ3NTY2hlbWEgPSBUYWdzU2NoZW1hPih7XG4gIHNhbmRib3hSZWNvcmQsXG4gIHN0b3JhZ2VDb25maWcsXG59OiB7XG4gIHNhbmRib3hSZWNvcmQ6IFNhbmRib3hSZWNvcmQgJiB7IGNvbmZpZzogeyB0eXBlOiBcImxvY2FsXCIgfSB9O1xuICBzdG9yYWdlQ29uZmlnOiBTdG9yYWdlQ29uZmlnO1xufSk6IFNhbmRib3g8VFRhZ3M+ID0+IHtcbiAgY29uc3QgY29uZmlnID0gc2FuZGJveFJlY29yZC5jb25maWc7XG4gIGNvbnN0IGJhc2VQYXRoID0gY29uZmlnLnBhdGggPz8gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgcHJvY2Vzc2VzID0gbmV3IE1hcDxzdHJpbmcsIENoaWxkUHJvY2Vzcz4oKTtcbiAgY29uc3Qgc3RvcmFnZSA9IGdldFN0b3JhZ2Uoc3RvcmFnZUNvbmZpZyk7XG5cbiAgY29uc3Qgc2FuZGJveDogU2FuZGJveDxUVGFncz4gPSB7XG4gICAgaWQ6IHNhbmRib3hSZWNvcmQuaWQsXG4gICAgY29uZmlnOiBzYW5kYm94UmVjb3JkLmNvbmZpZyxcbiAgICBleGVjOiAoeyBjb21tYW5kLCBhcmdzLCBzaWduYWwgfSkgPT4ge1xuICAgICAgcmV0dXJuIGVycm9yZS50cnlBc3luYyh7XG4gICAgICAgIHRyeTogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbW1hbmRJZCA9IGBjb21tYW5kXyR7dWxpZCgpfWA7XG5cbiAgICAgICAgICBjb25zdCBjaGlsZCA9IHNwYXduKGNvbW1hbmQsIGFyZ3MsIHtcbiAgICAgICAgICAgIGN3ZDogYmFzZVBhdGgsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBwcm9jZXNzZXMuc2V0KGNvbW1hbmRJZCwgY2hpbGQpO1xuXG4gICAgICAgICAgbGV0IHN0ZG91dCA9IFwiXCI7XG4gICAgICAgICAgbGV0IHN0ZGVyciA9IFwiXCI7XG4gICAgICAgICAgY29uc3QgbG9nUXVldWU6IExvZ0VudHJ5W10gPSBbXTtcbiAgICAgICAgICBsZXQgbG9nUmVzb2x2ZTogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgbGV0IGNsb3NlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKFwiZGF0YVwiLCAoZGF0YTogc3RyaW5nIHwgQnVmZmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdHIgPSBTdHJpbmcoZGF0YSk7XG4gICAgICAgICAgICBzdGRvdXQgKz0gc3RyO1xuICAgICAgICAgICAgbG9nUXVldWUucHVzaCh7IHN0cmVhbTogXCJzdGRvdXRcIiwgZGF0YTogc3RyIH0pO1xuICAgICAgICAgICAgbG9nUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjaGlsZC5zdGRlcnIub24oXCJkYXRhXCIsIChkYXRhOiBzdHJpbmcgfCBCdWZmZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0ciA9IFN0cmluZyhkYXRhKTtcbiAgICAgICAgICAgIHN0ZGVyciArPSBzdHI7XG4gICAgICAgICAgICBsb2dRdWV1ZS5wdXNoKHsgc3RyZWFtOiBcInN0ZGVyclwiLCBkYXRhOiBzdHIgfSk7XG4gICAgICAgICAgICBsb2dSZXNvbHZlPy4oKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBQcm9taXNlPHtcbiAgICAgICAgICAgIHN0ZG91dDogc3RyaW5nO1xuICAgICAgICAgICAgc3RkZXJyOiBzdHJpbmc7XG4gICAgICAgICAgICBleGl0Q29kZTogbnVtYmVyO1xuICAgICAgICAgIH0+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICAgICAgICBwcm9jZXNzZXMuZGVsZXRlKGNvbW1hbmRJZCk7XG4gICAgICAgICAgICAgIGNsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjaGlsZC5vbihcImNsb3NlXCIsIChjb2RlOiBudW1iZXIgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgIHByb2Nlc3Nlcy5kZWxldGUoY29tbWFuZElkKTtcbiAgICAgICAgICAgICAgY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgbG9nUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICAgIHJlc29sdmUoeyBzdGRvdXQsIHN0ZGVyciwgZXhpdENvZGU6IGNvZGUgPz8gMCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYXN5bmMgZnVuY3Rpb24qIGxvZ3MoKTogQXN5bmNJdGVyYWJsZTxMb2dFbnRyeT4ge1xuICAgICAgICAgICAgd2hpbGUgKCFjbG9zZWQgfHwgbG9nUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGxvZ1F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGVudHJ5O1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjbG9zZWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgbG9nUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbG9nUmVzb2x2ZSA9IG51bGw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgY29tbWFuZElkLCBsb2dzLCByZXN1bHQgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNhdGNoOiAoZTogdW5rbm93bikgPT5cbiAgICAgICAgICBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGdldERvbWFpbjogKHBvcnQpID0+IHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWApO1xuICAgIH0sXG5cbiAgICBraWxsOiBhc3luYyAoeyBjb21tYW5kSWQsIHN0b3JhZ2UgfSkgPT4ge1xuICAgICAgY29uc3QgY2hpbGQgPSBwcm9jZXNzZXMuZ2V0KGNvbW1hbmRJZCk7XG4gICAgICBpZiAoIWNoaWxkKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHtcbiAgICAgICAgICByZWFzb246IGBDb21tYW5kICR7Y29tbWFuZElkfSBub3QgZm91bmQgb3IgYWxyZWFkeSBmaW5pc2hlZGAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjaGlsZC5raWxsKFwiU0lHVEVSTVwiKTtcblxuICAgICAgY29uc3QgY21kID0gYXdhaXQgc3RvcmFnZS5jb21tYW5kLmdldChjb21tYW5kSWQpO1xuICAgICAgaWYgKGNtZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBjbWQubWVzc2FnZSwgY2F1c2U6IGNtZCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjbWQgJiYgY21kLnN0YXR1cyA9PT0gXCJydW5uaW5nXCIpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5jb21tYW5kLnNldCh7XG4gICAgICAgICAgLi4uY21kLFxuICAgICAgICAgIHN0YXR1czogXCJraWxsZWRcIixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiByZXN1bHQubWVzc2FnZSwgY2F1c2U6IHJlc3VsdCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB3cml0ZUZpbGVzOiAob3B0cykgPT4gd3JpdGVGaWxlcyh7IHNhbmRib3gsIC4uLm9wdHMgfSksXG5cbiAgICB0YWc6IHtcbiAgICAgIGxpc3Q6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FuZGJveFJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoc2FuZGJveC5pZCk7XG4gICAgICAgIGlmIChzYW5kYm94UmVjb3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gc2FuZGJveFJlY29yZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHNhbmRib3hSZWNvcmQudGFncyA/PyB7fSkgYXMgVFRhZ3M7XG4gICAgICB9LFxuICAgICAgZ2V0OiBhc3luYyAoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc2FuZGJveFJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoc2FuZGJveC5pZCk7XG4gICAgICAgIGlmIChzYW5kYm94UmVjb3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gc2FuZGJveFJlY29yZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2FuZGJveFJlY29yZC50YWdzPy5ba2V5IGFzIHN0cmluZ10gYXNcbiAgICAgICAgICB8IFRUYWdzW3R5cGVvZiBrZXldXG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC50YWcuc2V0KHtcbiAgICAgICAgICBzYW5kYm94SWQ6IHNhbmRib3guaWQsXG4gICAgICAgICAgdGFnczogeyBba2V5XTogdmFsdWUgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgICBzZXRNYW55OiBhc3luYyAodGFnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LnRhZy5zZXQoe1xuICAgICAgICAgIHNhbmRib3hJZDogc2FuZGJveC5pZCxcbiAgICAgICAgICB0YWdzOiB0YWdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBzYW5kYm94O1xufTtcbiIsICJpbXBvcnQgKiBhcyBlcnJvcmUgZnJvbSBcImVycm9yZVwiO1xuaW1wb3J0IHsgU2FuZGJveCBhcyBWZXJjZWxTYW5kYm94U0RLIH0gZnJvbSBcInNhbmRib3hcIjtcbmltcG9ydCB7IFNhbmRib3hFcnJvciwgU2FuZGJveE5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JzXCI7XG5pbXBvcnQgdHlwZSB7IFRhZ3NTY2hlbWEgfSBmcm9tIFwiLi4vLi4vaW5kZXhcIjtcbmltcG9ydCB7XG4gIGdldFN0b3JhZ2UsXG4gIHR5cGUgU2FuZGJveFJlY29yZCxcbiAgdHlwZSBTdG9yYWdlLFxuICB0eXBlIFN0b3JhZ2VDb25maWcsXG59IGZyb20gXCIuLi8uLi9zdG9yYWdlXCI7XG5pbXBvcnQgdHlwZSB7XG4gIExvZ0VudHJ5LFxuICBTYW5kYm94LFxuICBTYW5kYm94TGlmZWN5Y2xlLFxuICBTYW5kYm94U3RhdHVzLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IHdyaXRlRmlsZXMgfSBmcm9tIFwiLi4vd3JpdGUtZmlsZXNcIjtcblxuZXhwb3J0IHR5cGUgVmVyY2VsU2FuZGJveENyZWF0ZU9wdGlvbnMgPSBFeHRyYWN0PFxuICBQYXJhbWV0ZXJzPHR5cGVvZiBWZXJjZWxTYW5kYm94U0RLLmNyZWF0ZT5bMF0sXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9CYW5uZWRUeXBlczogLlxuICB7fVxuPjtcblxuZXhwb3J0IGNvbnN0IFZFUkNFTF9NQVhfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDYwICogMTAwMDsgLy8gNSBob3Vyc1xuY29uc3QgTE9DS19USU1FT1VUX01TID0gMiAqIDYwICogMTAwMDsgLy8gMiBtaW51dGVzIC0gaWYgbG9jayBvbGRlciB0aGFuIHRoaXMsIGNvbnNpZGVyIGl0IHN0YWxlXG5jb25zdCBMT0NLX1BPTExfSU5URVJWQUxfTVMgPSAyMDA7XG5cbmNvbnN0IGdldFRlc3RDcmVkZW50aWFscyA9ICgpID0+XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIlxuICAgID8ge1xuICAgICAgICB0b2tlbjogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVE9LRU4sXG4gICAgICAgIHRlYW1JZDogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVEVBTV9JRCxcbiAgICAgICAgcHJvamVjdElkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9QUk9KRUNUX0lELFxuICAgICAgfVxuICAgIDoge307XG5cbi8qKlxuICogTW9kdWxlLWxldmVsIGNhY2hlIGZvciBpbi1mbGlnaHQgc2FuZGJveCBjcmVhdGlvbiBwcm9taXNlcy5cbiAqIFByZXZlbnRzIHBhcmFsbGVsIHJlcXVlc3RzIHdpdGhpbiB0aGUgc2FtZSBwcm9jZXNzIGZyb20gY3JlYXRpbmcgZHVwbGljYXRlIHNhbmRib3hlcy5cbiAqL1xuY29uc3QgY3JlYXRlUHJvbWlzZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBzdHJpbmc+PigpO1xuXG5jb25zdCBBQ1RJVklUWV9USFJPVFRMRV9NUyA9IDEwXzAwMDtcbmNvbnN0IGxhc3RBY3Rpdml0eVNlbnQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG5jb25zdCBERUZBVUxUX1ZDUFVTID0gMjtcblxuZXhwb3J0IGNvbnN0IHZlcmNlbFNhbmRib3ggPSA8VFRhZ3MgZXh0ZW5kcyBUYWdzU2NoZW1hID0gVGFnc1NjaGVtYT4oe1xuICBzYW5kYm94UmVjb3JkLFxuICBzdG9yYWdlQ29uZmlnLFxuICBlbmFibGVMaWZlY3ljbGVXb3JrZmxvdyA9IHRydWUsXG4gIHN0b3JhZ2U6IHN0b3JhZ2VPdmVycmlkZSxcbn06IHtcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZCAmIHsgY29uZmlnOiB7IHR5cGU6IFwidmVyY2VsXCIgfSB9O1xuICBzdG9yYWdlQ29uZmlnOiBTdG9yYWdlQ29uZmlnO1xuICBlbmFibGVMaWZlY3ljbGVXb3JrZmxvdz86IGJvb2xlYW47XG4gIHN0b3JhZ2U/OiBTdG9yYWdlO1xufSk6IFNhbmRib3g8VFRhZ3M+ID0+IHtcbiAgY29uc3QgeyBpZCwgY29uZmlnIH0gPSBzYW5kYm94UmVjb3JkO1xuICBjb25zdCB2Y3B1cyA9IGNvbmZpZy5yZXNvdXJjZXM/LnZjcHVzID8/IERFRkFVTFRfVkNQVVM7XG4gIGNvbnN0IHBvcnRzID0gY29uZmlnLnBvcnRzO1xuICBjb25zdCBzdG9yYWdlID0gc3RvcmFnZU92ZXJyaWRlID8/IGdldFN0b3JhZ2Uoc3RvcmFnZUNvbmZpZyk7XG4gIGNvbnN0IGluaXRpYWxWZXJjZWwgPVxuICAgIHNhbmRib3hSZWNvcmQucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgID8gc2FuZGJveFJlY29yZC5wcm92aWRlck1ldGFkYXRhXG4gICAgICA6IG51bGw7XG5cbiAgdHlwZSBTYW5kYm94SW5zdGFuY2UgPSBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIFZlcmNlbFNhbmRib3hTREsuZ2V0Pj47XG4gIGxldCBzYW5kYm94UHJvbWlzZTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBTYW5kYm94SW5zdGFuY2U+IHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IEhPTUVfRElSID0gXCIvaG9tZS92ZXJjZWwtc2FuZGJveFwiO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHBvbGxGb3JTYW5kYm94SWQoKTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBMT0NLX1RJTUVPVVRfTVM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgTE9DS19QT0xMX0lOVEVSVkFMX01TKSk7XG4gICAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICAgIGlmIChyZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogcmVjb3JkLm1lc3NhZ2UsIGNhdXNlOiByZWNvcmQgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB2ZXJjZWxTYW5kYm94SWQgPVxuICAgICAgICByZWNvcmQ/LnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICAgICAgPyByZWNvcmQucHJvdmlkZXJNZXRhZGF0YS5zYW5kYm94SWRcbiAgICAgICAgICA6IG51bGw7XG4gICAgICBpZiAodmVyY2VsU2FuZGJveElkKSB7XG4gICAgICAgIHJldHVybiB2ZXJjZWxTYW5kYm94SWQ7XG4gICAgICB9XG4gICAgICBpZiAoIXJlY29yZD8uYWNxdWlyaW5nTG9ja0F0KSB7XG4gICAgICAgIGNvbnN0IGZpbmFsQ2hlY2sgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICAgICAgaWYgKGZpbmFsQ2hlY2sgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHtcbiAgICAgICAgICAgIHJlYXNvbjogZmluYWxDaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgY2F1c2U6IGZpbmFsQ2hlY2ssXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmluYWxWZXJjZWxTYW5kYm94SWQgPVxuICAgICAgICAgIGZpbmFsQ2hlY2s/LnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICAgICAgICA/IGZpbmFsQ2hlY2sucHJvdmlkZXJNZXRhZGF0YS5zYW5kYm94SWRcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgaWYgKGZpbmFsVmVyY2VsU2FuZGJveElkKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbmFsVmVyY2VsU2FuZGJveElkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkb0dldE9yQ3JlYXRlU2FuZGJveElkKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHtcbiAgICAgIHJlYXNvbjogXCJUaW1lZCBvdXQgd2FpdGluZyBmb3Igc2FuZGJveCBjcmVhdGlvbiBieSBhbm90aGVyIHByb2Nlc3NcIixcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNhbmRib3hGcm9tU25hcHNob3QoXG4gICAgc25hcHNob3RJZDogc3RyaW5nXG4gICk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgc3RyaW5nPiB7XG4gICAgcmV0dXJuIGF3YWl0IGVycm9yZS50cnlBc3luYyh7XG4gICAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFZlcmNlbFNhbmRib3hTREsuY3JlYXRlKHtcbiAgICAgICAgICBzb3VyY2U6IHsgdHlwZTogXCJzbmFwc2hvdFwiLCBzbmFwc2hvdElkIH0sXG4gICAgICAgICAgcmVzb3VyY2VzOiB7IHZjcHVzIH0sXG4gICAgICAgICAgdGltZW91dDogVkVSQ0VMX01BWF9USU1FT1VUX01TLFxuICAgICAgICAgIHBvcnRzLFxuICAgICAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIHRhZ3M6IHNhbmRib3hSZWNvcmQudGFncyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICBsYXN0QWN0aXZpdHlBdDogbm93LFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgcHJvdmlkZXI6IFwidmVyY2VsXCIsXG4gICAgICAgICAgICBzYW5kYm94SWQ6IHNhbmRib3guc2FuZGJveElkLFxuICAgICAgICAgICAgc25hcHNob3RJZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHNhbmRib3guc2FuZGJveElkO1xuICAgICAgfSxcbiAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUZyZXNoU2FuZGJveCgpOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IHN0cmluZz4ge1xuICAgIHJldHVybiBhd2FpdCBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgdHJ5OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBWZXJjZWxTYW5kYm94U0RLLmNyZWF0ZSh7XG4gICAgICAgICAgcmVzb3VyY2VzOiB7IHZjcHVzIH0sXG4gICAgICAgICAgdGltZW91dDogVkVSQ0VMX01BWF9USU1FT1VUX01TLFxuICAgICAgICAgIHBvcnRzLFxuICAgICAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIHRhZ3M6IHNhbmRib3hSZWNvcmQudGFncyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICBsYXN0QWN0aXZpdHlBdDogbm93LFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgcHJvdmlkZXI6IFwidmVyY2VsXCIsXG4gICAgICAgICAgICBzYW5kYm94SWQ6IHNhbmRib3guc2FuZGJveElkLFxuICAgICAgICAgICAgc25hcHNob3RJZDogbnVsbCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHNhbmRib3guc2FuZGJveElkO1xuICAgICAgfSxcbiAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRvR2V0T3JDcmVhdGVTYW5kYm94SWQoKTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBzdHJpbmc+IHtcbiAgICBpZiAoaW5pdGlhbFZlcmNlbD8uc2FuZGJveElkKSB7XG4gICAgICByZXR1cm4gaW5pdGlhbFZlcmNlbC5zYW5kYm94SWQ7XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICBpZiAoZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYgKGV4aXN0aW5nIGluc3RhbmNlb2YgU2FuZGJveE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgLy8gU2FuZGJveCBkb2Vzbid0IGV4aXN0IHlldCwgY29udGludWUgd2l0aCBjcmVhdGlvblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IGV4aXN0aW5nLm1lc3NhZ2UsIGNhdXNlOiBleGlzdGluZyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ1JlY29yZCA9XG4gICAgICBleGlzdGluZyBpbnN0YW5jZW9mIFNhbmRib3hOb3RGb3VuZEVycm9yID8gbnVsbCA6IGV4aXN0aW5nO1xuICAgIGNvbnN0IGV4aXN0aW5nVmVyY2VsID1cbiAgICAgIGV4aXN0aW5nUmVjb3JkPy5wcm92aWRlck1ldGFkYXRhPy5wcm92aWRlciA9PT0gXCJ2ZXJjZWxcIlxuICAgICAgICA/IGV4aXN0aW5nUmVjb3JkLnByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgOiBudWxsO1xuXG4gICAgaWYgKGV4aXN0aW5nVmVyY2VsPy5zYW5kYm94SWQpIHtcbiAgICAgIHJldHVybiBleGlzdGluZ1ZlcmNlbC5zYW5kYm94SWQ7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzQWN0aXZlTG9jayA9XG4gICAgICBleGlzdGluZ1JlY29yZD8uYWNxdWlyaW5nTG9ja0lkICYmXG4gICAgICBleGlzdGluZ1JlY29yZC5hY3F1aXJpbmdMb2NrQXQgJiZcbiAgICAgIERhdGUubm93KCkgLSBleGlzdGluZ1JlY29yZC5hY3F1aXJpbmdMb2NrQXQgPCBMT0NLX1RJTUVPVVRfTVM7XG5cbiAgICBpZiAoaGFzQWN0aXZlTG9jaykge1xuICAgICAgcmV0dXJuIHBvbGxGb3JTYW5kYm94SWQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2NrSWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICBpZCxcbiAgICAgIGNvbmZpZyxcbiAgICAgIHRhZ3M6IGV4aXN0aW5nUmVjb3JkPy50YWdzID8/IHNhbmRib3hSZWNvcmQudGFncyxcbiAgICAgIGNyZWF0ZWRBdDogZXhpc3RpbmdSZWNvcmQ/LmNyZWF0ZWRBdCA/PyBzYW5kYm94UmVjb3JkLmNyZWF0ZWRBdCxcbiAgICAgIGxhc3RBY3Rpdml0eUF0OlxuICAgICAgICBleGlzdGluZ1JlY29yZD8ubGFzdEFjdGl2aXR5QXQgPz8gc2FuZGJveFJlY29yZC5sYXN0QWN0aXZpdHlBdCxcbiAgICAgIGFjcXVpcmluZ0xvY2tJZDogbG9ja0lkLFxuICAgICAgYWNxdWlyaW5nTG9ja0F0OiBub3csXG4gICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgIHNuYXBzaG90SWQ6XG4gICAgICAgICAgZXhpc3RpbmdWZXJjZWw/LnNuYXBzaG90SWQgPz8gaW5pdGlhbFZlcmNlbD8uc25hcHNob3RJZCA/PyBudWxsLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGFmdGVyTG9jayA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgIGlmIChhZnRlckxvY2sgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IGFmdGVyTG9jay5tZXNzYWdlLCBjYXVzZTogYWZ0ZXJMb2NrIH0pO1xuICAgIH1cbiAgICBpZiAoYWZ0ZXJMb2NrPy5hY3F1aXJpbmdMb2NrSWQgIT09IGxvY2tJZCkge1xuICAgICAgcmV0dXJuIHBvbGxGb3JTYW5kYm94SWQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzbmFwc2hvdElkID1cbiAgICAgIGV4aXN0aW5nVmVyY2VsPy5zbmFwc2hvdElkID8/XG4gICAgICBpbml0aWFsVmVyY2VsPy5zbmFwc2hvdElkID8/XG4gICAgICBjb25maWcubGlmZWN5Y2xlPy5zbmFwc2hvdElkO1xuICAgIGlmIChzbmFwc2hvdElkKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVTYW5kYm94RnJvbVNuYXBzaG90KHNuYXBzaG90SWQpO1xuICAgICAgaWYgKCEocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUZyZXNoU2FuZGJveCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0T3JDcmVhdGVTYW5kYm94SWQoKTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBjYWNoZWQgPSBjcmVhdGVQcm9taXNlcy5nZXQoaWQpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvbWlzZSA9IGRvR2V0T3JDcmVhdGVTYW5kYm94SWQoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIGNyZWF0ZVByb21pc2VzLmRlbGV0ZShpZCk7XG4gICAgfSk7XG4gICAgY3JlYXRlUHJvbWlzZXMuc2V0KGlkLCBwcm9taXNlKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRvR2V0U2FuZGJveCgpOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IFNhbmRib3hJbnN0YW5jZT4ge1xuICAgIGNvbnN0IHZlcmNlbFNhbmRib3hJZCA9IGF3YWl0IGdldE9yQ3JlYXRlU2FuZGJveElkKCk7XG4gICAgaWYgKHZlcmNlbFNhbmRib3hJZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICByZXR1cm4gdmVyY2VsU2FuZGJveElkO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgdHJ5OiAoKSA9PlxuICAgICAgICBWZXJjZWxTYW5kYm94U0RLLmdldCh7XG4gICAgICAgICAgc2FuZGJveElkOiB2ZXJjZWxTYW5kYm94SWQsXG4gICAgICAgICAgLi4uZ2V0VGVzdENyZWRlbnRpYWxzKCksXG4gICAgICAgIH0pLFxuICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U2FuZGJveCgpOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IFNhbmRib3hJbnN0YW5jZT4ge1xuICAgIGlmICghc2FuZGJveFByb21pc2UpIHtcbiAgICAgIHNhbmRib3hQcm9taXNlID0gZG9HZXRTYW5kYm94KCk7XG4gICAgfVxuICAgIHJldHVybiBzYW5kYm94UHJvbWlzZTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUxhc3RBY3Rpdml0eSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGxhc3RTZW50ID0gbGFzdEFjdGl2aXR5U2VudC5nZXQoaWQpO1xuICAgIGlmIChsYXN0U2VudCAmJiBub3cgLSBsYXN0U2VudCA8IEFDVElWSVRZX1RIUk9UVExFX01TKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxhc3RBY3Rpdml0eVNlbnQuc2V0KGlkLCBub3cpO1xuXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICBpZiAoZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvciB8fCAhZXhpc3RpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmdWZXJjZWwgPVxuICAgICAgZXhpc3RpbmcucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgICAgPyBleGlzdGluZy5wcm92aWRlck1ldGFkYXRhXG4gICAgICAgIDogbnVsbDtcbiAgICBhd2FpdCBzdG9yYWdlLnNhbmRib3guc2V0KHtcbiAgICAgIGlkOiBleGlzdGluZy5pZCxcbiAgICAgIGNvbmZpZzogZXhpc3RpbmcuY29uZmlnLFxuICAgICAgdGFnczogZXhpc3RpbmcudGFncyxcbiAgICAgIGNyZWF0ZWRBdDogZXhpc3RpbmcuY3JlYXRlZEF0LFxuICAgICAgbGFzdEFjdGl2aXR5QXQ6IG5vdyxcbiAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IGV4aXN0aW5nVmVyY2VsID8/IHtcbiAgICAgICAgcHJvdmlkZXI6IFwidmVyY2VsXCIsXG4gICAgICAgIHNhbmRib3hJZDogbnVsbCxcbiAgICAgICAgc25hcHNob3RJZDogbnVsbCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3cpIHtcbiAgICAgIC8vIHRvZG8gcmUtZW5hYmxlIG9uY2Ugd2UgZmlndXJlIG91dCB3aHkgd29ya2Zsb3cgdGhyb3dzIGEgYnVuY2ggb2YgZXJyb3JzIGluIGRldlxuICAgICAgLy8gY29uc3QgbGlmZWN5Y2xlSW5wdXQ6IFNhbmRib3hMaWZlY3ljbGVJbnB1dCA9IHtcbiAgICAgIC8vICAgaWQsXG4gICAgICAvLyAgIHN0b3JhZ2VDb25maWcsXG4gICAgICAvLyAgIGluaXRpYWxDb25maWc6IGNvbmZpZyxcbiAgICAgIC8vIH07XG4gICAgICAvLyB0cnkge1xuICAgICAgLy8gICBhd2FpdCBzYW5kYm94QWN0aXZpdHlIb29rLnJlc3VtZShpZCwge1xuICAgICAgLy8gICAgIHR5cGU6IFwiYWN0aXZpdHlcIixcbiAgICAgIC8vICAgICBuZXdDb25maWc6IGNvbmZpZyxcbiAgICAgIC8vICAgfSk7XG4gICAgICAvLyB9IGNhdGNoIHtcbiAgICAgIC8vICAgYXdhaXQgc3RhcnQoc2FuZGJveExpZmVjeWNsZVdvcmtmbG93LCBbeyBpbnB1dDogbGlmZWN5Y2xlSW5wdXQgfV0pO1xuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGxpZmVjeWNsZTogU2FuZGJveExpZmVjeWNsZSA9IHtcbiAgICBzdGFydDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChzYW5kYm94IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgICB9XG4gICAgICBhd2FpdCB1cGRhdGVMYXN0QWN0aXZpdHkoKTtcbiAgICAgIHJldHVybiBzYW5kYm94LnN0YXR1cyBhcyBTYW5kYm94U3RhdHVzO1xuICAgIH0sXG5cbiAgICBzbmFwc2hvdDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChzYW5kYm94IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgc2FuZGJveC5zbmFwc2hvdCgpO1xuICAgICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5zZXQoe1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICB0YWdzOiBleGlzdGluZyBpbnN0YW5jZW9mIEVycm9yID8gbnVsbCA6IChleGlzdGluZz8udGFncyA/PyBudWxsKSxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDpcbiAgICAgICAgICAgICAgZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvciA/IG51bGwgOiAoZXhpc3Rpbmc/LmNyZWF0ZWRBdCA/PyBudWxsKSxcbiAgICAgICAgICAgIGxhc3RBY3Rpdml0eUF0OlxuICAgICAgICAgICAgICBleGlzdGluZyBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgOiAoZXhpc3Rpbmc/Lmxhc3RBY3Rpdml0eUF0ID8/IG51bGwpLFxuICAgICAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICBwcm92aWRlcjogXCJ2ZXJjZWxcIixcbiAgICAgICAgICAgICAgc2FuZGJveElkOiBudWxsLFxuICAgICAgICAgICAgICBzbmFwc2hvdElkOiBzbmFwc2hvdC5zbmFwc2hvdElkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4geyBzbmFwc2hvdElkOiBzbmFwc2hvdC5zbmFwc2hvdElkIH07XG4gICAgICAgIH0sXG4gICAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBzdG9wOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVycm9yZS50cnlBc3luYyh7XG4gICAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHNhbmRib3guc3RvcCgpO1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgICAgICAgaWYgKGV4aXN0aW5nIGluc3RhbmNlb2YgRXJyb3IgfHwgIWV4aXN0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBzdG9yYWdlLnNhbmRib3guc2V0KHtcbiAgICAgICAgICAgIGlkOiBleGlzdGluZy5pZCxcbiAgICAgICAgICAgIGNvbmZpZzogZXhpc3RpbmcuY29uZmlnLFxuICAgICAgICAgICAgdGFnczogZXhpc3RpbmcudGFncyxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogZXhpc3RpbmcuY3JlYXRlZEF0LFxuICAgICAgICAgICAgbGFzdEFjdGl2aXR5QXQ6IGV4aXN0aW5nLmxhc3RBY3Rpdml0eUF0LFxuICAgICAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICBwcm92aWRlcjogXCJ2ZXJjZWxcIixcbiAgICAgICAgICAgICAgc2FuZGJveElkOiBudWxsLFxuICAgICAgICAgICAgICBzbmFwc2hvdElkOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9LFxuICAgICAgICBjYXRjaDogKGUpID0+IG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgZ2V0U3RhdHVzOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzYW5kYm94LnN0YXR1cyBhcyBTYW5kYm94U3RhdHVzO1xuICAgIH0sXG5cbiAgICBnZXRDcmVhdGVkQXQ6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoc2FuZGJveCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNhbmRib3guY3JlYXRlZEF0O1xuICAgIH0sXG5cbiAgICBnZXRSZW1haW5pbmdUaW1lb3V0OiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzYW5kYm94LnRpbWVvdXQ7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBzYW5kYm94OiBTYW5kYm94PFRUYWdzPiA9IHtcbiAgICBpZCxcbiAgICBjb25maWcsXG4gICAgZXhlYzogYXN5bmMgKHsgY29tbWFuZCwgYXJncywgc2lnbmFsIH0pID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1cGRhdGVQcm9taXNlID0gdXBkYXRlTGFzdEFjdGl2aXR5KCk7XG5cbiAgICAgIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBpbnN0YW5jZS5ydW5Db21tYW5kKHtcbiAgICAgICAgICAgIGN3ZDogSE9NRV9ESVIsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgY21kOiBjb21tYW5kLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbGV0IHN0ZG91dCA9IFwiXCI7XG4gICAgICAgICAgbGV0IHN0ZGVyciA9IFwiXCI7XG4gICAgICAgICAgY29uc3QgbG9nQnVmZmVyOiBMb2dFbnRyeVtdID0gW107XG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICAgICAgICByZXNvbHZlOiBudWxsIGFzICgoKSA9PiB2b2lkKSB8IG51bGwsXG4gICAgICAgICAgICBjb25zdW1lZDogZmFsc2UsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGNvbnN1bWVMb2dzID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgbG9nIG9mIG91dHB1dC5sb2dzKCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZW50cnk6IExvZ0VudHJ5ID1cbiAgICAgICAgICAgICAgICBsb2cuc3RyZWFtID09PSBcInN0ZG91dFwiXG4gICAgICAgICAgICAgICAgICA/IHsgc3RyZWFtOiBcInN0ZG91dFwiLCBkYXRhOiBsb2cuZGF0YSB9XG4gICAgICAgICAgICAgICAgICA6IHsgc3RyZWFtOiBcInN0ZGVyclwiLCBkYXRhOiBsb2cuZGF0YSB9O1xuXG4gICAgICAgICAgICAgIGlmIChsb2cuc3RyZWFtID09PSBcInN0ZG91dFwiKSB7XG4gICAgICAgICAgICAgICAgc3Rkb3V0ICs9IGxvZy5kYXRhO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0ZGVyciArPSBsb2cuZGF0YTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGxvZ0J1ZmZlci5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgICAgc3RhdGUucmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0ZS5jb25zdW1lZCA9IHRydWU7XG4gICAgICAgICAgICBzdGF0ZS5yZXNvbHZlPy4oKTtcbiAgICAgICAgICB9KSgpO1xuXG4gICAgICAgICAgYXN5bmMgZnVuY3Rpb24qIGxvZ3MoKTogQXN5bmNJdGVyYWJsZTxMb2dFbnRyeT4ge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgICAgIHdoaWxlICghc3RhdGUuY29uc3VtZWQgfHwgaW5kZXggPCBsb2dCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGlmIChpbmRleCA8IGxvZ0J1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBsb2dCdWZmZXJbaW5kZXgrK107XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgIHN0YXRlLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXRlLnJlc29sdmUgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29uc3VtZUxvZ3MudGhlbigoKSA9PiAoe1xuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgZXhpdENvZGU6IG91dHB1dC5leGl0Q29kZSxcbiAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICByZXR1cm4geyBjb21tYW5kSWQ6IG91dHB1dC5jbWRJZCwgbG9ncywgcmVzdWx0IH07XG4gICAgICAgIH0sXG4gICAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB1cGRhdGVQcm9taXNlO1xuICAgICAgcmV0dXJuIGV4ZWNSZXN1bHQ7XG4gICAgfSxcblxuICAgIGdldERvbWFpbjogYXN5bmMgKHBvcnQpID0+IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoc2FuZGJveCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gc2FuZGJveC5kb21haW4ocG9ydCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBraWxsOiBhc3luYyAoeyBjb21tYW5kSWQsIHN0b3JhZ2U6IGNtZFN0b3JhZ2UgfSkgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNtZCA9IGF3YWl0IGNtZFN0b3JhZ2UuY29tbWFuZC5nZXQoY29tbWFuZElkKTtcbiAgICAgIGlmIChjbWQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogY21kLm1lc3NhZ2UsIGNhdXNlOiBjbWQgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY21kICYmIGNtZC5zdGF0dXMgPT09IFwicnVubmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNtZFN0b3JhZ2UuY29tbWFuZC5zZXQoe1xuICAgICAgICAgIC4uLmNtZCxcbiAgICAgICAgICBzdGF0dXM6IFwia2lsbGVkXCIsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogcmVzdWx0Lm1lc3NhZ2UsIGNhdXNlOiByZXN1bHQgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSxcblxuICAgIHdyaXRlRmlsZXM6IChvcHRzKSA9PiB3cml0ZUZpbGVzKHsgc2FuZGJveCwgLi4ub3B0cyB9KSxcblxuICAgIGxpZmVjeWNsZSxcblxuICAgIHRhZzoge1xuICAgICAgbGlzdDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzYW5kYm94UmVjb3JkID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgICAgIGlmIChzYW5kYm94UmVjb3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gc2FuZGJveFJlY29yZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHNhbmRib3hSZWNvcmQudGFncyA/PyB7fSkgYXMgVFRhZ3M7XG4gICAgICB9LFxuICAgICAgZ2V0OiBhc3luYyAoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc2FuZGJveFJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQudGFncz8uW2tleSBhcyBzdHJpbmddIGFzXG4gICAgICAgICAgfCBUVGFnc1t0eXBlb2Yga2V5XVxuICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3gudGFnLnNldCh7XG4gICAgICAgICAgc2FuZGJveElkOiBpZCxcbiAgICAgICAgICB0YWdzOiB7IFtrZXldOiB2YWx1ZSB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICAgIHNldE1hbnk6IGFzeW5jICh0YWdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3gudGFnLnNldCh7XG4gICAgICAgICAgc2FuZGJveElkOiBpZCxcbiAgICAgICAgICB0YWdzOiB0YWdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIGlmIChjb25maWcubGlmZWN5Y2xlPy5hdXRvU3RhcnQgIT09IGZhbHNlKSB7XG4gICAgc2FuZGJveFByb21pc2UgPSBkb0dldFNhbmRib3goKTtcbiAgfVxuXG4gIHJldHVybiBzYW5kYm94O1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IFRhZ3NTY2hlbWEgfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveFJlY29yZCwgU3RvcmFnZUNvbmZpZyB9IGZyb20gXCIuLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyBsb2NhbFNhbmRib3ggfSBmcm9tIFwiLi9iaW5kaW5ncy9sb2NhbFwiO1xuaW1wb3J0IHsgdmVyY2VsU2FuZGJveCB9IGZyb20gXCIuL2JpbmRpbmdzL3ZlcmNlbFwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNhbmRib3g8VFRhZ3MgZXh0ZW5kcyBUYWdzU2NoZW1hID0gVGFnc1NjaGVtYT4oe1xuICBzYW5kYm94UmVjb3JkLFxuICBzdG9yYWdlQ29uZmlnLFxufToge1xuICBzdG9yYWdlQ29uZmlnOiBTdG9yYWdlQ29uZmlnO1xuICBzYW5kYm94UmVjb3JkOiBTYW5kYm94UmVjb3JkO1xufSk6IFNhbmRib3g8VFRhZ3M+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHNhbmRib3hSZWNvcmQ7XG4gIHN3aXRjaCAoY29uZmlnLnR5cGUpIHtcbiAgICBjYXNlIFwibG9jYWxcIjpcbiAgICAgIHJldHVybiBsb2NhbFNhbmRib3g8VFRhZ3M+KHtcbiAgICAgICAgc2FuZGJveFJlY29yZDogc2FuZGJveFJlY29yZCBhcyBTYW5kYm94UmVjb3JkICYge1xuICAgICAgICAgIGNvbmZpZzogeyB0eXBlOiBcImxvY2FsXCIgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc3RvcmFnZUNvbmZpZyxcbiAgICAgIH0pO1xuICAgIGNhc2UgXCJ2ZXJjZWxcIjpcbiAgICAgIHJldHVybiB2ZXJjZWxTYW5kYm94PFRUYWdzPih7XG4gICAgICAgIHNhbmRib3hSZWNvcmQ6IHNhbmRib3hSZWNvcmQgYXMgU2FuZGJveFJlY29yZCAmIHtcbiAgICAgICAgICBjb25maWc6IHsgdHlwZTogXCJ2ZXJjZWxcIiB9O1xuICAgICAgICB9LFxuICAgICAgICBzdG9yYWdlQ29uZmlnLFxuICAgICAgfSk7XG4gICAgY2FzZSBcImN1c3RvbVwiOlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ3VzdG9tIHNhbmRib3hlcyBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICBkZWZhdWx0OlxuICAgICAgY29uZmlnIHNhdGlzZmllcyBuZXZlcjtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVua25vd24gc2FuZGJveCB0eXBlOiAke1xuICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogLlxuICAgICAgICAgIChjb25maWcgYXMgYW55KS50eXBlXG4gICAgICAgIH1gXG4gICAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94TGlmZWN5Y2xlSW5wdXQgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc25hcHNob3RTYW5kYm94U3RlcChpbnB1dDogU2FuZGJveExpZmVjeWNsZUlucHV0KSB7XG4gIFwidXNlIHN0ZXBcIjtcblxuICBjb25zdCB7IGdldFN0b3JhZ2UgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0b3JhZ2VcIik7XG4gIGNvbnN0IHsgZ2V0U2FuZGJveCB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jbGllbnRcIik7XG5cbiAgY29uc3Qgc3RvcmFnZSA9IGdldFN0b3JhZ2UoaW5wdXQuc3RvcmFnZUNvbmZpZyk7XG4gIGNvbnN0IHNhbmRib3hSZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlucHV0LmlkKTtcbiAgaWYgKHNhbmRib3hSZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiBzYW5kYm94UmVjb3JkO1xuICB9XG5cbiAgY29uc3Qgc2FuZGJveCA9IGdldFNhbmRib3goe1xuICAgIHNhbmRib3hSZWNvcmQsXG4gICAgc3RvcmFnZUNvbmZpZzogaW5wdXQuc3RvcmFnZUNvbmZpZyxcbiAgfSk7XG5cbiAgYXdhaXQgc2FuZGJveC5saWZlY3ljbGU/LnNuYXBzaG90KCk7XG59XG4iLCAiaW1wb3J0IHsgZGVmaW5lSG9vaywgRmF0YWxFcnJvciwgc2xlZXAgfSBmcm9tIFwid29ya2Zsb3dcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveENvbmZpZyB9IGZyb20gXCIuLi9zdG9yYWdlL3JwY1wiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94TGlmZWN5Y2xlSW5wdXQgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgdHlwZSB7IFNhbmRib3hMaWZlY3ljbGVJbnB1dCB9O1xuXG5leHBvcnQgdHlwZSBTYW5kYm94QWN0aXZpdHlTaWduYWwgPSB7XG4gIHR5cGU6IFwiYWN0aXZpdHlcIjtcbiAgbmV3Q29uZmlnOiBTYW5kYm94Q29uZmlnO1xufTtcblxuZXhwb3J0IGNvbnN0IHNhbmRib3hBY3Rpdml0eUhvb2sgPSBkZWZpbmVIb29rPFNhbmRib3hBY3Rpdml0eVNpZ25hbD4oKTtcblxuY29uc3QgREVGQVVMVF9JRExFX1RJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwOyAvLyA1IG1pbnV0ZXNcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhbmRib3hMaWZlY3ljbGVXb3JrZmxvdyh7XG4gIGlucHV0LFxufToge1xuICBpbnB1dDogU2FuZGJveExpZmVjeWNsZUlucHV0O1xufSkge1xuICBcInVzZSB3b3JrZmxvd1wiO1xuXG4gIGNvbnN0IGFjdGl2aXR5SG9vayA9IHNhbmRib3hBY3Rpdml0eUhvb2suY3JlYXRlKHsgdG9rZW46IGlucHV0LmlkIH0pO1xuICBjb25zdCBpdGVyYXRvciA9IGFjdGl2aXR5SG9va1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgbGV0IHBlbmRpbmdOZXh0ID0gaXRlcmF0b3IubmV4dCgpO1xuXG4gIGxldCBzYW5kYm94Q29uZmlnID0gaW5wdXQuaW5pdGlhbENvbmZpZztcblxuICBpZiAoc2FuZGJveENvbmZpZy50eXBlICE9PSBcInZlcmNlbFwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU2FuZGJveCBjb25maWcgaXMgbm90IGEgVmVyY2VsIHNhbmRib3hcIik7XG4gIH1cblxuICBjb25zdCBpZGxlVGltZW91dE1zID1cbiAgICBzYW5kYm94Q29uZmlnLmxpZmVjeWNsZT8uc3RvcEFmdGVySW5hY3RpdmVNcyA/PyBERUZBVUxUX0lETEVfVElNRU9VVF9NUztcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICBwZW5kaW5nTmV4dC50aGVuKChyKSA9PiAoeyAuLi5yLCB0eXBlOiBcImFjdGl2aXR5XCIgYXMgY29uc3QgfSkpLFxuICAgICAgc2xlZXAoaWRsZVRpbWVvdXRNcykudGhlbigoKSA9PiAoeyB0eXBlOiBcInRpbWVvdXRcIiBhcyBjb25zdCB9KSksXG4gICAgXSk7XG5cbiAgICBpZiAocmVzdWx0LnR5cGUgPT09IFwidGltZW91dFwiKSB7XG4gICAgICBjb25zdCB7IHNuYXBzaG90U2FuZGJveFN0ZXAgfSA9IGF3YWl0IGltcG9ydChcbiAgICAgICAgXCIuL2xpZmVjeWNsZS13b3JrZmxvdy1zdGVwc1wiXG4gICAgICApO1xuICAgICAgYXdhaXQgc25hcHNob3RTYW5kYm94U3RlcChpbnB1dCkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgaWYgKEZhdGFsRXJyb3IuaXMoZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiU25hcHNob3QgZmFpbGVkIHBlcm1hbmVudGx5OlwiLCBlLm1lc3NhZ2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHNhbmRib3hDb25maWcgPSByZXN1bHQudmFsdWUubmV3Q29uZmlnO1xuICAgIHBlbmRpbmdOZXh0ID0gaXRlcmF0b3IubmV4dCgpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxZQUVhLHNCQUtBLGNBS0Esc0JBS0EsY0FLQSxjQUtBO0FBM0JiO0FBQUE7QUFBQTtBQUFBLGFBQXdCO0FBRWpCLElBQU0sdUJBQU4sY0FBMEMseUJBQWtCO0FBQUEsTUFDakUsTUFBTTtBQUFBLE1BQ04sU0FBUztBQUFBLElBQ1gsQ0FBQyxFQUFFO0FBQUEsSUFBQztBQUVHLElBQU0sZUFBTixjQUFrQyx5QkFBa0I7QUFBQSxNQUN6RCxNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsSUFDWCxDQUFDLEVBQUU7QUFBQSxJQUFDO0FBRUcsSUFBTSx1QkFBTixjQUEwQyx5QkFBa0I7QUFBQSxNQUNqRSxNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsSUFDWCxDQUFDLEVBQUU7QUFBQSxJQUFDO0FBRUcsSUFBTSxlQUFOLGNBQWtDLHlCQUFrQjtBQUFBLE1BQ3pELE1BQU07QUFBQSxNQUNOLFNBQVM7QUFB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VyxhQUFhLE9BQU8sYUFBYSxFQUFFO0FBQ3BELE1BQUksY0FBYyxTQUFTLEtBQUs7QUFFaEMsTUFBSSxnQkFBZ0IsTUFBTTtBQUUxQixNQUFJLGNBQWMsU0FBUyxVQUFVO0FBQ25DLFVBQU0sSUFBSSxNQUFNLHdDQUF3QztBQUFBLEVBQzFEO0FBRUEsUUFBTSxnQkFDSixjQUFjLFdBQVcsdUJBQXVCO0FBRWxELFNBQU8sTUFBTTtBQUNYLFVBQU0sU0FBUyxNQUFNLFFBQVEsS0FBSztBQUFBLE1BQ2hDLFlBQVksS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLEdBQUcsTUFBTSxXQUFvQixFQUFFO0FBQUEsVUFDN0QsdUJBQU0sYUFBYSxFQUFFLEtBQUssT0FBTyxFQUFFLE1BQU0sVUFBbUIsRUFBRTtBQUFBLElBQ2hFLENBQUM7QUFFRCxRQUFJLE9BQU8sU0FBUyxXQUFXO0FBQzdCLFlBQU0sRUFBRSxxQkFBQUMscUJBQW9CLElBQUksTUFBTTtBQUd0QyxZQUFNQSxxQkFBb0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNO0FBQzVDLFlBQUksMkJBQVcsR0FBRyxDQUFDLEdBQUc7QUFDcEIsa0JBQVEsTUFBTSxnQ0FBZ0MsRUFBRSxPQUFPO0FBQ3ZEO0FBQUEsUUFDRjtBQUNBLGNBQU07QUFBQSxNQUNSLENBQUM7QUFDRDtBQUFBLElBQ0Y7QUFFQSxRQUFJLE9BQU8sTUFBTTtBQUNmO0FBQUEsSUFDRjtBQUVBLG9CQUFnQixPQUFPLE1BQU07QUFDN0Isa0JBQWMsU0FBUyxLQUFLO0FBQUEsRUFDOUI7QUFDRjsiLAogICJuYW1lcyI6IFsic3RhcnRMb2NhbFN0b3JhZ2UiLCAiZ2V0VmVyY2VsU3RvcmFnZUNvbmZpZyIsICJleGl0Q29kZSIsICJzdGRlcnIiLCAiZXJyb3JlIiwgImluaXRfbG9jYWwiLCAic3RvcmFnZSIsICJzYW5kYm94UmVjb3JkIiwgImVycm9yZSIsICJpbml0X3ZlcmNlbCIsICJzYW5kYm94IiwgIlZlcmNlbFNhbmRib3hTREsiLCAiZ2V0U2FuZGJveCIsICJzYW5kYm94UmVjb3JkIiwgImluaXRfY2xpZW50IiwgImluaXRfbG9jYWwiLCAiaW5pdF92ZXJjZWwiLCAiZ2V0U3RvcmFnZSIsICJnZXRTYW5kYm94IiwgInNuYXBzaG90U2FuZGJveFN0ZXAiXQp9Cg==
|
|
812
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvdmVyY2VsLXNkay50cyIsICIuLi9zcmMvZXJyb3JzLnRzIiwgIi4uL3NyYy9zdG9yYWdlL2NsaWVudC50cyIsICIuLi9zcmMvc3RvcmFnZS9ycGMudHMiLCAiLi4vc3JjL3N0b3JhZ2UvaGFuZGxlci50cyIsICIuLi9zcmMvc3RvcmFnZS9pbmRleC50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy9saWZlY3ljbGUtd29ya2Zsb3cudHMiLCAiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvbGlmZWN5Y2xlLXdvcmtmbG93LXN0ZXBzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgeyBTYW5kYm94IH0gZnJvbSBcInNhbmRib3hcIjtcbiIsICJpbXBvcnQgKiBhcyBlcnJvcmUgZnJvbSBcImVycm9yZVwiO1xuXG5leHBvcnQgY2xhc3MgU2Vzc2lvbk5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNlc3Npb25Ob3RGb3VuZEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU2Vzc2lvbiAkaWQgbm90IGZvdW5kXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU2Vzc2lvbkVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTZXNzaW9uRXJyb3JcIixcbiAgbWVzc2FnZTogXCJTZXNzaW9uICRpZCBmYWlsZWQ6ICRyZWFzb25cIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBTYW5kYm94Tm90Rm91bmRFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2FuZGJveE5vdEZvdW5kRXJyb3JcIixcbiAgbWVzc2FnZTogXCJTYW5kYm94ICRpZCBub3QgZm91bmRcIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBTdG9yYWdlRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlN0b3JhZ2VFcnJvclwiLFxuICBtZXNzYWdlOiBcIiRyZWFzb25cIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBTYW5kYm94RXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNhbmRib3hFcnJvclwiLFxuICBtZXNzYWdlOiBcIiRyZWFzb25cIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlTm90Rm91bmRFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiTWVzc2FnZU5vdEZvdW5kRXJyb3JcIixcbiAgbWVzc2FnZTogXCJNZXNzYWdlICRpZCBub3QgZm91bmRcIixcbn0pIHt9XG4iLCAiaW1wb3J0IHR5cGUgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHtcbiAgTWVzc2FnZU5vdEZvdW5kRXJyb3IsXG4gIFNhbmRib3hOb3RGb3VuZEVycm9yLFxuICBTZXNzaW9uTm90Rm91bmRFcnJvcixcbiAgU3RvcmFnZUVycm9yLFxufSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgdHlwZSB7IFN0b3JhZ2VNZXRob2RzIH0gZnJvbSBcIi4vcnBjXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbW1hbmQsXG4gIExpc3RSZXN1bHQsXG4gIFBhcnQsXG4gIFN0b3JhZ2UsXG4gIFN0b3JhZ2VDb25maWcsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbnR5cGUgUnBjUmVzcG9uc2U8VD4gPVxuICB8IHsgcmVzdWx0OiBUIH1cbiAgfCB7IGVycm9yOiB7IGNvZGU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH0gfTtcblxuZXhwb3J0IHR5cGUgUnBjRm4gPSAocGFyYW1zOiB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICBwYXJhbXM6IHVua25vd247XG59KSA9PiBQcm9taXNlPFJwY1Jlc3BvbnNlPHVua25vd24+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0b3JhZ2VDbGllbnQocnBjRm46IFJwY0ZuLCBuYW1lPzogc3RyaW5nKTogU3RvcmFnZSB7XG4gIGFzeW5jIGZ1bmN0aW9uIHJwYzxNIGV4dGVuZHMga2V5b2YgU3RvcmFnZU1ldGhvZHM+KFxuICAgIG1ldGhvZDogTSxcbiAgICBwYXJhbXM6IHouaW5mZXI8U3RvcmFnZU1ldGhvZHNbTV1bXCJwYXJhbXNcIl0+XG4gICk6IFByb21pc2U8ei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tNXVtcInJlc3VsdFwiXT4+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGNGbih7IG5hbWUsIG1ldGhvZCwgcGFyYW1zIH0pO1xuXG4gICAgaWYgKFwiZXJyb3JcIiBpbiByZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IHJlc3VsdC5lcnJvci5tZXNzYWdlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQucmVzdWx0IGFzIHouaW5mZXI8U3RvcmFnZU1ldGhvZHNbTV1bXCJyZXN1bHRcIl0+O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzZXNzaW9uOiB7XG4gICAgICBnZXQ6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcInNlc3Npb24uZ2V0XCIsIHsgaWQgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uTm90Rm91bmRFcnJvcih7IGlkIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKHNlc3Npb24pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi5zZXRcIiwgc2Vzc2lvbik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGlzdDogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi5saXN0XCIsIHtcbiAgICAgICAgICAgIHRhZ3M6IG9wdHM/LnRhZ3MsXG4gICAgICAgICAgICBvcmRlcjogb3B0cz8ub3JkZXIsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0YWc6IHtcbiAgICAgICAgc2V0OiBhc3luYyAoeyBzZXNzaW9uSWQsIHRhZ3MgfSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi50YWcuc2V0XCIsIHsgc2Vzc2lvbklkLCB0YWdzIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG1lc3NhZ2U6IHtcbiAgICAgIGxpc3Q6IGFzeW5jIChzZXNzaW9uSWQsIG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwibWVzc2FnZS5saXN0XCIsIHtcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdldDogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwibWVzc2FnZS5nZXRcIiwgeyBpZCB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VOb3RGb3VuZEVycm9yKHsgaWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJtZXNzYWdlLnNldFwiLCBtZXNzYWdlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBwYXJ0OiB7XG4gICAgICBsaXN0QnlNZXNzYWdlOiBhc3luYyAobWVzc2FnZUlkLCBvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwicGFydC5saXN0QnlNZXNzYWdlXCIsIHtcbiAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgTGlzdFJlc3VsdDxQYXJ0PjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsaXN0QnlTZXNzaW9uOiBhc3luYyAoc2Vzc2lvbklkLCBvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwicGFydC5saXN0QnlTZXNzaW9uXCIsIHtcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgTGlzdFJlc3VsdDxQYXJ0PjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChwYXJ0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJwYXJ0LnNldFwiLCBwYXJ0KSkgYXMgUGFydDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkZWxldGU6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHJwYyhcInBhcnQuZGVsZXRlXCIsIHsgaWQgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gICAgc2FuZGJveDoge1xuICAgICAgZ2V0OiBhc3luYyAoa2V5KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwic2FuZGJveC5nZXRcIiwgeyBrZXkgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94Tm90Rm91bmRFcnJvcih7IGlkOiBrZXkgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0QnlTZXNzaW9uOiBhc3luYyAoc2Vzc2lvbklkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwic2FuZGJveC5nZXRCeVNlc3Npb25cIiwgeyBzZXNzaW9uSWQgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94Tm90Rm91bmRFcnJvcih7IGlkOiBzZXNzaW9uSWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAocmVjb3JkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcnBjKFwic2FuZGJveC5zZXRcIiwgcmVjb3JkKTtcbiAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxpc3Q6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNhbmRib3gubGlzdFwiLCB7XG4gICAgICAgICAgICB0YWdzOiBvcHRzPy50YWdzLFxuICAgICAgICAgICAgb3JkZXI6IG9wdHM/Lm9yZGVyLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdGFnOiB7XG4gICAgICAgIHNldDogYXN5bmMgKHsgc2FuZGJveElkLCB0YWdzIH0pID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNhbmRib3gudGFnLnNldFwiLCB7IHNhbmRib3hJZCwgdGFncyB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb21tYW5kOiB7XG4gICAgICBnZXQ6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcnBjKFwiY29tbWFuZC5nZXRcIiwgeyBpZCB9KSkgYXMgQ29tbWFuZCB8IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAoY29tbWFuZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcnBjKFwiY29tbWFuZC5zZXRcIiwgY29tbWFuZCkpIGFzIENvbW1hbmQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGlzdDogYXN5bmMgKHNlc3Npb25JZCwgb3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcImNvbW1hbmQubGlzdFwiLCB7XG4gICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICBpbmNsdWRlRmluaXNoZWQ6IG9wdHM/LmluY2x1ZGVGaW5pc2hlZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgTGlzdFJlc3VsdDxDb21tYW5kPjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTkFNRVNQQUNFID0gXCJkZWZhdWx0XCI7XG5leHBvcnQgY29uc3QgTE9DQUxfU1RPUkFHRV9WRVJTSU9OID0gXCJ2MVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZShvcHRzOiB7XG4gIGNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgcnBjOiBScGNGbjtcbn0pOiBTdG9yYWdlIHtcbiAgY29uc3QgbmFtZSA9IG9wdHMuY29uZmlnLm5hbWUgPz8gREVGQVVMVF9OQU1FU1BBQ0U7XG4gIHJldHVybiBnZXRTdG9yYWdlQ2xpZW50KG9wdHMucnBjLCBuYW1lKTtcbn1cbiIsICJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5jb25zdCBWZXJjZWxMaWZlY3ljbGVDb25maWdTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHBvbGxJbnRlcnZhbE1zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHN0b3BBZnRlckluYWN0aXZlTXM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgc25hcHNob3RCZWZvcmVUaW1lb3V0TXM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgc25hcHNob3RJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBhdXRvU3RhcnQ6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGNvbnN0IFNhbmRib3hDb25maWdTY2hlbWEgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKFwidmVyY2VsXCIpLFxuICAgIHJlc291cmNlczogei5vYmplY3QoeyB2Y3B1czogei5udW1iZXIoKSB9KS5vcHRpb25hbCgpLFxuICAgIHBvcnRzOiB6LmFycmF5KHoubnVtYmVyKCkpLm9wdGlvbmFsKCksXG4gICAgbGlmZWN5Y2xlOiBWZXJjZWxMaWZlY3ljbGVDb25maWdTY2hlbWEub3B0aW9uYWwoKSxcbiAgfSksXG4gIHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJsb2NhbFwiKSxcbiAgICBwYXRoOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIH0pLFxuICB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKFwiY3VzdG9tXCIpLFxuICAgIHVybDogei5zdHJpbmcoKSxcbiAgICBoZWFkZXJzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICB9KSxcbl0pO1xuXG5leHBvcnQgdHlwZSBTYW5kYm94Q29uZmlnID0gei5pbmZlcjx0eXBlb2YgU2FuZGJveENvbmZpZ1NjaGVtYT47XG5cbmNvbnN0IEdlbmVyYXRpb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG1heFN0ZXBzOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHRlbXBlcmF0dXJlOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHRvcEs6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgdG9wUDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBmcmVxdWVuY3lQZW5hbHR5OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHByZXNlbmNlUGVuYWx0eTogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBtYXhPdXRwdXRUb2tlbnM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgaGVhZGVyczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgU2Vzc2lvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIGNyZWF0ZWRBdDogei5udW1iZXIoKSxcbiAgdXBkYXRlZEF0OiB6Lm51bWJlcigpLFxuICBydW5JZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBsYXN0TWVzc2FnZUlkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5udWxsYWJsZSgpLFxuICBzeXN0ZW06IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgbW9kZWw6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgc2FuZGJveElkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHNraWxsc0Rpcjogei5hcnJheSh6LnN0cmluZygpKS5udWxsYWJsZSgpLFxuICBob29rVG9rZW46IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgYWN0aXZlVG9vbHM6IHouYXJyYXkoei5zdHJpbmcoKSkubnVsbGFibGUoKSxcbiAgZ2VuZXJhdGlvbjogR2VuZXJhdGlvblNjaGVtYS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG59KTtcblxuZXhwb3J0IGNvbnN0IFN0ZXBVc2FnZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3RlcEluZGV4OiB6Lm51bWJlcigpLFxuICBtb2RlbDogei5zdHJpbmcoKSxcbiAgaW5wdXRUb2tlbnM6IHoubnVtYmVyKCksXG4gIG91dHB1dFRva2Vuczogei5udW1iZXIoKSxcbiAgdG90YWxUb2tlbnM6IHoubnVtYmVyKCksXG4gIGNhY2hlUmVhZFRva2Vuczogei5udW1iZXIoKSxcbiAgY2FjaGVXcml0ZVRva2Vuczogei5udW1iZXIoKSxcbiAgcmVhc29uaW5nVG9rZW5zOiB6Lm51bWJlcigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBVc2FnZVN1bW1hcnlTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG1vZGVsOiB6LnN0cmluZygpLFxuICBpbnB1dFRva2Vuczogei5udW1iZXIoKSxcbiAgb3V0cHV0VG9rZW5zOiB6Lm51bWJlcigpLFxuICB0b3RhbFRva2Vuczogei5udW1iZXIoKSxcbiAgY2FjaGVSZWFkVG9rZW5zOiB6Lm51bWJlcigpLFxuICBjYWNoZVdyaXRlVG9rZW5zOiB6Lm51bWJlcigpLFxuICByZWFzb25pbmdUb2tlbnM6IHoubnVtYmVyKCksXG4gIHN0ZXBDb3VudDogei5udW1iZXIoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgTWVzc2FnZVVzYWdlU2NoZW1hID0gei5vYmplY3Qoe1xuICBzdGVwczogei5hcnJheShTdGVwVXNhZ2VTY2hlbWEpLFxuICBzdW1tYXJ5OiBVc2FnZVN1bW1hcnlTY2hlbWEsXG59KTtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZVVzYWdlID0gei5pbmZlcjx0eXBlb2YgTWVzc2FnZVVzYWdlU2NoZW1hPjtcbmV4cG9ydCB0eXBlIFVzYWdlU3VtbWFyeSA9IHouaW5mZXI8dHlwZW9mIFVzYWdlU3VtbWFyeVNjaGVtYT47XG5leHBvcnQgdHlwZSBTdGVwVXNhZ2UgPSB6LmluZmVyPHR5cGVvZiBTdGVwVXNhZ2VTY2hlbWE+O1xuXG5leHBvcnQgY29uc3QgTWVzc2FnZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgcm9sZTogei5lbnVtKFtcInVzZXJcIiwgXCJhc3Npc3RhbnRcIiwgXCJzeXN0ZW1cIl0pLFxuICBjcmVhdGVkQXQ6IHoubnVtYmVyKCksXG4gIHN0YXJ0ZWRBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBjb21wbGV0ZWRBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBpbnRlcnJ1cHRlZEF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIHVzYWdlOiBNZXNzYWdlVXNhZ2VTY2hlbWEubnVsbGFibGUoKSxcbn0pO1xuXG4vKipcbiAqIFRoZSBgcGFydGAgZmllbGQgY29ycmVzcG9uZHMgdG8gYFVJTWVzc2FnZVtcInBhcnRzXCJdW251bWJlcl1gIGZyb20gdGhlIGBhaWAgcGFja2FnZS5cbiAqIFdlIHVzZSBgei51bmtub3duKClgIGJlY2F1c2UgdGhlIGV4YWN0IHNoYXBlIHZhcmllcyBieSBwYXJ0IHR5cGUgKHRleHQsIHRvb2wtY2FsbCxcbiAqIHRvb2wtcmVzdWx0LCBldGMuKSBhbmQgbWF5IGV2b2x2ZSB3aXRoIHRoZSBBSSBTREsuIFRoZSBSUEMgbGF5ZXIganVzdCBwYXNzZXMgaXQgdGhyb3VnaC5cbiAqL1xuZXhwb3J0IGNvbnN0IFBhcnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBtZXNzYWdlSWQ6IHouc3RyaW5nKCksXG4gIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgaW5kZXg6IHoubnVtYmVyKCksXG4gIHBhcnQ6IHoudW5rbm93bigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBDb21tYW5kUmVzdWx0U2NoZW1hID0gei5vYmplY3Qoe1xuICBzdGRvdXQ6IHouc3RyaW5nKCksXG4gIHN0ZGVycjogei5zdHJpbmcoKSxcbiAgZXhpdENvZGU6IHoubnVtYmVyKCksXG4gIGNvbXBsZXRlZEF0OiB6Lm51bWJlcigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBTYW5kYm94UmVjb3JkU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgY29uZmlnOiBTYW5kYm94Q29uZmlnU2NoZW1hLFxuICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkubnVsbGFibGUoKSxcbiAgY3JlYXRlZEF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGxhc3RBY3Rpdml0eUF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGFjcXVpcmluZ0xvY2tJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBhY3F1aXJpbmdMb2NrQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgcHJvdmlkZXJNZXRhZGF0YTogelxuICAgIC5kaXNjcmltaW5hdGVkVW5pb24oXCJwcm92aWRlclwiLCBbXG4gICAgICB6Lm9iamVjdCh7XG4gICAgICAgIHByb3ZpZGVyOiB6LmxpdGVyYWwoXCJ2ZXJjZWxcIiksXG4gICAgICAgIHNhbmRib3hJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgICAgICBzbmFwc2hvdElkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgICB9KSxcbiAgICBdKVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmNvbnN0IENvbW1hbmRCYXNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICBjb21tYW5kOiB6LnN0cmluZygpLFxuICBhcmdzOiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gIHN0YXJ0ZWRBdDogei5udW1iZXIoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgQ29tbWFuZFNjaGVtYSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwic3RhdHVzXCIsIFtcbiAgQ29tbWFuZEJhc2VTY2hlbWEuZXh0ZW5kKHsgc3RhdHVzOiB6LmxpdGVyYWwoXCJydW5uaW5nXCIpIH0pLFxuICBDb21tYW5kQmFzZVNjaGVtYS5leHRlbmQoe1xuICAgIHN0YXR1czogei5saXRlcmFsKFwiY29tcGxldGVkXCIpLFxuICAgIHJlc3VsdDogQ29tbWFuZFJlc3VsdFNjaGVtYSxcbiAgfSksXG4gIENvbW1hbmRCYXNlU2NoZW1hLmV4dGVuZCh7XG4gICAgc3RhdHVzOiB6LmxpdGVyYWwoXCJraWxsZWRcIiksXG4gICAgcmVzdWx0OiBDb21tYW5kUmVzdWx0U2NoZW1hLm9wdGlvbmFsKCksXG4gIH0pLFxuICBDb21tYW5kQmFzZVNjaGVtYS5leHRlbmQoe1xuICAgIHN0YXR1czogei5saXRlcmFsKFwiZmFpbGVkXCIpLFxuICAgIHJlc3VsdDogQ29tbWFuZFJlc3VsdFNjaGVtYSxcbiAgfSksXG5dKTtcblxuZnVuY3Rpb24gTGlzdFJlc3VsdFNjaGVtYTxUIGV4dGVuZHMgei5ab2RUeXBlQW55PihpdGVtU2NoZW1hOiBUKSB7XG4gIHJldHVybiB6Lm9iamVjdCh7XG4gICAgaXRlbXM6IHouYXJyYXkoaXRlbVNjaGVtYSksXG4gICAgbmV4dEN1cnNvcjogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICB9KTtcbn1cblxuY29uc3QgbWV0aG9kcyA9IHtcbiAgXCJzZXNzaW9uLmdldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogU2Vzc2lvblNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcInNlc3Npb24uc2V0XCI6IHtcbiAgICBwYXJhbXM6IFNlc3Npb25TY2hlbWEsXG4gICAgcmVzdWx0OiBTZXNzaW9uU2NoZW1hLFxuICB9LFxuICBcInNlc3Npb24ubGlzdFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkub3B0aW9uYWwoKSxcbiAgICAgIG9yZGVyOiB6XG4gICAgICAgIC5lbnVtKFtcbiAgICAgICAgICBcImNyZWF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcImNyZWF0ZWRBdF9kZXNjXCIsXG4gICAgICAgICAgXCJ1cGRhdGVkQXRfYXNjXCIsXG4gICAgICAgICAgXCJ1cGRhdGVkQXRfZGVzY1wiLFxuICAgICAgICBdKVxuICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoU2Vzc2lvblNjaGVtYSksXG4gIH0sXG4gIFwic2Vzc2lvbi5saXN0QnlTYW5kYm94XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNhbmRib3hJZDogei5zdHJpbmcoKSxcbiAgICAgIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5vcHRpb25hbCgpLFxuICAgICAgb3JkZXI6IHpcbiAgICAgICAgLmVudW0oW1xuICAgICAgICAgIFwiY3JlYXRlZEF0X2FzY1wiLFxuICAgICAgICAgIFwiY3JlYXRlZEF0X2Rlc2NcIixcbiAgICAgICAgICBcInVwZGF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcInVwZGF0ZWRBdF9kZXNjXCIsXG4gICAgICAgIF0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShTZXNzaW9uU2NoZW1hKSxcbiAgfSxcbiAgXCJzZXNzaW9uLnRhZy5zZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICAgICAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogU2Vzc2lvblNjaGVtYSxcbiAgfSxcbiAgXCJtZXNzYWdlLmdldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogTWVzc2FnZVNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcIm1lc3NhZ2Uuc2V0XCI6IHtcbiAgICBwYXJhbXM6IE1lc3NhZ2VTY2hlbWEsXG4gICAgcmVzdWx0OiBNZXNzYWdlU2NoZW1hLFxuICB9LFxuICBcIm1lc3NhZ2UubGlzdFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKE1lc3NhZ2VTY2hlbWEpLFxuICB9LFxuICBcInBhcnQubGlzdEJ5TWVzc2FnZVwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBtZXNzYWdlSWQ6IHouc3RyaW5nKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKFBhcnRTY2hlbWEpLFxuICB9LFxuICBcInBhcnQubGlzdEJ5U2Vzc2lvblwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKFBhcnRTY2hlbWEpLFxuICB9LFxuICBcInBhcnQuc2V0XCI6IHtcbiAgICBwYXJhbXM6IFBhcnRTY2hlbWEsXG4gICAgcmVzdWx0OiBQYXJ0U2NoZW1hLFxuICB9LFxuICBcInBhcnQuZGVsZXRlXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsgaWQ6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiB6LnZvaWQoKSxcbiAgfSxcbiAgXCJzYW5kYm94LmdldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGtleTogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IFNhbmRib3hSZWNvcmRTY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJzYW5kYm94LmdldEJ5U2Vzc2lvblwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IHNlc3Npb25JZDogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IFNhbmRib3hSZWNvcmRTY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJzYW5kYm94LnNldFwiOiB7XG4gICAgcGFyYW1zOiBTYW5kYm94UmVjb3JkU2NoZW1hLFxuICAgIHJlc3VsdDogei52b2lkKCksXG4gIH0sXG4gIFwic2FuZGJveC5saXN0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5vcHRpb25hbCgpLFxuICAgICAgb3JkZXI6IHpcbiAgICAgICAgLmVudW0oW1xuICAgICAgICAgIFwiY3JlYXRlZEF0X2FzY1wiLFxuICAgICAgICAgIFwiY3JlYXRlZEF0X2Rlc2NcIixcbiAgICAgICAgICBcImxhc3RBY3Rpdml0eUF0X2FzY1wiLFxuICAgICAgICAgIFwibGFzdEFjdGl2aXR5QXRfZGVzY1wiLFxuICAgICAgICBdKVxuICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoU2FuZGJveFJlY29yZFNjaGVtYSksXG4gIH0sXG4gIFwic2FuZGJveC50YWcuc2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNhbmRib3hJZDogei5zdHJpbmcoKSxcbiAgICAgIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IFNhbmRib3hSZWNvcmRTY2hlbWEsXG4gIH0sXG4gIFwiY29tbWFuZC5nZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBpZDogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IENvbW1hbmRTY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJjb21tYW5kLnNldFwiOiB7XG4gICAgcGFyYW1zOiBDb21tYW5kU2NoZW1hLFxuICAgIHJlc3VsdDogQ29tbWFuZFNjaGVtYSxcbiAgfSxcbiAgXCJjb21tYW5kLmxpc3RcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICAgICAgaW5jbHVkZUZpbmlzaGVkOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShDb21tYW5kU2NoZW1hKSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB7IG1ldGhvZHMgfTtcbmV4cG9ydCB0eXBlIFN0b3JhZ2VNZXRob2RzID0gdHlwZW9mIG1ldGhvZHM7XG5leHBvcnQgdHlwZSBNZXRob2ROYW1lID0ga2V5b2YgU3RvcmFnZU1ldGhvZHM7XG5leHBvcnQgY29uc3QgU1RPUkFHRV9SUENfTUVUSE9EUyA9IE9iamVjdC5rZXlzKG1ldGhvZHMpIGFzIE1ldGhvZE5hbWVbXTtcbiIsICJpbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyB0eXBlIE1ldGhvZE5hbWUsIG1ldGhvZHMsIHR5cGUgU3RvcmFnZU1ldGhvZHMgfSBmcm9tIFwiLi9ycGNcIjtcblxuZXhwb3J0IHR5cGUgSGFuZGxlcnMgPSB7XG4gIFtLIGluIE1ldGhvZE5hbWVdOiAoXG4gICAgcGFyYW1zOiB6LmluZmVyPFN0b3JhZ2VNZXRob2RzW0tdW1wicGFyYW1zXCJdPlxuICApID0+IFByb21pc2U8ei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tLXVtcInJlc3VsdFwiXT4+O1xufTtcblxuZXhwb3J0IHR5cGUgUnBjUmVxdWVzdCA9IHtcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHBhcmFtczogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIFJwY1N1Y2Nlc3NSZXNwb25zZTxUID0gdW5rbm93bj4gPSB7XG4gIHJlc3VsdDogVDtcbn07XG5cbmV4cG9ydCB0eXBlIFJwY0Vycm9yUmVzcG9uc2UgPSB7XG4gIGVycm9yOiB7IGNvZGU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH07XG59O1xuXG5leHBvcnQgdHlwZSBScGNSZXNwb25zZTxUID0gdW5rbm93bj4gPSBScGNTdWNjZXNzUmVzcG9uc2U8VD4gfCBScGNFcnJvclJlc3BvbnNlO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlU3RvcmFnZVJwYyhcbiAgYm9keTogUnBjUmVxdWVzdCxcbiAgaGFuZGxlcnM6IEhhbmRsZXJzXG4pOiBQcm9taXNlPFJwY1Jlc3BvbnNlPiB7XG4gIGNvbnN0IHsgbWV0aG9kLCBwYXJhbXMgfSA9IGJvZHk7XG5cbiAgaWYgKCEobWV0aG9kIGluIG1ldGhvZHMpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiB7IGNvZGU6IFwiTUVUSE9EX05PVF9GT1VORFwiLCBtZXNzYWdlOiBgVW5rbm93biBtZXRob2Q6ICR7bWV0aG9kfWAgfSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgbWV0aG9kTmFtZSA9IG1ldGhvZCBhcyBNZXRob2ROYW1lO1xuICBjb25zdCBzY2hlbWEgPSBtZXRob2RzW21ldGhvZE5hbWVdLnBhcmFtcztcbiAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnNhZmVQYXJzZShwYXJhbXMpO1xuXG4gIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogXCJJTlZBTElEX1BBUkFNU1wiLFxuICAgICAgICBtZXNzYWdlOiBwYXJzZWQuZXJyb3IuaXNzdWVzXG4gICAgICAgICAgLm1hcCgoaSkgPT4gYCR7aS5wYXRoLmpvaW4oXCIuXCIpfTogJHtpLm1lc3NhZ2V9YClcbiAgICAgICAgICAuam9pbihcIiwgXCIpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnNbbWV0aG9kTmFtZV0gYXMgKFxuICAgICAgcGFyYW1zOiB1bmtub3duXG4gICAgKSA9PiBQcm9taXNlPHVua25vd24+O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIocGFyc2VkLmRhdGEpO1xuICAgIHJldHVybiB7IHJlc3VsdCB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIGNvZGU6IFwiSU5URVJOQUxfRVJST1JcIixcbiAgICAgICAgbWVzc2FnZTogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCAiZXhwb3J0IHtcbiAgREVGQVVMVF9OQU1FU1BBQ0UsXG4gIGdldFN0b3JhZ2UsXG4gIExPQ0FMX1NUT1JBR0VfVkVSU0lPTixcbiAgdHlwZSBScGNGbixcbn0gZnJvbSBcIi4vY2xpZW50XCI7XG5leHBvcnQge1xuICB0eXBlIEhhbmRsZXJzLFxuICBoYW5kbGVTdG9yYWdlUnBjLFxuICB0eXBlIFJwY0Vycm9yUmVzcG9uc2UsXG4gIHR5cGUgUnBjUmVxdWVzdCxcbiAgdHlwZSBScGNSZXNwb25zZSxcbiAgdHlwZSBScGNTdWNjZXNzUmVzcG9uc2UsXG59IGZyb20gXCIuL2hhbmRsZXJcIjtcbmV4cG9ydCB7XG4gIHR5cGUgTWVzc2FnZVVzYWdlLFxuICB0eXBlIE1ldGhvZE5hbWUsXG4gIHR5cGUgU2FuZGJveENvbmZpZyxcbiAgU1RPUkFHRV9SUENfTUVUSE9EUyxcbiAgdHlwZSBTdGVwVXNhZ2UsXG4gIHR5cGUgU3RvcmFnZU1ldGhvZHMsXG4gIHR5cGUgVXNhZ2VTdW1tYXJ5LFxufSBmcm9tIFwiLi9ycGNcIjtcbmV4cG9ydCB0eXBlIHtcbiAgQ29tbWFuZCxcbiAgTGlzdFJlc3VsdCxcbiAgTWVzc2FnZSxcbiAgUGFydCxcbiAgUmVzb2x2ZWRTdG9yYWdlLFxuICBTYW5kYm94UmVjb3JkLFxuICBTZXNzaW9uLFxuICBTdG9yYWdlLFxuICBTdG9yYWdlQ29uZmlnLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuIiwgImltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIndvcmtmbG93XCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hMaWZlY3ljbGVJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgY2hlY2tBbmRTbmFwc2hvdFN0ZXAgfSBmcm9tIFwiLi9saWZlY3ljbGUtd29ya2Zsb3ctc3RlcHNcIjtcblxuZXhwb3J0IHR5cGUgeyBTYW5kYm94TGlmZWN5Y2xlSW5wdXQgfTtcblxuY29uc3QgREVGQVVMVF9QT0xMX01TID0gMiAqIDYwICogMTAwMDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhbmRib3hMaWZlY3ljbGVXb3JrZmxvdyh7XG4gIGlucHV0LFxufToge1xuICBpbnB1dDogU2FuZGJveExpZmVjeWNsZUlucHV0O1xufSkge1xuICBcInVzZSB3b3JrZmxvd1wiO1xuXG4gIGxldCBuZXh0UG9sbE1zID0gREVGQVVMVF9QT0xMX01TO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgYXdhaXQgc2xlZXAobmV4dFBvbGxNcyk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjaGVja0FuZFNuYXBzaG90U3RlcChpbnB1dCk7XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IgfHwgcmVzdWx0LmFjdGlvbiA9PT0gXCJleGl0XCIpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIG5leHRQb2xsTXMgPSByZXN1bHQubmV4dFBvbGxNcztcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveExpZmVjeWNsZUlucHV0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmNvbnN0IERFRkFVTFRfUE9MTF9JTlRFUlZBTF9NUyA9IDIgKiA2MCAqIDEwMDA7XG5jb25zdCBERUZBVUxUX0lETEVfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDA7XG5jb25zdCBTTkFQU0hPVF9CRUZPUkVfVElNRU9VVF9NUyA9IDEwICogNjAgKiAxMDAwO1xuXG5jb25zdCBnZXRUZXN0Q3JlZGVudGlhbHMgPSAoKSA9PlxuICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCJcbiAgICA/IHtcbiAgICAgICAgdG9rZW46IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1RPS0VOLFxuICAgICAgICB0ZWFtSWQ6IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1RFQU1fSUQsXG4gICAgICAgIHByb2plY3RJZDogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfUFJPSkVDVF9JRCxcbiAgICAgIH1cbiAgICA6IHt9O1xuXG5leHBvcnQgdHlwZSBMaWZlY3ljbGVTdGVwUmVzdWx0ID1cbiAgfCB7IGFjdGlvbjogXCJjb250aW51ZVwiOyBuZXh0UG9sbE1zOiBudW1iZXIgfVxuICB8IHtcbiAgICAgIGFjdGlvbjogXCJleGl0XCI7XG4gICAgICByZWFzb246IFwic2FuZGJveElkX2NoYW5nZWRcIiB8IFwiaWRsZVwiIHwgXCJ0aW1lb3V0XCIgfCBcIm5vdF9mb3VuZFwiO1xuICAgIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0FuZFNuYXBzaG90U3RlcChcbiAgaW5wdXQ6IFNhbmRib3hMaWZlY3ljbGVJbnB1dFxuKTogUHJvbWlzZTxFcnJvciB8IExpZmVjeWNsZVN0ZXBSZXN1bHQ+IHtcbiAgXCJ1c2Ugc3RlcFwiO1xuXG4gIGNvbnN0IHsgU2FuZGJveDogVmVyY2VsU2FuZGJveFNESyB9ID0gYXdhaXQgaW1wb3J0KFwiLi92ZXJjZWwtc2RrXCIpO1xuICBjb25zdCB7IGdldFN0b3JhZ2UgfSA9IGF3YWl0IGltcG9ydChcIi4uLy4uL3N0b3JhZ2VcIik7XG4gIGNvbnN0IHN0b3JhZ2UgPSBnZXRTdG9yYWdlKHtcbiAgICBjb25maWc6IGlucHV0LnN0b3JhZ2VDb25maWcsXG4gICAgcnBjOiBpbnB1dC5ycGMsXG4gIH0pO1xuICBjb25zdCByZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlucHV0LmlkKTtcbiAgaWYgKHJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcIm5vdF9mb3VuZFwiIH07XG4gIH1cblxuICBjb25zdCBjdXJyZW50U2FuZGJveElkID1cbiAgICByZWNvcmQucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgID8gcmVjb3JkLnByb3ZpZGVyTWV0YWRhdGEuc2FuZGJveElkXG4gICAgICA6IG51bGw7XG5cbiAgaWYgKGN1cnJlbnRTYW5kYm94SWQgIT09IGlucHV0LnZlcmNlbFNhbmRib3hJZCkge1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJzYW5kYm94SWRfY2hhbmdlZFwiIH07XG4gIH1cblxuICBpZiAoIWN1cnJlbnRTYW5kYm94SWQpIHtcbiAgICByZXR1cm4geyBhY3Rpb246IFwiZXhpdFwiLCByZWFzb246IFwibm90X2ZvdW5kXCIgfTtcbiAgfVxuXG4gIGNvbnN0IGNvbmZpZyA9IHJlY29yZC5jb25maWc7XG4gIGlmIChjb25maWcudHlwZSAhPT0gXCJ2ZXJjZWxcIikge1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJub3RfZm91bmRcIiB9O1xuICB9XG5cbiAgY29uc3QgcG9sbEludGVydmFsTXMgPVxuICAgIGNvbmZpZy5saWZlY3ljbGU/LnBvbGxJbnRlcnZhbE1zID8/IERFRkFVTFRfUE9MTF9JTlRFUlZBTF9NUztcbiAgY29uc3QgaWRsZVRpbWVvdXRNcyA9XG4gICAgY29uZmlnLmxpZmVjeWNsZT8uc3RvcEFmdGVySW5hY3RpdmVNcyA/PyBERUZBVUxUX0lETEVfVElNRU9VVF9NUztcbiAgY29uc3Qgc25hcHNob3RCZWZvcmVUaW1lb3V0TXMgPVxuICAgIGNvbmZpZy5saWZlY3ljbGU/LnNuYXBzaG90QmVmb3JlVGltZW91dE1zID8/IFNOQVBTSE9UX0JFRk9SRV9USU1FT1VUX01TO1xuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IGxhc3RBY3Rpdml0eSA9IHJlY29yZC5sYXN0QWN0aXZpdHlBdCA/PyByZWNvcmQuY3JlYXRlZEF0ID8/IG5vdztcbiAgY29uc3QgaWRsZUR1cmF0aW9uID0gbm93IC0gbGFzdEFjdGl2aXR5O1xuICBjb25zdCBzaG91bGRTbmFwc2hvdER1ZVRvSWRsZSA9IGlkbGVEdXJhdGlvbiA+IGlkbGVUaW1lb3V0TXM7XG5cbiAgbGV0IHNob3VsZFNuYXBzaG90RHVlVG9UaW1lb3V0ID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFZlcmNlbFNhbmRib3hTREsuZ2V0KHtcbiAgICAgIHNhbmRib3hJZDogY3VycmVudFNhbmRib3hJZCxcbiAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgIH0pO1xuICAgIGlmIChzYW5kYm94LnRpbWVvdXQgPCBzbmFwc2hvdEJlZm9yZVRpbWVvdXRNcykge1xuICAgICAgc2hvdWxkU25hcHNob3REdWVUb1RpbWVvdXQgPSB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcIm5vdF9mb3VuZFwiIH07XG4gIH1cblxuICBpZiAoc2hvdWxkU25hcHNob3REdWVUb0lkbGUgfHwgc2hvdWxkU25hcHNob3REdWVUb1RpbWVvdXQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFZlcmNlbFNhbmRib3hTREsuZ2V0KHtcbiAgICAgICAgc2FuZGJveElkOiBjdXJyZW50U2FuZGJveElkLFxuICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBzYW5kYm94LnNuYXBzaG90KCk7XG4gICAgICBhd2FpdCBzdG9yYWdlLnNhbmRib3guc2V0KHtcbiAgICAgICAgLi4ucmVjb3JkLFxuICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgIHNhbmRib3hJZDogbnVsbCxcbiAgICAgICAgICBzbmFwc2hvdElkOiBzbmFwc2hvdC5zbmFwc2hvdElkLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvciA/IGUgOiBuZXcgRXJyb3IoU3RyaW5nKGUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJleGl0XCIsXG4gICAgICByZWFzb246IHNob3VsZFNuYXBzaG90RHVlVG9JZGxlID8gXCJpZGxlXCIgOiBcInRpbWVvdXRcIixcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgYWN0aW9uOiBcImNvbnRpbnVlXCIsIG5leHRQb2xsTXM6IHBvbGxJbnRlcnZhbE1zIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQXdCO0FBQUE7QUFBQTs7O0FDQXhCLFlBRWEsc0JBS0EsY0FLQSxzQkFLQSxjQUtBLGNBS0E7QUEzQmI7QUFBQTtBQUFBO0FBQUEsYUFBd0I7QUFFakIsSUFBTSx1QkFBTixjQUEwQyx5QkFBa0I7QUFBQSxNQUNqRSxNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsSUFDWCxDQUFDLEVBQUU7QUFBQSxJQUFDO0FBRUcsSUFBTSxlQUFOLGNBQWtDLHlCQUFrQjtBQUFBLE1BQ3pELE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQSxJQUNYLENBQUMsRUFBRTtBQUFBLElBQUM7QUFFRyxJQUFNLHVCQUFOLGNBQTBDLHlCQUFrQjtBQUFBLE1BQ2pFLE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQSxJQUNYLENBQUMsRUFBRTtBQUFBLElBQUM7QUFFRyxJQUFNLGVBQU4sY0FBa0MseUJBQWtCO0FBQUEsTUFDekQsTUFBTTtBQUFBLE1BQ04sU0FBUztBQUFBLElBQ1gsQ0FBQyxFQUFFO0FBQUEsSUFBQztBQUVHLElBQU0sZUFBTixjQUFrQyx5QkFBa0I7QUFBQSxNQUN6RCxNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsSUFDWCxDQUFDLEVBQUU7QUFBQSxJQUFDO0FBRUcsSUFBTSx1QkFBTixjQUEwQyx5QkFBa0I7QUFBQSxNQUNqRSxNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsSUFDWCxDQUFDLEVBQUU7QUFBQSxJQUFDO0FBQUE7QUFBQTs7O0FDSkcsU0FBUyxpQkFBaUIsT0FBYyxNQUF3QjtBQUNyRSxpQkFBZSxJQUNiLFFBQ0EsUUFDK0M7QUFDL0MsVUFBTSxTQUFTLE1BQU0sTUFBTSxFQUFFLE1BQU0sUUFBUSxPQUFPLENBQUM7QUFFbkQsUUFBSSxXQUFXLFFBQVE7QUFDckIsWUFBTSxJQUFJLGFBQWEsRUFBRSxRQUFRLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFBQSxJQUN6RDtBQUVBLFdBQU8sT0FBTztBQUFBLEVBQ2hCO0FBRUEsU0FBTztBQUFBLElBQ0wsU0FBUztBQUFBLE1BQ1AsS0FBSyxPQUFPLE9BQU87QUFDakIsWUFBSTtBQUNGLGdCQUFNLFNBQVMsTUFBTSxJQUFJLGVBQWUsRUFBRSxHQUFHLENBQUM7QUFDOUMsY0FBSSxXQUFXLE1BQU07QUFDbkIsbUJBQU8sSUFBSSxxQkFBcUIsRUFBRSxHQUFHLENBQUM7QUFBQSxVQUN4QztBQUNBLGlCQUFPO0FBQUEsUUFDVCxTQUFTLEdBQUc7QUFDVixjQUFJLGFBQWEsY0FBYztBQUM3QixtQkFBTztBQUFBLFVBQ1Q7QUFDQSxpQkFBTyxJQUFJLGFBQWEsRUFBRSxRQUFRLE9BQU8sQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDO0FBQUEsUUFDekQ7QUFBQSxNQUNGO0FBQUEsTUFDQSxLQUFLLE9BQU8sWUFBWTtBQUN0QixZQUFJO0FBQ0YsaUJBQU8sTUFBTSxJQUFJLGVBQWUsT0FBTztBQUFBLFFBQ3pDLFNBQVMsR0FBRztBQUNWLGNBQUksYUFBYSxjQUFjO0FBQzdCLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGlCQUFPLElBQUksYUFBYSxFQUFFLFFBQVEsT0FBTyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUM7QUFBQSxRQUN6RDtBQUFBLE1BQ0Y7QUFBQSxNQUNBLE1BQU0sT0FBTyxTQUFTO0FBQ3BCLFlBQUk7QUFDRixpQkFBTyxNQUFNLElBQUksZ0JBQWdCO0FBQUEsWUFDL0IsTUFBTSxNQUFNO0FBQUEsWUFDWixPQUFPLE1BQU07QUFBQSxZQUNiLFFBQVEsTUFBTTtBQUFBLFlBQ2QsT0FBTyxNQUFNO0FBQUEsVUFDZixDQUFDO0FBQUEsUUFDSCxTQUFTLEdBQUc7QUFDVixjQUFJLGFBQWEsY0FBYztBQUM3QixtQkFBTztBQUFBLFVBQ1Q7QUFDQSxpQkFBTyxJQUFJLGFBQWEsRUFBRSxRQUFRLE9BQU8sQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDO0FBQUEsUUFDekQ7QUFBQSxNQUNGO0FBQUEsTUFDQSxLQUFLO0FBQUEsUUFDSCxLQUFLLE9BQU8sRUFBRSxXQUFXLEtBQUssTUFBTTtBQUNsQyxjQUFJO0FBQ0YsbUJBQU8sTUFBTSxJQUFJLG1CQUFtQixFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQUEsVUFDekQsU0FBUyxHQUFHO0FBQ1YsZ0JBQUksYUFBYSxjQUFjO0FBQzdCLHFCQUFPO0FBQUEsWUFDVDtBQUNBLG1CQUFPLElBQUksYUFBYSxFQUFFLFFBQVEsT0FBTyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUM7QUFBQSxVQUN6RDtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsTUFBTSxPQUFPLFdBQVcsU0FBUztBQUMvQixZQUFJO0FBQ0YsaUJBQU8sTUFBTSxJQUFJLGdCQUFnQjtBQUFBLFlBQy9CO0FBQUEsWUFDQSxRQUFRLE1BQU07QUFBQSxZQUNkLE9BQU8sTUFBTTtBQUFBLFVBQ2YsQ0FBQztBQUFBLFFBQ0gsU0FBUyxHQUFHO0FBQ1YsY0FBSSxhQUFhLGNBQWM7QUFDN0IsbUJBQU87QUFBQSxVQUNUO0FBQ0EsaUJBQU8sSUFBSSxhQUFhLEVBQUUsUUFBUSxPQUFPLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQztBQUFBLFFBQ3pEO0FBQUEsTUFDRjtBQUFBLE1BQ0EsS0FBSyxPQUFPLE9BQU87QUFDakIsWUFBSTtBQUNGLGdCQUFNLFNBQVMsTUFBTSxJQUFJLGVBQWUsRUFBRSxHQUFHLENBQUM7QUFDOUMsY0FBSSxXQUFXLE1BQU07QUFDbkIsbUJBQU8sSUFBSSxxQkFBcUIsRUFBRSxHQUFHLENBQUM7QUFBQSxVQUN4QztBQUNBLGlCQUFPO0FBQUEsUUFDVCxTQUFTLEdBQUc7QUFDVixjQUFJLGFBQWEsY0FBYztBQUM3QixtQkFBTztBQUFBLFVBQ1Q7QUFDQSxpQkFBTyxJQUFJLGFBQWEsRUFBRSxRQUFRLE9BQU8sQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDO0FBQUEsUUFDekQ7QUFBQSxNQUNGO0FBQUEsTUFDQSxLQUFLLE9BQU8sWUFBWTtBQUN0QixZQUFJO0FBQ0YsaUJBQU8sTUFBTSxJQUFJLGVBQWUsT0FBTztBQUFBLFFBQ3pDLFNBQVMsR0FBRztBQUNWLGNBQUksYUFBYSxjQUFjO0FBQzdCLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGlCQUFPLElBQUksYUFBYSxFQUFFLFFBQVEsT0FBTyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUM7QUFBQSxRQUN6RDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxNQUFNO0FBQUEsTUFDSixlQUFlLE9BQU8sV0FBVyxTQUFTO0FBQ3hDLFlBQUk7QUFDRixnQkFBTSxTQUFTLE1BQU0sSUFBSSxzQkFBc0I7QUFBQSxZQUM3QztBQUFBLFlBQ0EsUUFBUSxNQUFNO0FBQUEsWUFDZCxPQUFPLE1BQU07QUFBQSxVQUNmLENBQUM7QUFDRCxpQkFBTztBQUFBLFFBQ1QsU0FBUyxHQUFHO0FBQ1YsY0FBSSxhQUFhLGNBQWM7QUFDN0IsbUJBQU87QUFBQSxVQUNUO0FBQ0EsaUJBQU8sSUFBSSxhQUFhLEVBQUUsUUFBUSxPQUFPLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQztBQUFBLFFBQ3pEO0FBQUEsTUFDRjtBQUFBLE1BQ0EsZUFBZSxPQUFPLFdBQVcsU0FBUztBQUN4QyxZQUFJO0FBQ0YsZ0JBQU0sU0FBUyxNQUFNLElBQUksc0JBQXNCO0FBQUEsWUFDN0M7QUFBQSxZQUNBLFFBQVEsTUFBTTtBQUFBLFlBQ2QsT0FBTyxNQUFNO0FBQUEsVUFDZixDQUFDO0FBQ0QsaUJBQU87QUFBQSxRQUNULFNBQVMsR0FBRztBQUNWLGNBQUksYUFBYSxjQUFjO0FBQzdCLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGlCQUFPLElBQUksYUFBYSxFQUFFLFFBQVEsT0FBTyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUM7QUFBQSxRQUN6RDtBQUFBLE1BQ0Y7QUFBQSxNQUNBLEtBQUssT0FBTyxTQUFTO0FBQ25CLFlBQUk7QUFDRixpQkFBUSxNQUFNLElBQUksWUFBWSxJQUFJO0FBQUEsUUFDcEMsU0FBUyxHQUFHO0FBQ1YsY0FBSSxhQUFhLGNBQWM7QUFDN0IsbUJBQU87QUFBQSxVQUNUO0FBQ0EsaUJBQU8sSUFBSSxhQUFhLEVBQUUsUUFBUSxPQUFPLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQztBQUFBLFFBQ3pEO0FBQUEsTUFDRjtBQUFBLE1BQ0EsUUFBUSxPQUFPLE9BQU87QUFDcEIsWUFBSTtBQUNGLGdCQUFNLElBQUksZUFBZSxFQUFFLEdBQUcsQ0FBQztBQUFBLFFBQ2pDLFNBQVMsR0FBRztBQUNWLGNBQUksYUFBYSxjQUFjO0FBQzdCLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGlCQUFPLElBQUksYUFBYSxFQUFFLFFBQVEsT0FBTyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUM7QUFBQSxRQUN6RDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFDUCxLQUFLLE9BQU8sUUFBUTtBQUNsQixZQUFJO0FBQ0YsZ0JBQU0sU0FBUyxNQUFNLElBQUksZUFBZSxFQUFFLElBQUksQ0FBQztBQUMvQyxjQUFJLFdBQVcsTUFBTTtBQUNuQixtQkFBTyxJQUFJLHFCQUFxQixFQUFFLElBQUksSUFBSSxDQUFDO0FBQUEsVUFDN0M7QUFDQSxpQkFBTztBQUFBLFFBQ1QsU0FBUyxHQUFHO0FBQ1YsY0FBSSxhQUFhLGNBQWM7QUFDN0IsbUJBQU87QUFBQSxVQUNUO0FBQ0EsaUJBQU8sSUFBSSxhQUFhLEVBQUUsUUFBUSxPQUFPLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQztBQUFBLFFBQ3pEO0FBQUEsTUFDRjtBQUFBLE1BQ0EsY0FBYyxPQUFPLGNBQWM7QUFDakMsWUFBSTtBQUNGLGdCQUFNLFNBQVMsTUFBTSxJQUFJLHdCQUF3QixFQUFFLFVBQVUsQ0FBQztBQUM5RCxjQUFJLFdBQVcsTUFBTTtBQUNuQixtQkFBTyxJQUFJLHFCQUFxQixFQUFFLElBQUksVUFBVSxDQUFDO0FBQUEsVUFDbkQ7QUFDQSxpQkFBTztBQUFBLFFBQ1QsU0FBUyxHQUFHO0FBQ1YsY0FBSSxhQUFhLGNBQWM7QUFDN0IsbUJBQU87QUFBQSxVQUNUO0FBQ0EsaUJBQU8sSUFBSSxhQUFhLEVBQUUsUUFBUSxPQUFPLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQztBQUFBLFFBQ3pEO0FBQUEsTUFDRjtBQUFBLE1BQ0EsS0FBSyxPQUFPLFdBQVc7QUFDckIsWUFBSTtBQUNGLGdCQUFNLElBQUksZUFBZSxNQUFNO0FBQy9CLGlCQUFPO0FBQUEsUUFDVCxTQUFTLEdBQUc7QUFDVixjQUFJLGFBQWEsY0FBYztBQUM3QixtQkFBTztBQUFBLFVBQ1Q7QUFDQSxpQkFBTyxJQUFJLGFBQWEsRUFBRSxRQUFRLE9BQU8sQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDO0FBQUEsUUFDekQ7QUFBQSxNQUNGO0FBQUEsTUFDQSxNQUFNLE9BQU8sU0FBUztBQUNwQixZQUFJO0FBQ0YsaUJBQU8sTUFBTSxJQUFJLGdCQUFnQjtBQUFBLFlBQy9CLE1BQU0sTUFBTTtBQUFBLFlBQ1osT0FBTyxNQUFNO0FBQUEsWUFDYixRQUFRLE1BQU07QUFBQSxZQUNkLE9BQU8sTUFBTTtBQUFBLFVBQ2YsQ0FBQztBQUFBLFFBQ0gsU0FBUyxHQUFHO0FBQ1YsY0FBSSxhQUFhLGNBQWM7QUFDN0IsbUJBQU87QUFBQSxVQUNUO0FBQ0EsaUJBQU8sSUFBSSxhQUFhLEVBQUUsUUFBUSxPQUFPLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQztBQUFBLFFBQ3pEO0FBQUEsTUFDRjtBQUFBLE1BQ0EsS0FBSztBQUFBLFFBQ0gsS0FBSyxPQUFPLEVBQUUsV0FBVyxLQUFLLE1BQU07QUFDbEMsY0FBSTtBQUNGLG1CQUFPLE1BQU0sSUFBSSxtQkFBbUIsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUFBLFVBQ3pELFNBQVMsR0FBRztBQUNWLGdCQUFJLGFBQWEsY0FBYztBQUM3QixxQkFBTztBQUFBLFlBQ1Q7QUFDQSxtQkFBTyxJQUFJLGFBQWEsRUFBRSxRQUFRLE9BQU8sQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDO0FBQUEsVUFDekQ7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLEtBQUssT0FBTyxPQUFPO0FBQ2pCLFlBQUk7QUFDRixpQkFBUSxNQUFNLElBQUksZUFBZSxFQUFFLEdBQUcsQ0FBQztBQUFBLFFBQ3pDLFNBQVMsR0FBRztBQUNWLGNBQUksYUFBYSxjQUFjO0FBQzdCLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGlCQUFPLElBQUksYUFBYSxFQUFFLFFBQVEsT0FBTyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUM7QUFBQSxRQUN6RDtBQUFBLE1BQ0Y7QUFBQSxNQUNBLEtBQUssT0FBTyxZQUFZO0FBQ3RCLFlBQUk7QUFDRixpQkFBUSxNQUFNLElBQUksZUFBZSxPQUFPO0FBQUEsUUFDMUMsU0FBUyxHQUFHO0FBQ1YsY0FBSSxhQUFhLGNBQWM7QUFDN0IsbUJBQU87QUFBQSxVQUNUO0FBQ0EsaUJBQU8sSUFBSSxhQUFhLEVBQUUsUUFBUSxPQUFPLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQztBQUFBLFFBQ3pEO0FBQUEsTUFDRjtBQUFBLE1BQ0EsTUFBTSxPQUFPLFdBQVcsU0FBUztBQUMvQixZQUFJO0FBQ0YsZ0JBQU0sU0FBUyxNQUFNLElBQUksZ0JBQWdCO0FBQUEsWUFDdkM7QUFBQSxZQUNBLGlCQUFpQixNQUFNO0FBQUEsWUFDdkIsUUFBUSxNQUFNO0FBQUEsWUFDZCxPQUFPLE1BQU07QUFBQSxVQUNmLENBQUM7QUFDRCxpQkFBTztBQUFBLFFBQ1QsU0FBUyxHQUFHO0FBQ1YsY0FBSSxhQUFhLGNBQWM7QUFDN0IsbUJBQU87QUFBQSxVQUNUO0FBQ0EsaUJBQU8sSUFBSSxhQUFhLEVBQUUsUUFBUSxPQUFPLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQztBQUFBLFFBQ3pEO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFLTyxTQUFTLFdBQVcsTUFHZjtBQUNWLFFBQU0sT0FBTyxLQUFLLE9BQU8sUUFBUTtBQUNqQyxTQUFPLGlCQUFpQixLQUFLLEtBQUssSUFBSTtBQUN4QztBQWhUQSxJQXVTYSxtQkFDQTtBQXhTYjtBQUFBO0FBQUE7QUFDQTtBQXNTTyxJQUFNLG9CQUFvQjtBQUMxQixJQUFNLHdCQUF3QjtBQUFBO0FBQUE7OztBQ3RJckMsU0FBUyxpQkFBeUMsWUFBZTtBQUMvRCxTQUFPLGFBQUUsT0FBTztBQUFBLElBQ2QsT0FBTyxhQUFFLE1BQU0sVUFBVTtBQUFBLElBQ3pCLFlBQVksYUFBRSxPQUFPLEVBQUUsU0FBUztBQUFBLEVBQ2xDLENBQUM7QUFDSDtBQXZLQSxnQkFFTSw2QkFRTyxxQkFvQlAsa0JBV08sZUFnQkEsaUJBV0Esb0JBV0Esb0JBU0EsZUFnQkEsWUFRQSxxQkFPQSxxQkFtQlAsbUJBUU8sZUF1QlAsU0FrSk87QUEzVGI7QUFBQTtBQUFBO0FBQUEsaUJBQWtCO0FBRWxCLElBQU0sOEJBQThCLGFBQUUsT0FBTztBQUFBLE1BQzNDLGdCQUFnQixhQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsTUFDcEMscUJBQXFCLGFBQUUsT0FBTyxFQUFFLFNBQVM7QUFBQSxNQUN6Qyx5QkFBeUIsYUFBRSxPQUFPLEVBQUUsU0FBUztBQUFBLE1BQzdDLFlBQVksYUFBRSxPQUFPLEVBQUUsU0FBUztBQUFBLE1BQ2hDLFdBQVcsYUFBRSxRQUFRLEVBQUUsU0FBUztBQUFBLElBQ2xDLENBQUM7QUFFTSxJQUFNLHNCQUFzQixhQUFFLG1CQUFtQixRQUFRO0FBQUEsTUFDOUQsYUFBRSxPQUFPO0FBQUEsUUFDUCxNQUFNLGFBQUUsUUFBUSxRQUFRO0FBQUEsUUFDeEIsV0FBVyxhQUFFLE9BQU8sRUFBRSxPQUFPLGFBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTO0FBQUEsUUFDcEQsT0FBTyxhQUFFLE1BQU0sYUFBRSxPQUFPLENBQUMsRUFBRSxTQUFTO0FBQUEsUUFDcEMsV0FBVyw0QkFBNEIsU0FBUztBQUFBLE1BQ2xELENBQUM7QUFBQSxNQUNELGFBQUUsT0FBTztBQUFBLFFBQ1AsTUFBTSxhQUFFLFFBQVEsT0FBTztBQUFBLFFBQ3ZCLE1BQU0sYUFBRSxPQUFPLEVBQUUsU0FBUztBQUFBLE1BQzVCLENBQUM7QUFBQSxNQUNELGFBQUUsT0FBTztBQUFBLFFBQ1AsTUFBTSxhQUFFLFFBQVEsUUFBUTtBQUFBLFFBQ3hCLEtBQUssYUFBRSxPQUFPO0FBQUEsUUFDZCxTQUFTLGFBQUUsT0FBTyxhQUFFLE9BQU8sR0FBRyxhQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVM7QUFBQSxNQUNyRCxDQUFDO0FBQUEsSUFDSCxDQUFDO0FBSUQsSUFBTSxtQkFBbUIsYUFBRSxPQUFPO0FBQUEsTUFDaEMsVUFBVSxhQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsTUFDOUIsYUFBYSxhQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsTUFDakMsTUFBTSxhQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsTUFDMUIsTUFBTSxhQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsTUFDMUIsa0JBQWtCLGFBQUUsT0FBTyxFQUFFLFNBQVM7QUFBQSxNQUN0QyxpQkFBaUIsYUFBRSxPQUFPLEVBQUUsU0FBUztBQUFBLE1BQ3JDLGlCQUFpQixhQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsTUFDckMsU0FBUyxhQUFFLE9BQU8sYUFBRSxPQUFPLEdBQUcsYUFBRSxPQUFPLENBQUMsRUFBRSxTQUFTO0FBQUEsSUFDckQsQ0FBQztBQUVNLElBQU0sZ0JBQWdCLGFBQUUsT0FBTztBQUFBLE1BQ3BDLElBQUksYUFBRSxPQUFPO0FBQUEsTUFDYixXQUFXLGFBQUUsT0FBTztBQUFBLE1BQ3BCLFdBQVcsYUFBRSxPQUFPO0FBQUEsTUFDcEIsT0FBTyxhQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsTUFDM0IsZUFBZSxhQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsTUFDbkMsTUFBTSxhQUFFLE9BQU8sYUFBRSxPQUFPLEdBQUcsYUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTO0FBQUEsTUFDakQsUUFBUSxhQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsTUFDNUIsT0FBTyxhQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsTUFDM0IsV0FBVyxhQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsTUFDL0IsV0FBVyxhQUFFLE1BQU0sYUFBRSxPQUFPLENBQUMsRUFBRSxTQUFTO0FBQUEsTUFDeEMsV0FBVyxhQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsTUFDL0IsYUFBYSxhQUFFLE1BQU0sYUFBRSxPQUFPLENBQUMsRUFBRSxTQUFTO0FBQUEsTUFDMUMsWUFBWSxpQkFBaUIsU0FBUyxFQUFFLFFBQVEsSUFBSTtBQUFBLElBQ3RELENBQUM7QUFFTSxJQUFNLGtCQUFrQixhQUFFLE9BQU87QUFBQSxNQUN0QyxXQUFXLGFBQUUsT0FBTztBQUFBLE1BQ3BCLE9BQU8sYUFBRSxPQUFPO0FBQUEsTUFDaEIsYUFBYSxhQUFFLE9BQU87QUFBQSxNQUN0QixjQUFjLGFBQUUsT0FBTztBQUFBLE1BQ3ZCLGFBQWEsYUFBRSxPQUFPO0FBQUEsTUFDdEIsaUJBQWlCLGFBQUUsT0FBTztBQUFBLE1BQzFCLGtCQUFrQixhQUFFLE9BQU87QUFBQSxNQUMzQixpQkFBaUIsYUFBRSxPQUFPO0FBQUEsSUFDNUIsQ0FBQztBQUVNLElBQU0scUJBQXFCLGFBQUUsT0FBTztBQUFBLE1BQ3pDLE9BQU8sYUFBRSxPQUFPO0FBQUEsTUFDaEIsYUFBYSxhQUFFLE9BQU87QUFBQSxNQUN0QixjQUFjLGFBQUUsT0FBTztBQUFBLE1BQ3ZCLGFBQWEsYUFBRSxPQUFPO0FBQUEsTUFDdEIsaUJBQWlCLGFBQUUsT0FBTztBQUFBLE1BQzFCLGtCQUFrQixhQUFFLE9BQU87QUFBQSxNQUMzQixpQkFBaUIsYUFBRSxPQUFPO0FBQUEsTUFDMUIsV0FBVyxhQUFFLE9BQU87QUFBQSxJQUN0QixDQUFDO0FBRU0sSUFBTSxxQkFBcUIsYUFBRSxPQUFPO0FBQUEsTUFDekMsT0FBTyxhQUFFLE1BQU0sZUFBZTtBQUFBLE1BQzlCLFNBQVM7QUFBQSxJQUNYLENBQUM7QUFNTSxJQUFNLGdCQUFnQixhQUFFLE9BQU87QUFBQSxNQUNwQyxJQUFJLGFBQUUsT0FBTztBQUFBLE1BQ2IsV0FBVyxhQUFFLE9BQU87QUFBQSxNQUNwQixNQUFNLGFBQUUsS0FBSyxDQUFDLFFBQVEsYUFBYSxRQUFRLENBQUM7QUFBQSxNQUM1QyxXQUFXLGFBQUUsT0FBTztBQUFBLE1BQ3BCLFdBQVcsYUFBRSxPQUFPLEVBQUUsU0FBUztBQUFBLE1BQy9CLGFBQWEsYUFBRSxPQUFPLEVBQUUsU0FBUztBQUFBLE1BQ2pDLGVBQWUsYUFBRSxPQUFPLEVBQUUsU0FBUztBQUFBLE1BQ25DLE9BQU8sbUJBQW1CLFNBQVM7QUFBQSxJQUNyQyxDQUFDO0FBT00sSUFBTSxhQUFhLGFBQUUsT0FBTztBQUFBLE1BQ2pDLElBQUksYUFBRSxPQUFPO0FBQUEsTUFDYixXQUFXLGFBQUUsT0FBTztBQUFBLE1BQ3BCLFdBQVcsYUFBRSxPQUFPO0FBQUEsTUFDcEIsT0FBTyxhQUFFLE9BQU87QUFBQSxNQUNoQixNQUFNLGFBQUUsUUFBUTtBQUFBLElBQ2xCLENBQUM7QUFFTSxJQUFNLHNCQUFzQixhQUFFLE9BQU87QUFBQSxNQUMxQyxRQUFRLGFBQUUsT0FBTztBQUFBLE1BQ2pCLFFBQVEsYUFBRSxPQUFPO0FBQUEsTUFDakIsVUFBVSxhQUFFLE9BQU87QUFBQSxNQUNuQixhQUFhLGFBQUUsT0FBTztBQUFBLElBQ3hCLENBQUM7QUFFTSxJQUFNLHNCQUFzQixhQUFFLE9BQU87QUFBQSxNQUMxQyxJQUFJLGFBQUUsT0FBTztBQUFBLE1BQ2IsUUFBUTtBQUFBLE1BQ1IsTUFBTSxhQUFFLE9BQU8sYUFBRSxPQUFPLEdBQUcsYUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTO0FBQUEsTUFDakQsV0FBVyxhQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsTUFDL0IsZ0JBQWdCLGFBQUUsT0FBTyxFQUFFLFNBQVM7QUFBQSxNQUNwQyxpQkFBaUIsYUFBRSxPQUFPLEVBQUUsU0FBUztBQUFBLE1BQ3JDLGlCQUFpQixhQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsTUFDckMsa0JBQWtCLGFBQ2YsbUJBQW1CLFlBQVk7QUFBQSxRQUM5QixhQUFFLE9BQU87QUFBQSxVQUNQLFVBQVUsYUFBRSxRQUFRLFFBQVE7QUFBQSxVQUM1QixXQUFXLGFBQUUsT0FBTyxFQUFFLFNBQVM7QUFBQSxVQUMvQixZQUFZLGFBQUUsT0FBTyxFQUFFLFNBQVM7QUFBQSxRQUNsQyxDQUFDO0FBQUEsTUFDSCxDQUFDLEVBQ0EsU0FBUztBQUFBLElBQ2QsQ0FBQztBQUVELElBQU0sb0JBQW9CLGFBQUUsT0FBTztBQUFBLE1BQ2pDLElBQUksYUFBRSxPQUFPO0FBQUEsTUFDYixXQUFXLGFBQUUsT0FBTztBQUFBLE1BQ3BCLFNBQVMsYUFBRSxPQUFPO0FBQUEsTUFDbEIsTUFBTSxhQUFFLE1BQU0sYUFBRSxPQUFPLENBQUMsRUFBRSxTQUFTO0FBQUEsTUFDbkMsV0FBVyxhQUFFLE9BQU87QUFBQSxJQUN0QixDQUFDO0FBRU0sSUFBTSxnQkFBZ0IsYUFBRSxtQkFBbUIsVUFBVTtBQUFBLE1BQzFELGtCQUFrQixPQUFPLEVBQUUsUUFBUSxhQUFFLFFBQVEsU0FBUyxFQUFFLENBQUM7QUFBQSxNQUN6RCxrQkFBa0IsT0FBTztBQUFBLFFBQ3ZCLFFBQVEsYUFBRSxRQUFRLFdBQVc7QUFBQSxRQUM3QixRQUFRO0FBQUEsTUFDVixDQUFDO0FBQUEsTUFDRCxrQkFBa0IsT0FBTztBQUFBLFFBQ3ZCLFFBQVEsYUFBRSxRQUFRLFFBQVE7QUFBQSxRQUMxQixRQUFRLG9CQUFvQixTQUFTO0FBQUEsTUFDdkMsQ0FBQztBQUFBLE1BQ0Qsa0JBQWtCLE9BQU87QUFBQSxRQUN2QixRQUFRLGFBQUUsUUFBUSxRQUFRO0FBQUEsUUFDMUIsUUFBUTtBQUFBLE1BQ1YsQ0FBQztBQUFBLElBQ0gsQ0FBQztBQVNELElBQU0sVUFBVTtBQUFBLE1BQ2QsZUFBZTtBQUFBLFFBQ2IsUUFBUSxhQUFFLE9BQU8sRUFBRSxJQUFJLGFBQUUsT0FBTyxFQUFFLENBQUM7QUFBQSxRQUNuQyxRQUFRLGNBQWMsU0FBUztBQUFBLE1BQ2pDO0FBQUEsTUFDQSxlQUFlO0FBQUEsUUFDYixRQUFRO0FBQUEsUUFDUixRQUFRO0FBQUEsTUFDVjtBQUFBLE1BQ0EsZ0JBQWdCO0FBQUEsUUFDZCxRQUFRLGFBQUUsT0FBTztBQUFBLFVBQ2YsTUFBTSxhQUFFLE9BQU8sYUFBRSxPQUFPLEdBQUcsYUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTO0FBQUEsVUFDakQsT0FBTyxhQUNKLEtBQUs7QUFBQSxZQUNKO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsVUFDRixDQUFDLEVBQ0EsU0FBUztBQUFBLFVBQ1osUUFBUSxhQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsVUFDNUIsT0FBTyxhQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsUUFDN0IsQ0FBQztBQUFBLFFBQ0QsUUFBUSxpQkFBaUIsYUFBYTtBQUFBLE1BQ3hDO0FBQUEsTUFDQSx5QkFBeUI7QUFBQSxRQUN2QixRQUFRLGFBQUUsT0FBTztBQUFBLFVBQ2YsV0FBVyxhQUFFLE9BQU87QUFBQSxVQUNwQixNQUFNLGFBQUUsT0FBTyxhQUFFLE9BQU8sR0FBRyxhQUFFLFFBQVEsQ0FBQyxFQUFFLFNBQVM7QUFBQSxVQUNqRCxPQUFPLGFBQ0osS0FBSztBQUFBLFlBQ0o7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxVQUNGLENBQUMsRUFDQSxTQUFTO0FBQUEsVUFDWixRQUFRLGFBQUUsT0FBTyxFQUFFLFNBQVM7QUFBQSxVQUM1QixPQUFPLGFBQUUsT0FBTyxFQUFFLFNBQVM7QUFBQSxRQUM3QixDQUFDO0FBQUEsUUFDRCxRQUFRLGlCQUFpQixhQUFhO0FBQUEsTUFDeEM7QUFBQSxNQUNBLG1CQUFtQjtBQUFBLFFBQ2pCLFFBQVEsYUFBRSxPQUFPO0FBQUEsVUFDZixXQUFXLGFBQUUsT0FBTztBQUFBLFVBQ3BCLE1BQU0sYUFBRSxPQUFPLGFBQUUsT0FBTyxHQUFHLGFBQUUsUUFBUSxDQUFDO0FBQUEsUUFDeEMsQ0FBQztBQUFBLFFBQ0QsUUFBUTtBQUFBLE1BQ1Y7QUFBQSxNQUNBLGVBQWU7QUFBQSxRQUNiLFFBQVEsYUFBRSxPQUFPLEVBQUUsSUFBSSxhQUFFLE9BQU8sRUFBRSxDQUFDO0FBQUEsUUFDbkMsUUFBUSxjQUFjLFNBQVM7QUFBQSxNQUNqQztBQUFBLE1BQ0EsZUFBZTtBQUFBLFFBQ2IsUUFBUTtBQUFBLFFBQ1IsUUFBUTtBQUFBLE1BQ1Y7QUFBQSxNQUNBLGdCQUFnQjtBQUFBLFFBQ2QsUUFBUSxhQUFFLE9BQU87QUFBQSxVQUNmLFdBQVcsYUFBRSxPQUFPO0FBQUEsVUFDcEIsUUFBUSxhQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsVUFDNUIsT0FBTyxhQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsUUFDN0IsQ0FBQztBQUFBLFFBQ0QsUUFBUSxpQkFBaUIsYUFBYTtBQUFBLE1BQ3hDO0FBQUEsTUFDQSxzQkFBc0I7QUFBQSxRQUNwQixRQUFRLGFBQUUsT0FBTztBQUFBLFVBQ2YsV0FBVyxhQUFFLE9BQU87QUFBQSxVQUNwQixRQUFRLGFBQUUsT0FBTyxFQUFFLFNBQVM7QUFBQSxVQUM1QixPQUFPLGFBQUUsT0FBTyxFQUFFLFNBQVM7QUFBQSxRQUM3QixDQUFDO0FBQUEsUUFDRCxRQUFRLGlCQUFpQixVQUFVO0FBQUEsTUFDckM7QUFBQSxNQUNBLHNCQUFzQjtBQUFBLFFBQ3BCLFFBQVEsYUFBRSxPQUFPO0FBQUEsVUFDZixXQUFXLGFBQUUsT0FBTztBQUFBLFVBQ3BCLFFBQVEsYUFBRSxPQUFPLEVBQUUsU0FBUztBQUFBLFVBQzVCLE9BQU8sYUFBRSxPQUFPLEVBQUUsU0FBUztBQUFBLFFBQzdCLENBQUM7QUFBQSxRQUNELFFBQVEsaUJBQWlCLFVBQVU7QUFBQSxNQUNyQztBQUFBLE1BQ0EsWUFBWTtBQUFBLFFBQ1YsUUFBUTtBQUFBLFFBQ1IsUUFBUTtBQUFBLE1BQ1Y7QUFBQSxNQUNBLGVBQWU7QUFBQSxRQUNiLFFBQVEsYUFBRSxPQUFPLEVBQUUsSUFBSSxhQUFFLE9BQU8sRUFBRSxDQUFDO0FBQUEsUUFDbkMsUUFBUSxhQUFFLEtBQUs7QUFBQSxNQUNqQjtBQUFBLE1BQ0EsZUFBZTtBQUFBLFFBQ2IsUUFBUSxhQUFFLE9BQU8sRUFBRSxLQUFLLGFBQUUsT0FBTyxFQUFFLENBQUM7QUFBQSxRQUNwQyxRQUFRLG9CQUFvQixTQUFTO0FBQUEsTUFDdkM7QUFBQSxNQUNBLHdCQUF3QjtBQUFBLFFBQ3RCLFFBQVEsYUFBRSxPQUFPLEVBQUUsV0FBVyxhQUFFLE9BQU8sRUFBRSxDQUFDO0FBQUEsUUFDMUMsUUFBUSxvQkFBb0IsU0FBUztBQUFBLE1BQ3ZDO0FBQUEsTUFDQSxlQUFlO0FBQUEsUUFDYixRQUFRO0FBQUEsUUFDUixRQUFRLGFBQUUsS0FBSztBQUFBLE1BQ2pCO0FBQUEsTUFDQSxnQkFBZ0I7QUFBQSxRQUNkLFFBQVEsYUFBRSxPQUFPO0FBQUEsVUFDZixNQUFNLGFBQUUsT0FBTyxhQUFFLE9BQU8sR0FBRyxhQUFFLFFBQVEsQ0FBQyxFQUFFLFNBQVM7QUFBQSxVQUNqRCxPQUFPLGFBQ0osS0FBSztBQUFBLFlBQ0o7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxVQUNGLENBQUMsRUFDQSxTQUFTO0FBQUEsVUFDWixRQUFRLGFBQUUsT0FBTyxFQUFFLFNBQVM7QUFBQSxVQUM1QixPQUFPLGFBQUUsT0FBTyxFQUFFLFNBQVM7QUFBQSxRQUM3QixDQUFDO0FBQUEsUUFDRCxRQUFRLGlCQUFpQixtQkFBbUI7QUFBQSxNQUM5QztBQUFBLE1BQ0EsbUJBQW1CO0FBQUEsUUFDakIsUUFBUSxhQUFFLE9BQU87QUFBQSxVQUNmLFdBQVcsYUFBRSxPQUFPO0FBQUEsVUFDcEIsTUFBTSxhQUFFLE9BQU8sYUFBRSxPQUFPLEdBQUcsYUFBRSxRQUFRLENBQUM7QUFBQSxRQUN4QyxDQUFDO0FBQUEsUUFDRCxRQUFRO0FBQUEsTUFDVjtBQUFBLE1BQ0EsZUFBZTtBQUFBLFFBQ2IsUUFBUSxhQUFFLE9BQU8sRUFBRSxJQUFJLGFBQUUsT0FBTyxFQUFFLENBQUM7QUFBQSxRQUNuQyxRQUFRLGNBQWMsU0FBUztBQUFBLE1BQ2pDO0FBQUEsTUFDQSxlQUFlO0FBQUEsUUFDYixRQUFRO0FBQUEsUUFDUixRQUFRO0FBQUEsTUFDVjtBQUFBLE1BQ0EsZ0JBQWdCO0FBQUEsUUFDZCxRQUFRLGFBQUUsT0FBTztBQUFBLFVBQ2YsV0FBVyxhQUFFLE9BQU87QUFBQSxVQUNwQixpQkFBaUIsYUFBRSxRQUFRLEVBQUUsU0FBUztBQUFBLFVBQ3RDLFFBQVEsYUFBRSxPQUFPLEVBQUUsU0FBUztBQUFBLFVBQzVCLE9BQU8sYUFBRSxPQUFPLEVBQUUsU0FBUztBQUFBLFFBQzdCLENBQUM7QUFBQSxRQUNELFFBQVEsaUJBQWlCLGFBQWE7QUFBQSxNQUN4QztBQUFBLElBQ0Y7QUFLTyxJQUFNLHNCQUFzQixPQUFPLEtBQUssT0FBTztBQUFBO0FBQUE7OztBQ25TdEQsZUFBc0IsaUJBQ3BCLE1BQ0EsVUFDc0I7QUFDdEIsUUFBTSxFQUFFLFFBQVEsT0FBTyxJQUFJO0FBRTNCLE1BQUksRUFBRSxVQUFVLFVBQVU7QUFDeEIsV0FBTztBQUFBLE1BQ0wsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLFNBQVMsbUJBQW1CLE1BQU0sR0FBRztBQUFBLElBQzFFO0FBQUEsRUFDRjtBQUVBLFFBQU0sYUFBYTtBQUNuQixRQUFNLFNBQVMsUUFBUSxVQUFVLEVBQUU7QUFDbkMsUUFBTSxTQUFTLE9BQU8sVUFBVSxNQUFNO0FBRXRDLE1BQUksQ0FBQyxPQUFPLFNBQVM7QUFDbkIsV0FBTztBQUFBLE1BQ0wsT0FBTztBQUFBLFFBQ0wsTUFBTTtBQUFBLFFBQ04sU0FBUyxPQUFPLE1BQU0sT0FDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEtBQUssS0FBSyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUM5QyxLQUFLLElBQUk7QUFBQSxNQUNkO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxNQUFJO0FBQ0YsVUFBTSxVQUFVLFNBQVMsVUFBVTtBQUduQyxVQUFNLFNBQVMsTUFBTSxRQUFRLE9BQU8sSUFBSTtBQUN4QyxXQUFPLEVBQUUsT0FBTztBQUFBLEVBQ2xCLFNBQVMsR0FBRztBQUNWLFdBQU87QUFBQSxNQUNMLE9BQU87QUFBQSxRQUNMLE1BQU07QUFBQSxRQUNOLFNBQVMsYUFBYSxRQUFRLEVBQUUsVUFBVSxPQUFPLENBQUM7QUFBQSxNQUNwRDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFqRUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBOzs7QUNEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQVFBO0FBQUE7QUFBQTs7O0FDZEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHNCQUFzQjs7O0FDRXRCLElBQU0sMkJBQTJCLElBQUksS0FBSztBQUMxQyxJQUFNLDBCQUEwQixJQUFJLEtBQUs7QUFDekMsSUFBTSw2QkFBNkIsS0FBSyxLQUFLO0FBRTdDLElBQU0scUJBQXFCLE1BQ3pCLFFBQVEsSUFBSSxhQUFhLFNBQ3JCO0FBQUEsRUFDRSxPQUFPLFFBQVEsSUFBSTtBQUFBLEVBQ25CLFFBQVEsUUFBUSxJQUFJO0FBQUEsRUFDcEIsV0FBVyxRQUFRLElBQUk7QUFDekIsSUFDQSxDQUFDO0FBU1AsZUFBc0IscUJBQ3BCLE9BQ3NDO0FBQ3RDO0FBRUEsUUFBTSxFQUFFLFNBQVMsaUJBQWlCLElBQUksTUFBTTtBQUM1QyxRQUFNLEVBQUUsWUFBQUEsWUFBVyxJQUFJLE1BQU07QUFDN0IsUUFBTSxVQUFVQSxZQUFXO0FBQUEsSUFDekIsUUFBUSxNQUFNO0FBQUEsSUFDZCxLQUFLLE1BQU07QUFBQSxFQUNiLENBQUM7QUFDRCxRQUFNLFNBQVMsTUFBTSxRQUFRLFFBQVEsSUFBSSxNQUFNLEVBQUU7QUFDakQsTUFBSSxrQkFBa0IsT0FBTztBQUMzQixXQUFPLEVBQUUsUUFBUSxRQUFRLFFBQVEsWUFBWTtBQUFBLEVBQy9DO0FBRUEsUUFBTSxtQkFDSixPQUFPLGtCQUFrQixhQUFhLFdBQ2xDLE9BQU8saUJBQWlCLFlBQ3hCO0FBRU4sTUFBSSxxQkFBcUIsTUFBTSxpQkFBaUI7QUFDOUMsV0FBTyxFQUFFLFFBQVEsUUFBUSxRQUFRLG9CQUFvQjtBQUFBLEVBQ3ZEO0FBRUEsTUFBSSxDQUFDLGtCQUFrQjtBQUNyQixXQUFPLEVBQUUsUUFBUSxRQUFRLFFBQVEsWUFBWTtBQUFBLEVBQy9DO0FBRUEsUUFBTSxTQUFTLE9BQU87QUFDdEIsTUFBSSxPQUFPLFNBQVMsVUFBVTtBQUM1QixXQUFPLEVBQUUsUUFBUSxRQUFRLFFBQVEsWUFBWTtBQUFBLEVBQy9DO0FBRUEsUUFBTSxpQkFDSixPQUFPLFdBQVcsa0JBQWtCO0FBQ3RDLFFBQU0sZ0JBQ0osT0FBTyxXQUFXLHVCQUF1QjtBQUMzQyxRQUFNLDBCQUNKLE9BQU8sV0FBVywyQkFBMkI7QUFFL0MsUUFBTSxNQUFNLEtBQUssSUFBSTtBQUNyQixRQUFNLGVBQWUsT0FBTyxrQkFBa0IsT0FBTyxhQUFhO0FBQ2xFLFFBQU0sZUFBZSxNQUFNO0FBQzNCLFFBQU0sMEJBQTBCLGVBQWU7QUFFL0MsTUFBSSw2QkFBNkI7QUFDakMsTUFBSTtBQUNGLFVBQU0sVUFBVSxNQUFNLGlCQUFpQixJQUFJO0FBQUEsTUFDekMsV0FBVztBQUFBLE1BQ1gsR0FBRyxtQkFBbUI7QUFBQSxJQUN4QixDQUFDO0FBQ0QsUUFBSSxRQUFRLFVBQVUseUJBQXlCO0FBQzdDLG1DQUE2QjtBQUFBLElBQy9CO0FBQUEsRUFDRixRQUFRO0FBQ04sV0FBTyxFQUFFLFFBQVEsUUFBUSxRQUFRLFlBQVk7QUFBQSxFQUMvQztBQUVBLE1BQUksMkJBQTJCLDRCQUE0QjtBQUN6RCxRQUFJO0FBQ0YsWUFBTSxVQUFVLE1BQU0saUJBQWlCLElBQUk7QUFBQSxRQUN6QyxXQUFXO0FBQUEsUUFDWCxHQUFHLG1CQUFtQjtBQUFBLE1BQ3hCLENBQUM7QUFDRCxZQUFNLFdBQVcsTUFBTSxRQUFRLFNBQVM7QUFDeEMsWUFBTSxRQUFRLFFBQVEsSUFBSTtBQUFBLFFBQ3hCLEdBQUc7QUFBQSxRQUNILGlCQUFpQjtBQUFBLFFBQ2pCLGlCQUFpQjtBQUFBLFFBQ2pCLGtCQUFrQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFdBQVc7QUFBQSxVQUNYLFlBQVksU0FBUztBQUFBLFFBQ3ZCO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSCxTQUFTLEdBQUc7QUFDVixhQUFPLGFBQWEsUUFBUSxJQUFJLElBQUksTUFBTSxPQUFPLENBQUMsQ0FBQztBQUFBLElBQ3JEO0FBQ0EsV0FBTztBQUFBLE1BQ0wsUUFBUTtBQUFBLE1BQ1IsUUFBUSwwQkFBMEIsU0FBUztBQUFBLElBQzdDO0FBQUEsRUFDRjtBQUVBLFNBQU8sRUFBRSxRQUFRLFlBQVksWUFBWSxlQUFlO0FBQzFEOzs7QUR0R0EsSUFBTSxrQkFBa0IsSUFBSSxLQUFLO0FBRWpDLGVBQXNCLHlCQUF5QjtBQUFBLEVBQzdDO0FBQ0YsR0FFRztBQUNEO0FBRUEsTUFBSSxhQUFhO0FBRWpCLFNBQU8sTUFBTTtBQUNYLGNBQU0sdUJBQU0sVUFBVTtBQUV0QixVQUFNLFNBQVMsTUFBTSxxQkFBcUIsS0FBSztBQUUvQyxRQUFJLGtCQUFrQixTQUFTLE9BQU8sV0FBVyxRQUFRO0FBQ3ZEO0FBQUEsSUFDRjtBQUVBLGlCQUFhLE9BQU87QUFBQSxFQUN0QjtBQUNGOyIsCiAgIm5hbWVzIjogWyJnZXRTdG9yYWdlIl0KfQo=
|