@aitos/core 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/acs.d.ts +108 -0
- package/dist/acs.js +719 -0
- package/dist/atoms/calculation.d.ts +7 -0
- package/dist/atoms/calculation.js +95 -0
- package/dist/atoms/control.d.ts +11 -0
- package/dist/atoms/control.js +269 -0
- package/dist/atoms/judgment.d.ts +14 -0
- package/dist/atoms/judgment.js +193 -0
- package/dist/atoms/manipulation.d.ts +22 -0
- package/dist/atoms/manipulation.js +371 -0
- package/dist/atoms/state.d.ts +3 -0
- package/dist/atoms/state.js +35 -0
- package/dist/atoms/telemetry.d.ts +6 -0
- package/dist/atoms/telemetry.js +135 -0
- package/dist/atoms/time.d.ts +5 -0
- package/dist/atoms/time.js +71 -0
- package/dist/atoms/tool-calls.d.ts +2 -0
- package/dist/atoms/tool-calls.js +106 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +52 -0
- package/dist/runtime.d.ts +50 -0
- package/dist/runtime.js +408 -0
- package/dist/types.d.ts +123 -0
- package/dist/types.js +3 -0
- package/package.json +21 -7
package/dist/acs.js
ADDED
|
@@ -0,0 +1,719 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AITOS Compact Syntax (ACS)
|
|
4
|
+
*
|
|
5
|
+
* ACS is a compact representation of Graph JSON, designed for:
|
|
6
|
+
* - AI generation (10-20x more compact than JSON)
|
|
7
|
+
* - Human readability (for auditing AI output)
|
|
8
|
+
* - Unambiguous compilation to/from Graph JSON
|
|
9
|
+
*
|
|
10
|
+
* Syntax:
|
|
11
|
+
* graph <name> {
|
|
12
|
+
* [mode: kernel|user]
|
|
13
|
+
* [in: <type> | <name>: <type>, ...]
|
|
14
|
+
* [out: <type>]
|
|
15
|
+
*
|
|
16
|
+
* let <nodeId> = <atom>(<param>: <value>, ...)
|
|
17
|
+
* if <refNodeId> {
|
|
18
|
+
* <nodes...>
|
|
19
|
+
* } [else {
|
|
20
|
+
* <nodes...>
|
|
21
|
+
* }]
|
|
22
|
+
* loop [max: N] [cond: <storeKey>] {
|
|
23
|
+
* <nodes...>
|
|
24
|
+
* }
|
|
25
|
+
* forEach <itemKey> in <arrayRef> [max: N] {
|
|
26
|
+
* <nodes...>
|
|
27
|
+
* }
|
|
28
|
+
* }
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.AcsDecompiler = exports.AcsCompiler = exports.AcsParser = void 0;
|
|
32
|
+
exports.compileAcs = compileAcs;
|
|
33
|
+
exports.decompileAcs = decompileAcs;
|
|
34
|
+
class AcsParser {
|
|
35
|
+
constructor() {
|
|
36
|
+
this.pos = 0;
|
|
37
|
+
this.src = '';
|
|
38
|
+
}
|
|
39
|
+
parse(text) {
|
|
40
|
+
this.src = text.trim();
|
|
41
|
+
this.pos = 0;
|
|
42
|
+
return this.parseGraph();
|
|
43
|
+
}
|
|
44
|
+
parseGraph() {
|
|
45
|
+
this.expect('graph');
|
|
46
|
+
const name = this.readIdentifier();
|
|
47
|
+
this.expect('{');
|
|
48
|
+
const graph = { name, nodes: [] };
|
|
49
|
+
while (!this.peek('}') && this.pos < this.src.length) {
|
|
50
|
+
this.skipWhitespaceAndComments();
|
|
51
|
+
if (this.peek('mode:')) {
|
|
52
|
+
this.advance(5);
|
|
53
|
+
graph.mode = this.readIdentifier();
|
|
54
|
+
}
|
|
55
|
+
else if (this.peek('meta:')) {
|
|
56
|
+
this.advance(5);
|
|
57
|
+
graph.meta = this.parseMetaDecl();
|
|
58
|
+
}
|
|
59
|
+
else if (this.peek('in:')) {
|
|
60
|
+
this.advance(3);
|
|
61
|
+
graph.input = this.parseInputDecl();
|
|
62
|
+
}
|
|
63
|
+
else if (this.peek('out:')) {
|
|
64
|
+
this.advance(4);
|
|
65
|
+
graph.output = this.readIdentifier();
|
|
66
|
+
}
|
|
67
|
+
else if (this.peek('let')) {
|
|
68
|
+
graph.nodes.push(this.parseLet());
|
|
69
|
+
}
|
|
70
|
+
else if (this.peek('if')) {
|
|
71
|
+
graph.nodes.push(this.parseIf());
|
|
72
|
+
}
|
|
73
|
+
else if (this.peek('loop')) {
|
|
74
|
+
graph.nodes.push(this.parseLoop());
|
|
75
|
+
}
|
|
76
|
+
else if (this.peek('forEach')) {
|
|
77
|
+
graph.nodes.push(this.parseForEach());
|
|
78
|
+
}
|
|
79
|
+
else if (this.peek('filter')) {
|
|
80
|
+
graph.nodes.push(this.parseFilter());
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
throw new Error(`ACS parse error at pos ${this.pos}: unexpected "${this.src.slice(this.pos, this.pos + 20)}"`);
|
|
84
|
+
}
|
|
85
|
+
this.skipWhitespaceAndComments();
|
|
86
|
+
}
|
|
87
|
+
this.expect('}');
|
|
88
|
+
return graph;
|
|
89
|
+
}
|
|
90
|
+
parseLet() {
|
|
91
|
+
this.expect('let');
|
|
92
|
+
const id = this.readIdentifier();
|
|
93
|
+
this.expect('=');
|
|
94
|
+
this.skipWhitespaceAndComments();
|
|
95
|
+
if (this.peek('if')) {
|
|
96
|
+
const ifNode = this.parseIf();
|
|
97
|
+
ifNode.id = id;
|
|
98
|
+
return ifNode;
|
|
99
|
+
}
|
|
100
|
+
if (this.peek('forEach')) {
|
|
101
|
+
const forEachNode = this.parseForEach();
|
|
102
|
+
forEachNode.id = id;
|
|
103
|
+
return forEachNode;
|
|
104
|
+
}
|
|
105
|
+
if (this.peek('loop')) {
|
|
106
|
+
const loopNode = this.parseLoop();
|
|
107
|
+
loopNode.id = id;
|
|
108
|
+
return loopNode;
|
|
109
|
+
}
|
|
110
|
+
if (this.peek('filter')) {
|
|
111
|
+
const filterNode = this.parseFilter();
|
|
112
|
+
filterNode.id = id;
|
|
113
|
+
return filterNode;
|
|
114
|
+
}
|
|
115
|
+
const atom = this.readIdentifier();
|
|
116
|
+
const params = this.parseParams();
|
|
117
|
+
return { type: 'let', id, atom, params };
|
|
118
|
+
}
|
|
119
|
+
parseIf() {
|
|
120
|
+
this.expect('if');
|
|
121
|
+
this.skipWhitespaceAndComments();
|
|
122
|
+
const savedPos = this.pos;
|
|
123
|
+
const firstIdent = this.readIdentifier();
|
|
124
|
+
this.skipWhitespaceAndComments();
|
|
125
|
+
let ref;
|
|
126
|
+
let inlineCondAtom;
|
|
127
|
+
if (this.peek('(')) {
|
|
128
|
+
const params = this.parseParams();
|
|
129
|
+
inlineCondAtom = { atom: firstIdent, params };
|
|
130
|
+
ref = `__inline_cond_${savedPos}`;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
ref = firstIdent;
|
|
134
|
+
}
|
|
135
|
+
this.expect('{');
|
|
136
|
+
const body = this.parseBody();
|
|
137
|
+
this.expect('}');
|
|
138
|
+
let elseBody;
|
|
139
|
+
this.skipWhitespaceAndComments();
|
|
140
|
+
if (this.peek('else')) {
|
|
141
|
+
this.advance(4);
|
|
142
|
+
this.expect('{');
|
|
143
|
+
elseBody = this.parseBody();
|
|
144
|
+
this.expect('}');
|
|
145
|
+
}
|
|
146
|
+
const ifNode = { type: 'if', ref, body, elseBody };
|
|
147
|
+
if (inlineCondAtom) {
|
|
148
|
+
ifNode.inlineCondAtom = inlineCondAtom;
|
|
149
|
+
}
|
|
150
|
+
return ifNode;
|
|
151
|
+
}
|
|
152
|
+
parseLoop() {
|
|
153
|
+
this.expect('loop');
|
|
154
|
+
let maxIterations;
|
|
155
|
+
let condKey;
|
|
156
|
+
this.skipWhitespaceAndComments();
|
|
157
|
+
if (this.peek('max:')) {
|
|
158
|
+
this.advance(4);
|
|
159
|
+
maxIterations = this.readNumber();
|
|
160
|
+
}
|
|
161
|
+
this.skipWhitespaceAndComments();
|
|
162
|
+
if (this.peek('cond:')) {
|
|
163
|
+
this.advance(5);
|
|
164
|
+
condKey = this.readString() || this.readIdentifier();
|
|
165
|
+
}
|
|
166
|
+
this.expect('{');
|
|
167
|
+
const body = this.parseBody();
|
|
168
|
+
this.expect('}');
|
|
169
|
+
return { type: 'loop', maxIterations, condKey, body };
|
|
170
|
+
}
|
|
171
|
+
parseForEach() {
|
|
172
|
+
this.expect('forEach');
|
|
173
|
+
const itemKey = this.readIdentifier();
|
|
174
|
+
let indexKey;
|
|
175
|
+
this.skipWhitespaceAndComments();
|
|
176
|
+
if (this.peek(',')) {
|
|
177
|
+
this.advance(1);
|
|
178
|
+
indexKey = this.readIdentifier();
|
|
179
|
+
}
|
|
180
|
+
this.expect('in');
|
|
181
|
+
const arrayRef = this.readIdentifier();
|
|
182
|
+
let maxItems;
|
|
183
|
+
this.skipWhitespaceAndComments();
|
|
184
|
+
if (this.peek('max:')) {
|
|
185
|
+
this.advance(4);
|
|
186
|
+
maxItems = this.readNumber();
|
|
187
|
+
}
|
|
188
|
+
this.expect('{');
|
|
189
|
+
const body = this.parseBody();
|
|
190
|
+
this.expect('}');
|
|
191
|
+
return { type: 'forEach', itemKey, indexKey, arrayRef, maxItems, body };
|
|
192
|
+
}
|
|
193
|
+
parseFilter() {
|
|
194
|
+
this.expect('filter');
|
|
195
|
+
const itemKey = this.readIdentifier();
|
|
196
|
+
let indexKey;
|
|
197
|
+
this.skipWhitespaceAndComments();
|
|
198
|
+
if (this.peek('index:')) {
|
|
199
|
+
this.advance(6);
|
|
200
|
+
indexKey = this.readIdentifier();
|
|
201
|
+
}
|
|
202
|
+
this.expect('in');
|
|
203
|
+
const arrayRef = this.readIdentifier();
|
|
204
|
+
this.expect('{');
|
|
205
|
+
const body = this.parseBody();
|
|
206
|
+
this.expect('}');
|
|
207
|
+
return { type: 'filter', itemKey, indexKey, arrayRef, body };
|
|
208
|
+
}
|
|
209
|
+
parseBody() {
|
|
210
|
+
const nodes = [];
|
|
211
|
+
this.skipWhitespaceAndComments();
|
|
212
|
+
while (!this.peek('}') && this.pos < this.src.length) {
|
|
213
|
+
if (this.peek('let'))
|
|
214
|
+
nodes.push(this.parseLet());
|
|
215
|
+
else if (this.peek('if'))
|
|
216
|
+
nodes.push(this.parseIf());
|
|
217
|
+
else if (this.peek('loop'))
|
|
218
|
+
nodes.push(this.parseLoop());
|
|
219
|
+
else if (this.peek('forEach'))
|
|
220
|
+
nodes.push(this.parseForEach());
|
|
221
|
+
else if (this.peek('filter'))
|
|
222
|
+
nodes.push(this.parseFilter());
|
|
223
|
+
else
|
|
224
|
+
break;
|
|
225
|
+
this.skipWhitespaceAndComments();
|
|
226
|
+
}
|
|
227
|
+
return nodes;
|
|
228
|
+
}
|
|
229
|
+
parseParams() {
|
|
230
|
+
if (!this.peek('('))
|
|
231
|
+
return {};
|
|
232
|
+
this.advance(1); // skip (
|
|
233
|
+
const params = {};
|
|
234
|
+
while (!this.peek(')') && this.pos < this.src.length) {
|
|
235
|
+
const key = this.readIdentifier();
|
|
236
|
+
this.expect(':');
|
|
237
|
+
const value = this.readValue();
|
|
238
|
+
params[key] = value;
|
|
239
|
+
this.skipWhitespaceAndComments();
|
|
240
|
+
if (this.peek(','))
|
|
241
|
+
this.advance(1);
|
|
242
|
+
this.skipWhitespaceAndComments();
|
|
243
|
+
}
|
|
244
|
+
this.expect(')');
|
|
245
|
+
return params;
|
|
246
|
+
}
|
|
247
|
+
parseInputDecl() {
|
|
248
|
+
if (this.peek('none')) {
|
|
249
|
+
this.advance(4);
|
|
250
|
+
return [];
|
|
251
|
+
}
|
|
252
|
+
const result = [];
|
|
253
|
+
while (!this.peek('\n') && !this.peek('}') && this.pos < this.src.length) {
|
|
254
|
+
const name = this.readIdentifier();
|
|
255
|
+
this.expect(':');
|
|
256
|
+
const type = this.readIdentifier();
|
|
257
|
+
result.push({ name, type });
|
|
258
|
+
this.skipWhitespaceAndComments();
|
|
259
|
+
if (this.peek(','))
|
|
260
|
+
this.advance(1);
|
|
261
|
+
this.skipWhitespaceAndComments();
|
|
262
|
+
}
|
|
263
|
+
return result;
|
|
264
|
+
}
|
|
265
|
+
parseMetaDecl() {
|
|
266
|
+
this.expect('{');
|
|
267
|
+
const meta = {};
|
|
268
|
+
while (!this.peek('}') && this.pos < this.src.length) {
|
|
269
|
+
const key = this.readIdentifier();
|
|
270
|
+
this.expect(':');
|
|
271
|
+
meta[key] = this.readString() || this.readIdentifier();
|
|
272
|
+
this.skipWhitespaceAndComments();
|
|
273
|
+
if (this.peek(','))
|
|
274
|
+
this.advance(1);
|
|
275
|
+
this.skipWhitespaceAndComments();
|
|
276
|
+
}
|
|
277
|
+
this.expect('}');
|
|
278
|
+
return meta;
|
|
279
|
+
}
|
|
280
|
+
readValue() {
|
|
281
|
+
this.skipWhitespaceAndComments();
|
|
282
|
+
if (this.peek('"'))
|
|
283
|
+
return this.readString();
|
|
284
|
+
if (this.peek("'"))
|
|
285
|
+
return this.readString();
|
|
286
|
+
if (this.src[this.pos] === '-' || this.src[this.pos] >= '0' && this.src[this.pos] <= '9')
|
|
287
|
+
return this.readNumber();
|
|
288
|
+
if (this.peek('true')) {
|
|
289
|
+
this.advance(4);
|
|
290
|
+
return true;
|
|
291
|
+
}
|
|
292
|
+
if (this.peek('false')) {
|
|
293
|
+
this.advance(5);
|
|
294
|
+
return false;
|
|
295
|
+
}
|
|
296
|
+
if (this.peek('null')) {
|
|
297
|
+
this.advance(4);
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
if (this.peek('{{'))
|
|
301
|
+
return this.readReference();
|
|
302
|
+
if (this.peek('{'))
|
|
303
|
+
return this.readObject();
|
|
304
|
+
if (this.peek('['))
|
|
305
|
+
return this.readArray();
|
|
306
|
+
return this.readIdentifier();
|
|
307
|
+
}
|
|
308
|
+
readReference() {
|
|
309
|
+
const start = this.pos;
|
|
310
|
+
this.advance(2);
|
|
311
|
+
const ref = this.readUntil('}}');
|
|
312
|
+
this.advance(2);
|
|
313
|
+
return `{{${ref}}}`;
|
|
314
|
+
}
|
|
315
|
+
readObject() {
|
|
316
|
+
this.expect('{');
|
|
317
|
+
const obj = {};
|
|
318
|
+
this.skipWhitespaceAndComments();
|
|
319
|
+
while (!this.peek('}') && this.pos < this.src.length) {
|
|
320
|
+
let key;
|
|
321
|
+
if (this.peek('"') || this.peek("'")) {
|
|
322
|
+
key = this.readString();
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
key = this.readIdentifier();
|
|
326
|
+
}
|
|
327
|
+
this.expect(':');
|
|
328
|
+
const value = this.readValue();
|
|
329
|
+
obj[key] = value;
|
|
330
|
+
this.skipWhitespaceAndComments();
|
|
331
|
+
if (this.peek(','))
|
|
332
|
+
this.advance(1);
|
|
333
|
+
this.skipWhitespaceAndComments();
|
|
334
|
+
}
|
|
335
|
+
this.expect('}');
|
|
336
|
+
return obj;
|
|
337
|
+
}
|
|
338
|
+
readArray() {
|
|
339
|
+
this.expect('[');
|
|
340
|
+
const arr = [];
|
|
341
|
+
this.skipWhitespaceAndComments();
|
|
342
|
+
while (!this.peek(']') && this.pos < this.src.length) {
|
|
343
|
+
arr.push(this.readValue());
|
|
344
|
+
this.skipWhitespaceAndComments();
|
|
345
|
+
if (this.peek(','))
|
|
346
|
+
this.advance(1);
|
|
347
|
+
this.skipWhitespaceAndComments();
|
|
348
|
+
}
|
|
349
|
+
this.expect(']');
|
|
350
|
+
return arr;
|
|
351
|
+
}
|
|
352
|
+
skipWhitespaceAndComments() {
|
|
353
|
+
while (this.pos < this.src.length) {
|
|
354
|
+
if (/\s/.test(this.src[this.pos])) {
|
|
355
|
+
this.pos++;
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
if (this.src[this.pos] === '/' && this.src[this.pos + 1] === '/') {
|
|
359
|
+
while (this.pos < this.src.length && this.src[this.pos] !== '\n')
|
|
360
|
+
this.pos++;
|
|
361
|
+
continue;
|
|
362
|
+
}
|
|
363
|
+
break;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
peek(s) {
|
|
367
|
+
return this.src.slice(this.pos, this.pos + s.length) === s;
|
|
368
|
+
}
|
|
369
|
+
expect(s) {
|
|
370
|
+
this.skipWhitespaceAndComments();
|
|
371
|
+
if (!this.peek(s)) {
|
|
372
|
+
throw new Error(`ACS parse error at pos ${this.pos}: expected "${s}", got "${this.src.slice(this.pos, this.pos + 10)}"`);
|
|
373
|
+
}
|
|
374
|
+
this.pos += s.length;
|
|
375
|
+
}
|
|
376
|
+
advance(n) {
|
|
377
|
+
this.pos += n;
|
|
378
|
+
}
|
|
379
|
+
readIdentifier() {
|
|
380
|
+
this.skipWhitespaceAndComments();
|
|
381
|
+
let start = this.pos;
|
|
382
|
+
while (this.pos < this.src.length && /[a-zA-Z0-9_@\-/.]/.test(this.src[this.pos]))
|
|
383
|
+
this.pos++;
|
|
384
|
+
if (this.pos === start)
|
|
385
|
+
throw new Error(`ACS parse error at pos ${this.pos}: expected identifier`);
|
|
386
|
+
return this.src.slice(start, this.pos);
|
|
387
|
+
}
|
|
388
|
+
readNumber() {
|
|
389
|
+
this.skipWhitespaceAndComments();
|
|
390
|
+
let start = this.pos;
|
|
391
|
+
if (this.src[this.pos] === '-')
|
|
392
|
+
this.pos++;
|
|
393
|
+
while (this.pos < this.src.length && /[0-9.]/.test(this.src[this.pos]))
|
|
394
|
+
this.pos++;
|
|
395
|
+
return Number(this.src.slice(start, this.pos));
|
|
396
|
+
}
|
|
397
|
+
readString() {
|
|
398
|
+
this.skipWhitespaceAndComments();
|
|
399
|
+
const quote = this.src[this.pos];
|
|
400
|
+
if (quote !== '"' && quote !== "'")
|
|
401
|
+
throw new Error(`ACS parse error at pos ${this.pos}: expected string`);
|
|
402
|
+
this.pos++;
|
|
403
|
+
let result = '';
|
|
404
|
+
while (this.pos < this.src.length && this.src[this.pos] !== quote) {
|
|
405
|
+
if (this.src[this.pos] === '\\') {
|
|
406
|
+
this.pos++;
|
|
407
|
+
const ch = this.src[this.pos];
|
|
408
|
+
if (ch === 'n')
|
|
409
|
+
result += '\n';
|
|
410
|
+
else if (ch === 't')
|
|
411
|
+
result += '\t';
|
|
412
|
+
else if (ch === 'r')
|
|
413
|
+
result += '\r';
|
|
414
|
+
else if (ch === '\\')
|
|
415
|
+
result += '\\';
|
|
416
|
+
else if (ch === quote)
|
|
417
|
+
result += quote;
|
|
418
|
+
else if (ch === '{')
|
|
419
|
+
result += '\\{';
|
|
420
|
+
else
|
|
421
|
+
result += ch;
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
result += this.src[this.pos];
|
|
425
|
+
}
|
|
426
|
+
this.pos++;
|
|
427
|
+
}
|
|
428
|
+
this.pos++;
|
|
429
|
+
return result;
|
|
430
|
+
}
|
|
431
|
+
readUntil(end) {
|
|
432
|
+
let result = '';
|
|
433
|
+
while (this.pos < this.src.length && !this.peek(end)) {
|
|
434
|
+
result += this.src[this.pos];
|
|
435
|
+
this.pos++;
|
|
436
|
+
}
|
|
437
|
+
return result;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
exports.AcsParser = AcsParser;
|
|
441
|
+
class AcsCompiler {
|
|
442
|
+
compile(acsGraph) {
|
|
443
|
+
const graph = {
|
|
444
|
+
order: [],
|
|
445
|
+
nodes: {},
|
|
446
|
+
};
|
|
447
|
+
if (acsGraph.mode)
|
|
448
|
+
graph.mode = acsGraph.mode;
|
|
449
|
+
if (acsGraph.meta)
|
|
450
|
+
graph._meta = acsGraph.meta;
|
|
451
|
+
if (acsGraph.input && acsGraph.input.length > 0) {
|
|
452
|
+
graph.interface = {
|
|
453
|
+
input: acsGraph.input.map(i => ({ name: i.name, type: i.type })),
|
|
454
|
+
output: { type: acsGraph.output || 'void' },
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
this.compileNodes(acsGraph.nodes, graph);
|
|
458
|
+
return graph;
|
|
459
|
+
}
|
|
460
|
+
compileNodes(acsNodes, graph) {
|
|
461
|
+
for (const node of acsNodes) {
|
|
462
|
+
switch (node.type) {
|
|
463
|
+
case 'let': {
|
|
464
|
+
const graphNode = { atom: node.atom, ...node.params };
|
|
465
|
+
graph.order.push(node.id);
|
|
466
|
+
graph.nodes[node.id] = graphNode;
|
|
467
|
+
break;
|
|
468
|
+
}
|
|
469
|
+
case 'if': {
|
|
470
|
+
if (node.inlineCondAtom) {
|
|
471
|
+
const condNodeId = node.ref;
|
|
472
|
+
const condGraphNode = { atom: node.inlineCondAtom.atom, ...node.inlineCondAtom.params };
|
|
473
|
+
graph.order.push(condNodeId);
|
|
474
|
+
graph.nodes[condNodeId] = condGraphNode;
|
|
475
|
+
}
|
|
476
|
+
let ifNodeId;
|
|
477
|
+
if (node.id) {
|
|
478
|
+
ifNodeId = node.id;
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
ifNodeId = `if_${node.ref}`;
|
|
482
|
+
if (graph.nodes[ifNodeId]) {
|
|
483
|
+
ifNodeId = `if_${node.ref}_${graph.order.length}`;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
const thenGraph = this.compileSubGraph(node.body || []);
|
|
487
|
+
const elseGraph = node.elseBody ? this.compileSubGraph(node.elseBody) : undefined;
|
|
488
|
+
const graphNode = {
|
|
489
|
+
atom: 'branch',
|
|
490
|
+
cond: `{{${node.ref}}}`,
|
|
491
|
+
};
|
|
492
|
+
if (thenGraph.order.length > 0 || !elseGraph)
|
|
493
|
+
graphNode.then = thenGraph;
|
|
494
|
+
if (elseGraph)
|
|
495
|
+
graphNode.else = elseGraph;
|
|
496
|
+
graph.order.push(ifNodeId);
|
|
497
|
+
graph.nodes[ifNodeId] = graphNode;
|
|
498
|
+
break;
|
|
499
|
+
}
|
|
500
|
+
case 'loop': {
|
|
501
|
+
const loopNodeId = node.id || `loop_${graph.order.length}`;
|
|
502
|
+
const bodyGraph = this.compileSubGraph(node.body || []);
|
|
503
|
+
const graphNode = {
|
|
504
|
+
atom: 'loop',
|
|
505
|
+
nodes: bodyGraph,
|
|
506
|
+
};
|
|
507
|
+
if (node.maxIterations)
|
|
508
|
+
graphNode.maxIterations = node.maxIterations;
|
|
509
|
+
if (node.condKey)
|
|
510
|
+
graphNode.condKey = node.condKey;
|
|
511
|
+
graph.order.push(loopNodeId);
|
|
512
|
+
graph.nodes[loopNodeId] = graphNode;
|
|
513
|
+
break;
|
|
514
|
+
}
|
|
515
|
+
case 'forEach': {
|
|
516
|
+
const feNodeId = node.id || `forEach_${graph.order.length}`;
|
|
517
|
+
const bodyGraph = this.compileSubGraph(node.body || []);
|
|
518
|
+
const graphNode = {
|
|
519
|
+
atom: 'forEach',
|
|
520
|
+
array: `{{${node.arrayRef}}}`,
|
|
521
|
+
nodes: bodyGraph,
|
|
522
|
+
itemKey: node.itemKey,
|
|
523
|
+
};
|
|
524
|
+
if (node.indexKey)
|
|
525
|
+
graphNode.indexKey = node.indexKey;
|
|
526
|
+
if (node.maxItems)
|
|
527
|
+
graphNode.maxItems = node.maxItems;
|
|
528
|
+
graph.order.push(feNodeId);
|
|
529
|
+
graph.nodes[feNodeId] = graphNode;
|
|
530
|
+
break;
|
|
531
|
+
}
|
|
532
|
+
case 'filter': {
|
|
533
|
+
const fNodeId = node.id || `filter_${graph.order.length}`;
|
|
534
|
+
const bodyGraph = this.compileSubGraph(node.body || []);
|
|
535
|
+
const graphNode = {
|
|
536
|
+
atom: 'filter',
|
|
537
|
+
array: `{{${node.arrayRef}}}`,
|
|
538
|
+
nodes: bodyGraph,
|
|
539
|
+
itemKey: node.itemKey,
|
|
540
|
+
};
|
|
541
|
+
if (node.indexKey)
|
|
542
|
+
graphNode.indexKey = node.indexKey;
|
|
543
|
+
graph.order.push(fNodeId);
|
|
544
|
+
graph.nodes[fNodeId] = graphNode;
|
|
545
|
+
break;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
compileSubGraph(acsNodes) {
|
|
551
|
+
const graph = { order: [], nodes: {} };
|
|
552
|
+
this.compileNodes(acsNodes, graph);
|
|
553
|
+
return graph;
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
exports.AcsCompiler = AcsCompiler;
|
|
557
|
+
class AcsDecompiler {
|
|
558
|
+
decompile(graph, name = 'unnamed') {
|
|
559
|
+
const lines = [];
|
|
560
|
+
lines.push(`graph ${name} {`);
|
|
561
|
+
if (graph.mode)
|
|
562
|
+
lines.push(` mode: ${graph.mode}`);
|
|
563
|
+
if (graph._meta) {
|
|
564
|
+
const parts = Object.entries(graph._meta).map(([k, v]) => `${k}: "${v}"`).join(', ');
|
|
565
|
+
lines.push(` meta: { ${parts} }`);
|
|
566
|
+
}
|
|
567
|
+
if (graph.interface) {
|
|
568
|
+
if (graph.interface.input.length === 0) {
|
|
569
|
+
lines.push(` in: none`);
|
|
570
|
+
}
|
|
571
|
+
else {
|
|
572
|
+
const inStr = graph.interface.input.map(i => `${i.name}: ${i.type}`).join(', ');
|
|
573
|
+
lines.push(` in: ${inStr}`);
|
|
574
|
+
}
|
|
575
|
+
lines.push(` out: ${graph.interface.output.type}`);
|
|
576
|
+
}
|
|
577
|
+
lines.push('');
|
|
578
|
+
for (const nodeId of graph.order) {
|
|
579
|
+
const node = graph.nodes[nodeId];
|
|
580
|
+
if (nodeId.startsWith('__inline_cond_') && node.atom !== 'branch')
|
|
581
|
+
continue;
|
|
582
|
+
lines.push(...this.decompileNode(nodeId, node, 1, graph.nodes));
|
|
583
|
+
}
|
|
584
|
+
lines.push('}');
|
|
585
|
+
return lines.join('\n');
|
|
586
|
+
}
|
|
587
|
+
decompileNode(nodeId, node, indent, allNodes) {
|
|
588
|
+
const prefix = ' '.repeat(indent);
|
|
589
|
+
const lines = [];
|
|
590
|
+
if (node.atom === 'branch') {
|
|
591
|
+
const condRef = this.extractCondRef(node.cond);
|
|
592
|
+
const isNamedIf = nodeId && !nodeId.startsWith('if_');
|
|
593
|
+
const ifPrefix = isNamedIf ? `${prefix}let ${nodeId} = ` : '';
|
|
594
|
+
let condStr = condRef || nodeId;
|
|
595
|
+
if (condRef && condRef.startsWith('__inline_cond_') && allNodes && allNodes[condRef]) {
|
|
596
|
+
const condNode = allNodes[condRef];
|
|
597
|
+
const condParams = this.formatParams(condNode);
|
|
598
|
+
condStr = `${condNode.atom}(${condParams})`;
|
|
599
|
+
lines.push(`${ifPrefix}if ${condStr} {`);
|
|
600
|
+
}
|
|
601
|
+
else {
|
|
602
|
+
lines.push(`${ifPrefix}if ${condStr} {`);
|
|
603
|
+
}
|
|
604
|
+
if (node.then)
|
|
605
|
+
lines.push(...this.decompileSubGraph(node.then, indent + 1));
|
|
606
|
+
if (node.else) {
|
|
607
|
+
lines.push(`${prefix}} else {`);
|
|
608
|
+
lines.push(...this.decompileSubGraph(node.else, indent + 1));
|
|
609
|
+
}
|
|
610
|
+
lines.push(`${prefix}}`);
|
|
611
|
+
}
|
|
612
|
+
else if (node.atom === 'loop') {
|
|
613
|
+
const isNamedLoop = nodeId && !nodeId.startsWith('loop_');
|
|
614
|
+
const loopPrefix = isNamedLoop ? `${prefix}let ${nodeId} = ` : '';
|
|
615
|
+
const extras = [];
|
|
616
|
+
if (node.maxIterations)
|
|
617
|
+
extras.push(`max: ${node.maxIterations}`);
|
|
618
|
+
if (node.condKey)
|
|
619
|
+
extras.push(`cond: "${node.condKey}"`);
|
|
620
|
+
lines.push(`${loopPrefix}loop ${extras.join(' ')} {`);
|
|
621
|
+
if (node.nodes)
|
|
622
|
+
lines.push(...this.decompileSubGraph(node.nodes, indent + 1));
|
|
623
|
+
lines.push(`${prefix}}`);
|
|
624
|
+
}
|
|
625
|
+
else if (node.atom === 'forEach') {
|
|
626
|
+
const isNamedForEach = nodeId && !nodeId.startsWith('forEach_');
|
|
627
|
+
const fePrefix = isNamedForEach ? `${prefix}let ${nodeId} = ` : '';
|
|
628
|
+
const extras = [];
|
|
629
|
+
if (node.maxItems)
|
|
630
|
+
extras.push(`max: ${node.maxItems}`);
|
|
631
|
+
const idx = node.indexKey ? `, ${node.indexKey}` : '';
|
|
632
|
+
lines.push(`${fePrefix}forEach ${node.itemKey || 'item'}${idx} in ${this.extractArrayRef(node.array)} ${extras.join(' ')} {`);
|
|
633
|
+
if (node.nodes)
|
|
634
|
+
lines.push(...this.decompileSubGraph(node.nodes, indent + 1));
|
|
635
|
+
lines.push(`${prefix}}`);
|
|
636
|
+
}
|
|
637
|
+
else if (node.atom === 'filter') {
|
|
638
|
+
const isNamedFilter = nodeId && !nodeId.startsWith('filter_');
|
|
639
|
+
const fPrefix = isNamedFilter ? `${prefix}let ${nodeId} = ` : '';
|
|
640
|
+
const idx = node.indexKey ? ` index: ${node.indexKey}` : '';
|
|
641
|
+
lines.push(`${fPrefix}filter ${node.itemKey || 'item'}${idx} in ${this.extractArrayRef(node.array)} {`);
|
|
642
|
+
if (node.nodes)
|
|
643
|
+
lines.push(...this.decompileSubGraph(node.nodes, indent + 1));
|
|
644
|
+
lines.push(`${prefix}}`);
|
|
645
|
+
}
|
|
646
|
+
else {
|
|
647
|
+
const params = this.formatParams(node);
|
|
648
|
+
lines.push(`${prefix}let ${nodeId} = ${node.atom}(${params})`);
|
|
649
|
+
}
|
|
650
|
+
return lines;
|
|
651
|
+
}
|
|
652
|
+
decompileSubGraph(graph, indent) {
|
|
653
|
+
const lines = [];
|
|
654
|
+
for (const nodeId of graph.order) {
|
|
655
|
+
if (nodeId.startsWith('__inline_cond_') && graph.nodes[nodeId].atom !== 'branch')
|
|
656
|
+
continue;
|
|
657
|
+
lines.push(...this.decompileNode(nodeId, graph.nodes[nodeId], indent, graph.nodes));
|
|
658
|
+
}
|
|
659
|
+
return lines;
|
|
660
|
+
}
|
|
661
|
+
formatParams(node) {
|
|
662
|
+
const SKIP = new Set(['atom', 'nodes', 'then', 'else', 'cond', 'maxIterations', 'itemKey', 'maxItems']);
|
|
663
|
+
if (node.atom === 'forEach' || node.atom === 'filter')
|
|
664
|
+
SKIP.add('array');
|
|
665
|
+
const parts = [];
|
|
666
|
+
for (const [key, value] of Object.entries(node)) {
|
|
667
|
+
if (SKIP.has(key))
|
|
668
|
+
continue;
|
|
669
|
+
parts.push(`${key}: ${this.formatValue(value)}`);
|
|
670
|
+
}
|
|
671
|
+
return parts.join(', ');
|
|
672
|
+
}
|
|
673
|
+
formatValue(value) {
|
|
674
|
+
if (typeof value === 'string') {
|
|
675
|
+
const escaped = value.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\t/g, '\\t');
|
|
676
|
+
return `"${escaped}"`;
|
|
677
|
+
}
|
|
678
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
679
|
+
return String(value);
|
|
680
|
+
if (value === null)
|
|
681
|
+
return 'null';
|
|
682
|
+
if (Array.isArray(value))
|
|
683
|
+
return `[${value.map(v => this.formatValue(v)).join(', ')}]`;
|
|
684
|
+
if (typeof value === 'object') {
|
|
685
|
+
const parts = Object.entries(value).map(([k, v]) => {
|
|
686
|
+
const keyStr = /^[a-zA-Z_]\w*$/.test(k) ? k : `"${k}"`;
|
|
687
|
+
return `${keyStr}: ${this.formatValue(v)}`;
|
|
688
|
+
});
|
|
689
|
+
return `{ ${parts.join(', ')} }`;
|
|
690
|
+
}
|
|
691
|
+
return String(value);
|
|
692
|
+
}
|
|
693
|
+
extractArrayRef(array) {
|
|
694
|
+
if (typeof array === 'string' && array.startsWith('{{')) {
|
|
695
|
+
const match = array.match(/^\{\{(\w+)\}\}$/);
|
|
696
|
+
return match ? match[1] : array;
|
|
697
|
+
}
|
|
698
|
+
return String(array);
|
|
699
|
+
}
|
|
700
|
+
extractCondRef(cond) {
|
|
701
|
+
if (typeof cond === 'string' && cond.startsWith('{{')) {
|
|
702
|
+
const match = cond.match(/^\{\{(\w+)(?:\.(.+?))?\}\}$/);
|
|
703
|
+
return match ? (match[2] ? `${match[1]}.${match[2]}` : match[1]) : String(cond);
|
|
704
|
+
}
|
|
705
|
+
return String(cond);
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
exports.AcsDecompiler = AcsDecompiler;
|
|
709
|
+
function compileAcs(text) {
|
|
710
|
+
const parser = new AcsParser();
|
|
711
|
+
const ast = parser.parse(text);
|
|
712
|
+
const compiler = new AcsCompiler();
|
|
713
|
+
return compiler.compile(ast);
|
|
714
|
+
}
|
|
715
|
+
function decompileAcs(graph, name) {
|
|
716
|
+
const decompiler = new AcsDecompiler();
|
|
717
|
+
return decompiler.decompile(graph, name);
|
|
718
|
+
}
|
|
719
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Fjcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRzs7O0FBaXJCSCxnQ0FLQztBQUVELG9DQUdDO0FBN3BCRCxNQUFhLFNBQVM7SUFBdEI7UUFDVSxRQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1IsUUFBRyxHQUFHLEVBQUUsQ0FBQztJQXdZbkIsQ0FBQztJQXRZQyxLQUFLLENBQUMsSUFBWTtRQUNoQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNiLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTyxVQUFVO1FBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFakIsTUFBTSxLQUFLLEdBQWEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBRTVDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyRCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUVqQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEIsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxFQUF1QixDQUFDO1lBQzFELENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hCLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3BDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hCLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hCLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ25DLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7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Q0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEIsQ0FBQztDQUNGO0FBN0lELHNDQTZJQztBQUVELFNBQWdCLFVBQVUsQ0FBQyxJQUFZO0lBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7SUFDL0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixNQUFNLFFBQVEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ25DLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLEtBQVksRUFBRSxJQUFhO0lBQ3RELE1BQU0sVUFBVSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7SUFDdkMsT0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBSVRPUyBDb21wYWN0IFN5bnRheCAoQUNTKVxuICpcbiAqIEFDUyBpcyBhIGNvbXBhY3QgcmVwcmVzZW50YXRpb24gb2YgR3JhcGggSlNPTiwgZGVzaWduZWQgZm9yOlxuICogLSBBSSBnZW5lcmF0aW9uICgxMC0yMHggbW9yZSBjb21wYWN0IHRoYW4gSlNPTilcbiAqIC0gSHVtYW4gcmVhZGFiaWxpdHkgKGZvciBhdWRpdGluZyBBSSBvdXRwdXQpXG4gKiAtIFVuYW1iaWd1b3VzIGNvbXBpbGF0aW9uIHRvL2Zyb20gR3JhcGggSlNPTlxuICpcbiAqIFN5bnRheDpcbiAqICAgZ3JhcGggPG5hbWU+IHtcbiAqICAgICBbbW9kZToga2VybmVsfHVzZXJdXG4gKiAgICAgW2luOiA8dHlwZT4gfCA8bmFtZT46IDx0eXBlPiwgLi4uXVxuICogICAgIFtvdXQ6IDx0eXBlPl1cbiAqXG4gKiAgICAgbGV0IDxub2RlSWQ+ID0gPGF0b20+KDxwYXJhbT46IDx2YWx1ZT4sIC4uLilcbiAqICAgICBpZiA8cmVmTm9kZUlkPiB7XG4gKiAgICAgICA8bm9kZXMuLi4+XG4gKiAgICAgfSBbZWxzZSB7XG4gKiAgICAgICA8bm9kZXMuLi4+XG4gKiAgICAgfV1cbiAqICAgICBsb29wIFttYXg6IE5dIFtjb25kOiA8c3RvcmVLZXk+XSB7XG4gKiAgICAgICA8bm9kZXMuLi4+XG4gKiAgICAgfVxuICogICAgIGZvckVhY2ggPGl0ZW1LZXk+IGluIDxhcnJheVJlZj4gW21heDogTl0ge1xuICogICAgICAgPG5vZGVzLi4uPlxuICogICAgIH1cbiAqICAgfVxuICovXG5cbmltcG9ydCB7IEdyYXBoLCBHcmFwaE5vZGUgfSBmcm9tICcuL3R5cGVzJztcblxuaW50ZXJmYWNlIEFjc05vZGUge1xuICB0eXBlOiAnbGV0JyB8ICdpZicgfCAnbG9vcCcgfCAnZm9yRWFjaCcgfCAnZmlsdGVyJztcbiAgaWQ/OiBzdHJpbmc7XG4gIGF0b20/OiBzdHJpbmc7XG4gIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHJlZj86IHN0cmluZztcbiAgYm9keT86IEFjc05vZGVbXTtcbiAgZWxzZUJvZHk/OiBBY3NOb2RlW107XG4gIG1heEl0ZXJhdGlvbnM/OiBudW1iZXI7XG4gIGNvbmRLZXk/OiBzdHJpbmc7XG4gIGl0ZW1LZXk/OiBzdHJpbmc7XG4gIGluZGV4S2V5Pzogc3RyaW5nO1xuICBhcnJheVJlZj86IHN0cmluZztcbiAgbWF4SXRlbXM/OiBudW1iZXI7XG4gIGlubGluZUNvbmRBdG9tPzogeyBhdG9tOiBzdHJpbmc7IHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiB9O1xufVxuXG5pbnRlcmZhY2UgQWNzR3JhcGgge1xuICBuYW1lOiBzdHJpbmc7XG4gIG1vZGU/OiAna2VybmVsJyB8ICd1c2VyJztcbiAgbWV0YT86IHsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmc7IGNhdGVnb3J5Pzogc3RyaW5nOyBhdXRob3I/OiBzdHJpbmcgfTtcbiAgaW5wdXQ/OiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0+O1xuICBvdXRwdXQ/OiBzdHJpbmc7XG4gIG5vZGVzOiBBY3NOb2RlW107XG59XG5cbmV4cG9ydCBjbGFzcyBBY3NQYXJzZXIge1xuICBwcml2YXRlIHBvcyA9IDA7XG4gIHByaXZhdGUgc3JjID0gJyc7XG5cbiAgcGFyc2UodGV4dDogc3RyaW5nKTogQWNzR3JhcGgge1xuICAgIHRoaXMuc3JjID0gdGV4dC50cmltKCk7XG4gICAgdGhpcy5wb3MgPSAwO1xuICAgIHJldHVybiB0aGlzLnBhcnNlR3JhcGgoKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VHcmFwaCgpOiBBY3NHcmFwaCB7XG4gICAgdGhpcy5leHBlY3QoJ2dyYXBoJyk7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVhZElkZW50aWZpZXIoKTtcbiAgICB0aGlzLmV4cGVjdCgneycpO1xuXG4gICAgY29uc3QgZ3JhcGg6IEFjc0dyYXBoID0geyBuYW1lLCBub2RlczogW10gfTtcblxuICAgIHdoaWxlICghdGhpcy5wZWVrKCd9JykgJiYgdGhpcy5wb3MgPCB0aGlzLnNyYy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuXG4gICAgICBpZiAodGhpcy5wZWVrKCdtb2RlOicpKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSg1KTtcbiAgICAgICAgZ3JhcGgubW9kZSA9IHRoaXMucmVhZElkZW50aWZpZXIoKSBhcyAna2VybmVsJyB8ICd1c2VyJztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wZWVrKCdtZXRhOicpKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSg1KTtcbiAgICAgICAgZ3JhcGgubWV0YSA9IHRoaXMucGFyc2VNZXRhRGVjbCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBlZWsoJ2luOicpKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgzKTtcbiAgICAgICAgZ3JhcGguaW5wdXQgPSB0aGlzLnBhcnNlSW5wdXREZWNsKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucGVlaygnb3V0OicpKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSg0KTtcbiAgICAgICAgZ3JhcGgub3V0cHV0ID0gdGhpcy5yZWFkSWRlbnRpZmllcigpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBlZWsoJ2xldCcpKSB7XG4gICAgICAgIGdyYXBoLm5vZGVzLnB1c2godGhpcy5wYXJzZUxldCgpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wZWVrKCdpZicpKSB7XG4gICAgICAgIGdyYXBoLm5vZGVzLnB1c2godGhpcy5wYXJzZUlmKCkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBlZWsoJ2xvb3AnKSkge1xuICAgICAgICBncmFwaC5ub2Rlcy5wdXNoKHRoaXMucGFyc2VMb29wKCkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBlZWsoJ2ZvckVhY2gnKSkge1xuICAgICAgICBncmFwaC5ub2Rlcy5wdXNoKHRoaXMucGFyc2VGb3JFYWNoKCkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBlZWsoJ2ZpbHRlcicpKSB7XG4gICAgICAgIGdyYXBoLm5vZGVzLnB1c2godGhpcy5wYXJzZUZpbHRlcigpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQUNTIHBhcnNlIGVycm9yIGF0IHBvcyAke3RoaXMucG9zfTogdW5leHBlY3RlZCBcIiR7dGhpcy5zcmMuc2xpY2UodGhpcy5wb3MsIHRoaXMucG9zICsgMjApfVwiYCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIH1cblxuICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG4gICAgcmV0dXJuIGdyYXBoO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUxldCgpOiBBY3NOb2RlIHtcbiAgICB0aGlzLmV4cGVjdCgnbGV0Jyk7XG4gICAgY29uc3QgaWQgPSB0aGlzLnJlYWRJZGVudGlmaWVyKCk7XG4gICAgdGhpcy5leHBlY3QoJz0nKTtcbiAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICBpZiAodGhpcy5wZWVrKCdpZicpKSB7XG4gICAgICBjb25zdCBpZk5vZGUgPSB0aGlzLnBhcnNlSWYoKTtcbiAgICAgIGlmTm9kZS5pZCA9IGlkO1xuICAgICAgcmV0dXJuIGlmTm9kZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGVlaygnZm9yRWFjaCcpKSB7XG4gICAgICBjb25zdCBmb3JFYWNoTm9kZSA9IHRoaXMucGFyc2VGb3JFYWNoKCk7XG4gICAgICBmb3JFYWNoTm9kZS5pZCA9IGlkO1xuICAgICAgcmV0dXJuIGZvckVhY2hOb2RlO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZWVrKCdsb29wJykpIHtcbiAgICAgIGNvbnN0IGxvb3BOb2RlID0gdGhpcy5wYXJzZUxvb3AoKTtcbiAgICAgIGxvb3BOb2RlLmlkID0gaWQ7XG4gICAgICByZXR1cm4gbG9vcE5vZGU7XG4gICAgfVxuICAgIGlmICh0aGlzLnBlZWsoJ2ZpbHRlcicpKSB7XG4gICAgICBjb25zdCBmaWx0ZXJOb2RlID0gdGhpcy5wYXJzZUZpbHRlcigpO1xuICAgICAgZmlsdGVyTm9kZS5pZCA9IGlkO1xuICAgICAgcmV0dXJuIGZpbHRlck5vZGU7XG4gICAgfVxuICAgIGNvbnN0IGF0b20gPSB0aGlzLnJlYWRJZGVudGlmaWVyKCk7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5wYXJzZVBhcmFtcygpO1xuICAgIHJldHVybiB7IHR5cGU6ICdsZXQnLCBpZCwgYXRvbSwgcGFyYW1zIH07XG4gIH1cblxuICBwcml2YXRlIHBhcnNlSWYoKTogQWNzTm9kZSB7XG4gICAgdGhpcy5leHBlY3QoJ2lmJyk7XG4gICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG5cbiAgICBjb25zdCBzYXZlZFBvcyA9IHRoaXMucG9zO1xuICAgIGNvbnN0IGZpcnN0SWRlbnQgPSB0aGlzLnJlYWRJZGVudGlmaWVyKCk7XG4gICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG5cbiAgICBsZXQgcmVmOiBzdHJpbmc7XG4gICAgbGV0IGlubGluZUNvbmRBdG9tOiB7IGF0b206IHN0cmluZzsgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodGhpcy5wZWVrKCcoJykpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMucGFyc2VQYXJhbXMoKTtcbiAgICAgIGlubGluZUNvbmRBdG9tID0geyBhdG9tOiBmaXJzdElkZW50LCBwYXJhbXMgfTtcbiAgICAgIHJlZiA9IGBfX2lubGluZV9jb25kXyR7c2F2ZWRQb3N9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVmID0gZmlyc3RJZGVudDtcbiAgICB9XG5cbiAgICB0aGlzLmV4cGVjdCgneycpO1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLnBhcnNlQm9keSgpO1xuICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG5cbiAgICBsZXQgZWxzZUJvZHk6IEFjc05vZGVbXSB8IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICBpZiAodGhpcy5wZWVrKCdlbHNlJykpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSg0KTtcbiAgICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG4gICAgICBlbHNlQm9keSA9IHRoaXMucGFyc2VCb2R5KCk7XG4gICAgICB0aGlzLmV4cGVjdCgnfScpO1xuICAgIH1cblxuICAgIGNvbnN0IGlmTm9kZTogQWNzTm9kZSA9IHsgdHlwZTogJ2lmJywgcmVmLCBib2R5LCBlbHNlQm9keSB9O1xuICAgIGlmIChpbmxpbmVDb25kQXRvbSkge1xuICAgICAgaWZOb2RlLmlubGluZUNvbmRBdG9tID0gaW5saW5lQ29uZEF0b207XG4gICAgfVxuICAgIHJldHVybiBpZk5vZGU7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlTG9vcCgpOiBBY3NOb2RlIHtcbiAgICB0aGlzLmV4cGVjdCgnbG9vcCcpO1xuICAgIGxldCBtYXhJdGVyYXRpb25zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGNvbmRLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIGlmICh0aGlzLnBlZWsoJ21heDonKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKDQpO1xuICAgICAgbWF4SXRlcmF0aW9ucyA9IHRoaXMucmVhZE51bWJlcigpO1xuICAgIH1cbiAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICBpZiAodGhpcy5wZWVrKCdjb25kOicpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoNSk7XG4gICAgICBjb25kS2V5ID0gdGhpcy5yZWFkU3RyaW5nKCkgfHwgdGhpcy5yZWFkSWRlbnRpZmllcigpO1xuICAgIH1cblxuICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG4gICAgY29uc3QgYm9keSA9IHRoaXMucGFyc2VCb2R5KCk7XG4gICAgdGhpcy5leHBlY3QoJ30nKTtcblxuICAgIHJldHVybiB7IHR5cGU6ICdsb29wJywgbWF4SXRlcmF0aW9ucywgY29uZEtleSwgYm9keSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUZvckVhY2goKTogQWNzTm9kZSB7XG4gICAgdGhpcy5leHBlY3QoJ2ZvckVhY2gnKTtcbiAgICBjb25zdCBpdGVtS2V5ID0gdGhpcy5yZWFkSWRlbnRpZmllcigpO1xuICAgIGxldCBpbmRleEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIGlmICh0aGlzLnBlZWsoJywnKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKDEpO1xuICAgICAgaW5kZXhLZXkgPSB0aGlzLnJlYWRJZGVudGlmaWVyKCk7XG4gICAgfVxuICAgIHRoaXMuZXhwZWN0KCdpbicpO1xuICAgIGNvbnN0IGFycmF5UmVmID0gdGhpcy5yZWFkSWRlbnRpZmllcigpO1xuICAgIGxldCBtYXhJdGVtczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgaWYgKHRoaXMucGVlaygnbWF4OicpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoNCk7XG4gICAgICBtYXhJdGVtcyA9IHRoaXMucmVhZE51bWJlcigpO1xuICAgIH1cblxuICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG4gICAgY29uc3QgYm9keSA9IHRoaXMucGFyc2VCb2R5KCk7XG4gICAgdGhpcy5leHBlY3QoJ30nKTtcblxuICAgIHJldHVybiB7IHR5cGU6ICdmb3JFYWNoJywgaXRlbUtleSwgaW5kZXhLZXksIGFycmF5UmVmLCBtYXhJdGVtcywgYm9keSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUZpbHRlcigpOiBBY3NOb2RlIHtcbiAgICB0aGlzLmV4cGVjdCgnZmlsdGVyJyk7XG4gICAgY29uc3QgaXRlbUtleSA9IHRoaXMucmVhZElkZW50aWZpZXIoKTtcbiAgICBsZXQgaW5kZXhLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIGlmICh0aGlzLnBlZWsoJ2luZGV4OicpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoNik7XG4gICAgICBpbmRleEtleSA9IHRoaXMucmVhZElkZW50aWZpZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLmV4cGVjdCgnaW4nKTtcbiAgICBjb25zdCBhcnJheVJlZiA9IHRoaXMucmVhZElkZW50aWZpZXIoKTtcblxuICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG4gICAgY29uc3QgYm9keSA9IHRoaXMucGFyc2VCb2R5KCk7XG4gICAgdGhpcy5leHBlY3QoJ30nKTtcblxuICAgIHJldHVybiB7IHR5cGU6ICdmaWx0ZXInLCBpdGVtS2V5LCBpbmRleEtleSwgYXJyYXlSZWYsIGJvZHkgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VCb2R5KCk6IEFjc05vZGVbXSB7XG4gICAgY29uc3Qgbm9kZXM6IEFjc05vZGVbXSA9IFtdO1xuICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuXG4gICAgd2hpbGUgKCF0aGlzLnBlZWsoJ30nKSAmJiB0aGlzLnBvcyA8IHRoaXMuc3JjLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMucGVlaygnbGV0JykpIG5vZGVzLnB1c2godGhpcy5wYXJzZUxldCgpKTtcbiAgICAgIGVsc2UgaWYgKHRoaXMucGVlaygnaWYnKSkgbm9kZXMucHVzaCh0aGlzLnBhcnNlSWYoKSk7XG4gICAgICBlbHNlIGlmICh0aGlzLnBlZWsoJ2xvb3AnKSkgbm9kZXMucHVzaCh0aGlzLnBhcnNlTG9vcCgpKTtcbiAgICAgIGVsc2UgaWYgKHRoaXMucGVlaygnZm9yRWFjaCcpKSBub2Rlcy5wdXNoKHRoaXMucGFyc2VGb3JFYWNoKCkpO1xuICAgICAgZWxzZSBpZiAodGhpcy5wZWVrKCdmaWx0ZXInKSkgbm9kZXMucHVzaCh0aGlzLnBhcnNlRmlsdGVyKCkpO1xuICAgICAgZWxzZSBicmVhaztcbiAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlcztcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VQYXJhbXMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgaWYgKCF0aGlzLnBlZWsoJygnKSkgcmV0dXJuIHt9O1xuICAgIHRoaXMuYWR2YW5jZSgxKTsgLy8gc2tpcCAoXG5cbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICB3aGlsZSAoIXRoaXMucGVlaygnKScpICYmIHRoaXMucG9zIDwgdGhpcy5zcmMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLnJlYWRJZGVudGlmaWVyKCk7XG4gICAgICB0aGlzLmV4cGVjdCgnOicpO1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlYWRWYWx1ZSgpO1xuICAgICAgcGFyYW1zW2tleV0gPSB2YWx1ZTtcblxuICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICBpZiAodGhpcy5wZWVrKCcsJykpIHRoaXMuYWR2YW5jZSgxKTtcbiAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIH1cblxuICAgIHRoaXMuZXhwZWN0KCcpJyk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VJbnB1dERlY2woKTogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9PiB7XG4gICAgaWYgKHRoaXMucGVlaygnbm9uZScpKSB7IHRoaXMuYWR2YW5jZSg0KTsgcmV0dXJuIFtdOyB9XG4gICAgY29uc3QgcmVzdWx0OiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0+ID0gW107XG4gICAgd2hpbGUgKCF0aGlzLnBlZWsoJ1xcbicpICYmICF0aGlzLnBlZWsoJ30nKSAmJiB0aGlzLnBvcyA8IHRoaXMuc3JjLmxlbmd0aCkge1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMucmVhZElkZW50aWZpZXIoKTtcbiAgICAgIHRoaXMuZXhwZWN0KCc6Jyk7XG4gICAgICBjb25zdCB0eXBlID0gdGhpcy5yZWFkSWRlbnRpZmllcigpO1xuICAgICAgcmVzdWx0LnB1c2goeyBuYW1lLCB0eXBlIH0pO1xuICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICBpZiAodGhpcy5wZWVrKCcsJykpIHRoaXMuYWR2YW5jZSgxKTtcbiAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZU1ldGFEZWNsKCk6IHsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmc7IGNhdGVnb3J5Pzogc3RyaW5nOyBhdXRob3I/OiBzdHJpbmcgfSB7XG4gICAgdGhpcy5leHBlY3QoJ3snKTtcbiAgICBjb25zdCBtZXRhOiBhbnkgPSB7fTtcbiAgICB3aGlsZSAoIXRoaXMucGVlaygnfScpICYmIHRoaXMucG9zIDwgdGhpcy5zcmMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLnJlYWRJZGVudGlmaWVyKCk7XG4gICAgICB0aGlzLmV4cGVjdCgnOicpO1xuICAgICAgbWV0YVtrZXldID0gdGhpcy5yZWFkU3RyaW5nKCkgfHwgdGhpcy5yZWFkSWRlbnRpZmllcigpO1xuICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICBpZiAodGhpcy5wZWVrKCcsJykpIHRoaXMuYWR2YW5jZSgxKTtcbiAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIH1cbiAgICB0aGlzLmV4cGVjdCgnfScpO1xuICAgIHJldHVybiBtZXRhO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkVmFsdWUoKTogYW55IHtcbiAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICBpZiAodGhpcy5wZWVrKCdcIicpKSByZXR1cm4gdGhpcy5yZWFkU3RyaW5nKCk7XG4gICAgaWYgKHRoaXMucGVlayhcIidcIikpIHJldHVybiB0aGlzLnJlYWRTdHJpbmcoKTtcbiAgICBpZiAodGhpcy5zcmNbdGhpcy5wb3NdID09PSAnLScgfHwgdGhpcy5zcmNbdGhpcy5wb3NdID49ICcwJyAmJiB0aGlzLnNyY1t0aGlzLnBvc10gPD0gJzknKSByZXR1cm4gdGhpcy5yZWFkTnVtYmVyKCk7XG4gICAgaWYgKHRoaXMucGVlaygndHJ1ZScpKSB7IHRoaXMuYWR2YW5jZSg0KTsgcmV0dXJuIHRydWU7IH1cbiAgICBpZiAodGhpcy5wZWVrKCdmYWxzZScpKSB7IHRoaXMuYWR2YW5jZSg1KTsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWYgKHRoaXMucGVlaygnbnVsbCcpKSB7IHRoaXMuYWR2YW5jZSg0KTsgcmV0dXJuIG51bGw7IH1cbiAgICBpZiAodGhpcy5wZWVrKCd7eycpKSByZXR1cm4gdGhpcy5yZWFkUmVmZXJlbmNlKCk7XG4gICAgaWYgKHRoaXMucGVlaygneycpKSByZXR1cm4gdGhpcy5yZWFkT2JqZWN0KCk7XG4gICAgaWYgKHRoaXMucGVlaygnWycpKSByZXR1cm4gdGhpcy5yZWFkQXJyYXkoKTtcbiAgICByZXR1cm4gdGhpcy5yZWFkSWRlbnRpZmllcigpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkUmVmZXJlbmNlKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnBvcztcbiAgICB0aGlzLmFkdmFuY2UoMik7XG4gICAgY29uc3QgcmVmID0gdGhpcy5yZWFkVW50aWwoJ319Jyk7XG4gICAgdGhpcy5hZHZhbmNlKDIpO1xuICAgIHJldHVybiBge3ske3JlZn19fWA7XG4gIH1cblxuICBwcml2YXRlIHJlYWRPYmplY3QoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgdGhpcy5leHBlY3QoJ3snKTtcbiAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICB3aGlsZSAoIXRoaXMucGVlaygnfScpICYmIHRoaXMucG9zIDwgdGhpcy5zcmMubGVuZ3RoKSB7XG4gICAgICBsZXQga2V5OiBzdHJpbmc7XG4gICAgICBpZiAodGhpcy5wZWVrKCdcIicpIHx8IHRoaXMucGVlayhcIidcIikpIHtcbiAgICAgICAga2V5ID0gdGhpcy5yZWFkU3RyaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrZXkgPSB0aGlzLnJlYWRJZGVudGlmaWVyKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmV4cGVjdCgnOicpO1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlYWRWYWx1ZSgpO1xuICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgaWYgKHRoaXMucGVlaygnLCcpKSB0aGlzLmFkdmFuY2UoMSk7XG4gICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICB9XG4gICAgdGhpcy5leHBlY3QoJ30nKTtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkQXJyYXkoKTogYW55W10ge1xuICAgIHRoaXMuZXhwZWN0KCdbJyk7XG4gICAgY29uc3QgYXJyOiBhbnlbXSA9IFtdO1xuICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIHdoaWxlICghdGhpcy5wZWVrKCddJykgJiYgdGhpcy5wb3MgPCB0aGlzLnNyYy5sZW5ndGgpIHtcbiAgICAgIGFyci5wdXNoKHRoaXMucmVhZFZhbHVlKCkpO1xuICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICBpZiAodGhpcy5wZWVrKCcsJykpIHRoaXMuYWR2YW5jZSgxKTtcbiAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIH1cbiAgICB0aGlzLmV4cGVjdCgnXScpO1xuICAgIHJldHVybiBhcnI7XG4gIH1cblxuICBwcml2YXRlIHNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTogdm9pZCB7XG4gICAgd2hpbGUgKHRoaXMucG9zIDwgdGhpcy5zcmMubGVuZ3RoKSB7XG4gICAgICBpZiAoL1xccy8udGVzdCh0aGlzLnNyY1t0aGlzLnBvc10pKSB7IHRoaXMucG9zKys7IGNvbnRpbnVlOyB9XG4gICAgICBpZiAodGhpcy5zcmNbdGhpcy5wb3NdID09PSAnLycgJiYgdGhpcy5zcmNbdGhpcy5wb3MgKyAxXSA9PT0gJy8nKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IHRoaXMuc3JjLmxlbmd0aCAmJiB0aGlzLnNyY1t0aGlzLnBvc10gIT09ICdcXG4nKSB0aGlzLnBvcysrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGVlayhzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zcmMuc2xpY2UodGhpcy5wb3MsIHRoaXMucG9zICsgcy5sZW5ndGgpID09PSBzO1xuICB9XG5cbiAgcHJpdmF0ZSBleHBlY3Qoczogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgaWYgKCF0aGlzLnBlZWsocykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQUNTIHBhcnNlIGVycm9yIGF0IHBvcyAke3RoaXMucG9zfTogZXhwZWN0ZWQgXCIke3N9XCIsIGdvdCBcIiR7dGhpcy5zcmMuc2xpY2UodGhpcy5wb3MsIHRoaXMucG9zICsgMTApfVwiYCk7XG4gICAgfVxuICAgIHRoaXMucG9zICs9IHMubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBhZHZhbmNlKG46IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucG9zICs9IG47XG4gIH1cblxuICBwcml2YXRlIHJlYWRJZGVudGlmaWVyKCk6IHN0cmluZyB7XG4gICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgd2hpbGUgKHRoaXMucG9zIDwgdGhpcy5zcmMubGVuZ3RoICYmIC9bYS16QS1aMC05X0BcXC0vLl0vLnRlc3QodGhpcy5zcmNbdGhpcy5wb3NdKSkgdGhpcy5wb3MrKztcbiAgICBpZiAodGhpcy5wb3MgPT09IHN0YXJ0KSB0aHJvdyBuZXcgRXJyb3IoYEFDUyBwYXJzZSBlcnJvciBhdCBwb3MgJHt0aGlzLnBvc306IGV4cGVjdGVkIGlkZW50aWZpZXJgKTtcbiAgICByZXR1cm4gdGhpcy5zcmMuc2xpY2Uoc3RhcnQsIHRoaXMucG9zKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZE51bWJlcigpOiBudW1iZXIge1xuICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgIGxldCBzdGFydCA9IHRoaXMucG9zO1xuICAgIGlmICh0aGlzLnNyY1t0aGlzLnBvc10gPT09ICctJykgdGhpcy5wb3MrKztcbiAgICB3aGlsZSAodGhpcy5wb3MgPCB0aGlzLnNyYy5sZW5ndGggJiYgL1swLTkuXS8udGVzdCh0aGlzLnNyY1t0aGlzLnBvc10pKSB0aGlzLnBvcysrO1xuICAgIHJldHVybiBOdW1iZXIodGhpcy5zcmMuc2xpY2Uoc3RhcnQsIHRoaXMucG9zKSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRTdHJpbmcoKTogc3RyaW5nIHtcbiAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICBjb25zdCBxdW90ZSA9IHRoaXMuc3JjW3RoaXMucG9zXTtcbiAgICBpZiAocXVvdGUgIT09ICdcIicgJiYgcXVvdGUgIT09IFwiJ1wiKSB0aHJvdyBuZXcgRXJyb3IoYEFDUyBwYXJzZSBlcnJvciBhdCBwb3MgJHt0aGlzLnBvc306IGV4cGVjdGVkIHN0cmluZ2ApO1xuICAgIHRoaXMucG9zKys7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIHdoaWxlICh0aGlzLnBvcyA8IHRoaXMuc3JjLmxlbmd0aCAmJiB0aGlzLnNyY1t0aGlzLnBvc10gIT09IHF1b3RlKSB7XG4gICAgICBpZiAodGhpcy5zcmNbdGhpcy5wb3NdID09PSAnXFxcXCcpIHtcbiAgICAgICAgdGhpcy5wb3MrKztcbiAgICAgICAgY29uc3QgY2ggPSB0aGlzLnNyY1t0aGlzLnBvc107XG4gICAgICAgIGlmIChjaCA9PT0gJ24nKSByZXN1bHQgKz0gJ1xcbic7XG4gICAgICAgIGVsc2UgaWYgKGNoID09PSAndCcpIHJlc3VsdCArPSAnXFx0JztcbiAgICAgICAgZWxzZSBpZiAoY2ggPT09ICdyJykgcmVzdWx0ICs9ICdcXHInO1xuICAgICAgICBlbHNlIGlmIChjaCA9PT0gJ1xcXFwnKSByZXN1bHQgKz0gJ1xcXFwnO1xuICAgICAgICBlbHNlIGlmIChjaCA9PT0gcXVvdGUpIHJlc3VsdCArPSBxdW90ZTtcbiAgICAgICAgZWxzZSBpZiAoY2ggPT09ICd7JykgcmVzdWx0ICs9ICdcXFxceyc7XG4gICAgICAgIGVsc2UgcmVzdWx0ICs9IGNoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IHRoaXMuc3JjW3RoaXMucG9zXTtcbiAgICAgIH1cbiAgICAgIHRoaXMucG9zKys7XG4gICAgfVxuICAgIHRoaXMucG9zKys7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZFVudGlsKGVuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgd2hpbGUgKHRoaXMucG9zIDwgdGhpcy5zcmMubGVuZ3RoICYmICF0aGlzLnBlZWsoZW5kKSkge1xuICAgICAgcmVzdWx0ICs9IHRoaXMuc3JjW3RoaXMucG9zXTtcbiAgICAgIHRoaXMucG9zKys7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjc0NvbXBpbGVyIHtcbiAgY29tcGlsZShhY3NHcmFwaDogQWNzR3JhcGgpOiBHcmFwaCB7XG4gICAgY29uc3QgZ3JhcGg6IEdyYXBoID0ge1xuICAgICAgb3JkZXI6IFtdLFxuICAgICAgbm9kZXM6IHt9LFxuICAgIH07XG5cbiAgICBpZiAoYWNzR3JhcGgubW9kZSkgZ3JhcGgubW9kZSA9IGFjc0dyYXBoLm1vZGU7XG4gICAgaWYgKGFjc0dyYXBoLm1ldGEpIGdyYXBoLl9tZXRhID0gYWNzR3JhcGgubWV0YTtcbiAgICBpZiAoYWNzR3JhcGguaW5wdXQgJiYgYWNzR3JhcGguaW5wdXQubGVuZ3RoID4gMCkge1xuICAgICAgZ3JhcGguaW50ZXJmYWNlID0ge1xuICAgICAgICBpbnB1dDogYWNzR3JhcGguaW5wdXQubWFwKGkgPT4gKHsgbmFtZTogaS5uYW1lLCB0eXBlOiBpLnR5cGUgfSkpLFxuICAgICAgICBvdXRwdXQ6IHsgdHlwZTogYWNzR3JhcGgub3V0cHV0IHx8ICd2b2lkJyB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbXBpbGVOb2RlcyhhY3NHcmFwaC5ub2RlcywgZ3JhcGgpO1xuXG4gICAgcmV0dXJuIGdyYXBoO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21waWxlTm9kZXMoYWNzTm9kZXM6IEFjc05vZGVbXSwgZ3JhcGg6IEdyYXBoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIGFjc05vZGVzKSB7XG4gICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICBjYXNlICdsZXQnOiB7XG4gICAgICAgICAgY29uc3QgZ3JhcGhOb2RlOiBHcmFwaE5vZGUgPSB7IGF0b206IG5vZGUuYXRvbSEsIC4uLm5vZGUucGFyYW1zIH07XG4gICAgICAgICAgZ3JhcGgub3JkZXIucHVzaChub2RlLmlkISk7XG4gICAgICAgICAgZ3JhcGgubm9kZXNbbm9kZS5pZCFdID0gZ3JhcGhOb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2lmJzoge1xuICAgICAgICAgIGlmIChub2RlLmlubGluZUNvbmRBdG9tKSB7XG4gICAgICAgICAgICBjb25zdCBjb25kTm9kZUlkID0gbm9kZS5yZWYhO1xuICAgICAgICAgICAgY29uc3QgY29uZEdyYXBoTm9kZTogR3JhcGhOb2RlID0geyBhdG9tOiBub2RlLmlubGluZUNvbmRBdG9tLmF0b20sIC4uLm5vZGUuaW5saW5lQ29uZEF0b20ucGFyYW1zIH07XG4gICAgICAgICAgICBncmFwaC5vcmRlci5wdXNoKGNvbmROb2RlSWQpO1xuICAgICAgICAgICAgZ3JhcGgubm9kZXNbY29uZE5vZGVJZF0gPSBjb25kR3JhcGhOb2RlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBpZk5vZGVJZDogc3RyaW5nO1xuICAgICAgICAgIGlmIChub2RlLmlkKSB7XG4gICAgICAgICAgICBpZk5vZGVJZCA9IG5vZGUuaWQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmTm9kZUlkID0gYGlmXyR7bm9kZS5yZWZ9YDtcbiAgICAgICAgICAgIGlmIChncmFwaC5ub2Rlc1tpZk5vZGVJZF0pIHtcbiAgICAgICAgICAgICAgaWZOb2RlSWQgPSBgaWZfJHtub2RlLnJlZn1fJHtncmFwaC5vcmRlci5sZW5ndGh9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdGhlbkdyYXBoID0gdGhpcy5jb21waWxlU3ViR3JhcGgobm9kZS5ib2R5IHx8IFtdKTtcbiAgICAgICAgICBjb25zdCBlbHNlR3JhcGggPSBub2RlLmVsc2VCb2R5ID8gdGhpcy5jb21waWxlU3ViR3JhcGgobm9kZS5lbHNlQm9keSkgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBjb25zdCBncmFwaE5vZGU6IEdyYXBoTm9kZSA9IHtcbiAgICAgICAgICAgIGF0b206ICdicmFuY2gnLFxuICAgICAgICAgICAgY29uZDogYHt7JHtub2RlLnJlZn19fWAsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodGhlbkdyYXBoLm9yZGVyLmxlbmd0aCA+IDAgfHwgIWVsc2VHcmFwaCkgZ3JhcGhOb2RlLnRoZW4gPSB0aGVuR3JhcGg7XG4gICAgICAgICAgaWYgKGVsc2VHcmFwaCkgZ3JhcGhOb2RlLmVsc2UgPSBlbHNlR3JhcGg7XG5cbiAgICAgICAgICBncmFwaC5vcmRlci5wdXNoKGlmTm9kZUlkKTtcbiAgICAgICAgICBncmFwaC5ub2Rlc1tpZk5vZGVJZF0gPSBncmFwaE5vZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbG9vcCc6IHtcbiAgICAgICAgICBjb25zdCBsb29wTm9kZUlkID0gbm9kZS5pZCB8fCBgbG9vcF8ke2dyYXBoLm9yZGVyLmxlbmd0aH1gO1xuICAgICAgICAgIGNvbnN0IGJvZHlHcmFwaCA9IHRoaXMuY29tcGlsZVN1YkdyYXBoKG5vZGUuYm9keSB8fCBbXSk7XG5cbiAgICAgICAgICBjb25zdCBncmFwaE5vZGU6IEdyYXBoTm9kZSA9IHtcbiAgICAgICAgICAgIGF0b206ICdsb29wJyxcbiAgICAgICAgICAgIG5vZGVzOiBib2R5R3JhcGgsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAobm9kZS5tYXhJdGVyYXRpb25zKSBncmFwaE5vZGUubWF4SXRlcmF0aW9ucyA9IG5vZGUubWF4SXRlcmF0aW9ucztcbiAgICAgICAgICBpZiAobm9kZS5jb25kS2V5KSBncmFwaE5vZGUuY29uZEtleSA9IG5vZGUuY29uZEtleTtcblxuICAgICAgICAgIGdyYXBoLm9yZGVyLnB1c2gobG9vcE5vZGVJZCk7XG4gICAgICAgICAgZ3JhcGgubm9kZXNbbG9vcE5vZGVJZF0gPSBncmFwaE5vZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZm9yRWFjaCc6IHtcbiAgICAgICAgICBjb25zdCBmZU5vZGVJZCA9IG5vZGUuaWQgfHwgYGZvckVhY2hfJHtncmFwaC5vcmRlci5sZW5ndGh9YDtcbiAgICAgICAgICBjb25zdCBib2R5R3JhcGggPSB0aGlzLmNvbXBpbGVTdWJHcmFwaChub2RlLmJvZHkgfHwgW10pO1xuXG4gICAgICAgICAgY29uc3QgZ3JhcGhOb2RlOiBHcmFwaE5vZGUgPSB7XG4gICAgICAgICAgICBhdG9tOiAnZm9yRWFjaCcsXG4gICAgICAgICAgICBhcnJheTogYHt7JHtub2RlLmFycmF5UmVmfX19YCxcbiAgICAgICAgICAgIG5vZGVzOiBib2R5R3JhcGgsXG4gICAgICAgICAgICBpdGVtS2V5OiBub2RlLml0ZW1LZXksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAobm9kZS5pbmRleEtleSkgZ3JhcGhOb2RlLmluZGV4S2V5ID0gbm9kZS5pbmRleEtleTtcbiAgICAgICAgICBpZiAobm9kZS5tYXhJdGVtcykgZ3JhcGhOb2RlLm1heEl0ZW1zID0gbm9kZS5tYXhJdGVtcztcblxuICAgICAgICAgIGdyYXBoLm9yZGVyLnB1c2goZmVOb2RlSWQpO1xuICAgICAgICAgIGdyYXBoLm5vZGVzW2ZlTm9kZUlkXSA9IGdyYXBoTm9kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdmaWx0ZXInOiB7XG4gICAgICAgICAgY29uc3QgZk5vZGVJZCA9IG5vZGUuaWQgfHwgYGZpbHRlcl8ke2dyYXBoLm9yZGVyLmxlbmd0aH1gO1xuICAgICAgICAgIGNvbnN0IGJvZHlHcmFwaCA9IHRoaXMuY29tcGlsZVN1YkdyYXBoKG5vZGUuYm9keSB8fCBbXSk7XG5cbiAgICAgICAgICBjb25zdCBncmFwaE5vZGU6IEdyYXBoTm9kZSA9IHtcbiAgICAgICAgICAgIGF0b206ICdmaWx0ZXInLFxuICAgICAgICAgICAgYXJyYXk6IGB7eyR7bm9kZS5hcnJheVJlZn19fWAsXG4gICAgICAgICAgICBub2RlczogYm9keUdyYXBoLFxuICAgICAgICAgICAgaXRlbUtleTogbm9kZS5pdGVtS2V5LFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKG5vZGUuaW5kZXhLZXkpIGdyYXBoTm9kZS5pbmRleEtleSA9IG5vZGUuaW5kZXhLZXk7XG5cbiAgICAgICAgICBncmFwaC5vcmRlci5wdXNoKGZOb2RlSWQpO1xuICAgICAgICAgIGdyYXBoLm5vZGVzW2ZOb2RlSWRdID0gZ3JhcGhOb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb21waWxlU3ViR3JhcGgoYWNzTm9kZXM6IEFjc05vZGVbXSk6IEdyYXBoIHtcbiAgICBjb25zdCBncmFwaDogR3JhcGggPSB7IG9yZGVyOiBbXSwgbm9kZXM6IHt9IH07XG4gICAgdGhpcy5jb21waWxlTm9kZXMoYWNzTm9kZXMsIGdyYXBoKTtcbiAgICByZXR1cm4gZ3JhcGg7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjc0RlY29tcGlsZXIge1xuICBkZWNvbXBpbGUoZ3JhcGg6IEdyYXBoLCBuYW1lOiBzdHJpbmcgPSAndW5uYW1lZCcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxpbmVzLnB1c2goYGdyYXBoICR7bmFtZX0ge2ApO1xuXG4gICAgaWYgKGdyYXBoLm1vZGUpIGxpbmVzLnB1c2goYCAgbW9kZTogJHtncmFwaC5tb2RlfWApO1xuICAgIGlmIChncmFwaC5fbWV0YSkge1xuICAgICAgY29uc3QgcGFydHMgPSBPYmplY3QuZW50cmllcyhncmFwaC5fbWV0YSkubWFwKChbaywgdl0pID0+IGAke2t9OiBcIiR7dn1cImApLmpvaW4oJywgJyk7XG4gICAgICBsaW5lcy5wdXNoKGAgIG1ldGE6IHsgJHtwYXJ0c30gfWApO1xuICAgIH1cbiAgICBpZiAoZ3JhcGguaW50ZXJmYWNlKSB7XG4gICAgICBpZiAoZ3JhcGguaW50ZXJmYWNlLmlucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBsaW5lcy5wdXNoKGAgIGluOiBub25lYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpblN0ciA9IGdyYXBoLmludGVyZmFjZS5pbnB1dC5tYXAoaSA9PiBgJHtpLm5hbWV9OiAke2kudHlwZX1gKS5qb2luKCcsICcpO1xuICAgICAgICBsaW5lcy5wdXNoKGAgIGluOiAke2luU3RyfWApO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaChgICBvdXQ6ICR7Z3JhcGguaW50ZXJmYWNlLm91dHB1dC50eXBlfWApO1xuICAgIH1cblxuICAgIGxpbmVzLnB1c2goJycpO1xuICAgIGZvciAoY29uc3Qgbm9kZUlkIG9mIGdyYXBoLm9yZGVyKSB7XG4gICAgICBjb25zdCBub2RlID0gZ3JhcGgubm9kZXNbbm9kZUlkXTtcbiAgICAgIGlmIChub2RlSWQuc3RhcnRzV2l0aCgnX19pbmxpbmVfY29uZF8nKSAmJiBub2RlLmF0b20gIT09ICdicmFuY2gnKSBjb250aW51ZTtcbiAgICAgIGxpbmVzLnB1c2goLi4udGhpcy5kZWNvbXBpbGVOb2RlKG5vZGVJZCwgbm9kZSwgMSwgZ3JhcGgubm9kZXMpKTtcbiAgICB9XG5cbiAgICBsaW5lcy5wdXNoKCd9Jyk7XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWNvbXBpbGVOb2RlKG5vZGVJZDogc3RyaW5nLCBub2RlOiBHcmFwaE5vZGUsIGluZGVudDogbnVtYmVyLCBhbGxOb2Rlcz86IFJlY29yZDxzdHJpbmcsIEdyYXBoTm9kZT4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcHJlZml4ID0gJyAgJy5yZXBlYXQoaW5kZW50KTtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChub2RlLmF0b20gPT09ICdicmFuY2gnKSB7XG4gICAgICBjb25zdCBjb25kUmVmID0gdGhpcy5leHRyYWN0Q29uZFJlZihub2RlLmNvbmQpO1xuICAgICAgY29uc3QgaXNOYW1lZElmID0gbm9kZUlkICYmICFub2RlSWQuc3RhcnRzV2l0aCgnaWZfJyk7XG4gICAgICBjb25zdCBpZlByZWZpeCA9IGlzTmFtZWRJZiA/IGAke3ByZWZpeH1sZXQgJHtub2RlSWR9ID0gYCA6ICcnO1xuXG4gICAgICBsZXQgY29uZFN0ciA9IGNvbmRSZWYgfHwgbm9kZUlkO1xuICAgICAgaWYgKGNvbmRSZWYgJiYgY29uZFJlZi5zdGFydHNXaXRoKCdfX2lubGluZV9jb25kXycpICYmIGFsbE5vZGVzICYmIGFsbE5vZGVzW2NvbmRSZWZdKSB7XG4gICAgICAgIGNvbnN0IGNvbmROb2RlID0gYWxsTm9kZXNbY29uZFJlZl07XG4gICAgICAgIGNvbnN0IGNvbmRQYXJhbXMgPSB0aGlzLmZvcm1hdFBhcmFtcyhjb25kTm9kZSk7XG4gICAgICAgIGNvbmRTdHIgPSBgJHtjb25kTm9kZS5hdG9tfSgke2NvbmRQYXJhbXN9KWA7XG4gICAgICAgIGxpbmVzLnB1c2goYCR7aWZQcmVmaXh9aWYgJHtjb25kU3RyfSB7YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lcy5wdXNoKGAke2lmUHJlZml4fWlmICR7Y29uZFN0cn0ge2ApO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUudGhlbikgbGluZXMucHVzaCguLi50aGlzLmRlY29tcGlsZVN1YkdyYXBoKG5vZGUudGhlbiwgaW5kZW50ICsgMSkpO1xuICAgICAgaWYgKG5vZGUuZWxzZSkge1xuICAgICAgICBsaW5lcy5wdXNoKGAke3ByZWZpeH19IGVsc2Uge2ApO1xuICAgICAgICBsaW5lcy5wdXNoKC4uLnRoaXMuZGVjb21waWxlU3ViR3JhcGgobm9kZS5lbHNlLCBpbmRlbnQgKyAxKSk7XG4gICAgICB9XG4gICAgICBsaW5lcy5wdXNoKGAke3ByZWZpeH19YCk7XG4gICAgfSBlbHNlIGlmIChub2RlLmF0b20gPT09ICdsb29wJykge1xuICAgICAgY29uc3QgaXNOYW1lZExvb3AgPSBub2RlSWQgJiYgIW5vZGVJZC5zdGFydHNXaXRoKCdsb29wXycpO1xuICAgICAgY29uc3QgbG9vcFByZWZpeCA9IGlzTmFtZWRMb29wID8gYCR7cHJlZml4fWxldCAke25vZGVJZH0gPSBgIDogJyc7XG4gICAgICBjb25zdCBleHRyYXM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAobm9kZS5tYXhJdGVyYXRpb25zKSBleHRyYXMucHVzaChgbWF4OiAke25vZGUubWF4SXRlcmF0aW9uc31gKTtcbiAgICAgIGlmIChub2RlLmNvbmRLZXkpIGV4dHJhcy5wdXNoKGBjb25kOiBcIiR7bm9kZS5jb25kS2V5fVwiYCk7XG4gICAgICBsaW5lcy5wdXNoKGAke2xvb3BQcmVmaXh9bG9vcCAke2V4dHJhcy5qb2luKCcgJyl9IHtgKTtcbiAgICAgIGlmIChub2RlLm5vZGVzKSBsaW5lcy5wdXNoKC4uLnRoaXMuZGVjb21waWxlU3ViR3JhcGgobm9kZS5ub2RlcywgaW5kZW50ICsgMSkpO1xuICAgICAgbGluZXMucHVzaChgJHtwcmVmaXh9fWApO1xuICAgIH0gZWxzZSBpZiAobm9kZS5hdG9tID09PSAnZm9yRWFjaCcpIHtcbiAgICAgIGNvbnN0IGlzTmFtZWRGb3JFYWNoID0gbm9kZUlkICYmICFub2RlSWQuc3RhcnRzV2l0aCgnZm9yRWFjaF8nKTtcbiAgICAgIGNvbnN0IGZlUHJlZml4ID0gaXNOYW1lZEZvckVhY2ggPyBgJHtwcmVmaXh9bGV0ICR7bm9kZUlkfSA9IGAgOiAnJztcbiAgICAgIGNvbnN0IGV4dHJhczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmIChub2RlLm1heEl0ZW1zKSBleHRyYXMucHVzaChgbWF4OiAke25vZGUubWF4SXRlbXN9YCk7XG4gICAgICBjb25zdCBpZHggPSBub2RlLmluZGV4S2V5ID8gYCwgJHtub2RlLmluZGV4S2V5fWAgOiAnJztcbiAgICAgIGxpbmVzLnB1c2goYCR7ZmVQcmVmaXh9Zm9yRWFjaCAke25vZGUuaXRlbUtleSB8fCAnaXRlbSd9JHtpZHh9IGluICR7dGhpcy5leHRyYWN0QXJyYXlSZWYobm9kZS5hcnJheSl9ICR7ZXh0cmFzLmpvaW4oJyAnKX0ge2ApO1xuICAgICAgaWYgKG5vZGUubm9kZXMpIGxpbmVzLnB1c2goLi4udGhpcy5kZWNvbXBpbGVTdWJHcmFwaChub2RlLm5vZGVzLCBpbmRlbnQgKyAxKSk7XG4gICAgICBsaW5lcy5wdXNoKGAke3ByZWZpeH19YCk7XG4gICAgfSBlbHNlIGlmIChub2RlLmF0b20gPT09ICdmaWx0ZXInKSB7XG4gICAgICBjb25zdCBpc05hbWVkRmlsdGVyID0gbm9kZUlkICYmICFub2RlSWQuc3RhcnRzV2l0aCgnZmlsdGVyXycpO1xuICAgICAgY29uc3QgZlByZWZpeCA9IGlzTmFtZWRGaWx0ZXIgPyBgJHtwcmVmaXh9bGV0ICR7bm9kZUlkfSA9IGAgOiAnJztcbiAgICAgIGNvbnN0IGlkeCA9IG5vZGUuaW5kZXhLZXkgPyBgIGluZGV4OiAke25vZGUuaW5kZXhLZXl9YCA6ICcnO1xuICAgICAgbGluZXMucHVzaChgJHtmUHJlZml4fWZpbHRlciAke25vZGUuaXRlbUtleSB8fCAnaXRlbSd9JHtpZHh9IGluICR7dGhpcy5leHRyYWN0QXJyYXlSZWYobm9kZS5hcnJheSl9IHtgKTtcbiAgICAgIGlmIChub2RlLm5vZGVzKSBsaW5lcy5wdXNoKC4uLnRoaXMuZGVjb21waWxlU3ViR3JhcGgobm9kZS5ub2RlcywgaW5kZW50ICsgMSkpO1xuICAgICAgbGluZXMucHVzaChgJHtwcmVmaXh9fWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmZvcm1hdFBhcmFtcyhub2RlKTtcbiAgICAgIGxpbmVzLnB1c2goYCR7cHJlZml4fWxldCAke25vZGVJZH0gPSAke25vZGUuYXRvbX0oJHtwYXJhbXN9KWApO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcztcbiAgfVxuXG4gIHByaXZhdGUgZGVjb21waWxlU3ViR3JhcGgoZ3JhcGg6IEdyYXBoLCBpbmRlbnQ6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG5vZGVJZCBvZiBncmFwaC5vcmRlcikge1xuICAgICAgaWYgKG5vZGVJZC5zdGFydHNXaXRoKCdfX2lubGluZV9jb25kXycpICYmIGdyYXBoLm5vZGVzW25vZGVJZF0uYXRvbSAhPT0gJ2JyYW5jaCcpIGNvbnRpbnVlO1xuICAgICAgbGluZXMucHVzaCguLi50aGlzLmRlY29tcGlsZU5vZGUobm9kZUlkLCBncmFwaC5ub2Rlc1tub2RlSWRdLCBpbmRlbnQsIGdyYXBoLm5vZGVzKSk7XG4gICAgfVxuICAgIHJldHVybiBsaW5lcztcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0UGFyYW1zKG5vZGU6IEdyYXBoTm9kZSk6IHN0cmluZyB7XG4gICAgY29uc3QgU0tJUCA9IG5ldyBTZXQoWydhdG9tJywgJ25vZGVzJywgJ3RoZW4nLCAnZWxzZScsICdjb25kJywgJ21heEl0ZXJhdGlvbnMnLCAnaXRlbUtleScsICdtYXhJdGVtcyddKTtcbiAgICBpZiAobm9kZS5hdG9tID09PSAnZm9yRWFjaCcgfHwgbm9kZS5hdG9tID09PSAnZmlsdGVyJykgU0tJUC5hZGQoJ2FycmF5Jyk7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICAgIGlmIChTS0lQLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIHBhcnRzLnB1c2goYCR7a2V5fTogJHt0aGlzLmZvcm1hdFZhbHVlKHZhbHVlKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJywgJyk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFZhbHVlKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBlc2NhcGVkID0gdmFsdWUucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykucmVwbGFjZSgvXFxuL2csICdcXFxcbicpLnJlcGxhY2UoL1xcci9nLCAnXFxcXHInKS5yZXBsYWNlKC9cXHQvZywgJ1xcXFx0Jyk7XG4gICAgICByZXR1cm4gYFwiJHtlc2NhcGVkfVwiYDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBgWyR7dmFsdWUubWFwKHYgPT4gdGhpcy5mb3JtYXRWYWx1ZSh2KSkuam9pbignLCAnKX1dYDtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgcGFydHMgPSBPYmplY3QuZW50cmllcyh2YWx1ZSkubWFwKChbaywgdl0pID0+IHtcbiAgICAgICAgY29uc3Qga2V5U3RyID0gL15bYS16QS1aX11cXHcqJC8udGVzdChrKSA/IGsgOiBgXCIke2t9XCJgO1xuICAgICAgICByZXR1cm4gYCR7a2V5U3RyfTogJHt0aGlzLmZvcm1hdFZhbHVlKHYpfWA7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBgeyAke3BhcnRzLmpvaW4oJywgJyl9IH1gO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdEFycmF5UmVmKGFycmF5OiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgYXJyYXkgPT09ICdzdHJpbmcnICYmIGFycmF5LnN0YXJ0c1dpdGgoJ3t7JykpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gYXJyYXkubWF0Y2goL15cXHtcXHsoXFx3KylcXH1cXH0kLyk7XG4gICAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IGFycmF5O1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKGFycmF5KTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdENvbmRSZWYoY29uZDogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIGNvbmQgPT09ICdzdHJpbmcnICYmIGNvbmQuc3RhcnRzV2l0aCgne3snKSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBjb25kLm1hdGNoKC9eXFx7XFx7KFxcdyspKD86XFwuKC4rPykpP1xcfVxcfSQvKTtcbiAgICAgIHJldHVybiBtYXRjaCA/IChtYXRjaFsyXSA/IGAke21hdGNoWzFdfS4ke21hdGNoWzJdfWAgOiBtYXRjaFsxXSkgOiBTdHJpbmcoY29uZCk7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcoY29uZCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVBY3ModGV4dDogc3RyaW5nKTogR3JhcGgge1xuICBjb25zdCBwYXJzZXIgPSBuZXcgQWNzUGFyc2VyKCk7XG4gIGNvbnN0IGFzdCA9IHBhcnNlci5wYXJzZSh0ZXh0KTtcbiAgY29uc3QgY29tcGlsZXIgPSBuZXcgQWNzQ29tcGlsZXIoKTtcbiAgcmV0dXJuIGNvbXBpbGVyLmNvbXBpbGUoYXN0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29tcGlsZUFjcyhncmFwaDogR3JhcGgsIG5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkZWNvbXBpbGVyID0gbmV3IEFjc0RlY29tcGlsZXIoKTtcbiAgcmV0dXJuIGRlY29tcGlsZXIuZGVjb21waWxlKGdyYXBoLCBuYW1lKTtcbn1cbiJdfQ==
|