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.
Files changed (57) hide show
  1. package/README.md +13 -2
  2. package/dist/agent-workflow.d.mts +11 -3
  3. package/dist/agent-workflow.d.ts +11 -3
  4. package/dist/agent-workflow.js +1921 -1144
  5. package/dist/agent-workflow.mjs +7 -3
  6. package/dist/chunk-3ODWQVIA.mjs +12 -0
  7. package/dist/chunk-64THY7Y7.mjs +155 -0
  8. package/dist/chunk-GSRJYPWF.mjs +284 -0
  9. package/dist/chunk-HJGPUEFC.mjs +42 -0
  10. package/dist/chunk-JCPQQWIK.mjs +2057 -0
  11. package/dist/chunk-JEE2FQ4O.mjs +844 -0
  12. package/dist/chunk-T7PMZLOX.mjs +79 -0
  13. package/dist/chunk-TQRCSTCF.mjs +103 -0
  14. package/dist/chunk-VBLZWXVE.mjs +318 -0
  15. package/dist/{types-DPXFq_r6.d.ts → client-6g79J0s3.d.mts} +866 -31
  16. package/dist/{types-DPXFq_r6.d.mts → client-6g79J0s3.d.ts} +866 -31
  17. package/dist/client-SREKHM6I.mjs +15 -0
  18. package/dist/client.d.mts +37 -0
  19. package/dist/client.d.ts +37 -0
  20. package/dist/client.js +58 -0
  21. package/dist/client.mjs +30 -0
  22. package/dist/{client-HUG4HT5L.mjs → handler-36FM5H35.mjs} +4 -5
  23. package/dist/index.d.mts +3 -4
  24. package/dist/index.d.ts +3 -4
  25. package/dist/index.js +3102 -1438
  26. package/dist/index.mjs +720 -147
  27. package/dist/lifecycle-workflow.d.mts +3 -10
  28. package/dist/lifecycle-workflow.d.ts +3 -10
  29. package/dist/lifecycle-workflow.js +170 -1246
  30. package/dist/lifecycle-workflow.mjs +5 -41
  31. package/dist/local-fs-handlers-P4WGW3QY.mjs +235 -0
  32. package/dist/next/loader.d.mts +14 -0
  33. package/dist/next/loader.d.ts +14 -0
  34. package/dist/next/loader.js +206 -0
  35. package/dist/next/loader.mjs +103 -0
  36. package/dist/next.d.mts +34 -0
  37. package/dist/next.d.ts +34 -0
  38. package/dist/next.js +329 -0
  39. package/dist/next.mjs +224 -0
  40. package/dist/process-manager-JAKAXROL.mjs +10 -0
  41. package/dist/{client-4Y3UPWFR.mjs → sandbox-QAPGBVYM.mjs} +4 -3
  42. package/dist/storage-Q376OZH3.mjs +20 -0
  43. package/dist/{vercel-2CFDMEHB.mjs → vercel-LLXAHKVJ.mjs} +3 -1
  44. package/dist/vercel-sdk-VHKEX2GQ.mjs +8 -0
  45. package/package.json +32 -19
  46. package/dist/chunk-24DJSI7C.mjs +0 -374
  47. package/dist/chunk-4RGMKC2M.mjs +0 -755
  48. package/dist/chunk-6ICYKNCC.mjs +0 -284
  49. package/dist/chunk-PGYYQ3WZ.mjs +0 -1088
  50. package/dist/client-BBpD9kKL.d.ts +0 -193
  51. package/dist/client-BGJViybU.d.mts +0 -193
  52. package/dist/lifecycle-workflow-steps-HHN46ZAD.mjs +0 -20
  53. package/dist/local-BYPFRMLZ.mjs +0 -282
  54. package/dist/process-manager-H2HF6G4G.mjs +0 -153
  55. package/dist/sandbox-BFA4ECEQ.mjs +0 -10
  56. package/dist/storage-2U2QFNWI.mjs +0 -27
  57. /package/dist/{chunk-36X6L7SK.mjs → chunk-TAXLUVIC.mjs} +0 -0
