socket-function 1.2.2 → 1.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/SocketFunction.d.ts +1 -1
  2. package/SocketFunctionTypes.d.ts +1 -1
  3. package/hot/HotReloadController.d.ts +3 -3
  4. package/index.d.ts +25 -10
  5. package/package.json +1 -1
  6. package/require/CSSShim.d.ts +1 -1
  7. package/require/RequireController.d.ts +2 -2
  8. package/require/compileFlags.d.ts +1 -1
  9. package/require/require.d.ts +1 -1
  10. package/src/callManager.d.ts +1 -1
  11. package/src/webSocketServer.ts +44 -35
  12. package/test.ts +5 -11
  13. package/time/trueTimeShim.d.ts +16 -1
  14. package/time/trueTimeShim.ts +43 -7
  15. package/dist/SetProcessVariables.ts.cache +0 -9
  16. package/dist/SocketFunction.ts.cache +0 -467
  17. package/hot/dist/HotReloadController.ts.cache +0 -252
  18. package/require/dist/RequireController.ts.cache +0 -386
  19. package/require/dist/compileFlags.ts.cache +0 -41
  20. package/require/dist/extMapper.ts.cache +0 -368
  21. package/require/dist/require.ts.cache +0 -676
  22. package/src/JSONLACKS/dist/JSONLACKS.ts.cache +0 -469
  23. package/src/dist/CallFactory.ts.cache +0 -930
  24. package/src/dist/Zip.ts.cache +0 -156
  25. package/src/dist/batching.ts.cache +0 -377
  26. package/src/dist/bits.ts.cache +0 -121
  27. package/src/dist/buffers.ts.cache +0 -76
  28. package/src/dist/caching.ts.cache +0 -302
  29. package/src/dist/callHTTPHandler.ts.cache +0 -264
  30. package/src/dist/callManager.ts.cache +0 -159
  31. package/src/dist/certStore.ts.cache +0 -59
  32. package/src/dist/createSingleton.ts.cache +0 -62
  33. package/src/dist/fixLargeNetworkCalls.ts.cache +0 -17
  34. package/src/dist/forwardPort.ts.cache +0 -222
  35. package/src/dist/https.ts.cache +0 -141
  36. package/src/dist/misc.ts.cache +0 -499
  37. package/src/dist/nodeCache.ts.cache +0 -136
  38. package/src/dist/nodeProxy.ts.cache +0 -57
  39. package/src/dist/protocolNegotiation.ts.cache +0 -101
  40. package/src/dist/tlsParsing.ts.cache +0 -85
  41. package/src/dist/types.ts.cache +0 -9
  42. package/src/dist/webSocketServer.ts.cache +0 -365
  43. package/src/dist/websocketFactory.ts.cache +0 -53
  44. package/src/formatting/dist/colors.ts.cache +0 -98
  45. package/src/formatting/dist/format.ts.cache +0 -396
  46. package/src/formatting/dist/logColors.ts.cache +0 -28
  47. package/src/lz4/dist/LZ4.ts.cache +0 -53
  48. package/src/profiling/dist/getOwnTime.ts.cache +0 -100
  49. package/src/profiling/dist/measure.ts.cache +0 -338
  50. package/src/profiling/dist/stats.ts.cache +0 -202
  51. package/src/profiling/dist/statsFormat.ts.cache +0 -45
  52. package/time/dist/trueTimeShim.ts.cache +0 -707
