socket-function 1.2.1 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SocketFunction.d.ts +1 -1
- package/SocketFunctionTypes.d.ts +1 -1
- package/hot/HotReloadController.d.ts +3 -3
- package/index.d.ts +25 -10
- package/package.json +1 -1
- package/require/CSSShim.d.ts +1 -1
- package/require/RequireController.d.ts +2 -2
- package/require/compileFlags.d.ts +1 -1
- package/require/require.d.ts +1 -1
- package/src/callManager.d.ts +1 -1
- package/test.ts +5 -11
- package/time/trueTimeShim.d.ts +16 -1
- package/time/trueTimeShim.ts +121 -34
- package/dist/SetProcessVariables.ts.cache +0 -9
- package/dist/SocketFunction.ts.cache +0 -467
- package/hot/dist/HotReloadController.ts.cache +0 -252
- package/require/dist/RequireController.ts.cache +0 -386
- package/require/dist/compileFlags.ts.cache +0 -41
- package/require/dist/extMapper.ts.cache +0 -368
- package/require/dist/require.ts.cache +0 -676
- package/src/JSONLACKS/dist/JSONLACKS.ts.cache +0 -469
- package/src/dist/CallFactory.ts.cache +0 -930
- package/src/dist/Zip.ts.cache +0 -156
- package/src/dist/batching.ts.cache +0 -377
- package/src/dist/bits.ts.cache +0 -121
- package/src/dist/buffers.ts.cache +0 -76
- package/src/dist/caching.ts.cache +0 -302
- package/src/dist/callHTTPHandler.ts.cache +0 -264
- package/src/dist/callManager.ts.cache +0 -159
- package/src/dist/certStore.ts.cache +0 -59
- package/src/dist/createSingleton.ts.cache +0 -62
- package/src/dist/fixLargeNetworkCalls.ts.cache +0 -17
- package/src/dist/forwardPort.ts.cache +0 -222
- package/src/dist/https.ts.cache +0 -141
- package/src/dist/misc.ts.cache +0 -499
- package/src/dist/nodeCache.ts.cache +0 -136
- package/src/dist/nodeProxy.ts.cache +0 -57
- package/src/dist/protocolNegotiation.ts.cache +0 -101
- package/src/dist/tlsParsing.ts.cache +0 -85
- package/src/dist/types.ts.cache +0 -9
- package/src/dist/webSocketServer.ts.cache +0 -365
- package/src/dist/websocketFactory.ts.cache +0 -53
- package/src/formatting/dist/colors.ts.cache +0 -98
- package/src/formatting/dist/format.ts.cache +0 -396
- package/src/formatting/dist/logColors.ts.cache +0 -28
- package/src/lz4/dist/LZ4.ts.cache +0 -53
- package/src/profiling/dist/getOwnTime.ts.cache +0 -100
- package/src/profiling/dist/measure.ts.cache +0 -338
- package/src/profiling/dist/stats.ts.cache +0 -202
- package/src/profiling/dist/statsFormat.ts.cache +0 -45
- package/time/dist/trueTimeShim.ts.cache +0 -656
|
@@ -1,469 +0,0 @@
|
|
|
1
|
-
"use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
27
|
-
};
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
29
|
-
exports.JSONLACKS = void 0;
|
|
30
|
-
const measure_1 = require("../profiling/measure");
|
|
31
|
-
const fs_1 = __importDefault(require("fs"));
|
|
32
|
-
const JSONLACKS_generated_js_1 = __importDefault(require("./JSONLACKS.generated.js"));
|
|
33
|
-
const misc_1 = require("../misc");
|
|
34
|
-
const types_1 = require("../types");
|
|
35
|
-
const batching_1 = require("../batching");
|
|
36
|
-
const SERIALIZE_OBJECT_BATCH_COUNT = 1000;
|
|
37
|
-
const PARSE_BYTE_CHUNK_SIZE = 1024 * 1024 * 10;
|
|
38
|
-
// Supports json and also:
|
|
39
|
-
// - Non quoted field names "{ x: 1 }"?
|
|
40
|
-
// - Trailing commas
|
|
41
|
-
// NOTE: Comma only syntax is not supported, ex, "[,,]", which is an array of length 2 in javascript
|
|
42
|
-
// - Comments on input, but not on output
|
|
43
|
-
// - References
|
|
44
|
-
// - Buffers (just Buffers, not typed arrays)
|
|
45
|
-
// The stringify function always creates valid json, as the syntax for references and buffers
|
|
46
|
-
// will just be special property names and values.
|
|
47
|
-
// NOTE: We don't support Date serialization. Never store Dates, store "number".
|
|
48
|
-
class JSONLACKS {
|
|
49
|
-
static stringify(obj, config) {
|
|
50
|
-
let serialized = JSONLACKS.escapeSpecialObjects(obj, config);
|
|
51
|
-
return JSON.stringify(serialized);
|
|
52
|
-
}
|
|
53
|
-
/** Is useful when serializing an array to a file with one object per line */
|
|
54
|
-
static async stringifyFile(obj, config) {
|
|
55
|
-
let serialized = JSONLACKS.escapeSpecialObjects(obj, config);
|
|
56
|
-
let buffers = [];
|
|
57
|
-
for (let i = 0; i < serialized.length; i += SERIALIZE_OBJECT_BATCH_COUNT) {
|
|
58
|
-
let str = serialized.slice(i, i + SERIALIZE_OBJECT_BATCH_COUNT).map(x => JSON.stringify(x) + "\n").join("");
|
|
59
|
-
buffers.push(Buffer.from(str));
|
|
60
|
-
await (0, batching_1.delay)("immediate");
|
|
61
|
-
}
|
|
62
|
-
// Break up into chunks, as string => Buffer i
|
|
63
|
-
return Buffer.concat(buffers);
|
|
64
|
-
}
|
|
65
|
-
static stringifyFileSync(obj, config) {
|
|
66
|
-
let serialized = JSONLACKS.escapeSpecialObjects(obj, config);
|
|
67
|
-
let buffers = [];
|
|
68
|
-
for (let i = 0; i < serialized.length; i += SERIALIZE_OBJECT_BATCH_COUNT) {
|
|
69
|
-
let str = serialized.slice(i, i + SERIALIZE_OBJECT_BATCH_COUNT).map(x => JSON.stringify(x) + "\n").join("");
|
|
70
|
-
buffers.push(Buffer.from(str));
|
|
71
|
-
}
|
|
72
|
-
// Break up into chunks, as string => Buffer i
|
|
73
|
-
return Buffer.concat(buffers);
|
|
74
|
-
}
|
|
75
|
-
// TIMING: Seems to be about 40X slower than JSON.parse unless extended is set to false,
|
|
76
|
-
// then it is about 2X slower (although it depends on the size and complexity of the objects!)
|
|
77
|
-
static parse(text, config, hydrateState) {
|
|
78
|
-
var _a;
|
|
79
|
-
// Empty string should parse to SOMETHING
|
|
80
|
-
if (text.trim() === "")
|
|
81
|
-
return undefined;
|
|
82
|
-
let obj;
|
|
83
|
-
let extendedParsing = (_a = config === null || config === void 0 ? void 0 : config.extended) !== null && _a !== void 0 ? _a : JSONLACKS.EXTENDED_PARSER;
|
|
84
|
-
if (extendedParsing) {
|
|
85
|
-
obj = JSONLACKS_generated_js_1.default.parse(text);
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
try {
|
|
89
|
-
obj = JSON.parse(text);
|
|
90
|
-
}
|
|
91
|
-
catch (_b) {
|
|
92
|
-
obj = JSONLACKS_generated_js_1.default.parse(text);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return JSONLACKS.hydrateSpecialObjects(obj, hydrateState, config);
|
|
96
|
-
}
|
|
97
|
-
static async parseLines(buffer, config) {
|
|
98
|
-
let output = [];
|
|
99
|
-
let pos = 0;
|
|
100
|
-
let hydrateState = {
|
|
101
|
-
references: new Map(),
|
|
102
|
-
visited: new Set(),
|
|
103
|
-
};
|
|
104
|
-
function parseChunk() {
|
|
105
|
-
let start = pos;
|
|
106
|
-
let lastNewLine = 0;
|
|
107
|
-
while (pos < buffer.length && (!lastNewLine || (pos - start) < PARSE_BYTE_CHUNK_SIZE)) {
|
|
108
|
-
let byte = buffer[pos];
|
|
109
|
-
if (byte === 10) {
|
|
110
|
-
lastNewLine = pos;
|
|
111
|
-
}
|
|
112
|
-
pos++;
|
|
113
|
-
}
|
|
114
|
-
if (pos === buffer.length) {
|
|
115
|
-
lastNewLine = pos;
|
|
116
|
-
}
|
|
117
|
-
pos = lastNewLine + 1;
|
|
118
|
-
let text = buffer.slice(start, lastNewLine).toString("utf8");
|
|
119
|
-
let lines = text
|
|
120
|
-
.replaceAll("\r", "")
|
|
121
|
-
.split("\n")
|
|
122
|
-
.filter(x => x && !x.startsWith("//"));
|
|
123
|
-
let linesJSON = "[";
|
|
124
|
-
for (let i = 0; i < lines.length; i++) {
|
|
125
|
-
if (i !== 0)
|
|
126
|
-
linesJSON += ",";
|
|
127
|
-
linesJSON += lines[i];
|
|
128
|
-
}
|
|
129
|
-
linesJSON += "]";
|
|
130
|
-
if (config === null || config === void 0 ? void 0 : config.discardMissingReferences) {
|
|
131
|
-
try {
|
|
132
|
-
let parts = JSONLACKS.parse(linesJSON, config, hydrateState);
|
|
133
|
-
for (let part of parts) {
|
|
134
|
-
output.push(part);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
catch (e) {
|
|
138
|
-
if (!e.message.includes("Reference to undefined id")) {
|
|
139
|
-
throw e;
|
|
140
|
-
}
|
|
141
|
-
for (let line of lines) {
|
|
142
|
-
try {
|
|
143
|
-
let part = JSONLACKS.parse(line, config, hydrateState);
|
|
144
|
-
output.push(part);
|
|
145
|
-
}
|
|
146
|
-
catch (e) {
|
|
147
|
-
if (!e.message.includes("Reference to undefined id")) {
|
|
148
|
-
throw e;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
let parts = JSONLACKS.parse(linesJSON, config, hydrateState);
|
|
156
|
-
for (let part of parts) {
|
|
157
|
-
output.push(part);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
while (pos < buffer.length) {
|
|
162
|
-
parseChunk();
|
|
163
|
-
// Wait, to allow other thread to do work. We wait a long time... because we parse 10MB at once,
|
|
164
|
-
// so... this gives us 2s of delay per 1GB of parsing, which should only be a fraction of our parse time
|
|
165
|
-
if (pos < buffer.length) {
|
|
166
|
-
await (0, batching_1.delay)(20);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
return output;
|
|
170
|
-
}
|
|
171
|
-
static escapeSpecialObjects(obj, config) {
|
|
172
|
-
// I think iterating twice for references is the fastest way to do it?
|
|
173
|
-
let objects = new Set();
|
|
174
|
-
// NOTE: Use unique values for references, to allow concatenating files without having to
|
|
175
|
-
// deal with escaping references.
|
|
176
|
-
let refPrefix = Date.now() + Math.random() + "";
|
|
177
|
-
let nextRefId = 0;
|
|
178
|
-
function getNextRefKey() {
|
|
179
|
-
return refPrefix + "_" + nextRefId++;
|
|
180
|
-
}
|
|
181
|
-
let refObjects = new Map();
|
|
182
|
-
findReferences(obj);
|
|
183
|
-
function findReferences(obj) {
|
|
184
|
-
if (!(0, types_1.canHaveChildren)(obj))
|
|
185
|
-
return;
|
|
186
|
-
if (refObjects.has(obj))
|
|
187
|
-
return;
|
|
188
|
-
if (objects.has(obj)) {
|
|
189
|
-
let refKey = getNextRefKey();
|
|
190
|
-
refObjects.set(obj, refKey);
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
objects.add(obj);
|
|
194
|
-
for (let key in obj) {
|
|
195
|
-
findReferences(obj[key]);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
let refsSeen = new Set();
|
|
199
|
-
return iterate(obj);
|
|
200
|
-
function iterate(obj, refHandled) {
|
|
201
|
-
if (!(0, types_1.canHaveChildren)(obj))
|
|
202
|
-
return obj;
|
|
203
|
-
if (!refHandled) {
|
|
204
|
-
let refKey = refObjects.get(obj);
|
|
205
|
-
if (refKey) {
|
|
206
|
-
if (refsSeen.has(obj)) {
|
|
207
|
-
return {
|
|
208
|
-
[JSONLACKS.LACKS_KEY]: "ref",
|
|
209
|
-
id: refKey,
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
refsSeen.add(obj);
|
|
213
|
-
return {
|
|
214
|
-
[JSONLACKS.LACKS_KEY]: "define",
|
|
215
|
-
id: refKey,
|
|
216
|
-
value: iterate(obj, true),
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
if (JSONLACKS.LACKS_KEY in obj) {
|
|
221
|
-
let restOfObj = { ...obj };
|
|
222
|
-
let escapedValue = restOfObj[JSONLACKS.LACKS_KEY];
|
|
223
|
-
delete restOfObj[JSONLACKS.LACKS_KEY];
|
|
224
|
-
return {
|
|
225
|
-
[JSONLACKS.LACKS_KEY]: "removedSpecialKey",
|
|
226
|
-
escapedValue: iterate(escapedValue),
|
|
227
|
-
restOfObj: iterate(restOfObj),
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
if (obj instanceof Buffer) {
|
|
231
|
-
return {
|
|
232
|
-
[JSONLACKS.LACKS_KEY]: "Buffer",
|
|
233
|
-
data: obj.toString("base64"),
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
let cloned = config === null || config === void 0 ? void 0 : config.allowObjectMutation;
|
|
237
|
-
function cloneObj() {
|
|
238
|
-
if (cloned)
|
|
239
|
-
return;
|
|
240
|
-
cloned = true;
|
|
241
|
-
if (Array.isArray(obj)) {
|
|
242
|
-
obj = [...obj];
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
obj = { ...obj };
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
;
|
|
249
|
-
for (let key in obj) {
|
|
250
|
-
let originalValue = obj[key];
|
|
251
|
-
let value = iterate(originalValue);
|
|
252
|
-
if (value !== originalValue) {
|
|
253
|
-
cloneObj();
|
|
254
|
-
obj[key] = value;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
return obj;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
static hydrateSpecialObjects(obj, hydrateState, config) {
|
|
261
|
-
let references = (hydrateState === null || hydrateState === void 0 ? void 0 : hydrateState.references) || new Map();
|
|
262
|
-
let visited = (hydrateState === null || hydrateState === void 0 ? void 0 : hydrateState.visited) || new Set();
|
|
263
|
-
return iterate(obj);
|
|
264
|
-
function iterate(obj) {
|
|
265
|
-
if (!(0, types_1.canHaveChildren)(obj))
|
|
266
|
-
return obj;
|
|
267
|
-
if (visited.has(obj))
|
|
268
|
-
return obj;
|
|
269
|
-
visited.add(obj);
|
|
270
|
-
let type = obj[JSONLACKS.LACKS_KEY];
|
|
271
|
-
if (!type) {
|
|
272
|
-
for (let key in obj) {
|
|
273
|
-
let originalValue = obj[key];
|
|
274
|
-
let value = iterate(originalValue);
|
|
275
|
-
if (value !== originalValue) {
|
|
276
|
-
obj[key] = value;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
return obj;
|
|
280
|
-
}
|
|
281
|
-
if (type === "removedSpecialKey") {
|
|
282
|
-
let restOfObj = iterate(obj.restOfObj);
|
|
283
|
-
let escapedValue = iterate(obj.escapedValue);
|
|
284
|
-
return { ...restOfObj, [JSONLACKS.LACKS_KEY]: escapedValue };
|
|
285
|
-
}
|
|
286
|
-
if (type === "Buffer") {
|
|
287
|
-
return Buffer.from(obj.data, "base64");
|
|
288
|
-
}
|
|
289
|
-
if (type === "define") {
|
|
290
|
-
references.set(obj.id, iterate(obj.value));
|
|
291
|
-
return obj.value;
|
|
292
|
-
}
|
|
293
|
-
if (type === "ref") {
|
|
294
|
-
let id = obj.id;
|
|
295
|
-
if (!JSONLACKS.IGNORE_MISSING_REFERENCES && !references.has(id)) {
|
|
296
|
-
throw new Error(`Reference to undefined id "${id}"`);
|
|
297
|
-
}
|
|
298
|
-
return references.get(id);
|
|
299
|
-
}
|
|
300
|
-
throw new Error(`Unknown lacks type "${type}"`);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
exports.JSONLACKS = JSONLACKS;
|
|
305
|
-
JSONLACKS.LACKS_KEY = "__JSONLACKS__98cfb4a05fa34d828661cae15b8779ce__";
|
|
306
|
-
/** If set to true parses non-quoted field names, comments, trailing commas, etc */
|
|
307
|
-
JSONLACKS.EXTENDED_PARSER = false;
|
|
308
|
-
JSONLACKS.IGNORE_MISSING_REFERENCES = false;
|
|
309
|
-
async function benchmark() {
|
|
310
|
-
const loops = 1000 * 100;
|
|
311
|
-
let inputs = [];
|
|
312
|
-
for (let i = 0; i < loops; i++) {
|
|
313
|
-
inputs.push(JSON.stringify({
|
|
314
|
-
i,
|
|
315
|
-
hello_there: i,
|
|
316
|
-
example: 5,
|
|
317
|
-
list: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
|
|
318
|
-
}) + " ");
|
|
319
|
-
}
|
|
320
|
-
JSON.parse(inputs[0]);
|
|
321
|
-
JSONLACKS_generated_js_1.default.parse(inputs[0]);
|
|
322
|
-
(0, measure_1.measureCodeSync)(function measure() {
|
|
323
|
-
(0, measure_1.measureBlock)(function JSON_PARSE() {
|
|
324
|
-
for (let i = 0; i < loops; i++) {
|
|
325
|
-
JSON.parse(inputs[i]);
|
|
326
|
-
}
|
|
327
|
-
});
|
|
328
|
-
(0, measure_1.measureBlock)(function JSON_PARSE_FREEZE() {
|
|
329
|
-
for (let i = 0; i < loops; i++) {
|
|
330
|
-
let obj = JSON.parse(inputs[i]);
|
|
331
|
-
(0, misc_1.recursiveFreeze)(obj);
|
|
332
|
-
}
|
|
333
|
-
});
|
|
334
|
-
(0, measure_1.measureBlock)(function EXTENDED_PARSE() {
|
|
335
|
-
for (let i = 0; i < loops; i++) {
|
|
336
|
-
JSONLACKS_generated_js_1.default.parse(inputs[i]);
|
|
337
|
-
}
|
|
338
|
-
});
|
|
339
|
-
(0, measure_1.measureBlock)(function JSONLACKS_PARSE() {
|
|
340
|
-
for (let i = 0; i < loops; i++) {
|
|
341
|
-
JSONLACKS.parse(inputs[i]);
|
|
342
|
-
}
|
|
343
|
-
});
|
|
344
|
-
(0, measure_1.measureBlock)(function JSONLACKS_PARSE_SIMPLE() {
|
|
345
|
-
for (let i = 0; i < loops; i++) {
|
|
346
|
-
JSONLACKS.parse(inputs[i], { extended: false });
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
}, {
|
|
350
|
-
thresholdInTable: 0
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
|
-
//benchmark().catch(console.error).finally(() => process.exit());
|
|
354
|
-
async function testJSONLACKS() {
|
|
355
|
-
{
|
|
356
|
-
let obj = {};
|
|
357
|
-
let str = JSONLACKS.stringify({
|
|
358
|
-
a: obj,
|
|
359
|
-
b: obj,
|
|
360
|
-
});
|
|
361
|
-
let parsed = JSONLACKS.parse(str);
|
|
362
|
-
if (parsed.a !== parsed.b) {
|
|
363
|
-
throw new Error("Failed to maintain references");
|
|
364
|
-
}
|
|
365
|
-
if (typeof parsed.a !== "object") {
|
|
366
|
-
throw new Error("Object become corrupted");
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
// Test LACKS_KEY is escaped correctly
|
|
370
|
-
{
|
|
371
|
-
let obj = { [JSONLACKS.LACKS_KEY]: "hello" };
|
|
372
|
-
let str = JSONLACKS.stringify(obj);
|
|
373
|
-
let parsed = JSONLACKS.parse(str);
|
|
374
|
-
if (JSON.stringify(obj) !== JSON.stringify(parsed)) {
|
|
375
|
-
throw new Error("Failed to escape LACKS_KEY");
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
// Test buffers are preserved
|
|
379
|
-
{
|
|
380
|
-
let obj = { a: Buffer.from("hello") };
|
|
381
|
-
let str = JSONLACKS.stringify(obj);
|
|
382
|
-
let parsed = JSONLACKS.parse(str);
|
|
383
|
-
if (obj.a.toString() !== parsed.a.toString()) {
|
|
384
|
-
throw new Error(`Failed to preserve buffers`);
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
// Test references 2
|
|
388
|
-
{
|
|
389
|
-
let base = {};
|
|
390
|
-
let arr = [base, base];
|
|
391
|
-
let obj = { x: arr, y: arr };
|
|
392
|
-
let result = JSONLACKS.parse(JSONLACKS.stringify(obj), { extended: false });
|
|
393
|
-
if (JSON.stringify(result) !== JSON.stringify(obj)) {
|
|
394
|
-
throw new Error(`Corrupted values, expected ${JSON.stringify(obj)}, got ${JSON.stringify(result)}`);
|
|
395
|
-
}
|
|
396
|
-
if (result.x !== result.y) {
|
|
397
|
-
throw new Error(`Failed to maintain references`);
|
|
398
|
-
}
|
|
399
|
-
if (result.x[0] !== result.x[1]) {
|
|
400
|
-
throw new Error(`Failed to maintain references`);
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
//testJSONLACKS().catch(console.error).finally(() => process.exit());
|
|
405
|
-
async function generateAndVerifyParser() {
|
|
406
|
-
const pegjs = await Promise.resolve().then(() => __importStar(require("pegjs")));
|
|
407
|
-
var grammar = fs_1.default.readFileSync(__dirname + "/JSONLACKS.pegjs", "utf8");
|
|
408
|
-
var parserSource = pegjs.generate(grammar, { output: "source", format: "commonjs" });
|
|
409
|
-
fs_1.default.writeFileSync(__dirname + "/JSONLACKS.generated.js", parserSource);
|
|
410
|
-
var module = { exports: {} };
|
|
411
|
-
eval(parserSource);
|
|
412
|
-
const parser = module.exports;
|
|
413
|
-
function verify(text, forcedObj) {
|
|
414
|
-
var parsed = parser.parse(text);
|
|
415
|
-
var result = JSON.stringify(parsed);
|
|
416
|
-
let realResult = forcedObj !== null && forcedObj !== void 0 ? forcedObj : JSON.stringify(eval("(" + text + ")"));
|
|
417
|
-
if (result !== realResult) {
|
|
418
|
-
throw new Error(`Failed to parse: ${text} should be ${realResult}, was ${result}`);
|
|
419
|
-
}
|
|
420
|
-
console.log("Parsed correctly: ", text);
|
|
421
|
-
}
|
|
422
|
-
verify(`
|
|
423
|
-
{
|
|
424
|
-
"hello_there": 1,
|
|
425
|
-
}
|
|
426
|
-
`);
|
|
427
|
-
verify(`
|
|
428
|
-
{
|
|
429
|
-
hello_there: 1,
|
|
430
|
-
}
|
|
431
|
-
`);
|
|
432
|
-
verify(`
|
|
433
|
-
{
|
|
434
|
-
hello_there: 1,
|
|
435
|
-
more: 1,
|
|
436
|
-
}
|
|
437
|
-
`);
|
|
438
|
-
verify(`{ list: [1,], }`);
|
|
439
|
-
verify(`{ list: [1,], list2: [1,], }`);
|
|
440
|
-
verify(`{ /* test */ list: [1,], list2: [1,], }`);
|
|
441
|
-
verify(`{ /* test */ /* test 2 */ list: [1,], list2: [1,], }`);
|
|
442
|
-
verify(`
|
|
443
|
-
{
|
|
444
|
-
/* test */
|
|
445
|
-
/* test 2 */
|
|
446
|
-
list: [1,],
|
|
447
|
-
// Single line comment
|
|
448
|
-
list2: [1,],
|
|
449
|
-
// list3: [3],
|
|
450
|
-
}
|
|
451
|
-
`);
|
|
452
|
-
// Multiline double quote strings
|
|
453
|
-
verify(`
|
|
454
|
-
{
|
|
455
|
-
value: "a
|
|
456
|
-
b"
|
|
457
|
-
}
|
|
458
|
-
`, JSON.stringify({ value: "a\nb" }));
|
|
459
|
-
// Single quotes
|
|
460
|
-
verify(`
|
|
461
|
-
{
|
|
462
|
-
value: 'a'
|
|
463
|
-
}
|
|
464
|
-
`);
|
|
465
|
-
verify(`undefined`);
|
|
466
|
-
}
|
|
467
|
-
//generateAndVerifyParser().catch(console.error).finally(() => process.exit());
|
|
468
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSlNPTkxBQ0tTLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiSlNPTkxBQ0tTLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0Esa0RBQWtIO0FBSWxILDRDQUFvQjtBQUVwQixzRkFBOEM7QUFDOUMsa0NBQTBDO0FBQzFDLG9DQUEyQztBQUMzQywwQ0FBb0M7QUFFcEMsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLENBQUM7QUFDMUMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQW9CL0MsMEJBQTBCO0FBQzFCLHdDQUF3QztBQUN4QyxxQkFBcUI7QUFDckIseUdBQXlHO0FBQ3pHLDBDQUEwQztBQUMxQyxnQkFBZ0I7QUFDaEIsOENBQThDO0FBQzlDLDZGQUE2RjtBQUM3RixtREFBbUQ7QUFDbkQsZ0ZBQWdGO0FBQ2hGLE1BQWEsU0FBUztJQU9YLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBWSxFQUFFLE1BQWtDO1FBQ3BFLElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDRCw2RUFBNkU7SUFDdEUsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBYyxFQUFFLE1BQWtDO1FBQ2hGLElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFjLENBQUM7UUFDMUUsSUFBSSxPQUFPLEdBQWEsRUFBRSxDQUFDO1FBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSw0QkFBNEIsRUFBRSxDQUFDO1lBQ3ZFLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENB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S0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLGNBQWMsVUFBVSxTQUFTLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdkYsQ0FBQztRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELE1BQU0sQ0FBQzs7OztLQUlOLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQzs7OztLQUlOLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQzs7Ozs7S0FLTixDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMxQixNQUFNLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUV2QyxNQUFNLENBQUMseUNBQXlDLENBQUMsQ0FBQztJQUNsRCxNQUFNLENBQUMsc0RBQXNELENBQUMsQ0FBQztJQUMvRCxNQUFNLENBQUM7Ozs7Ozs7OztLQVNOLENBQUMsQ0FBQztJQUNILGlDQUFpQztJQUNqQyxNQUFNLENBQUM7Ozs7O0tBS04sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV0QyxnQkFBZ0I7SUFDaEIsTUFBTSxDQUFDOzs7O0tBSU4sQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFDRCwrRUFBK0UiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7IGVuYWJsZU1lYXN1cmVtZW50cywgbWVhc3VyZUJsb2NrLCBtZWFzdXJlQ29kZSwgbWVhc3VyZUNvZGVTeW5jLCBtZWFzdXJlRm5jIH0gZnJvbSBcIi4uL3Byb2ZpbGluZy9tZWFzdXJlXCI7XG4vLyBlbmFibGVNZWFzdXJlbWVudHMoKTtcblxuaW1wb3J0IGRlYnVnYnJlYWsgZnJvbSBcImRlYnVnYnJlYWtcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcblxuaW1wb3J0IHBhcnNlciBmcm9tIFwiLi9KU09OTEFDS1MuZ2VuZXJhdGVkLmpzXCI7XG5pbXBvcnQgeyByZWN1cnNpdmVGcmVlemUgfSBmcm9tIFwiLi4vbWlzY1wiO1xuaW1wb3J0IHsgY2FuSGF2ZUNoaWxkcmVuIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCIuLi9iYXRjaGluZ1wiO1xuXG5jb25zdCBTRVJJQUxJWkVfT0JKRUNUX0JBVENIX0NPVU5UID0gMTAwMDtcbmNvbnN0IFBBUlNFX0JZVEVfQ0hVTktfU0laRSA9IDEwMjQgKiAxMDI0ICogMTA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSlNPTkxBQ0tTX1BhcnNlQ29uZmlnIHtcbiAgICAvLyBEZWZhdWx0cyB0byB0cnVlLiBFbmFibGVzIHBhcnNpbmcgb2Y6XG4gICAgLy8gIC0gVHJhaWxpbmcgY29tbWFzXG4gICAgLy8gIC0gTm9uLXF1b3RlZCBmaWVsZCBuYW1lcyAoZXgsIFwieyB4OiAxIH1cIilcbiAgICAvLyAgLSBDb21tZW50cyAoc3RyaXBzIHRoZW0sIGJ1dCBkb2Vzbid0IHRocm93KVxuICAgIGV4dGVuZGVkPzogYm9vbGVhbjtcbiAgICBkaXNjYXJkTWlzc2luZ1JlZmVyZW5jZXM/OiBib29sZWFuO1xufVxuZXhwb3J0IGludGVyZmFjZSBKU09OTEFDS1NfU3RyaW5naWZ5Q29uZmlnIHtcbiAgICAvLyBJZiBzcGVjaWZpZWQsIHdlIGFyZSBhbGxvd2VkIHRvIG11dGF0ZSB0aGUgcHJvdmlkZWQgb2JqZWN0LiBTcGVlZHMgdXAgc2VyaWFsaXphdGlvbi5cbiAgICBhbGxvd09iamVjdE11dGF0aW9uPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEh5ZHJhdGVTdGF0ZSB7XG4gICAgcmVmZXJlbmNlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4gICAgdmlzaXRlZDogU2V0PHVua25vd24+LFxufVxuXG4vLyBTdXBwb3J0cyBqc29uIGFuZCBhbHNvOlxuLy8gIC0gTm9uIHF1b3RlZCBmaWVsZCBuYW1lcyBcInsgeDogMSB9XCI/XG4vLyAgLSBUcmFpbGluZyBjb21tYXNcbi8vICAgICAgTk9URTogQ29tbWEgb25seSBzeW50YXggaXMgbm90IHN1cHBvcnRlZCwgZXgsIFwiWywsXVwiLCB3aGljaCBpcyBhbiBhcnJheSBvZiBsZW5ndGggMiBpbiBqYXZhc2NyaXB0XG4vLyAgLSBDb21tZW50cyBvbiBpbnB1dCwgYnV0IG5vdCBvbiBvdXRwdXRcbi8vICAtIFJlZmVyZW5jZXNcbi8vICAtIEJ1ZmZlcnMgKGp1c3QgQnVmZmVycywgbm90IHR5cGVkIGFycmF5cylcbi8vIFRoZSBzdHJpbmdpZnkgZnVuY3Rpb24gYWx3YXlzIGNyZWF0ZXMgdmFsaWQganNvbiwgYXMgdGhlIHN5bnRheCBmb3IgcmVmZXJlbmNlcyBhbmQgYnVmZmVyc1xuLy8gIHdpbGwganVzdCBiZSBzcGVjaWFsIHByb3BlcnR5IG5hbWVzIGFuZCB2YWx1ZXMuXG4vLyBOT1RFOiBXZSBkb24ndCBzdXBwb3J0IERhdGUgc2VyaWFsaXphdGlvbi4gTmV2ZXIgc3RvcmUgRGF0ZXMsIHN0b3JlIFwibnVtYmVyXCIuXG5leHBvcnQgY2xhc3MgSlNPTkxBQ0tTIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IExBQ0tTX0tFWSA9IFwiX19KU09OTEFDS1NfXzk4Y2ZiNGEwNWZhMzRkODI4NjYxY2FlMTViODc3OWNlX19cIjtcblxuICAgIC8qKiBJZiBzZXQgdG8gdHJ1ZSBwYXJzZXMgbm9uLXF1b3RlZCBmaWVsZCBuYW1lcywgY29tbWVudHMsIHRyYWlsaW5nIGNvbW1hcywgZXRjICovXG4gICAgcHVibGljIHN0YXRpYyBFWFRFTkRFRF9QQVJTRVIgPSBmYWxzZTtcbiAgICBwdWJsaWMgc3RhdGljIElHTk9SRV9NSVNTSU5HX1JFRkVSRU5DRVMgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5naWZ5KG9iajogdW5rbm93biwgY29uZmlnPzogSlNPTkxBQ0tTX1N0cmluZ2lmeUNvbmZpZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBzZXJpYWxpemVkID0gSlNPTkxBQ0tTLmVzY2FwZVNwZWNpYWxPYmplY3RzKG9iaiwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpO1xuICAgIH1cbiAgICAvKiogSXMgdXNlZnVsIHdoZW4gc2VyaWFsaXppbmcgYW4gYXJyYXkgdG8gYSBmaWxlIHdpdGggb25lIG9iamVjdCBwZXIgbGluZSAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgc3RyaW5naWZ5RmlsZShvYmo6IHVua25vd25bXSwgY29uZmlnPzogSlNPTkxBQ0tTX1N0cmluZ2lmeUNvbmZpZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgICAgIGxldCBzZXJpYWxpemVkID0gSlNPTkxBQ0tTLmVzY2FwZVNwZWNpYWxPYmplY3RzKG9iaiwgY29uZmlnKSBhcyB1bmtub3duW107XG4gICAgICAgIGxldCBidWZmZXJzOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlcmlhbGl6ZWQubGVuZ3RoOyBpICs9IFNFUklBTElaRV9PQkpFQ1RfQkFUQ0hfQ09VTlQpIHtcbiAgICAgICAgICAgIGxldCBzdHIgPSBzZXJpYWxpemVkLnNsaWNlKGksIGkgKyBTRVJJQUxJWkVfT0JKRUNUX0JBVENIX0NPVU5UKS5tYXAoeCA9PiBKU09OLnN0cmluZ2lmeSh4KSArIFwiXFxuXCIpLmpvaW4oXCJcIik7XG4gICAgICAgICAgICBidWZmZXJzLnB1c2goQnVmZmVyLmZyb20oc3RyKSk7XG4gICAgICAgICAgICBhd2FpdCBkZWxheShcImltbWVkaWF0ZVwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBCcmVhayB1cCBpbnRvIGNodW5rcywgYXMgc3RyaW5nID0+IEJ1ZmZlciBpXG4gICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHN0cmluZ2lmeUZpbGVTeW5jKG9iajogdW5rbm93bltdLCBjb25maWc/OiBKU09OTEFDS1NfU3RyaW5naWZ5Q29uZmlnKTogQnVmZmVyIHtcbiAgICAgICAgbGV0IHNlcmlhbGl6ZWQgPSBKU09OTEFDS1MuZXNjYXBlU3BlY2lhbE9iamVjdHMob2JqLCBjb25maWcpIGFzIHVua25vd25bXTtcbiAgICAgICAgbGV0IGJ1ZmZlcnM6IEJ1ZmZlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VyaWFsaXplZC5sZW5ndGg7IGkgKz0gU0VSSUFMSVpFX09CSkVDVF9CQVRDSF9DT1VOVCkge1xuICAgICAgICAgICAgbGV0IHN0ciA9IHNlcmlhbGl6ZWQuc2xpY2UoaSwgaSArIFNFUklBTElaRV9PQkpFQ1RfQkFUQ0hfQ09VTlQpLm1hcCh4ID0+IEpTT04uc3RyaW5naWZ5KHgpICsgXCJcXG5cIikuam9pbihcIlwiKTtcbiAgICAgICAgICAgIGJ1ZmZlcnMucHVzaChCdWZmZXIuZnJvbShzdHIpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBCcmVhayB1cCBpbnRvIGNodW5rcywgYXMgc3RyaW5nID0+IEJ1ZmZlciBpXG4gICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMpO1xuICAgIH1cbiAgICAvLyBUSU1JTkc6IFNlZW1zIHRvIGJlIGFib3V0IDQwWCBzbG93ZXIgdGhhbiBKU09OLnBhcnNlIHVubGVzcyBleHRlbmRlZCBpcyBzZXQgdG8gZmFsc2UsXG4gICAgLy8gIHRoZW4gaXQgaXMgYWJvdXQgMlggc2xvd2VyIChhbHRob3VnaCBpdCBkZXBlbmRzIG9uIHRoZSBzaXplIGFuZCBjb21wbGV4aXR5IG9mIHRoZSBvYmplY3RzISlcbiAgICBwdWJsaWMgc3RhdGljIHBhcnNlPFQ+KHRleHQ6IHN0cmluZywgY29uZmlnPzogSlNPTkxBQ0tTX1BhcnNlQ29uZmlnLCBoeWRyYXRlU3RhdGU/OiBIeWRyYXRlU3RhdGUpOiBUIHtcbiAgICAgICAgLy8gRW1wdHkgc3RyaW5nIHNob3VsZCBwYXJzZSB0byBTT01FVEhJTkdcbiAgICAgICAgaWYgKHRleHQudHJpbSgpID09PSBcIlwiKSByZXR1cm4gdW5kZWZpbmVkIGFzIFQ7XG4gICAgICAgIGxldCBvYmo6IHVua25vd247XG5cbiAgICAgICAgbGV0IGV4dGVuZGVkUGFyc2luZyA9IGNvbmZpZz8uZXh0ZW5kZWQgPz8gSlNPTkxBQ0tTLkVYVEVOREVEX1BBUlNFUjtcblxuICAgICAgICBpZiAoZXh0ZW5kZWRQYXJzaW5nKSB7XG4gICAgICAgICAgICBvYmogPSBwYXJzZXIucGFyc2UodGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG9iaiA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBvYmogPSBwYXJzZXIucGFyc2UodGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gSlNPTkxBQ0tTLmh5ZHJhdGVTcGVjaWFsT2JqZWN0cyhvYmosIGh5ZHJhdGVTdGF0ZSwgY29uZmlnKSBhcyBUO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIHBhcnNlTGluZXM8VD4oYnVmZmVyOiBCdWZmZXIsIGNvbmZpZz86IEpTT05MQUNLU19QYXJzZUNvbmZpZyk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBvdXRwdXQ6IFRbXSA9IFtdO1xuICAgICAgICBsZXQgcG9zID0gMDtcbiAgICAgICAgbGV0IGh5ZHJhdGVTdGF0ZTogSHlkcmF0ZVN0YXRlID0ge1xuICAgICAgICAgICAgcmVmZXJlbmNlczogbmV3IE1hcCgpLFxuICAgICAgICAgICAgdmlzaXRlZDogbmV3IFNldCgpLFxuICAgICAgICB9O1xuICAgICAgICBmdW5jdGlvbiBwYXJzZUNodW5rKCkge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gcG9zO1xuICAgICAgICAgICAgbGV0IGxhc3ROZXdMaW5lID0gMDtcbiAgICAgICAgICAgIHdoaWxlIChwb3MgPCBidWZmZXIubGVuZ3RoICYmICghbGFzdE5ld0xpbmUgfHwgKHBvcyAtIHN0YXJ0KSA8IFBBUlNFX0JZVEVfQ0hVTktfU0laRSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgYnl0ZSA9IGJ1ZmZlcltwb3NdO1xuICAgICAgICAgICAgICAgIGlmIChieXRlID09PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0TmV3TGluZSA9IHBvcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcG9zKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zID09PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGFzdE5ld0xpbmUgPSBwb3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgPSBsYXN0TmV3TGluZSArIDE7XG5cbiAgICAgICAgICAgIGxldCB0ZXh0ID0gYnVmZmVyLnNsaWNlKHN0YXJ0LCBsYXN0TmV3TGluZSkudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgICAgICAgICAgbGV0IGxpbmVzID0gdGV4dFxuICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKFwiXFxyXCIsIFwiXCIpXG4gICAgICAgICAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgICAgICAgICAgLmZpbHRlcih4ID0+IHggJiYgIXguc3RhcnRzV2l0aChcIi8vXCIpKVxuICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgIGxldCBsaW5lc0pTT04gPSBcIltcIjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gMCkgbGluZXNKU09OICs9IFwiLFwiO1xuICAgICAgICAgICAgICAgIGxpbmVzSlNPTiArPSBsaW5lc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpbmVzSlNPTiArPSBcIl1cIjtcbiAgICAgICAgICAgIGlmIChjb25maWc/LmRpc2NhcmRNaXNzaW5nUmVmZXJlbmNlcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJ0cyA9IEpTT05MQUNLUy5wYXJzZShsaW5lc0pTT04sIGNvbmZpZywgaHlkcmF0ZVN0YXRlKSBhcyBUW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHBhcnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZS5tZXNzYWdlLmluY2x1ZGVzKFwiUmVmZXJlbmNlIHRvIHVuZGVmaW5lZCBpZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJ0ID0gSlNPTkxBQ0tTLnBhcnNlKGxpbmUsIGNvbmZpZywgaHlkcmF0ZVN0YXRlKSBhcyBUO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHBhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlLm1lc3NhZ2UuaW5jbHVkZXMoXCJSZWZlcmVuY2UgdG8gdW5kZWZpbmVkIGlkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFydHMgPSBKU09OTEFDS1MucGFyc2UobGluZXNKU09OLCBjb25maWcsIGh5ZHJhdGVTdGF0ZSkgYXMgVFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2gocGFydCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChwb3MgPCBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICBwYXJzZUNodW5rKCk7XG4gICAgICAgICAgICAvLyBXYWl0LCB0byBhbGxvdyBvdGhlciB0aHJlYWQgdG8gZG8gd29yay4gV2Ugd2FpdCBhIGxvbmcgdGltZS4uLiBiZWNhdXNlIHdlIHBhcnNlIDEwTUIgYXQgb25jZSxcbiAgICAgICAgICAgIC8vICBzby4uLiB0aGlzIGdpdmVzIHVzIDJzIG9mIGRlbGF5IHBlciAxR0Igb2YgcGFyc2luZywgd2hpY2ggc2hvdWxkIG9ubHkgYmUgYSBmcmFjdGlvbiBvZiBvdXIgcGFyc2UgdGltZVxuICAgICAgICAgICAgaWYgKHBvcyA8IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheSgyMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBlc2NhcGVTcGVjaWFsT2JqZWN0cyhvYmo6IHVua25vd24sIGNvbmZpZz86IEpTT05MQUNLU19TdHJpbmdpZnlDb25maWcpOiB1bmtub3duIHtcbiAgICAgICAgLy8gSSB0aGluayBpdGVyYXRpbmcgdHdpY2UgZm9yIHJlZmVyZW5jZXMgaXMgdGhlIGZhc3Rlc3Qgd2F5IHRvIGRvIGl0P1xuICAgICAgICBsZXQgb2JqZWN0cyA9IG5ldyBTZXQ8dW5rbm93bj4oKTtcbiAgICAgICAgLy8gTk9URTogVXNlIHVuaXF1ZSB2YWx1ZXMgZm9yIHJlZmVyZW5jZXMsIHRvIGFsbG93IGNvbmNhdGVuYXRpbmcgZmlsZXMgd2l0aG91dCBoYXZpbmcgdG9cbiAgICAgICAgLy8gIGRlYWwgd2l0aCBlc2NhcGluZyByZWZlcmVuY2VzLlxuICAgICAgICBsZXQgcmVmUHJlZml4ID0gRGF0ZS5ub3coKSArIE1hdGgucmFuZG9tKCkgKyBcIlwiO1xuICAgICAgICBsZXQgbmV4dFJlZklkID0gMDtcbiAgICAgICAgZnVuY3Rpb24gZ2V0TmV4dFJlZktleSgpIHtcbiAgICAgICAgICAgIHJldHVybiByZWZQcmVmaXggKyBcIl9cIiArIG5leHRSZWZJZCsrO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZWZPYmplY3RzID0gbmV3IE1hcDx1bmtub3duLCBzdHJpbmc+KCk7XG4gICAgICAgIGZpbmRSZWZlcmVuY2VzKG9iaik7XG4gICAgICAgIGZ1bmN0aW9uIGZpbmRSZWZlcmVuY2VzKG9iajogdW5rbm93bikge1xuICAgICAgICAgICAgaWYgKCFjYW5IYXZlQ2hpbGRyZW4ob2JqKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHJlZk9iamVjdHMuaGFzKG9iaikpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChvYmplY3RzLmhhcyhvYmopKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlZktleSA9IGdldE5leHRSZWZLZXkoKTtcbiAgICAgICAgICAgICAgICByZWZPYmplY3RzLnNldChvYmosIHJlZktleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2JqZWN0cy5hZGQob2JqKTtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBmaW5kUmVmZXJlbmNlcyhvYmpba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVmc1NlZW4gPSBuZXcgU2V0PHVua25vd24+KCk7XG4gICAgICAgIHJldHVybiBpdGVyYXRlKG9iaik7XG4gICAgICAgIGZ1bmN0aW9uIGl0ZXJhdGUob2JqOiB1bmtub3duLCByZWZIYW5kbGVkPzogYm9vbGVhbik6IHVua25vd24ge1xuICAgICAgICAgICAgaWYgKCFjYW5IYXZlQ2hpbGRyZW4ob2JqKSkgcmV0dXJuIG9iajtcbiAgICAgICAgICAgIGlmICghcmVmSGFuZGxlZCkge1xuICAgICAgICAgICAgICAgIGxldCByZWZLZXkgPSByZWZPYmplY3RzLmdldChvYmopO1xuICAgICAgICAgICAgICAgIGlmIChyZWZLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZnNTZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtKU09OTEFDS1MuTEFDS1NfS0VZXTogXCJyZWZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcmVmS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZWZzU2Vlbi5hZGQob2JqKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtKU09OTEFDS1MuTEFDS1NfS0VZXTogXCJkZWZpbmVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByZWZLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlcmF0ZShvYmosIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKEpTT05MQUNLUy5MQUNLU19LRVkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3RPZk9iaiA9IHsgLi4ub2JqIH07XG4gICAgICAgICAgICAgICAgbGV0IGVzY2FwZWRWYWx1ZSA9IHJlc3RPZk9ialtKU09OTEFDS1MuTEFDS1NfS0VZXTtcbiAgICAgICAgICAgICAgICBkZWxldGUgcmVzdE9mT2JqW0pTT05MQUNLUy5MQUNLU19LRVldO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIFtKU09OTEFDS1MuTEFDS1NfS0VZXTogXCJyZW1vdmVkU3BlY2lhbEtleVwiLFxuICAgICAgICAgICAgICAgICAgICBlc2NhcGVkVmFsdWU6IGl0ZXJhdGUoZXNjYXBlZFZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdE9mT2JqOiBpdGVyYXRlKHJlc3RPZk9iaiksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIFtKU09OTEFDS1MuTEFDS1NfS0VZXTogXCJCdWZmZXJcIixcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogb2JqLnRvU3RyaW5nKFwiYmFzZTY0XCIpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjbG9uZWQgPSBjb25maWc/LmFsbG93T2JqZWN0TXV0YXRpb247XG4gICAgICAgICAgICBmdW5jdGlvbiBjbG9uZU9iaigpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2xvbmVkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgY2xvbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICAgICAgICAgIG9iaiA9IFsuLi5vYmpdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9iaiA9IHsgLi4ub2JqIGFzIGFueSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgbGV0IG9yaWdpbmFsVmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBpdGVyYXRlKG9yaWdpbmFsVmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gb3JpZ2luYWxWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjbG9uZU9iaigpO1xuICAgICAgICAgICAgICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBoeWRyYXRlU3BlY2lhbE9iamVjdHMob2JqOiB1bmtub3duLCBoeWRyYXRlU3RhdGU/OiBIeWRyYXRlU3RhdGUsIGNvbmZpZz86IEpTT05MQUNLU19QYXJzZUNvbmZpZyk6IHVua25vd24ge1xuICAgICAgICBsZXQgcmVmZXJlbmNlcyA9IGh5ZHJhdGVTdGF0ZT8ucmVmZXJlbmNlcyB8fCBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcbiAgICAgICAgbGV0IHZpc2l0ZWQgPSBoeWRyYXRlU3RhdGU/LnZpc2l0ZWQgfHwgbmV3IFNldDx1bmtub3duPigpO1xuICAgICAgICByZXR1cm4gaXRlcmF0ZShvYmopO1xuICAgICAgICBmdW5jdGlvbiBpdGVyYXRlKG9iajogdW5rbm93bikge1xuICAgICAgICAgICAgaWYgKCFjYW5IYXZlQ2hpbGRyZW4ob2JqKSkgcmV0dXJuIG9iajtcbiAgICAgICAgICAgIGlmICh2aXNpdGVkLmhhcyhvYmopKSByZXR1cm4gb2JqO1xuICAgICAgICAgICAgdmlzaXRlZC5hZGQob2JqKTtcbiAgICAgICAgICAgIGxldCB0eXBlID0gb2JqW0pTT05MQUNLUy5MQUNLU19LRVldO1xuICAgICAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIG9iaikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3JpZ2luYWxWYWx1ZSA9IG9ialtrZXldO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBpdGVyYXRlKG9yaWdpbmFsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IG9yaWdpbmFsVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcInJlbW92ZWRTcGVjaWFsS2V5XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdE9mT2JqID0gaXRlcmF0ZShvYmoucmVzdE9mT2JqKSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgbGV0IGVzY2FwZWRWYWx1ZSA9IGl0ZXJhdGUob2JqLmVzY2FwZWRWYWx1ZSkgYXMgYW55O1xuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLnJlc3RPZk9iaiwgW0pTT05MQUNLUy5MQUNLU19LRVldOiBlc2NhcGVkVmFsdWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcIkJ1ZmZlclwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKG9iai5kYXRhIGFzIHN0cmluZywgXCJiYXNlNjRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJkZWZpbmVcIikge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZXMuc2V0KG9iai5pZCBhcyBzdHJpbmcsIGl0ZXJhdGUob2JqLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iai52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcInJlZlwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlkID0gb2JqLmlkIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoIUpTT05MQUNLUy5JR05PUkVfTUlTU0lOR19SRUZFUkVOQ0VTICYmICFyZWZlcmVuY2VzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWZlcmVuY2UgdG8gdW5kZWZpbmVkIGlkIFwiJHtpZH1cImApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy5nZXQoaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGxhY2tzIHR5cGUgXCIke3R5cGV9XCJgKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYmVuY2htYXJrKCkge1xuICAgIGNvbnN0IGxvb3BzID0gMTAwMCAqIDEwMDtcbiAgICBsZXQgaW5wdXRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9vcHM7IGkrKykge1xuICAgICAgICBpbnB1dHMucHVzaChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgaGVsbG9fdGhlcmU6IGksXG4gICAgICAgICAgICBleGFtcGxlOiA1LFxuICAgICAgICAgICAgbGlzdDogWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXSxcbiAgICAgICAgfSkgKyBcIiBcIik7XG4gICAgfVxuICAgIEpTT04ucGFyc2UoaW5wdXRzWzBdKTtcbiAgICBwYXJzZXIucGFyc2UoaW5wdXRzWzBdKTtcblxuICAgIG1lYXN1cmVDb2RlU3luYyhmdW5jdGlvbiBtZWFzdXJlKCkge1xuICAgICAgICBtZWFzdXJlQmxvY2soZnVuY3Rpb24gSlNPTl9QQVJTRSgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9vcHM7IGkrKykge1xuICAgICAgICAgICAgICAgIEpTT04ucGFyc2UoaW5wdXRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG1lYXN1cmVCbG9jayhmdW5jdGlvbiBKU09OX1BBUlNFX0ZSRUVaRSgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9vcHM7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBvYmogPSBKU09OLnBhcnNlKGlucHV0c1tpXSk7XG4gICAgICAgICAgICAgICAgcmVjdXJzaXZlRnJlZXplKG9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG1lYXN1cmVCbG9jayhmdW5jdGlvbiBFWFRFTkRFRF9QQVJTRSgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9vcHM7IGkrKykge1xuICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZShpbnB1dHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBtZWFzdXJlQmxvY2soZnVuY3Rpb24gSlNPTkxBQ0tTX1BBUlNFKCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29wczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgSlNPTkxBQ0tTLnBhcnNlKGlucHV0c1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBtZWFzdXJlQmxvY2soZnVuY3Rpb24gSlNPTkxBQ0tTX1BBUlNFX1NJTVBMRSgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9vcHM7IGkrKykge1xuICAgICAgICAgICAgICAgIEpTT05MQUNLUy5wYXJzZShpbnB1dHNbaV0sIHsgZXh0ZW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH0sIHtcbiAgICAgICAgdGhyZXNob2xkSW5UYWJsZTogMFxuICAgIH0pO1xuXG59XG4vL2JlbmNobWFyaygpLmNhdGNoKGNvbnNvbGUuZXJyb3IpLmZpbmFsbHkoKCkgPT4gcHJvY2Vzcy5leGl0KCkpO1xuXG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RKU09OTEFDS1MoKSB7XG4gICAge1xuICAgICAgICBsZXQgb2JqID0ge307XG4gICAgICAgIGxldCBzdHIgPSBKU09OTEFDS1Muc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGE6IG9iaixcbiAgICAgICAgICAgIGI6IG9iaixcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBwYXJzZWQgPSBKU09OTEFDS1MucGFyc2Uoc3RyKSBhcyBhbnk7XG4gICAgICAgIGlmIChwYXJzZWQuYSAhPT0gcGFyc2VkLmIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBtYWludGFpbiByZWZlcmVuY2VzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGFyc2VkLmEgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk9iamVjdCBiZWNvbWUgY29ycnVwdGVkXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGVzdCBMQUNLU19LRVkgaXMgZXNjYXBlZCBjb3JyZWN0bHlcbiAgICB7XG4gICAgICAgIGxldCBvYmogPSB7IFtKU09OTEFDS1MuTEFDS1NfS0VZXTogXCJoZWxsb1wiIH07XG4gICAgICAgIGxldCBzdHIgPSBKU09OTEFDS1Muc3RyaW5naWZ5KG9iaik7XG4gICAgICAgIGxldCBwYXJzZWQgPSBKU09OTEFDS1MucGFyc2Uoc3RyKSBhcyBhbnk7XG4gICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShvYmopICE9PSBKU09OLnN0cmluZ2lmeShwYXJzZWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZXNjYXBlIExBQ0tTX0tFWVwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUZXN0IGJ1ZmZlcnMgYXJlIHByZXNlcnZlZFxuICAgIHtcbiAgICAgICAgbGV0IG9iaiA9IHsgYTogQnVmZmVyLmZyb20oXCJoZWxsb1wiKSB9O1xuICAgICAgICBsZXQgc3RyID0gSlNPTkxBQ0tTLnN0cmluZ2lmeShvYmopO1xuICAgICAgICBsZXQgcGFyc2VkID0gSlNPTkxBQ0tTLnBhcnNlKHN0cikgYXMgYW55O1xuICAgICAgICBpZiAob2JqLmEudG9TdHJpbmcoKSAhPT0gcGFyc2VkLmEudG9TdHJpbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcHJlc2VydmUgYnVmZmVyc2ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGVzdCByZWZlcmVuY2VzIDJcbiAgICB7XG4gICAgICAgIGxldCBiYXNlID0ge307XG4gICAgICAgIGxldCBhcnIgPSBbYmFzZSwgYmFzZV07XG4gICAgICAgIGxldCBvYmogPSB7IHg6IGFyciwgeTogYXJyIH07XG4gICAgICAgIGxldCByZXN1bHQgPSBKU09OTEFDS1MucGFyc2UoSlNPTkxBQ0tTLnN0cmluZ2lmeShvYmopLCB7IGV4dGVuZGVkOiBmYWxzZSB9KSBhcyB0eXBlb2Ygb2JqO1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSAhPT0gSlNPTi5zdHJpbmdpZnkob2JqKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3JydXB0ZWQgdmFsdWVzLCBleHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KG9iail9LCBnb3QgJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQueCAhPT0gcmVzdWx0LnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIG1haW50YWluIHJlZmVyZW5jZXNgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LnhbMF0gIT09IHJlc3VsdC54WzFdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBtYWludGFpbiByZWZlcmVuY2VzYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vL3Rlc3RKU09OTEFDS1MoKS5jYXRjaChjb25zb2xlLmVycm9yKS5maW5hbGx5KCgpID0+IHByb2Nlc3MuZXhpdCgpKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBbmRWZXJpZnlQYXJzZXIoKSB7XG4gICAgY29uc3QgcGVnanMgPSBhd2FpdCBpbXBvcnQoXCJwZWdqc1wiKTtcblxuICAgIHZhciBncmFtbWFyID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArIFwiL0pTT05MQUNLUy5wZWdqc1wiLCBcInV0ZjhcIik7XG4gICAgdmFyIHBhcnNlclNvdXJjZSA9IHBlZ2pzLmdlbmVyYXRlKGdyYW1tYXIsIHsgb3V0cHV0OiBcInNvdXJjZVwiLCBmb3JtYXQ6IFwiY29tbW9uanNcIiB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKF9fZGlybmFtZSArIFwiL0pTT05MQUNLUy5nZW5lcmF0ZWQuanNcIiwgcGFyc2VyU291cmNlKTtcblxuICAgIHZhciBtb2R1bGUgPSB7IGV4cG9ydHM6IHt9IH07XG4gICAgZXZhbChwYXJzZXJTb3VyY2UpO1xuICAgIGNvbnN0IHBhcnNlciA9IG1vZHVsZS5leHBvcnRzIGFzIGFueTtcbiAgICBmdW5jdGlvbiB2ZXJpZnkodGV4dDogc3RyaW5nLCBmb3JjZWRPYmo/OiB1bmtub3duKSB7XG4gICAgICAgIHZhciBwYXJzZWQgPSBwYXJzZXIucGFyc2UodGV4dCk7XG4gICAgICAgIHZhciByZXN1bHQgPSBKU09OLnN0cmluZ2lmeShwYXJzZWQpO1xuICAgICAgICBsZXQgcmVhbFJlc3VsdCA9IGZvcmNlZE9iaiA/PyBKU09OLnN0cmluZ2lmeShldmFsKFwiKFwiICsgdGV4dCArIFwiKVwiKSk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IHJlYWxSZXN1bHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlOiAke3RleHR9IHNob3VsZCBiZSAke3JlYWxSZXN1bHR9LCB3YXMgJHtyZXN1bHR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coXCJQYXJzZWQgY29ycmVjdGx5OiBcIiwgdGV4dCk7XG4gICAgfVxuXG4gICAgdmVyaWZ5KGBcbiAgICB7XG4gICAgICAgIFwiaGVsbG9fdGhlcmVcIjogMSxcbiAgICB9XG4gICAgYCk7XG4gICAgdmVyaWZ5KGBcbiAgICB7XG4gICAgICAgIGhlbGxvX3RoZXJlOiAxLFxuICAgIH1cbiAgICBgKTtcbiAgICB2ZXJpZnkoYFxuICAgIHtcbiAgICAgICAgaGVsbG9fdGhlcmU6IDEsXG4gICAgICAgIG1vcmU6IDEsXG4gICAgfVxuICAgIGApO1xuICAgIHZlcmlmeShgeyBsaXN0OiBbMSxdLCB9YCk7XG4gICAgdmVyaWZ5KGB7IGxpc3Q6IFsxLF0sIGxpc3QyOiBbMSxdLCB9YCk7XG5cbiAgICB2ZXJpZnkoYHsgLyogdGVzdCAqLyBsaXN0OiBbMSxdLCBsaXN0MjogWzEsXSwgfWApO1xuICAgIHZlcmlmeShgeyAvKiB0ZXN0ICovIC8qIHRlc3QgMiAqLyBsaXN0OiBbMSxdLCBsaXN0MjogWzEsXSwgfWApO1xuICAgIHZlcmlmeShgXG4gICAge1xuICAgICAgICAvKiB0ZXN0ICovXG4gICAgICAgIC8qIHRlc3QgMiAqL1xuICAgICAgICBsaXN0OiBbMSxdLFxuICAgICAgICAvLyBTaW5nbGUgbGluZSBjb21tZW50XG4gICAgICAgIGxpc3QyOiBbMSxdLFxuICAgICAgICAvLyBsaXN0MzogWzNdLFxuICAgIH1cbiAgICBgKTtcbiAgICAvLyBNdWx0aWxpbmUgZG91YmxlIHF1b3RlIHN0cmluZ3NcbiAgICB2ZXJpZnkoYFxuICAgIHtcbiAgICAgICAgdmFsdWU6IFwiYVxuYlwiXG4gICAgfVxuICAgIGAsIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IFwiYVxcbmJcIiB9KSk7XG5cbiAgICAvLyBTaW5nbGUgcXVvdGVzXG4gICAgdmVyaWZ5KGBcbiAgICB7XG4gICAgICAgIHZhbHVlOiAnYSdcbiAgICB9XG4gICAgYCk7XG4gICAgdmVyaWZ5KGB1bmRlZmluZWRgKTtcbn1cbi8vZ2VuZXJhdGVBbmRWZXJpZnlQYXJzZXIoKS5jYXRjaChjb25zb2xlLmVycm9yKS5maW5hbGx5KCgpID0+IHByb2Nlc3MuZXhpdCgpKTsiXX0=
|
|
469
|
-
/* _JS_SOURCE_HASH = "1ed5449cbb7f4a390b58c0657e5b462d47e1493ed0d92180605b08712028c036"; */
|