@@ -1,374 +0,0 @@
1
- // src/errors.ts
2
- import * as errore from "errore";
3
- var SessionNotFoundError = class extends errore.createTaggedError({
4
- name: "SessionNotFoundError",
5
- message: "Session $id not found"
6
- }) {
7
- };
8
- var SessionError = class extends errore.createTaggedError({
9
- name: "SessionError",
10
- message: "Session $id failed: $reason"
11
- }) {
12
- };
13
- var SandboxNotFoundError = class extends errore.createTaggedError({
14
- name: "SandboxNotFoundError",
15
- message: "Sandbox $id not found"
16
- }) {
17
- };
18
- var StorageError = class extends errore.createTaggedError({
19
- name: "StorageError",
20
- message: "$reason"
21
- }) {
22
- };
23
- var SandboxError = class extends errore.createTaggedError({
24
- name: "SandboxError",
25
- message: "$reason"
26
- }) {
27
- };
28
- var MessageNotFoundError = class extends errore.createTaggedError({
29
- name: "MessageNotFoundError",
30
- message: "Message $id not found"
31
- }) {
32
- };
33
-
34
- // src/storage/client.ts
35
- function getStorageClient({ url, headers }) {
36
- async function rpc(method, params) {
37
- const res = await fetch(url, {
38
- method: "POST",
39
- headers: { "Content-Type": "application/json", ...headers },
40
- body: JSON.stringify({ method, params })
41
- });
42
- if (!res.ok) {
43
- throw new StorageError({
44
- reason: `HTTP ${res.status}: ${res.statusText}`
45
- });
46
- }
47
- const json = await res.json();
48
- if ("error" in json) {
49
- throw new StorageError({ reason: json.error.message });
50
- }
51
- return json.result;
52
- }
53
- return {
54
- session: {
55
- get: async (id) => {
56
- try {
57
- const result = await rpc("session.get", { id });
58
- if (result === null) {
59
- return new SessionNotFoundError({ id });
60
- }
61
- return result;
62
- } catch (e) {
63
- if (e instanceof StorageError) {
64
- return e;
65
- }
66
- return new StorageError({ reason: String(e), cause: e });
67
- }
68
- },
69
- set: async (session) => {
70
- try {
71
- return await rpc("session.set", session);
72
- } catch (e) {
73
- if (e instanceof StorageError) {
74
- return e;
75
- }
76
- return new StorageError({ reason: String(e), cause: e });
77
- }
78
- },
79
- list: async (opts) => {
80
- try {
81
- return await rpc("session.list", {
82
- tags: opts?.tags,
83
- order: opts?.order,
84
- cursor: opts?.cursor,
85
- limit: opts?.limit
86
- });
87
- } catch (e) {
88
- if (e instanceof StorageError) {
89
- return e;
90
- }
91
- return new StorageError({ reason: String(e), cause: e });
92
- }
93
- },
94
- tag: {
95
- set: async ({ sessionId, tags }) => {
96
- try {
97
- return await rpc("session.tag.set", { sessionId, tags });
98
- } catch (e) {
99
- if (e instanceof StorageError) {
100
- return e;
101
- }
102
- return new StorageError({ reason: String(e), cause: e });
103
- }
104
- }
105
- }
106
- },
107
- message: {
108
- list: async (sessionId, opts) => {
109
- try {
110
- return await rpc("message.list", {
111
- sessionId,
112
- cursor: opts?.cursor,
113
- limit: opts?.limit
114
- });
115
- } catch (e) {
116
- if (e instanceof StorageError) {
117
- return e;
118
- }
119
- return new StorageError({ reason: String(e), cause: e });
120
- }
121
- },
122
- get: async (id) => {
123
- try {
124
- const result = await rpc("message.get", { id });
125
- if (result === null) {
126
- return new MessageNotFoundError({ id });
127
- }
128
- return result;
129
- } catch (e) {
130
- if (e instanceof StorageError) {
131
- return e;
132
- }
133
- return new StorageError({ reason: String(e), cause: e });
134
- }
135
- },
136
- set: async (message) => {
137
- try {
138
- return await rpc("message.set", message);
139
- } catch (e) {
140
- if (e instanceof StorageError) {
141
- return e;
142
- }
143
- return new StorageError({ reason: String(e), cause: e });
144
- }
145
- }
146
- },
147
- part: {
148
- listByMessage: async (messageId, opts) => {
149
- try {
150
- const result = await rpc("part.listByMessage", {
151
- messageId,
152
- cursor: opts?.cursor,
153
- limit: opts?.limit
154
- });
155
- return result;
156
- } catch (e) {
157
- if (e instanceof StorageError) {
158
- return e;
159
- }
160
- return new StorageError({ reason: String(e), cause: e });
161
- }
162
- },
163
- listBySession: async (sessionId, opts) => {
164
- try {
165
- const result = await rpc("part.listBySession", {
166
- sessionId,
167
- cursor: opts?.cursor,
168
- limit: opts?.limit
169
- });
170
- return result;
171
- } catch (e) {
172
- if (e instanceof StorageError) {
173
- return e;
174
- }
175
- return new StorageError({ reason: String(e), cause: e });
176
- }
177
- },
178
- set: async (part) => {
179
- try {
180
- return await rpc("part.set", part);
181
- } catch (e) {
182
- if (e instanceof StorageError) {
183
- return e;
184
- }
185
- return new StorageError({ reason: String(e), cause: e });
186
- }
187
- }
188
- },
189
- sandbox: {
190
- get: async (key) => {
191
- try {
192
- const result = await rpc("sandbox.get", { key });
193
- if (result === null) {
194
- return new SandboxNotFoundError({ id: key });
195
- }
196
- return result;
197
- } catch (e) {
198
- if (e instanceof StorageError) {
199
- return e;
200
- }
201
- return new StorageError({ reason: String(e), cause: e });
202
- }
203
- },
204
- getBySession: async (sessionId) => {
205
- try {
206
- const result = await rpc("sandbox.getBySession", { sessionId });
207
- if (result === null) {
208
- return new SandboxNotFoundError({ id: sessionId });
209
- }
210
- return result;
211
- } catch (e) {
212
- if (e instanceof StorageError) {
213
- return e;
214
- }
215
- return new StorageError({ reason: String(e), cause: e });
216
- }
217
- },
218
- set: async (record) => {
219
- try {
220
- await rpc("sandbox.set", record);
221
- return record;
222
- } catch (e) {
223
- if (e instanceof StorageError) {
224
- return e;
225
- }
226
- return new StorageError({ reason: String(e), cause: e });
227
- }
228
- },
229
- list: async (opts) => {
230
- try {
231
- return await rpc("sandbox.list", {
232
- tags: opts?.tags,
233
- order: opts?.order,
234
- cursor: opts?.cursor,
235
- limit: opts?.limit
236
- });
237
- } catch (e) {
238
- if (e instanceof StorageError) {
239
- return e;
240
- }
241
- return new StorageError({ reason: String(e), cause: e });
242
- }
243
- },
244
- tag: {
245
- set: async ({ sandboxId, tags }) => {
246
- try {
247
- return await rpc("sandbox.tag.set", { sandboxId, tags });
248
- } catch (e) {
249
- if (e instanceof StorageError) {
250
- return e;
251
- }
252
- return new StorageError({ reason: String(e), cause: e });
253
- }
254
- }
255
- }
256
- },
257
- command: {
258
- get: async (id) => {
259
- try {
260
- return await rpc("command.get", { id });
261
- } catch (e) {
262
- if (e instanceof StorageError) {
263
- return e;
264
- }
265
- return new StorageError({ reason: String(e), cause: e });
266
- }
267
- },
268
- set: async (command) => {
269
- try {
270
- return await rpc("command.set", command);
271
- } catch (e) {
272
- if (e instanceof StorageError) {
273
- return e;
274
- }
275
- return new StorageError({ reason: String(e), cause: e });
276
- }
277
- },
278
- list: async (sessionId, opts) => {
279
- try {
280
- const result = await rpc("command.list", {
281
- sessionId,
282
- includeFinished: opts?.includeFinished,
283
- cursor: opts?.cursor,
284
- limit: opts?.limit
285
- });
286
- return result;
287
- } catch (e) {
288
- if (e instanceof StorageError) {
289
- return e;
290
- }
291
- return new StorageError({ reason: String(e), cause: e });
292
- }
293
- }
294
- }
295
- };
296
- }
297
- async function resolveStorageUrl(config) {
298
- switch (config.type) {
299
- case "local": {
300
- const { startLocalStorage } = await import("./local-BYPFRMLZ.mjs");
301
- return { url: await startLocalStorage({ path: config.path }) };
302
- }
303
- case "vercel": {
304
- const { getVercelStorageConfig } = await import("./vercel-2CFDMEHB.mjs");
305
- return getVercelStorageConfig();
306
- }
307
- case "custom": {
308
- return { url: config.url, headers: config.headers };
309
- }
310
- default: {
311
- config;
312
- throw new Error(
313
- `Unknown storage type: ${config.type}`
314
- );
315
- }
316
- }
317
- }
318
- function getStorage(storageConfig) {
319
- let clientPromise = null;
320
- const getClient = () => {
321
- if (!clientPromise) {
322
- clientPromise = resolveStorageUrl(storageConfig).then(
323
- (resolved) => getStorageClient(resolved)
324
- );
325
- }
326
- return clientPromise;
327
- };
328
- return {
329
- session: {
330
- get: async (id) => (await getClient()).session.get(id),
331
- set: async (session) => (await getClient()).session.set(session),
332
- list: async (opts) => (await getClient()).session.list(opts),
333
- tag: {
334
- set: async (opts) => (await getClient()).session.tag.set(opts)
335
- }
336
- },
337
- message: {
338
- list: async (sessionId, opts) => (await getClient()).message.list(sessionId, opts),
339
- get: async (id) => (await getClient()).message.get(id),
340
- set: async (message) => (await getClient()).message.set(message)
341
- },
342
- part: {
343
- listByMessage: async (messageId, opts) => (await getClient()).part.listByMessage(messageId, opts),
344
- listBySession: async (sessionId, opts) => (await getClient()).part.listBySession(sessionId, opts),
345
- set: async (part) => (await getClient()).part.set(part)
346
- },
347
- sandbox: {
348
- get: async (key) => (await getClient()).sandbox.get(key),
349
- set: async (opts) => (await getClient()).sandbox.set(opts),
350
- getBySession: async (sessionId) => (await getClient()).sandbox.getBySession(sessionId),
351
- list: async (opts) => (await getClient()).sandbox.list(opts),
352
- tag: {
353
- set: async (opts) => (await getClient()).sandbox.tag.set(opts)
354
- }
355
- },
356
- command: {
357
- get: async (id) => (await getClient()).command.get(id),
358
- set: async (command) => (await getClient()).command.set(command),
359
- list: async (sessionId, opts) => (await getClient()).command.list(sessionId, opts)
360
- }
361
- };
362
- }
363
-
364
- export {
365
- SessionNotFoundError,
366
- SessionError,
367
- SandboxNotFoundError,
368
- StorageError,
369
- SandboxError,
370
- MessageNotFoundError,
371
- getStorageClient,
372
- getStorage
373
- };
374
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2Vycm9ycy50cyIsICIuLi9zcmMvc3RvcmFnZS9jbGllbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCAqIGFzIGVycm9yZSBmcm9tIFwiZXJyb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uTm90Rm91bmRFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2Vzc2lvbk5vdEZvdW5kRXJyb3JcIixcbiAgbWVzc2FnZTogXCJTZXNzaW9uICRpZCBub3QgZm91bmRcIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNlc3Npb25FcnJvclwiLFxuICBtZXNzYWdlOiBcIlNlc3Npb24gJGlkIGZhaWxlZDogJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFNhbmRib3hOb3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTYW5kYm94Tm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIlNhbmRib3ggJGlkIG5vdCBmb3VuZFwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU3RvcmFnZUVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFNhbmRib3hFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2FuZGJveEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VOb3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJNZXNzYWdlTm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIk1lc3NhZ2UgJGlkIG5vdCBmb3VuZFwiLFxufSkge31cbiIsICJpbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQge1xuICBNZXNzYWdlTm90Rm91bmRFcnJvcixcbiAgU2FuZGJveE5vdEZvdW5kRXJyb3IsXG4gIFNlc3Npb25Ob3RGb3VuZEVycm9yLFxuICBTdG9yYWdlRXJyb3IsXG59IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgU3RvcmFnZU1ldGhvZHMgfSBmcm9tIFwiLi9ycGNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29tbWFuZCxcbiAgTGlzdFJlc3VsdCxcbiAgUGFydCxcbiAgUmVzb2x2ZWRTdG9yYWdlLFxuICBTdG9yYWdlLFxuICBTdG9yYWdlQ29uZmlnLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG50eXBlIFJwY1Jlc3BvbnNlPFQ+ID1cbiAgfCB7IHJlc3VsdDogVCB9XG4gIHwgeyBlcnJvcjogeyBjb2RlOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9IH07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlQ2xpZW50KHsgdXJsLCBoZWFkZXJzIH06IFJlc29sdmVkU3RvcmFnZSk6IFN0b3JhZ2Uge1xuICBhc3luYyBmdW5jdGlvbiBycGM8TSBleHRlbmRzIGtleW9mIFN0b3JhZ2VNZXRob2RzPihcbiAgICBtZXRob2Q6IE0sXG4gICAgcGFyYW1zOiB6LmluZmVyPFN0b3JhZ2VNZXRob2RzW01dW1wicGFyYW1zXCJdPlxuICApOiBQcm9taXNlPHouaW5mZXI8U3RvcmFnZU1ldGhvZHNbTV1bXCJyZXN1bHRcIl0+PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiwgLi4uaGVhZGVycyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBtZXRob2QsIHBhcmFtcyB9KSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgU3RvcmFnZUVycm9yKHtcbiAgICAgICAgcmVhc29uOiBgSFRUUCAke3Jlcy5zdGF0dXN9OiAke3Jlcy5zdGF0dXNUZXh0fWAsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIFJwY1Jlc3BvbnNlPFxuICAgICAgei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tNXVtcInJlc3VsdFwiXT5cbiAgICA+O1xuXG4gICAgaWYgKFwiZXJyb3JcIiBpbiBqc29uKSB7XG4gICAgICB0aHJvdyBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBqc29uLmVycm9yLm1lc3NhZ2UgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGpzb24ucmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzZXNzaW9uOiB7XG4gICAgICBnZXQ6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcInNlc3Npb24uZ2V0XCIsIHsgaWQgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uTm90Rm91bmRFcnJvcih7IGlkIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKHNlc3Npb24pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi5zZXRcIiwgc2Vzc2lvbik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGlzdDogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi5saXN0XCIsIHtcbiAgICAgICAgICAgIHRhZ3M6IG9wdHM/LnRhZ3MsXG4gICAgICAgICAgICBvcmRlcjogb3B0cz8ub3JkZXIsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0YWc6IHtcbiAgICAgICAgc2V0OiBhc3luYyAoeyBzZXNzaW9uSWQsIHRhZ3MgfSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi50YWcuc2V0XCIsIHsgc2Vzc2lvbklkLCB0YWdzIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG1lc3NhZ2U6IHtcbiAgICAgIGxpc3Q6IGFzeW5jIChzZXNzaW9uSWQsIG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwibWVzc2FnZS5saXN0XCIsIHtcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdldDogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwibWVzc2FnZS5nZXRcIiwgeyBpZCB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VOb3RGb3VuZEVycm9yKHsgaWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJtZXNzYWdlLnNldFwiLCBtZXNzYWdlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBwYXJ0OiB7XG4gICAgICBsaXN0QnlNZXNzYWdlOiBhc3luYyAobWVzc2FnZUlkLCBvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwicGFydC5saXN0QnlNZXNzYWdlXCIsIHtcbiAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgTGlzdFJlc3VsdDxQYXJ0PjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsaXN0QnlTZXNzaW9uOiBhc3luYyAoc2Vzc2lvbklkLCBvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwicGFydC5saXN0QnlTZXNzaW9uXCIsIHtcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgTGlzdFJlc3VsdDxQYXJ0PjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChwYXJ0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJwYXJ0LnNldFwiLCBwYXJ0KSkgYXMgUGFydDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBzYW5kYm94OiB7XG4gICAgICBnZXQ6IGFzeW5jIChrZXkpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJzYW5kYm94LmdldFwiLCB7IGtleSB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hOb3RGb3VuZEVycm9yKHsgaWQ6IGtleSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXRCeVNlc3Npb246IGFzeW5jIChzZXNzaW9uSWQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJzYW5kYm94LmdldEJ5U2Vzc2lvblwiLCB7IHNlc3Npb25JZCB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hOb3RGb3VuZEVycm9yKHsgaWQ6IHNlc3Npb25JZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChyZWNvcmQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBycGMoXCJzYW5kYm94LnNldFwiLCByZWNvcmQpO1xuICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGlzdDogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2FuZGJveC5saXN0XCIsIHtcbiAgICAgICAgICAgIHRhZ3M6IG9wdHM/LnRhZ3MsXG4gICAgICAgICAgICBvcmRlcjogb3B0cz8ub3JkZXIsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0YWc6IHtcbiAgICAgICAgc2V0OiBhc3luYyAoeyBzYW5kYm94SWQsIHRhZ3MgfSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2FuZGJveC50YWcuc2V0XCIsIHsgc2FuZGJveElkLCB0YWdzIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbW1hbmQ6IHtcbiAgICAgIGdldDogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJjb21tYW5kLmdldFwiLCB7IGlkIH0pKSBhcyBDb21tYW5kIHwgbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChjb21tYW5kKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJjb21tYW5kLnNldFwiLCBjb21tYW5kKSkgYXMgQ29tbWFuZDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsaXN0OiBhc3luYyAoc2Vzc2lvbklkLCBvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwiY29tbWFuZC5saXN0XCIsIHtcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIGluY2x1ZGVGaW5pc2hlZDogb3B0cz8uaW5jbHVkZUZpbmlzaGVkLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBMaXN0UmVzdWx0PENvbW1hbmQ+O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU3RvcmFnZVVybChcbiAgY29uZmlnOiBTdG9yYWdlQ29uZmlnXG4pOiBQcm9taXNlPFJlc29sdmVkU3RvcmFnZT4ge1xuICBzd2l0Y2ggKGNvbmZpZy50eXBlKSB7XG4gICAgY2FzZSBcImxvY2FsXCI6IHtcbiAgICAgIGNvbnN0IHsgc3RhcnRMb2NhbFN0b3JhZ2UgfSA9IGF3YWl0IGltcG9ydChcIi4vYmluZGluZ3MvbG9jYWxcIik7XG4gICAgICByZXR1cm4geyB1cmw6IGF3YWl0IHN0YXJ0TG9jYWxTdG9yYWdlKHsgcGF0aDogY29uZmlnLnBhdGggfSkgfTtcbiAgICB9XG4gICAgY2FzZSBcInZlcmNlbFwiOiB7XG4gICAgICBjb25zdCB7IGdldFZlcmNlbFN0b3JhZ2VDb25maWcgfSA9IGF3YWl0IGltcG9ydChcIi4vYmluZGluZ3MvdmVyY2VsXCIpO1xuICAgICAgcmV0dXJuIGdldFZlcmNlbFN0b3JhZ2VDb25maWcoKTtcbiAgICB9XG4gICAgY2FzZSBcImN1c3RvbVwiOiB7XG4gICAgICByZXR1cm4geyB1cmw6IGNvbmZpZy51cmwsIGhlYWRlcnM6IGNvbmZpZy5oZWFkZXJzIH07XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbmZpZyBzYXRpc2ZpZXMgbmV2ZXI7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbmtub3duIHN0b3JhZ2UgdHlwZTogJHsoY29uZmlnIGFzIHsgdHlwZTogc3RyaW5nIH0pLnR5cGV9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0b3JhZ2Uoc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZyk6IFN0b3JhZ2Uge1xuICBsZXQgY2xpZW50UHJvbWlzZTogUHJvbWlzZTxTdG9yYWdlPiB8IG51bGwgPSBudWxsO1xuICBjb25zdCBnZXRDbGllbnQgPSAoKSA9PiB7XG4gICAgaWYgKCFjbGllbnRQcm9taXNlKSB7XG4gICAgICBjbGllbnRQcm9taXNlID0gcmVzb2x2ZVN0b3JhZ2VVcmwoc3RvcmFnZUNvbmZpZykudGhlbigocmVzb2x2ZWQpID0+XG4gICAgICAgIGdldFN0b3JhZ2VDbGllbnQocmVzb2x2ZWQpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY2xpZW50UHJvbWlzZTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHNlc3Npb246IHtcbiAgICAgIGdldDogYXN5bmMgKGlkKSA9PiAoYXdhaXQgZ2V0Q2xpZW50KCkpLnNlc3Npb24uZ2V0KGlkKSxcbiAgICAgIHNldDogYXN5bmMgKHNlc3Npb24pID0+IChhd2FpdCBnZXRDbGllbnQoKSkuc2Vzc2lvbi5zZXQoc2Vzc2lvbiksXG4gICAgICBsaXN0OiBhc3luYyAob3B0cykgPT4gKGF3YWl0IGdldENsaWVudCgpKS5zZXNzaW9uLmxpc3Qob3B0cyksXG4gICAgICB0YWc6IHtcbiAgICAgICAgc2V0OiBhc3luYyAob3B0cykgPT4gKGF3YWl0IGdldENsaWVudCgpKS5zZXNzaW9uLnRhZy5zZXQob3B0cyksXG4gICAgICB9LFxuICAgIH0sXG4gICAgbWVzc2FnZToge1xuICAgICAgbGlzdDogYXN5bmMgKHNlc3Npb25JZCwgb3B0cykgPT5cbiAgICAgICAgKGF3YWl0IGdldENsaWVudCgpKS5tZXNzYWdlLmxpc3Qoc2Vzc2lvbklkLCBvcHRzKSxcbiAgICAgIGdldDogYXN5bmMgKGlkKSA9PiAoYXdhaXQgZ2V0Q2xpZW50KCkpLm1lc3NhZ2UuZ2V0KGlkKSxcbiAgICAgIHNldDogYXN5bmMgKG1lc3NhZ2UpID0+IChhd2FpdCBnZXRDbGllbnQoKSkubWVzc2FnZS5zZXQobWVzc2FnZSksXG4gICAgfSxcbiAgICBwYXJ0OiB7XG4gICAgICBsaXN0QnlNZXNzYWdlOiBhc3luYyAobWVzc2FnZUlkLCBvcHRzKSA9PlxuICAgICAgICAoYXdhaXQgZ2V0Q2xpZW50KCkpLnBhcnQubGlzdEJ5TWVzc2FnZShtZXNzYWdlSWQsIG9wdHMpLFxuICAgICAgbGlzdEJ5U2Vzc2lvbjogYXN5bmMgKHNlc3Npb25JZCwgb3B0cykgPT5cbiAgICAgICAgKGF3YWl0IGdldENsaWVudCgpKS5wYXJ0Lmxpc3RCeVNlc3Npb24oc2Vzc2lvbklkLCBvcHRzKSxcbiAgICAgIHNldDogYXN5bmMgKHBhcnQpID0+IChhd2FpdCBnZXRDbGllbnQoKSkucGFydC5zZXQocGFydCksXG4gICAgfSxcbiAgICBzYW5kYm94OiB7XG4gICAgICBnZXQ6IGFzeW5jIChrZXkpID0+IChhd2FpdCBnZXRDbGllbnQoKSkuc2FuZGJveC5nZXQoa2V5KSxcbiAgICAgIHNldDogYXN5bmMgKG9wdHMpID0+IChhd2FpdCBnZXRDbGllbnQoKSkuc2FuZGJveC5zZXQob3B0cyksXG4gICAgICBnZXRCeVNlc3Npb246IGFzeW5jIChzZXNzaW9uSWQpID0+XG4gICAgICAgIChhd2FpdCBnZXRDbGllbnQoKSkuc2FuZGJveC5nZXRCeVNlc3Npb24oc2Vzc2lvbklkKSxcbiAgICAgIGxpc3Q6IGFzeW5jIChvcHRzKSA9PiAoYXdhaXQgZ2V0Q2xpZW50KCkpLnNhbmRib3gubGlzdChvcHRzKSxcbiAgICAgIHRhZzoge1xuICAgICAgICBzZXQ6IGFzeW5jIChvcHRzKSA9PiAoYXdhaXQgZ2V0Q2xpZW50KCkpLnNhbmRib3gudGFnLnNldChvcHRzKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb21tYW5kOiB7XG4gICAgICBnZXQ6IGFzeW5jIChpZCkgPT4gKGF3YWl0IGdldENsaWVudCgpKS5jb21tYW5kLmdldChpZCksXG4gICAgICBzZXQ6IGFzeW5jIChjb21tYW5kKSA9PiAoYXdhaXQgZ2V0Q2xpZW50KCkpLmNvbW1hbmQuc2V0KGNvbW1hbmQpLFxuICAgICAgbGlzdDogYXN5bmMgKHNlc3Npb25JZCwgb3B0cykgPT5cbiAgICAgICAgKGF3YWl0IGdldENsaWVudCgpKS5jb21tYW5kLmxpc3Qoc2Vzc2lvbklkLCBvcHRzKSxcbiAgICB9LFxuICB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFlBQVksWUFBWTtBQUVqQixJQUFNLHVCQUFOLGNBQTBDLHlCQUFrQjtBQUFBLEVBQ2pFLE1BQU07QUFBQSxFQUNOLFNBQVM7QUFDWCxDQUFDLEVBQUU7QUFBQztBQUVHLElBQU0sZUFBTixjQUFrQyx5QkFBa0I7QUFBQSxFQUN6RCxNQUFNO0FBQUEsRUFDTixTQUFTO0FBQ1gsQ0FBQyxFQUFFO0FBQUM7QUFFRyxJQUFNLHVCQUFOLGNBQTBDLHlCQUFrQjtBQUFBLEVBQ2pFLE1BQU07QUFBQSxFQUNOLFNBQVM7QUFDWCxDQUFDLEVBQUU7QUFBQztBQUVHLElBQU0sZUFBTixjQUFrQyx5QkFBa0I7QUFBQSxFQUN6RCxNQUFNO0FBQUEsRUFDTixTQUFTO0FBQ1gsQ0FBQyxFQUFFO0FBQUM7QUFFRyxJQUFNLGVBQU4sY0FBa0MseUJBQWtCO0FBQUEsRUFDekQsTUFBTTtBQUFBLEVBQ04sU0FBUztBQUNYLENBQUMsRUFBRTtBQUFDO0FBRUcsSUFBTSx1QkFBTixjQUEwQyx5QkFBa0I7QUFBQSxFQUNqRSxNQUFNO0FBQUEsRUFDTixTQUFTO0FBQ1gsQ0FBQyxFQUFFO0FBQUM7OztBQ1RHLFNBQVMs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QUssSUFBSTtBQUFBLE1BQzNELEtBQUs7QUFBQSxRQUNILEtBQUssT0FBTyxVQUFVLE1BQU0sVUFBVSxHQUFHLFFBQVEsSUFBSSxJQUFJLElBQUk7QUFBQSxNQUMvRDtBQUFBLElBQ0Y7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLE1BQU0sT0FBTyxXQUFXLFVBQ3JCLE1BQU0sVUFBVSxHQUFHLFFBQVEsS0FBSyxXQUFXLElBQUk7QUFBQSxNQUNsRCxLQUFLLE9BQU8sUUFBUSxNQUFNLFVBQVUsR0FBRyxRQUFRLElBQUksRUFBRTtBQUFBLE1BQ3JELEtBQUssT0FBTyxhQUFhLE1BQU0sVUFBVSxHQUFHLFFBQVEsSUFBSSxPQUFPO0FBQUEsSUFDakU7QUFBQSxJQUNBLE1BQU07QUFBQSxNQUNKLGVBQWUsT0FBTyxXQUFXLFVBQzlCLE1BQU0sVUFBVSxHQUFHLEtBQUssY0FBYyxXQUFXLElBQUk7QUFBQSxNQUN4RCxlQUFlLE9BQU8sV0FBVyxVQUM5QixNQUFNLFVBQVUsR0FBRyxLQUFLLGNBQWMsV0FBVyxJQUFJO0FBQUEsTUFDeEQsS0FBSyxPQUFPLFVBQVUsTUFBTSxVQUFVLEdBQUcsS0FBSyxJQUFJLElBQUk7QUFBQSxJQUN4RDtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsS0FBSyxPQUFPLFNBQVMsTUFBTSxVQUFVLEdBQUcsUUFBUSxJQUFJLEdBQUc7QUFBQSxNQUN2RCxLQUFLLE9BQU8sVUFBVSxNQUFNLFVBQVUsR0FBRyxRQUFRLElBQUksSUFBSTtBQUFBLE1BQ3pELGNBQWMsT0FBTyxlQUNsQixNQUFNLFVBQVUsR0FBRyxRQUFRLGFBQWEsU0FBUztBQUFBLE1BQ3BELE1BQU0sT0FBTyxVQUFVLE1BQU0sVUFBVSxHQUFHLFFBQVEsS0FBSyxJQUFJO0FBQUEsTUFDM0QsS0FBSztBQUFBLFFBQ0gsS0FBSyxPQUFPLFVBQVUsTUFBTSxVQUFVLEdBQUcsUUFBUSxJQUFJLElBQUksSUFBSTtBQUFBLE1BQy9EO0FBQUEsSUFDRjtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsS0FBSyxPQUFPLFFBQVEsTUFBTSxVQUFVLEdBQUcsUUFBUSxJQUFJLEVBQUU7QUFBQSxNQUNyRCxLQUFLLE9BQU8sYUFBYSxNQUFNLFVBQVUsR0FBRyxRQUFRLElBQUksT0FBTztBQUFBLE1BQy9ELE1BQU0sT0FBTyxXQUFXLFVBQ3JCLE1BQU0sVUFBVSxHQUFHLFFBQVEsS0FBSyxXQUFXLElBQUk7QUFBQSxJQUNwRDtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K