@@ -1,156 +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"; 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 __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
- return c > 3 && r && Object.defineProperty(target, key, r), r;
23
- };
24
- var __importStar = (this && this.__importStar) || function (mod) {
25
- if (mod && mod.__esModule) return mod;
26
- var result = {};
27
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
28
- __setModuleDefault(result, mod);
29
- return result;
30
- };
31
- var __importDefault = (this && this.__importDefault) || function (mod) {
32
- return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
33
- };
34
- Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
35
- exports.Zip = void 0;
36
- const misc_1 = require("./misc");
37
- const measure_1 = require("./profiling/measure");
38
- const zlib_1 = __importDefault(require("zlib"));
39
- const pako = __importStar(require("pako"));
40
- const compileFlags_1 = require("../require/compileFlags");
41
- (0, compileFlags_1.setFlag)(require, "pako", "allowclient", true);
42
- const SYNC_THRESHOLD_BYTES = 100000000;
43
- const ZIP_SYNC_THRESHOLD_BYTES = 10000000;
44
- // IMPORTANT! If this is slow, add a LZ4 version, which uses lz4-wasm-nodejs. This should be about 10X faster in both dcompression and decompression, only using 50% more space (which isn't great, but... if it is lagging the main thread it might be worth it).
45
- class Zip {
46
- static async gzip(buffer, level) {
47
- if (buffer.length < ZIP_SYNC_THRESHOLD_BYTES) {
48
- return this.gzipSync(buffer, level);
49
- }
50
- if ((0, misc_1.isNode)()) {
51
- return new Promise((resolve, reject) => {
52
- zlib_1.default.gzip(buffer, { level }, (err, result) => {
53
- if (err)
54
- reject(err);
55
- else
56
- resolve(result);
57
- });
58
- });
59
- }
60
- else {
61
- // @ts-ignore
62
- return await doStream(new CompressionStream("gzip"), buffer);
63
- }
64
- }
65
- static gzipSync(buffer, level) {
66
- if ((0, misc_1.isNode)() && buffer.length < ZIP_SYNC_THRESHOLD_BYTES) {
67
- return Buffer.from(zlib_1.default.gzipSync(buffer, { level }));
68
- }
69
- return Buffer.from(pako.gzip(buffer));
70
- }
71
- static gunzip(buffer) {
72
- return this.gunzipUntracked(buffer);
73
- }
74
- static async gunzipAsyncBase(buffer) {
75
- return this.gunzipUntracked(buffer);
76
- }
77
- static gunzipSync(buffer) {
78
- return this.gunzipUntrackedSync(buffer);
79
- }
80
- static async gunzipBatch(buffers) {
81
- let time = Date.now();
82
- buffers = await Promise.all(buffers.map(x => {
83
- return this.gunzipUntracked(x);
84
- }));
85
- time = Date.now() - time;
86
- // let totalSize = buffers.reduce((acc, buffer) => acc + buffer.length, 0);
87
- //console.log(`Gunzip ${formatNumber(totalSize)}B at ${formatNumber(totalSize / time * 1000)}B/s`);
88
- return buffers;
89
- }
90
- static gunzipUntracked(buffer) {
91
- // Switch to the synchronous version if the buffer is small. This is a lot faster in Node.js and clientside.
92
- // - On tests of random small amounts of data, this seems to be up to 7X faster (on node). However, on non-random data, on the actual data we're using, it seems to be almost 50 times faster. So... definitely worth it...
93
- if (buffer.length < SYNC_THRESHOLD_BYTES) {
94
- let time = Date.now();
95
- let result = Zip.gunzipUntrackedSync(buffer);
96
- let duration = Date.now() - time;
97
- if (duration > 50) {
98
- // Wait, so we don't lock up the main thread. And if we already wait it 50ms, then waiting for one frame is marginal, even client-side.
99
- return ((async () => {
100
- await new Promise(resolve => setTimeout(resolve, 0));
101
- return result;
102
- }))();
103
- }
104
- return result;
105
- }
106
- if ((0, misc_1.isNode)()) {
107
- return doStream(new DecompressionStream("gzip"), buffer);
108
- }
109
- else {
110
- return Zip.gunzipUntrackedSync(buffer);
111
- }
112
- }
113
- static gunzipUntrackedSync(buffer) {
114
- if ((0, misc_1.isNode)() && buffer.length < ZIP_SYNC_THRESHOLD_BYTES) {
115
- return Buffer.from(zlib_1.default.gunzipSync(buffer));
116
- }
117
- return Buffer.from(pako.ungzip(buffer));
118
- }
119
- }
120
- exports.Zip = Zip;
121
- __decorate([
122
- measure_1.measureFnc
123
- ], Zip, "gzip", null);
124
- __decorate([
125
- measure_1.measureFnc
126
- ], Zip, "gzipSync", null);
127
- __decorate([
128
- measure_1.measureFnc
129
- ], Zip, "gunzip", null);
130
- __decorate([
131
- measure_1.measureFnc
132
- ], Zip, "gunzipAsyncBase", null);
133
- __decorate([
134
- measure_1.measureFnc
135
- ], Zip, "gunzipSync", null);
136
- __decorate([
137
- measure_1.measureFnc
138
- ], Zip, "gunzipBatch", null);
139
- async function doStream(stream, buffer) {
140
- let reader = stream.readable.getReader();
141
- let writer = stream.writable.getWriter();
142
- let writePromise = writer.write(buffer);
143
- let closePromise = writer.close();
144
- let outputBuffers = [];
145
- while (true) {
146
- let { value, done } = await reader.read();
147
- if (done) {
148
- await writePromise;
149
- await closePromise;
150
- return Buffer.concat(outputBuffers);
151
- }
152
- outputBuffers.push(Buffer.from(value));
153
- }
154
- }
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWmlwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiWmlwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaUNBQWdDO0FBQ2hDLGlEQUFpRDtBQUNqRCxnREFBd0I7QUFDeEIsMkNBQTZCO0FBRTdCLDBEQUFrRDtBQUVsRCxJQUFBLHNCQUFPLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFFOUMsTUFBTSxvQkFBb0IsR0FBRyxTQUFXLENBQUM7QUFDekMsTUFBTSx3QkFBd0IsR0FBRyxRQUFVLENBQUM7QUFFNUMsa1FBQWtRO0FBQ2xRLE1BQWEsR0FBRztJQUVRLEFBQWIsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBYyxFQUFFLEtBQWM7UUFDbkQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLHdCQUF3QixFQUFFLENBQUM7WUFDM0MsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsSUFBSSxJQUFBLGFBQU0sR0FBRSxFQUFFLENBQUM7WUFDWCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNuQyxjQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBUSxFQUFFLE1BQWMsRUFBRSxFQUFFO29CQUN0RCxJQUFJLEdBQUc7d0JBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDOzt3QkFDaEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN6QixDQUFDLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQzthQUFNLENBQUM7WUFDSixhQUFhO1lBQ2IsT0FBTyxNQUFNLFFBQVEsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FB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Q0FBQztBQUVMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc05vZGUgfSBmcm9tIFwiLi9taXNjXCI7XG5pbXBvcnQgeyBtZWFzdXJlRm5jIH0gZnJvbSBcIi4vcHJvZmlsaW5nL21lYXN1cmVcIjtcbmltcG9ydCB6bGliIGZyb20gXCJ6bGliXCI7XG5pbXBvcnQgKiBhcyBwYWtvIGZyb20gXCJwYWtvXCI7XG5cbmltcG9ydCB7IHNldEZsYWcgfSBmcm9tIFwiLi4vcmVxdWlyZS9jb21waWxlRmxhZ3NcIjtcbmltcG9ydCB7IE1heWJlUHJvbWlzZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5zZXRGbGFnKHJlcXVpcmUsIFwicGFrb1wiLCBcImFsbG93Y2xpZW50XCIsIHRydWUpO1xuXG5jb25zdCBTWU5DX1RIUkVTSE9MRF9CWVRFUyA9IDEwMF8wMDBfMDAwO1xuY29uc3QgWklQX1NZTkNfVEhSRVNIT0xEX0JZVEVTID0gMTBfMDAwXzAwMDtcblxuLy8gSU1QT1JUQU5UISBJZiB0aGlzIGlzIHNsb3csIGFkZCBhIExaNCB2ZXJzaW9uLCB3aGljaCB1c2VzIGx6NC13YXNtLW5vZGVqcy4gVGhpcyBzaG91bGQgYmUgYWJvdXQgMTBYIGZhc3RlciBpbiBib3RoIGRjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiwgb25seSB1c2luZyA1MCUgbW9yZSBzcGFjZSAod2hpY2ggaXNuJ3QgZ3JlYXQsIGJ1dC4uLiBpZiBpdCBpcyBsYWdnaW5nIHRoZSBtYWluIHRocmVhZCBpdCBtaWdodCBiZSB3b3J0aCBpdCkuXG5leHBvcnQgY2xhc3MgWmlwIHtcbiAgICBAbWVhc3VyZUZuY1xuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ3ppcChidWZmZXI6IEJ1ZmZlciwgbGV2ZWw/OiBudW1iZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IFpJUF9TWU5DX1RIUkVTSE9MRF9CWVRFUykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3ppcFN5bmMoYnVmZmVyLCBsZXZlbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTm9kZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHpsaWIuZ3ppcChidWZmZXIsIHsgbGV2ZWwgfSwgKGVycjogYW55LCByZXN1bHQ6IEJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBkb1N0cmVhbShuZXcgQ29tcHJlc3Npb25TdHJlYW0oXCJnemlwXCIpLCBidWZmZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIEBtZWFzdXJlRm5jXG4gICAgcHVibGljIHN0YXRpYyBnemlwU3luYyhidWZmZXI6IEJ1ZmZlciwgbGV2ZWw/OiBudW1iZXIpOiBCdWZmZXIge1xuICAgICAgICBpZiAoaXNOb2RlKCkgJiYgYnVmZmVyLmxlbmd0aCA8IFpJUF9TWU5DX1RIUkVTSE9MRF9CWVRFUykge1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHpsaWIuZ3ppcFN5bmMoYnVmZmVyLCB7IGxldmVsIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20ocGFrby5nemlwKGJ1ZmZlcikpO1xuICAgIH1cblxuICAgIEBtZWFzdXJlRm5jXG4gICAgcHVibGljIHN0YXRpYyBndW56aXAoYnVmZmVyOiBCdWZmZXIpOiBNYXliZVByb21pc2U8QnVmZmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1bnppcFVudHJhY2tlZChidWZmZXIpO1xuICAgIH1cbiAgICBAbWVhc3VyZUZuY1xuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ3VuemlwQXN5bmNCYXNlKGJ1ZmZlcjogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VuemlwVW50cmFja2VkKGJ1ZmZlcik7XG4gICAgfVxuXG4gICAgQG1lYXN1cmVGbmNcbiAgICBwdWJsaWMgc3RhdGljIGd1bnppcFN5bmMoYnVmZmVyOiBCdWZmZXIpOiBCdWZmZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5ndW56aXBVbnRyYWNrZWRTeW5jKGJ1ZmZlcik7XG4gICAgfVxuXG4gICAgQG1lYXN1cmVGbmNcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGd1bnppcEJhdGNoKGJ1ZmZlcnM6IEJ1ZmZlcltdKTogUHJvbWlzZTxCdWZmZXJbXT4ge1xuICAgICAgICBsZXQgdGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGJ1ZmZlcnMgPSBhd2FpdCBQcm9taXNlLmFsbChidWZmZXJzLm1hcCh4ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmd1bnppcFVudHJhY2tlZCh4KTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aW1lID0gRGF0ZS5ub3coKSAtIHRpbWU7XG4gICAgICAgIC8vIGxldCB0b3RhbFNpemUgPSBidWZmZXJzLnJlZHVjZSgoYWNjLCBidWZmZXIpID0+IGFjYyArIGJ1ZmZlci5sZW5ndGgsIDApO1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBHdW56aXAgJHtmb3JtYXROdW1iZXIodG90YWxTaXplKX1CIGF0ICR7Zm9ybWF0TnVtYmVyKHRvdGFsU2l6ZSAvIHRpbWUgKiAxMDAwKX1CL3NgKTtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcnM7XG4gICAgfVxuXG5cblxuICAgIHB1YmxpYyBzdGF0aWMgZ3VuemlwVW50cmFja2VkKGJ1ZmZlcjogQnVmZmVyKTogTWF5YmVQcm9taXNlPEJ1ZmZlcj4ge1xuICAgICAgICAvLyBTd2l0Y2ggdG8gdGhlIHN5bmNocm9ub3VzIHZlcnNpb24gaWYgdGhlIGJ1ZmZlciBpcyBzbWFsbC4gVGhpcyBpcyBhIGxvdCBmYXN0ZXIgaW4gTm9kZS5qcyBhbmQgY2xpZW50c2lkZS5cbiAgICAgICAgLy8gIC0gT24gdGVzdHMgb2YgcmFuZG9tIHNtYWxsIGFtb3VudHMgb2YgZGF0YSwgdGhpcyBzZWVtcyB0byBiZSB1cCB0byA3WCBmYXN0ZXIgKG9uIG5vZGUpLiBIb3dldmVyLCBvbiBub24tcmFuZG9tIGRhdGEsIG9uIHRoZSBhY3R1YWwgZGF0YSB3ZSdyZSB1c2luZywgaXQgc2VlbXMgdG8gYmUgYWxtb3N0IDUwIHRpbWVzIGZhc3Rlci4gU28uLi4gZGVmaW5pdGVseSB3b3J0aCBpdC4uLlxuICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IFNZTkNfVEhSRVNIT0xEX0JZVEVTKSB7XG4gICAgICAgICAgICBsZXQgdGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gWmlwLmd1bnppcFVudHJhY2tlZFN5bmMoYnVmZmVyKTtcbiAgICAgICAgICAgIGxldCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSB0aW1lO1xuICAgICAgICAgICAgaWYgKGR1cmF0aW9uID4gNTApIHtcbiAgICAgICAgICAgICAgICAvLyBXYWl0LCBzbyB3ZSBkb24ndCBsb2NrIHVwIHRoZSBtYWluIHRocmVhZC4gQW5kIGlmIHdlIGFscmVhZHkgd2FpdCBpdCA1MG1zLCB0aGVuIHdhaXRpbmcgZm9yIG9uZSBmcmFtZSBpcyBtYXJnaW5hbCwgZXZlbiBjbGllbnQtc2lkZS4gXG4gICAgICAgICAgICAgICAgcmV0dXJuICgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH0pKSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOb2RlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBkb1N0cmVhbShuZXcgRGVjb21wcmVzc2lvblN0cmVhbShcImd6aXBcIiksIGJ1ZmZlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gWmlwLmd1bnppcFVudHJhY2tlZFN5bmMoYnVmZmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGd1bnppcFVudHJhY2tlZFN5bmMoYnVmZmVyOiBCdWZmZXIpOiBCdWZmZXIge1xuICAgICAgICBpZiAoaXNOb2RlKCkgJiYgYnVmZmVyLmxlbmd0aCA8IFpJUF9TWU5DX1RIUkVTSE9MRF9CWVRFUykge1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHpsaWIuZ3VuemlwU3luYyhidWZmZXIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20ocGFrby51bmd6aXAoYnVmZmVyKSk7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkb1N0cmVhbShzdHJlYW06IEdlbmVyaWNUcmFuc2Zvcm1TdHJlYW0sIGJ1ZmZlcjogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBsZXQgcmVhZGVyID0gc3RyZWFtLnJlYWRhYmxlLmdldFJlYWRlcigpO1xuICAgIGxldCB3cml0ZXIgPSBzdHJlYW0ud3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgbGV0IHdyaXRlUHJvbWlzZSA9IHdyaXRlci53cml0ZShidWZmZXIpO1xuICAgIGxldCBjbG9zZVByb21pc2UgPSB3cml0ZXIuY2xvc2UoKTtcblxuICAgIGxldCBvdXRwdXRCdWZmZXJzOiBCdWZmZXJbXSA9IFtdO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGxldCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVQcm9taXNlO1xuICAgICAgICAgICAgYXdhaXQgY2xvc2VQcm9taXNlO1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQob3V0cHV0QnVmZmVycyk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0QnVmZmVycy5wdXNoKEJ1ZmZlci5mcm9tKHZhbHVlKSk7XG4gICAgfVxuXG59Il19
156
- /* _JS_SOURCE_HASH = "bafabd4976ce01311009f7fde726d2bb7a8236733f9e7381cbaa0153ed865d15"; */
@@ -1,377 +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
- Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
- //exports.safeLoop = exports.unblockLoop = exports.throttledLoop = exports.retryFunctional = exports.shutdownPolling = exports.runInfinitePollCallAtStart = exports.runInfinitePoll = exports.runInParallel = exports.runInSerial = exports.batchFunction = exports.batchFunctionNone = exports.delay = void 0;
4
- const format_1 = require("./formatting/format");
5
- const logColors_1 = require("./formatting/logColors");
6
- const misc_1 = require("./misc");
7
- const measure_1 = require("./profiling/measure");
8
- function delay(delayTime,
9
- // Delays < 10ms become "immediate"
10
- immediateShortDelays) {
11
- if (delayTime === "afterio") {
12
- return new Promise(resolve => setImmediate(resolve));
13
- }
14
- else if (delayTime === "afterpromises") {
15
- // NOTE: We use a promise here as it might be a bit easier to debug than queueMicrotask.
16
- // It is equivalent though...
17
- return Promise.resolve();
18
- }
19
- else if (delayTime === "immediate") {
20
- if ((0, misc_1.isNode)()) {
21
- return new Promise(resolve => setImmediate(resolve));
22
- }
23
- else {
24
- return delay("afterpromises");
25
- }
26
- }
27
- else if (delayTime === "paintLoop") {
28
- if ((0, misc_1.isNode)()) {
29
- return delay("immediate");
30
- }
31
- return (async () => {
32
- await new Promise(resolve => requestAnimationFrame(resolve));
33
- })();
34
- }
35
- else if (delayTime === "afterPaint") {
36
- if ((0, misc_1.isNode)()) {
37
- return delay("immediate");
38
- }
39
- else {
40
- return (async () => {
41
- await new Promise(resolve => requestAnimationFrame(resolve));
42
- // Before first paint
43
- await new Promise(resolve => requestAnimationFrame(resolve));
44
- // After first paint
45
- })();
46
- }
47
- }
48
- else {
49
- if (delayTime < 10 && immediateShortDelays) {
50
- // NOTE: setTimeout can't wait this short of a time, so just setImmediate. This should be hard to distinguish
51
- // anyways, as setImmediate (at least in nodejs), should happen after io, so... it should just work
52
- // (the only difference is there will be less unnecessary delay).
53
- // NOTE: THIS DOES break certain cases where io is depending on true delay, and by only waiting a microtick
54
- // we don't give it a chance. But... we should just handle those cases explicitly, via an explicit "afterio".
55
- return delay("immediate");
56
- }
57
- // NOTE: We check Date.now() and wait longer if setTimeout didn't wait long enough.
58
- return (async () => {
59
- let targetTime = Date.now() + delayTime;
60
- while (true) {
61
- let timeToWait = targetTime - Date.now();
62
- await new Promise(resolve => setTimeout(resolve, timeToWait));
63
- if (Date.now() >= targetTime) {
64
- break;
65
- }
66
- }
67
- })();
68
- }
69
- }
70
- exports.delay = delay;
71
- // NOTE: This is an easy way to turn off batching, without having to strip the extra batch handling code
72
- function batchFunctionNone(config, fnc) {
73
- return async (arg) => fnc([arg]);
74
- }
75
- exports.batchFunctionNone = batchFunctionNone;
76
- function batchFunction(config, fnc) {
77
- if (!config.noMeasure) {
78
- fnc = (0, measure_1.measureWrap)(fnc, config.name);
79
- }
80
- let prevPromise;
81
- let batching;
82
- let curDelay = config.delay;
83
- let delayRamp = 0;
84
- if (config.throttleWindow && typeof curDelay === "number") {
85
- delayRamp = curDelay / (config.throttleWindow / curDelay);
86
- }
87
- let delayTime = 0;
88
- if (typeof curDelay === "number") {
89
- delayTime = curDelay;
90
- }
91
- let countSinceBreak = 0;
92
- let lastCall = 0;
93
- return arg => {
94
- let now = Date.now();
95
- if (delayRamp) {
96
- // The time since the last call (started) is how much budget we will have received to
97
- // run values. If it is === delayTime, then we subtract 1, as we are right on track.
98
- // If it is > delayTime, then we are running below the rate, so it is fine.
99
- // If it is < delayTime, we are running too fast, and have to slow down.
100
- let savedCount = (now - lastCall) / delayTime;
101
- if (savedCount >= 1) {
102
- countSinceBreak -= savedCount;
103
- }
104
- if (countSinceBreak < 0) {
105
- countSinceBreak = 0;
106
- }
107
- countSinceBreak++;
108
- // Set the max fairly high, as we basically ignore small delay times, so we need a high max to allow
109
- // our delay to even apply!
110
- curDelay = Math.min(delayTime * 20, delayRamp * countSinceBreak);
111
- }
112
- lastCall = now;
113
- if (batching) {
114
- batching.args.push(arg);
115
- return batching.promise;
116
- }
117
- let curPrevPromise = prevPromise;
118
- let args = [arg];
119
- let promise = Promise.resolve().then(async () => {
120
- // Ignore the error. New callers don't care about errors in previous calls,
121
- // as they are unrelated to the current call, and just break valid calls
122
- // due to invalid calls.
123
- try {
124
- await curPrevPromise;
125
- }
126
- catch (_a) { }
127
- await delay(curDelay, "immediateShortDelays");
128
- // Reset batching, as we once we start the function we can't accept args. `prevPromise` will block
129
- // the next batch from starting before we finish.
130
- batching = undefined;
131
- return await fnc(args);
132
- });
133
- batching = { args, promise, };
134
- prevPromise = batching.promise;
135
- return promise;
136
- };
137
- }
138
- exports.batchFunction = batchFunction;
139
- function runInSerial(fnc) {
140
- let updateQueue = [];
141
- return (async function runInSerial(...args) {
142
- var _a;
143
- let promise = {
144
- promise: null,
145
- resolve: () => { },
146
- };
147
- promise.promise = new Promise(resolve => {
148
- promise.resolve = resolve;
149
- });
150
- const queueWasEmpty = updateQueue.length === 0;
151
- if (queueWasEmpty) {
152
- promise.resolve();
153
- }
154
- updateQueue.push(promise);
155
- await promise.promise;
156
- try {
157
- return await fnc(...args);
158
- }
159
- finally {
160
- // Pop ourself off
161
- updateQueue.shift();
162
- // Resolve the next promise
163
- (_a = updateQueue[0]) === null || _a === void 0 ? void 0 : _a.resolve();
164
- }
165
- });
166
- }
167
- exports.runInSerial = runInSerial;
168
- function runInParallel(config, fnc) {
169
- let queued = [];
170
- let runningCount = 0;
171
- function runIfNeeded() {
172
- if (runningCount >= config.parallelCount) {
173
- return;
174
- }
175
- const queuedObj = queued.shift();
176
- if (!queuedObj)
177
- return;
178
- queuedObj.result.resolve((async () => {
179
- runningCount++;
180
- try {
181
- if (config.callTimeout) {
182
- return await (0, misc_1.timeoutToError)(config.callTimeout, fnc(...queuedObj.parameters), () => new Error(`Parallel call timed out for fnc ${fnc.name}`));
183
- }
184
- else {
185
- return await fnc(...queuedObj.parameters);
186
- }
187
- }
188
- finally {
189
- runningCount--;
190
- runIfNeeded();
191
- }
192
- })());
193
- }
194
- function parallelCall(...args) {
195
- queued.push({
196
- parameters: args,
197
- result: new misc_1.PromiseObj(),
198
- });
199
- let queuedObj = queued[queued.length - 1];
200
- runIfNeeded();
201
- return queuedObj.result.promise;
202
- }
203
- return parallelCall;
204
- }
205
- exports.runInParallel = runInParallel;
206
- let pollingRunning = true;
207
- let pendingPolls = new Set();
208
- function runInfinitePoll(delayTime, fnc, stopObj) {
209
- void (async () => {
210
- while (!(stopObj === null || stopObj === void 0 ? void 0 : stopObj.stop) && pollingRunning) {
211
- await delay(delayTime);
212
- if (!pollingRunning)
213
- break;
214
- await runPollFnc(fnc);
215
- }
216
- })();
217
- }
218
- exports.runInfinitePoll = runInfinitePoll;
219
- async function runInfinitePollCallAtStart(delayTime, fnc, stopObj) {
220
- try {
221
- return await fnc();
222
- }
223
- finally {
224
- void (async () => {
225
- while (!(stopObj === null || stopObj === void 0 ? void 0 : stopObj.stop) && pollingRunning) {
226
- await delay(delayTime);
227
- if (!pollingRunning)
228
- break;
229
- await runPollFnc(fnc);
230
- }
231
- })();
232
- }
233
- }
234
- exports.runInfinitePollCallAtStart = runInfinitePollCallAtStart;
235
- async function runPollFnc(fnc) {
236
- let promise = (async () => {
237
- try {
238
- return await fnc();
239
- }
240
- catch (e) {
241
- console.error(`Error in infinite poll ${fnc.name || fnc.toString().slice(0, 100)} (continuing poll loop)\n${e.stack}`);
242
- }
243
- })();
244
- pendingPolls.add(promise);
245
- await promise;
246
- pendingPolls.delete(promise);
247
- }
248
- /** Disables polling, called on shutdown. Blocks until all pending poll loops finish */
249
- async function shutdownPolling() {
250
- pollingRunning = false;
251
- await Promise.all(Array.from(pendingPolls));
252
- }
253
- exports.shutdownPolling = shutdownPolling;
254
- const DEFAULT_RETRY_DELAY = 5000;
255
- const DEFAULT_MAX_RETRIES = 3;
256
- function retryFunctional(fnc, config) {
257
- let { maxRetries = DEFAULT_MAX_RETRIES, shouldRetry, minDelay = DEFAULT_RETRY_DELAY, maxDelay = DEFAULT_RETRY_DELAY, timeout, warningInterval, } = config || {};
258
- let expFactor = Math.max(1, Math.log(maxDelay / minDelay) / Math.log(Math.max(maxRetries, 2)));
259
- let name = fnc.name || fnc.toString().slice(0, 100);
260
- async function runFnc(args, retries) {
261
- try {
262
- let promise = fnc(...args);
263
- if (timeout !== undefined) {
264
- promise = (0, misc_1.timeoutToError)(timeout, promise, () => new Error(`timed out after ${(0, format_1.formatTime)(timeout)}`));
265
- }
266
- if (warningInterval !== undefined) {
267
- promise = (0, misc_1.watchSlowPromise)(name, promise, { interval: warningInterval });
268
- }
269
- return await promise;
270
- }
271
- catch (e) {
272
- if (shouldRetry && !shouldRetry(String(e.stack))) {
273
- throw e;
274
- }
275
- if (retries < 0)
276
- throw e;
277
- retries--;
278
- console.warn(`Retrying ${name} (${retries}/${maxRetries} left), due to error ${String(e.stack)}`);
279
- let curCount = maxRetries - retries;
280
- await delay(minDelay * expFactor ** curCount);
281
- return runFnc(args, retries);
282
- }
283
- }
284
- return async function (...args) {
285
- return await runFnc(args, maxRetries);
286
- };
287
- }
288
- exports.retryFunctional = retryFunctional;
289
- /** @deprecated Use safeLoop instead */
290
- exports.throttledLoop = unblockLoop;
291
- /** @deprecated Use safeLoop instead */
292
- async function unblockLoop(config, fnc) {
293
- var _a, _b;
294
- let data = Array.isArray(config) ? config : config.data;
295
- let maxBlockingTime = 300;
296
- let backOffTime = 50;
297
- if (!Array.isArray(config)) {
298
- maxBlockingTime = (_a = config.maxBlockingTime) !== null && _a !== void 0 ? _a : 300;
299
- backOffTime = (_b = config.backOffTime) !== null && _b !== void 0 ? _b : 50;
300
- }
301
- let lastYieldTime = Date.now();
302
- let results = [];
303
- for (let item of data) {
304
- let result = fnc(item);
305
- // If the function returns a promise, await it
306
- if (result && typeof result === "object" && "then" in result) {
307
- result = await result;
308
- }
309
- results.push(result);
310
- // Check if we've been blocking for too long
311
- if (Date.now() - lastYieldTime > maxBlockingTime) {
312
- await delay(backOffTime);
313
- lastYieldTime = Date.now();
314
- }
315
- }
316
- return results;
317
- }
318
- exports.unblockLoop = unblockLoop;
319
- async function safeLoop(config, fnc) {
320
- var _a;
321
- let { data, maxActiveFraction, doNotWarnOnSlow, name } = config;
322
- let maxBlockingTime = (_a = config.maxBlockingTime) !== null && _a !== void 0 ? _a : 1000;
323
- let label = name || fnc.name || fnc.toString().slice(0, 100).replaceAll("\n", "\\n");
324
- let startTime = Date.now();
325
- let index = 0;
326
- let indexStartTime = Date.now();
327
- let done = false;
328
- if (!doNotWarnOnSlow) {
329
- void (async () => {
330
- while (!done) {
331
- await delay(5000);
332
- if (done)
333
- break;
334
- let message = `${(0, logColors_1.red)("SLOW LOOP")} | ${index} / ${data.length} | ${(0, format_1.formatTime)(Date.now() - startTime)} | ${label}`;
335
- let timeOnCurrent = Date.now() - indexStartTime;
336
- if (timeOnCurrent > 5000) {
337
- message += `| SLOW INDEX (${index}) ${(0, format_1.formatTime)(timeOnCurrent)}+`;
338
- }
339
- console.log(message);
340
- }
341
- })();
342
- }
343
- let results = [];
344
- let activeTimeSinceYield = 0;
345
- try {
346
- for (index = 0; index < data.length; index++) {
347
- indexStartTime = Date.now();
348
- let result = fnc(data[index]);
349
- let isPromise = false;
350
- if (result && typeof result === "object" && "then" in result) {
351
- isPromise = true;
352
- result = await result;
353
- }
354
- results.push(result);
355
- activeTimeSinceYield += Date.now() - indexStartTime;
356
- let backOffTime;
357
- if (!isPromise && activeTimeSinceYield > maxBlockingTime) {
358
- backOffTime = 0;
359
- }
360
- if (maxActiveFraction !== undefined && maxActiveFraction > 0 && maxActiveFraction < 1) {
361
- let target = activeTimeSinceYield / maxActiveFraction - activeTimeSinceYield;
362
- backOffTime = Math.max(backOffTime !== null && backOffTime !== void 0 ? backOffTime : 0, target);
363
- }
364
- if (backOffTime !== undefined) {
365
- await delay(backOffTime);
366
- activeTimeSinceYield = 0;
367
- }
368
- }
369
- }
370
- finally {
371
- done = true;
372
- }
373
- return results;
374
- }
375
- exports.safeLoop = safeLoop;
376
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJiYXRjaGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnREFBaUQ7QUFDakQsc0RBQTZDO0FBQzdDLGlDQUE4RTtBQUM5RSxpREFBa0Q7QUFvQmxELFNBQWdCLEtBQUssQ0FDakIsU0FBb0I7QUFDcEIsbUNBQW1DO0FBQ25DLG9CQUE2QztJQUU3QyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMxQixPQUFPLElBQUksT0FBTyxDQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztTQUFNLElBQUksU0FBUyxLQUFLLGVBQWUsRUFBRSxDQUFDO1FBQ3ZDLHdGQUF3RjtRQUN4Riw4QkFBOEI7UUFDOUIsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDN0IsQ0FBQztTQUFNLElBQUksU0FBUyxLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQ25DLElBQUksSUFBQSxhQUFNLEdBQUUsRUFBRSxDQUFDO1lBQ1gsT0FBTyxJQUFJLE9BQU8sQ0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7YUFBTSxDQUFDO1lBQ0osT0FBTyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNMLENBQUM7U0FBTSxJQUFJLFNBQVMsS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUNuQyxJQUFJLElBQUEsYUFBTSxHQUFFLEVBQUUsQ0FBQztZQUNYLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFDRCxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDZixNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDLENB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QztBQUNuQixDQUFDO0FBcEVELDRCQW9FQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZvcm1hdFRpbWUgfSBmcm9tIFwiLi9mb3JtYXR0aW5nL2Zvcm1hdFwiO1xuaW1wb3J0IHsgcmVkIH0gZnJvbSBcIi4vZm9ybWF0dGluZy9sb2dDb2xvcnNcIjtcbmltcG9ydCB7IFByb21pc2VPYmosIGlzTm9kZSwgdGltZW91dFRvRXJyb3IsIHdhdGNoU2xvd1Byb21pc2UgfSBmcm9tIFwiLi9taXNjXCI7XG5pbXBvcnQgeyBtZWFzdXJlV3JhcCB9IGZyb20gXCIuL3Byb2ZpbGluZy9tZWFzdXJlXCI7XG5pbXBvcnQgeyBBbnlGdW5jdGlvbiwgQXJncywgTWF5YmVQcm9taXNlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLypcbiAgICBcIm51bWJlcnNcIiB1c2Ugc2V0VGltZW91dFxuICAgIFwiYWZ0ZXJwcm9taXNlc1wiIHVzZXMgYSBtaWNyb3Rhc2ssIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTF9ET01fQVBJL01pY3JvdGFza19ndWlkZVxuICAgIFwiYWZ0ZXJpb1wiIHVzZXMgc2V0SW1tZWRpYXRlLCB3aGljaCB3aWxsIGJlIGFmdGVyIGFsbCBwZW5kaW5nIGFuZCBhbGwgY3JlYXRlZCBwcm9taXNlc1xuICAgICAgICAoaW4gdGhlIGJyb3dzZXIgaXQgaXMgbGlrZWx5IHNldEltbWVkaWF0ZSB3aWxsIGJlIHNoaW1tZWQgd2l0aCBzZXRUaW1lb3V0KVxuICAgIFwiaW1tZWRpYXRlXCIgdXNlcyBzZXRJbW1lZGlhdGUsIGJ1dCBpZiBub3QgYXZhaWxhYmxlIHVzZXMgXCJhZnRlcnByb21pc2VzXCJcbiAgICAgICAgLSBUaGUgZW5zdXJlcyBhIHByb21wdCByZXR1cm4sIHdpdGhvdXQgcmVzb3J0aW5nIHRvIHNldFRpbWVvdXQgaW4gdGhlIGJyb3dzZXIgKHdoaWNoIHdpbGwgY2F1c2VcbiAgICAgICAgICAgIHRoZSBjYWxsYmFjayB0byBiZSBkZWxheWVkIGEgZnJhbWUpLlxuKi9cbmV4cG9ydCB0eXBlIERlbGF5VHlwZSA9IChcbiAgICBudW1iZXIgfCBcImFmdGVyaW9cIiB8IFwiaW1tZWRpYXRlXCIgfCBcImFmdGVycHJvbWlzZXNcIlxuICAgIC8vIFdhaXRzIGZvciBwYWludCwgdXNhYmxlIGluIGEgbG9vcC4gVGhlIGZpcnN0IHdhaXQgZG9lc24ndCB3YWl0IHVudGlsIHRoZSBuZXh0XG4gICAgLy8gIHdhaXQsIGJ1dCB0aGUgc2Vjb25kIHdhaXQgd2lsbC5cbiAgICB8IFwicGFpbnRMb29wXCJcbiAgICAvLyBXYWl0cyB1bnRpbCBhZnRlciBwYWludCwgYnkgd2FpdGluZyB0d2ljZS5cbiAgICB8IFwiYWZ0ZXJQYWludFwiXG4pXG5leHBvcnQgZnVuY3Rpb24gZGVsYXkoXG4gICAgZGVsYXlUaW1lOiBEZWxheVR5cGUsXG4gICAgLy8gRGVsYXlzIDwgMTBtcyBiZWNvbWUgXCJpbW1lZGlhdGVcIlxuICAgIGltbWVkaWF0ZVNob3J0RGVsYXlzPzogXCJpbW1lZGlhdGVTaG9ydERlbGF5c1wiXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZGVsYXlUaW1lID09PSBcImFmdGVyaW9cIikge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiBzZXRJbW1lZGlhdGUocmVzb2x2ZSkpO1xuICAgIH0gZWxzZSBpZiAoZGVsYXlUaW1lID09PSBcImFmdGVycHJvbWlzZXNcIikge1xuICAgICAgICAvLyBOT1RFOiBXZSB1c2UgYSBwcm9taXNlIGhlcmUgYXMgaXQgbWlnaHQgYmUgYSBiaXQgZWFzaWVyIHRvIGRlYnVnIHRoYW4gcXVldWVNaWNyb3Rhc2suXG4gICAgICAgIC8vICBJdCBpcyBlcXVpdmFsZW50IHRob3VnaC4uLlxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfSBlbHNlIGlmIChkZWxheVRpbWUgPT09IFwiaW1tZWRpYXRlXCIpIHtcbiAgICAgICAgaWYgKGlzTm9kZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiBzZXRJbW1lZGlhdGUocmVzb2x2ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGRlbGF5KFwiYWZ0ZXJwcm9taXNlc1wiKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGVsYXlUaW1lID09PSBcInBhaW50TG9vcFwiKSB7XG4gICAgICAgIGlmIChpc05vZGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlbGF5KFwiaW1tZWRpYXRlXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZSkpO1xuICAgICAgICB9KSgpO1xuICAgIH0gZWxzZSBpZiAoZGVsYXlUaW1lID09PSBcImFmdGVyUGFpbnRcIikge1xuICAgICAgICBpZiAoaXNOb2RlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWxheShcImltbWVkaWF0ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlc29sdmUpKTtcbiAgICAgICAgICAgICAgICAvLyBCZWZvcmUgZmlyc3QgcGFpbnRcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShyZXNvbHZlKSk7XG4gICAgICAgICAgICAgICAgLy8gQWZ0ZXIgZmlyc3QgcGFpbnRcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuXG4gICAgICAgIGlmIChkZWxheVRpbWUgPCAxMCAmJiBpbW1lZGlhdGVTaG9ydERlbGF5cykge1xuICAgICAgICAgICAgLy8gTk9URTogc2V0VGltZW91dCBjYW4ndCB3YWl0IHRoaXMgc2hvcnQgb2YgYSB0aW1lLCBzbyBqdXN0IHNldEltbWVkaWF0ZS4gVGhpcyBzaG91bGQgYmUgaGFyZCB0byBkaXN0aW5ndWlzaFxuICAgICAgICAgICAgLy8gIGFueXdheXMsIGFzIHNldEltbWVkaWF0ZSAoYXQgbGVhc3QgaW4gbm9kZWpzKSwgc2hvdWxkIGhhcHBlbiBhZnRlciBpbywgc28uLi4gaXQgc2hvdWxkIGp1c3Qgd29ya1xuICAgICAgICAgICAgLy8gICh0aGUgb25seSBkaWZmZXJlbmNlIGlzIHRoZXJlIHdpbGwgYmUgbGVzcyB1bm5lY2Vzc2FyeSBkZWxheSkuXG4gICAgICAgICAgICAvLyBOT1RFOiBUSElTIERPRVMgYnJlYWsgY2VydGFpbiBjYXNlcyB3aGVyZSBpbyBpcyBkZXBlbmRpbmcgb24gdHJ1ZSBkZWxheSwgYW5kIGJ5IG9ubHkgd2FpdGluZyBhIG1pY3JvdGlja1xuICAgICAgICAgICAgLy8gIHdlIGRvbid0IGdpdmUgaXQgYSBjaGFuY2UuIEJ1dC4uLiB3ZSBzaG91bGQganVzdCBoYW5kbGUgdGhvc2UgY2FzZXMgZXhwbGljaXRseSwgdmlhIGFuIGV4cGxpY2l0IFwiYWZ0ZXJpb1wiLlxuICAgICAgICAgICAgcmV0dXJuIGRlbGF5KFwiaW1tZWRpYXRlXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5PVEU6IFdlIGNoZWNrIERhdGUubm93KCkgYW5kIHdhaXQgbG9uZ2VyIGlmIHNldFRpbWVvdXQgZGlkbid0IHdhaXQgbG9uZyBlbm91Z2guXG4gICAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHRhcmdldFRpbWUgPSBEYXRlLm5vdygpICsgZGVsYXlUaW1lO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGltZVRvV2FpdCA9IHRhcmdldFRpbWUgLSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCB0aW1lVG9XYWl0KSk7XG4gICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPj0gdGFyZ2V0VGltZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgfVxufVxuXG4vLyBOT1RFOiBUaGlzIGlzIGFuIGVhc3kgd2F5IHRvIHR1cm4gb2ZmIGJhdGNoaW5nLCB3aXRob3V0IGhhdmluZyB0byBzdHJpcCB0aGUgZXh0cmEgYmF0Y2ggaGFuZGxpbmcgY29kZVxuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoRnVuY3Rpb25Ob25lPEFyZywgUmVzdWx0ID0gdm9pZD4oXG4gICAgY29uZmlnOiB1bmtub3duLFxuICAgIGZuYzogKGFyZzogQXJnW10pID0+IChQcm9taXNlPFJlc3VsdD4gfCBSZXN1bHQpXG4pOiAoYXJnOiBBcmcpID0+IFByb21pc2U8UmVzdWx0PiB7XG4gICAgcmV0dXJuIGFzeW5jIGFyZyA9PiBmbmMoW2FyZ10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmF0Y2hGdW5jdGlvbjxBcmcsIFJlc3VsdCA9IHZvaWQ+KFxuICAgIGNvbmZpZzoge1xuICAgICAgICBkZWxheTogRGVsYXlUeXBlO1xuICAgICAgICAvKiogSW5zdGVhZCBvZiBpbW1lZGlhdGVseSB3YWl0aW5nIGRlbGF5LCBzdGFydHMgYnkgd2FpdGluZyAwbXMsIGFuZCBldmVyeSBjYWxsIGluY3JlbWVudHMgdGhlIGRlbGF5IGZhY3RvclxuICAgICAgICAgKiAgICAgIGJ5IDEuIERlbGF5IGlzIGBmYWN0b3IgKiAoZGVsYXkgLyB0aHJvdHRsZVdpbmRvdylgLiBGb3IgZXZlcnkgZGVsYXkgaW50ZXJ2YWwgd2UgaGF2ZSBubyBjYWxscywgd2UgZGVjcmVhc2UgYnlcbiAgICAgICAgICogICAgICBub19jYWxscy9kZWxheS5cbiAgICAgICAgICogICAgICAtIFRoaXMgZXNzZW50aWFsbHkgdHVybnMgZGVsYXkgaW50byBhIGBjYWxscyBwZXIgc2Vjb25kYCB0eXBlIGluZGljYXRvciAoZXgsIDEwbXMgaXMgMTAwIGNhbGxlcnNcbiAgICAgICAgICogICAgICAgICAgcGVyIHNlY29uZCwgNTAwbXMgaXMgMiBjYWxscywgZXRjKSwgd2hpY2ggaXMgYWNjdXJhdGUgb3ZlciBkZWxheSAqIHRocm90dGxlV2luZG93IHRpbWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aHJvdHRsZVdpbmRvdz86IG51bWJlcjtcbiAgICAgICAgbmFtZT86IHN0cmluZztcbiAgICAgICAgbm9NZWFzdXJlPzogYm9vbGVhbjtcbiAgICB9LFxuICAgIGZuYzogKGFyZzogQXJnW10pID0+IChQcm9taXNlPFJlc3VsdD4gfCBSZXN1bHQpXG4pOiAoYXJnOiBBcmcpID0+IFByb21pc2U8UmVzdWx0PiB7XG4gICAgaWYgKCFjb25maWcubm9NZWFzdXJlKSB7XG4gICAgICAgIGZuYyA9IG1lYXN1cmVXcmFwKGZuYywgY29uZmlnLm5hbWUpO1xuICAgIH1cblxuICAgIGxldCBwcmV2UHJvbWlzZTogUHJvbWlzZTxSZXN1bHQ+IHwgdW5kZWZpbmVkO1xuICAgIGxldCBiYXRjaGluZzoge1xuICAgICAgICBhcmdzOiBBcmdbXTtcbiAgICAgICAgcHJvbWlzZTogUHJvbWlzZTxSZXN1bHQ+O1xuICAgIH0gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGN1ckRlbGF5ID0gY29uZmlnLmRlbGF5O1xuICAgIGxldCBkZWxheVJhbXAgPSAwO1xuICAgIGlmIChjb25maWcudGhyb3R0bGVXaW5kb3cgJiYgdHlwZW9mIGN1ckRlbGF5ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGRlbGF5UmFtcCA9IGN1ckRlbGF5IC8gKGNvbmZpZy50aHJvdHRsZVdpbmRvdyAvIGN1ckRlbGF5KTtcbiAgICB9XG4gICAgbGV0IGRlbGF5VGltZSA9IDA7XG4gICAgaWYgKHR5cGVvZiBjdXJEZWxheSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBkZWxheVRpbWUgPSBjdXJEZWxheTtcbiAgICB9XG4gICAgbGV0IGNvdW50U2luY2VCcmVhayA9IDA7XG4gICAgbGV0IGxhc3RDYWxsID0gMDtcblxuICAgIHJldHVybiBhcmcgPT4ge1xuICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKGRlbGF5UmFtcCkge1xuICAgICAgICAgICAgLy8gVGhlIHRpbWUgc2luY2UgdGhlIGxhc3QgY2FsbCAoc3RhcnRlZCkgaXMgaG93IG11Y2ggYnVkZ2V0IHdlIHdpbGwgaGF2ZSByZWNlaXZlZCB0b1xuICAgICAgICAgICAgLy8gIHJ1biB2YWx1ZXMuIElmIGl0IGlzID09PSBkZWxheVRpbWUsIHRoZW4gd2Ugc3VidHJhY3QgMSwgYXMgd2UgYXJlIHJpZ2h0IG9uIHRyYWNrLlxuICAgICAgICAgICAgLy8gIElmIGl0IGlzID4gZGVsYXlUaW1lLCB0aGVuIHdlIGFyZSBydW5uaW5nIGJlbG93IHRoZSByYXRlLCBzbyBpdCBpcyBmaW5lLlxuICAgICAgICAgICAgLy8gIElmIGl0IGlzIDwgZGVsYXlUaW1lLCB3ZSBhcmUgcnVubmluZyB0b28gZmFzdCwgYW5kIGhhdmUgdG8gc2xvdyBkb3duLlxuICAgICAgICAgICAgbGV0IHNhdmVkQ291bnQgPSAobm93IC0gbGFzdENhbGwpIC8gZGVsYXlUaW1lO1xuICAgICAgICAgICAgaWYgKHNhdmVkQ291bnQgPj0gMSkge1xuICAgICAgICAgICAgICAgIGNvdW50U2luY2VCcmVhayAtPSBzYXZlZENvdW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvdW50U2luY2VCcmVhayA8IDApIHtcbiAgICAgICAgICAgICAgICBjb3VudFNpbmNlQnJlYWsgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb3VudFNpbmNlQnJlYWsrKztcbiAgICAgICAgICAgIC8vIFNldCB0aGUgbWF4IGZhaXJseSBoaWdoLCBhcyB3ZSBiYXNpY2FsbHkgaWdub3JlIHNtYWxsIGRlbGF5IHRpbWVzLCBzbyB3ZSBuZWVkIGEgaGlnaCBtYXggdG8gYWxsb3dcbiAgICAgICAgICAgIC8vICBvdXIgZGVsYXkgdG8gZXZlbiBhcHBseSFcbiAgICAgICAgICAgIGN1ckRlbGF5ID0gTWF0aC5taW4oZGVsYXlUaW1lICogMjAsIGRlbGF5UmFtcCAqIGNvdW50U2luY2VCcmVhayk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdENhbGwgPSBub3c7XG5cbiAgICAgICAgaWYgKGJhdGNoaW5nKSB7XG4gICAgICAgICAgICBiYXRjaGluZy5hcmdzLnB1c2goYXJnKTtcbiAgICAgICAgICAgIHJldHVybiBiYXRjaGluZy5wcm9taXNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGN1clByZXZQcm9taXNlID0gcHJldlByb21pc2U7XG4gICAgICAgIGxldCBhcmdzOiBBcmdbXSA9IFthcmddO1xuICAgICAgICBsZXQgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gSWdub3JlIHRoZSBlcnJvci4gTmV3IGNhbGxlcnMgZG9uJ3QgY2FyZSBhYm91dCBlcnJvcnMgaW4gcHJldmlvdXMgY2FsbHMsXG4gICAgICAgICAgICAvLyAgYXMgdGhleSBhcmUgdW5yZWxhdGVkIHRvIHRoZSBjdXJyZW50IGNhbGwsIGFuZCBqdXN0IGJyZWFrIHZhbGlkIGNhbGxzXG4gICAgICAgICAgICAvLyAgZHVlIHRvIGludmFsaWQgY2FsbHMuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGN1clByZXZQcm9taXNlO1xuICAgICAgICAgICAgfSBjYXRjaCB7IH1cbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KGN1ckRlbGF5LCBcImltbWVkaWF0ZVNob3J0RGVsYXlzXCIpO1xuICAgICAgICAgICAgLy8gUmVzZXQgYmF0Y2hpbmcsIGFzIHdlIG9uY2Ugd2Ugc3RhcnQgdGhlIGZ1bmN0aW9uIHdlIGNhbid0IGFjY2VwdCBhcmdzLiBgcHJldlByb21pc2VgIHdpbGwgYmxvY2tcbiAgICAgICAgICAgIC8vICB0aGUgbmV4dCBiYXRjaCBmcm9tIHN0YXJ0aW5nIGJlZm9yZSB3ZSBmaW5pc2guXG4gICAgICAgICAgICBiYXRjaGluZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbmMoYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgICBiYXRjaGluZyA9IHsgYXJncywgcHJvbWlzZSwgfTtcbiAgICAgICAgcHJldlByb21pc2UgPSBiYXRjaGluZy5wcm9taXNlO1xuXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5JblNlcmlhbDxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT4+KGZuYzogVCk6IFQge1xuICAgIGxldCB1cGRhdGVRdWV1ZTogeyBwcm9taXNlOiBQcm9taXNlPHZvaWQ+OyByZXNvbHZlOiAoKSA9PiB2b2lkOyB9W10gPSBbXTtcblxuICAgIHJldHVybiAoYXN5bmMgZnVuY3Rpb24gcnVuSW5TZXJpYWwoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgbGV0IHByb21pc2UgPSB7XG4gICAgICAgICAgICBwcm9taXNlOiBudWxsIGFzIGFueSBhcyBQcm9taXNlPHZvaWQ+LFxuICAgICAgICAgICAgcmVzb2x2ZTogKCkgPT4geyB9LFxuICAgICAgICB9O1xuICAgICAgICBwcm9taXNlLnByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHByb21pc2UucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBxdWV1ZVdhc0VtcHR5ID0gdXBkYXRlUXVldWUubGVuZ3RoID09PSAwO1xuICAgICAgICBpZiAocXVldWVXYXNFbXB0eSkge1xuICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlUXVldWUucHVzaChwcm9taXNlKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZS5wcm9taXNlO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZm5jKC4uLmFyZ3MpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgLy8gUG9wIG91cnNlbGYgb2ZmXG4gICAgICAgICAgICB1cGRhdGVRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgbmV4dCBwcm9taXNlXG4gICAgICAgICAgICB1cGRhdGVRdWV1ZVswXT8ucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgfSkgYXMgVDtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gcnVuSW5QYXJhbGxlbDxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT4+KFxuICAgIGNvbmZpZzoge1xuICAgICAgICBwYXJhbGxlbENvdW50OiBudW1iZXI7XG4gICAgICAgIGNhbGxUaW1lb3V0PzogbnVtYmVyO1xuICAgIH0sXG4gICAgZm5jOiBUXG4pOiBUIHtcbiAgICBsZXQgcXVldWVkOiB7XG4gICAgICAgIHBhcmFtZXRlcnM6IEFyZ3M8VD47XG4gICAgICAgIHJlc3VsdDogUHJvbWlzZU9iajxSZXR1cm5UeXBlPFQ+PjtcbiAgICB9W10gPSBbXTtcbiAgICBsZXQgcnVubmluZ0NvdW50ID0gMDtcblxuICAgIGZ1bmN0aW9uIHJ1bklmTmVlZGVkKCkge1xuICAgICAgICBpZiAocnVubmluZ0NvdW50ID49IGNvbmZpZy5wYXJhbGxlbENvdW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcXVldWVkT2JqID0gcXVldWVkLnNoaWZ0KCk7XG4gICAgICAgIGlmICghcXVldWVkT2JqKSByZXR1cm47XG5cbiAgICAgICAgcXVldWVkT2JqLnJlc3VsdC5yZXNvbHZlKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBydW5uaW5nQ291bnQrKztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5jYWxsVGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGltZW91dFRvRXJyb3IoY29uZmlnLmNhbGxUaW1lb3V0LCBmbmMoLi4ucXVldWVkT2JqLnBhcmFtZXRlcnMpLCAoKSA9PiBuZXcgRXJyb3IoYFBhcmFsbGVsIGNhbGwgdGltZWQgb3V0IGZvciBmbmMgJHtmbmMubmFtZX1gKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuYyguLi5xdWV1ZWRPYmoucGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBydW5uaW5nQ291bnQtLTtcbiAgICAgICAgICAgICAgICBydW5JZk5lZWRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJhbGxlbENhbGwoLi4uYXJnczogQXJnczxUPikge1xuICAgICAgICBxdWV1ZWQucHVzaCh7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgICAgICAgcmVzdWx0OiBuZXcgUHJvbWlzZU9iajxSZXR1cm5UeXBlPFQ+PigpLFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHF1ZXVlZE9iaiA9IHF1ZXVlZFtxdWV1ZWQubGVuZ3RoIC0gMV07XG4gICAgICAgIHJ1bklmTmVlZGVkKCk7XG4gICAgICAgIHJldHVybiBxdWV1ZWRPYmoucmVzdWx0LnByb21pc2U7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbGxlbENhbGwgYXMgVDtcbn1cblxubGV0IHBvbGxpbmdSdW5uaW5nID0gdHJ1ZTtcbmxldCBwZW5kaW5nUG9sbHMgPSBuZXcgU2V0PFByb21pc2U8dW5rbm93bj4+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5JbmZpbml0ZVBvbGwoXG4gICAgZGVsYXlUaW1lOiBudW1iZXIsXG4gICAgZm5jOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCxcbiAgICBzdG9wT2JqPzogeyBzdG9wOiBib29sZWFuOyB9XG4pIHtcbiAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHdoaWxlICghc3RvcE9iaj8uc3RvcCAmJiBwb2xsaW5nUnVubmluZykge1xuICAgICAgICAgICAgYXdhaXQgZGVsYXkoZGVsYXlUaW1lKTtcbiAgICAgICAgICAgIGlmICghcG9sbGluZ1J1bm5pbmcpIGJyZWFrO1xuICAgICAgICAgICAgYXdhaXQgcnVuUG9sbEZuYyhmbmMpO1xuICAgICAgICB9XG4gICAgfSkoKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkluZmluaXRlUG9sbENhbGxBdFN0YXJ0KFxuICAgIGRlbGF5VGltZTogbnVtYmVyLFxuICAgIGZuYzogKCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQsXG4gICAgc3RvcE9iaj86IHsgc3RvcDogYm9vbGVhbjsgfVxuKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuYygpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHdoaWxlICghc3RvcE9iaj8uc3RvcCAmJiBwb2xsaW5nUnVubmluZykge1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KGRlbGF5VGltZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwb2xsaW5nUnVubmluZykgYnJlYWs7XG4gICAgICAgICAgICAgICAgYXdhaXQgcnVuUG9sbEZuYyhmbmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUG9sbEZuYyhmbmM6ICgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKSB7XG4gICAgbGV0IHByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuYygpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGluIGluZmluaXRlIHBvbGwgJHtmbmMubmFtZSB8fCBmbmMudG9TdHJpbmcoKS5zbGljZSgwLCAxMDApfSAoY29udGludWluZyBwb2xsIGxvb3ApXFxuJHtlLnN0YWNrfWApO1xuICAgICAgICB9XG4gICAgfSkoKTtcbiAgICBwZW5kaW5nUG9sbHMuYWRkKHByb21pc2UpO1xuICAgIGF3YWl0IHByb21pc2U7XG4gICAgcGVuZGluZ1BvbGxzLmRlbGV0ZShwcm9taXNlKTtcbn1cblxuLyoqIERpc2FibGVzIHBvbGxpbmcsIGNhbGxlZCBvbiBzaHV0ZG93bi4gQmxvY2tzIHVudGlsIGFsbCBwZW5kaW5nIHBvbGwgbG9vcHMgZmluaXNoICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2h1dGRvd25Qb2xsaW5nKCkge1xuICAgIHBvbGxpbmdSdW5uaW5nID0gZmFsc2U7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbShwZW5kaW5nUG9sbHMpKTtcbn1cblxuXG5jb25zdCBERUZBVUxUX1JFVFJZX0RFTEFZID0gNTAwMDtcbmNvbnN0IERFRkFVTFRfTUFYX1JFVFJJRVMgPSAzO1xuZXhwb3J0IGZ1bmN0aW9uIHJldHJ5RnVuY3Rpb25hbDxUIGV4dGVuZHMgQW55RnVuY3Rpb24+KGZuYzogVCwgY29uZmlnPzoge1xuICAgIG1heFJldHJpZXM/OiBudW1iZXI7XG4gICAgc2hvdWxkUmV0cnk/OiAobWVzc2FnZTogc3RyaW5nKSA9PiBib29sZWFuO1xuICAgIG1pbkRlbGF5PzogbnVtYmVyO1xuICAgIG1heERlbGF5PzogbnVtYmVyO1xuICAgIHRpbWVvdXQ/OiBudW1iZXI7XG4gICAgd2FybmluZ0ludGVydmFsPzogbnVtYmVyO1xufSk6IFQge1xuICAgIGxldCB7XG4gICAgICAgIG1heFJldHJpZXMgPSBERUZBVUxUX01BWF9SRVRSSUVTLCBzaG91bGRSZXRyeSwgbWluRGVsYXkgPSBERUZBVUxUX1JFVFJZX0RFTEFZLCBtYXhEZWxheSA9IERFRkFVTFRfUkVUUllfREVMQVksXG4gICAgICAgIHRpbWVvdXQsXG4gICAgICAgIHdhcm5pbmdJbnRlcnZhbCxcbiAgICB9ID0gY29uZmlnIHx8IHt9O1xuICAgIGxldCBleHBGYWN0b3IgPSBNYXRoLm1heCgxLCBNYXRoLmxvZyhtYXhEZWxheSAvIG1pbkRlbGF5KSAvIE1hdGgubG9nKE1hdGgubWF4KG1heFJldHJpZXMsIDIpKSk7XG4gICAgbGV0IG5hbWUgPSBmbmMubmFtZSB8fCBmbmMudG9TdHJpbmcoKS5zbGljZSgwLCAxMDApO1xuICAgIGFzeW5jIGZ1bmN0aW9uIHJ1bkZuYyhhcmdzOiBhbnlbXSwgcmV0cmllczogbnVtYmVyKTogUHJvbWlzZTxSZXR1cm5UeXBlPFQ+PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcHJvbWlzZSA9IChmbmMgYXMgYW55KSguLi5hcmdzKTtcbiAgICAgICAgICAgIGlmICh0aW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlID0gdGltZW91dFRvRXJyb3IodGltZW91dCwgcHJvbWlzZSwgKCkgPT4gbmV3IEVycm9yKGB0aW1lZCBvdXQgYWZ0ZXIgJHtmb3JtYXRUaW1lKHRpbWVvdXQpfWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3YXJuaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHByb21pc2UgPSB3YXRjaFNsb3dQcm9taXNlKG5hbWUsIHByb21pc2UsIHsgaW50ZXJ2YWw6IHdhcm5pbmdJbnRlcnZhbCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBwcm9taXNlO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoU3RyaW5nKGUuc3RhY2spKSkge1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmV0cmllcyA8IDApIHRocm93IGU7XG4gICAgICAgICAgICByZXRyaWVzLS07XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFJldHJ5aW5nICR7bmFtZX0gKCR7cmV0cmllc30vJHttYXhSZXRyaWVzfSBsZWZ0KSwgZHVlIHRvIGVycm9yICR7U3RyaW5nKGUuc3RhY2spfWApO1xuICAgICAgICAgICAgbGV0IGN1ckNvdW50ID0gbWF4UmV0cmllcyAtIHJldHJpZXM7XG4gICAgICAgICAgICBhd2FpdCBkZWxheShtaW5EZWxheSAqIGV4cEZhY3RvciAqKiBjdXJDb3VudCk7XG4gICAgICAgICAgICByZXR1cm4gcnVuRm5jKGFyZ3MsIHJldHJpZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bkZuYyhhcmdzLCBtYXhSZXRyaWVzKTtcbiAgICB9IGFzIGFueTtcbn1cblxuLyoqIEBkZXByZWNhdGVkIFVzZSBzYWZlTG9vcCBpbnN0ZWFkICovXG5leHBvcnQgY29uc3QgdGhyb3R0bGVkTG9vcCA9IHVuYmxvY2tMb29wO1xuLyoqIEBkZXByZWNhdGVkIFVzZSBzYWZlTG9vcCBpbnN0ZWFkICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdW5ibG9ja0xvb3A8VCwgUj4oY29uZmlnOiB7XG4gICAgZGF0YTogVFtdO1xuICAgIG1heEJsb2NraW5nVGltZT86IG51bWJlcjtcbiAgICBiYWNrT2ZmVGltZT86IG51bWJlcjtcbn0gfCBUW10sIGZuYzogKGl0ZW06IFQpID0+IE1heWJlUHJvbWlzZTxSPik6IFByb21pc2U8UltdPiB7XG5cbiAgICBsZXQgZGF0YSA9IEFycmF5LmlzQXJyYXkoY29uZmlnKSA/IGNvbmZpZyA6IGNvbmZpZy5kYXRhO1xuICAgIGxldCBtYXhCbG9ja2luZ1RpbWUgPSAzMDA7XG4gICAgbGV0IGJhY2tPZmZUaW1lID0gNTA7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZykpIHtcbiAgICAgICAgbWF4QmxvY2tpbmdUaW1lID0gY29uZmlnLm1heEJsb2NraW5nVGltZSA/PyAzMDA7XG4gICAgICAgIGJhY2tPZmZUaW1lID0gY29uZmlnLmJhY2tPZmZUaW1lID8/IDUwO1xuICAgIH1cblxuICAgIGxldCBsYXN0WWllbGRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgcmVzdWx0czogUltdID0gW107XG5cbiAgICBmb3IgKGxldCBpdGVtIG9mIGRhdGEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZuYyhpdGVtKTtcblxuICAgICAgICAvLyBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2UsIGF3YWl0IGl0XG4gICAgICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiAmJiBcInRoZW5cIiBpbiByZXN1bHQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSd2ZSBiZWVuIGJsb2NraW5nIGZvciB0b28gbG9uZ1xuICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RZaWVsZFRpbWUgPiBtYXhCbG9ja2luZ1RpbWUpIHtcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KGJhY2tPZmZUaW1lKTtcbiAgICAgICAgICAgIGxhc3RZaWVsZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2FmZUxvb3A8VCwgUj4oY29uZmlnOiB7XG4gICAgZGF0YTogVFtdO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqIElmIHNldCwgeWllbGRzIGFmdGVyIGJsb2NraW5nIGZvciB0aGlzIG1hbnkgbXMuIE9OTFkgYXBwbGllcyBpZiB5b3VyIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBwcm9taXNlcy4gRGVmYXVsdCA9IDEwMDBtcyAqL1xuICAgIG1heEJsb2NraW5nVGltZT86IG51bWJlcjtcbiAgICAvKiogRnJhY3Rpb24gb2YgdGltZSBzcGVudCBhY3RpdmUgdnMgeWllbGRlZC4gZS5nLiAwLjUgPT4gYWZ0ZXIgcnVubmluZyBYIG1zLCB3YWl0IFggbXMgYmVmb3JlIGNvbnRpbnVpbmcuICovXG4gICAgbWF4QWN0aXZlRnJhY3Rpb24/OiBudW1iZXI7XG4gICAgZG9Ob3RXYXJuT25TbG93PzogYm9vbGVhbjtcbn0sIGZuYzogKGl0ZW06IFQpID0+IE1heWJlUHJvbWlzZTxSPik6IFByb21pc2U8UltdPiB7XG4gICAgbGV0IHsgZGF0YSwgbWF4QWN0aXZlRnJhY3Rpb24sIGRvTm90V2Fybk9uU2xvdywgbmFtZSB9ID0gY29uZmlnO1xuICAgIGxldCBtYXhCbG9ja2luZ1RpbWUgPSBjb25maWcubWF4QmxvY2tpbmdUaW1lID8/IDEwMDA7XG5cbiAgICBsZXQgbGFiZWwgPSBuYW1lIHx8IGZuYy5uYW1lIHx8IGZuYy50b1N0cmluZygpLnNsaWNlKDAsIDEwMCkucmVwbGFjZUFsbChcIlxcblwiLCBcIlxcXFxuXCIpO1xuICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgbGV0IGluZGV4U3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuXG4gICAgaWYgKCFkb05vdFdhcm5PblNsb3cpIHtcbiAgICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgd2hpbGUgKCFkb25lKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoNTAwMCk7XG4gICAgICAgICAgICAgICAgaWYgKGRvbmUpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYCR7cmVkKFwiU0xPVyBMT09QXCIpfSB8ICR7aW5kZXh9IC8gJHtkYXRhLmxlbmd0aH0gfCAke2Zvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSl9IHwgJHtsYWJlbH1gO1xuICAgICAgICAgICAgICAgIGxldCB0aW1lT25DdXJyZW50ID0gRGF0ZS5ub3coKSAtIGluZGV4U3RhcnRUaW1lO1xuICAgICAgICAgICAgICAgIGlmICh0aW1lT25DdXJyZW50ID4gNTAwMCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlICs9IGB8IFNMT1cgSU5ERVggKCR7aW5kZXh9KSAke2Zvcm1hdFRpbWUodGltZU9uQ3VycmVudCl9K2A7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgIH1cblxuICAgIGxldCByZXN1bHRzOiBSW10gPSBbXTtcbiAgICBsZXQgYWN0aXZlVGltZVNpbmNlWWllbGQgPSAwO1xuICAgIHRyeSB7XG4gICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGRhdGEubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBpbmRleFN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZm5jKGRhdGFbaW5kZXhdKTtcbiAgICAgICAgICAgIGxldCBpc1Byb21pc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiAmJiBcInRoZW5cIiBpbiByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBpc1Byb21pc2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuXG4gICAgICAgICAgICBhY3RpdmVUaW1lU2luY2VZaWVsZCArPSBEYXRlLm5vdygpIC0gaW5kZXhTdGFydFRpbWU7XG5cbiAgICAgICAgICAgIGxldCBiYWNrT2ZmVGltZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBpZiAoIWlzUHJvbWlzZSAmJiBhY3RpdmVUaW1lU2luY2VZaWVsZCA+IG1heEJsb2NraW5nVGltZSkge1xuICAgICAgICAgICAgICAgIGJhY2tPZmZUaW1lID0gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1heEFjdGl2ZUZyYWN0aW9uICE9PSB1bmRlZmluZWQgJiYgbWF4QWN0aXZlRnJhY3Rpb24gPiAwICYmIG1heEFjdGl2ZUZyYWN0aW9uIDwgMSkge1xuICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBhY3RpdmVUaW1lU2luY2VZaWVsZCAvIG1heEFjdGl2ZUZyYWN0aW9uIC0gYWN0aXZlVGltZVNpbmNlWWllbGQ7XG4gICAgICAgICAgICAgICAgYmFja09mZlRpbWUgPSBNYXRoLm1heChiYWNrT2ZmVGltZSA/PyAwLCB0YXJnZXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYmFja09mZlRpbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KGJhY2tPZmZUaW1lKTtcbiAgICAgICAgICAgICAgICBhY3RpdmVUaW1lU2luY2VZaWVsZCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG59Il19
377
- /* _JS_SOURCE_HASH = "9799d140cb038e8cb87b2d854c3850d4cf273d8a43b662ace82c78f9a0753e86"; */