socket-function 1.1.48 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SetProcessVariables.ts.cache +9 -0
- package/dist/SocketFunction.ts.cache +467 -0
- package/hot/dist/HotReloadController.ts.cache +252 -0
- package/package.json +1 -1
- package/require/dist/RequireController.ts.cache +386 -0
- package/require/dist/compileFlags.ts.cache +41 -0
- package/require/dist/extMapper.ts.cache +368 -0
- package/require/dist/require.ts.cache +676 -0
- package/src/JSONLACKS/dist/JSONLACKS.ts.cache +469 -0
- package/src/dist/CallFactory.ts.cache +930 -0
- package/src/dist/Zip.ts.cache +156 -0
- package/src/dist/batching.ts.cache +377 -0
- package/src/dist/bits.ts.cache +121 -0
- package/src/dist/buffers.ts.cache +76 -0
- package/src/dist/caching.ts.cache +302 -0
- package/src/dist/callHTTPHandler.ts.cache +264 -0
- package/src/dist/callManager.ts.cache +159 -0
- package/src/dist/certStore.ts.cache +59 -0
- package/src/dist/createSingleton.ts.cache +62 -0
- package/src/dist/fixLargeNetworkCalls.ts.cache +17 -0
- package/src/dist/forwardPort.ts.cache +222 -0
- package/src/dist/https.ts.cache +141 -0
- package/src/dist/misc.ts.cache +499 -0
- package/src/dist/nodeCache.ts.cache +136 -0
- package/src/dist/nodeProxy.ts.cache +57 -0
- package/src/dist/protocolNegotiation.ts.cache +101 -0
- package/src/dist/tlsParsing.ts.cache +85 -0
- package/src/dist/types.ts.cache +9 -0
- package/src/dist/webSocketServer.ts.cache +365 -0
- package/src/dist/websocketFactory.ts.cache +53 -0
- package/src/formatting/dist/colors.ts.cache +98 -0
- package/src/formatting/dist/format.ts.cache +396 -0
- package/src/formatting/dist/logColors.ts.cache +28 -0
- package/src/lz4/dist/LZ4.ts.cache +53 -0
- package/src/profiling/dist/getOwnTime.ts.cache +100 -0
- package/src/profiling/dist/measure.ts.cache +338 -0
- package/src/profiling/dist/stats.ts.cache +202 -0
- package/src/profiling/dist/statsFormat.ts.cache +45 -0
- package/src/profiling/getOwnTime.ts +7 -1
- package/src/profiling/measure.ts +25 -16
- package/time/dist/trueTimeShim.ts.cache +656 -0
|
@@ -0,0 +1,202 @@
|
|
|
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
|
+
// See statsFormat.ts:formatStats for a nice way to format a stats value
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
4
|
+
//exports.getStatsTop = exports.addToStats = exports.addToStatsValue = exports.createStatsValue = void 0;
|
|
5
|
+
function createStatsValue() {
|
|
6
|
+
return {
|
|
7
|
+
count: 0,
|
|
8
|
+
sum: 0,
|
|
9
|
+
sumSquares: 0,
|
|
10
|
+
logn7Value: 0, logn7Count: 0, logn6Value: 0, logn6Count: 0, logn5Value: 0, logn5Count: 0, logn4Value: 0, logn4Count: 0, logn3Value: 0, logn3Count: 0, logn2Value: 0, logn2Count: 0, logn1Value: 0, logn1Count: 0, log0Value: 0, log0VCount: 0, log1Value: 0, log1VCount: 0, log2Value: 0, log2VCount: 0, log3Value: 0, log3VCount: 0, log4Value: 0, log4VCount: 0, log5Value: 0, log5VCount: 0, log6Value: 0, log6VCount: 0, log7Value: 0, log7VCount: 0, log8Value: 0, log8VCount: 0, log9Value: 0, log9VCount: 0,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
exports.createStatsValue = createStatsValue;
|
|
14
|
+
// TIMING: Between 5.6ns and 8ns, depending on the size of the value (smaller values are faster to add)
|
|
15
|
+
// - A C++ implementation takes about 3.5ns, so... this is pretty fast!
|
|
16
|
+
function addToStatsValue(stats, value) {
|
|
17
|
+
stats.count++;
|
|
18
|
+
stats.sum += value;
|
|
19
|
+
stats.sumSquares += value * value;
|
|
20
|
+
if (value < 0.000001) {
|
|
21
|
+
stats.logn7Value += value;
|
|
22
|
+
stats.logn7Count++;
|
|
23
|
+
}
|
|
24
|
+
else if (value < 0.00001) {
|
|
25
|
+
stats.logn6Value += value;
|
|
26
|
+
stats.logn6Count++;
|
|
27
|
+
}
|
|
28
|
+
else if (value < 0.0001) {
|
|
29
|
+
stats.logn5Value += value;
|
|
30
|
+
stats.logn5Count++;
|
|
31
|
+
}
|
|
32
|
+
else if (value < 0.001) {
|
|
33
|
+
stats.logn4Value += value;
|
|
34
|
+
stats.logn4Count++;
|
|
35
|
+
}
|
|
36
|
+
else if (value < 0.01) {
|
|
37
|
+
stats.logn3Value += value;
|
|
38
|
+
stats.logn3Count++;
|
|
39
|
+
}
|
|
40
|
+
else if (value < 0.1) {
|
|
41
|
+
stats.logn2Value += value;
|
|
42
|
+
stats.logn2Count++;
|
|
43
|
+
}
|
|
44
|
+
else if (value < 1) {
|
|
45
|
+
stats.logn1Value += value;
|
|
46
|
+
stats.logn1Count++;
|
|
47
|
+
}
|
|
48
|
+
else if (value < 10) {
|
|
49
|
+
stats.log0Value += value;
|
|
50
|
+
stats.log0VCount++;
|
|
51
|
+
}
|
|
52
|
+
else if (value < 100) {
|
|
53
|
+
stats.log1Value += value;
|
|
54
|
+
stats.log1VCount++;
|
|
55
|
+
}
|
|
56
|
+
else if (value < 1000) {
|
|
57
|
+
stats.log2Value += value;
|
|
58
|
+
stats.log2VCount++;
|
|
59
|
+
}
|
|
60
|
+
else if (value < 10000) {
|
|
61
|
+
stats.log3Value += value;
|
|
62
|
+
stats.log3VCount++;
|
|
63
|
+
}
|
|
64
|
+
else if (value < 100000) {
|
|
65
|
+
stats.log4Value += value;
|
|
66
|
+
stats.log4VCount++;
|
|
67
|
+
}
|
|
68
|
+
else if (value < 1000000) {
|
|
69
|
+
stats.log5Value += value;
|
|
70
|
+
stats.log5VCount++;
|
|
71
|
+
}
|
|
72
|
+
else if (value < 10000000) {
|
|
73
|
+
stats.log6Value += value;
|
|
74
|
+
stats.log6VCount++;
|
|
75
|
+
}
|
|
76
|
+
else if (value < 100000000) {
|
|
77
|
+
stats.log7Value += value;
|
|
78
|
+
stats.log7VCount++;
|
|
79
|
+
}
|
|
80
|
+
else if (value < 1000000000) {
|
|
81
|
+
stats.log8Value += value;
|
|
82
|
+
stats.log8VCount++;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
stats.log9Value += value;
|
|
86
|
+
stats.log9VCount++;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
exports.addToStatsValue = addToStatsValue;
|
|
90
|
+
function addToStats(stats, other) {
|
|
91
|
+
stats.count += other.count;
|
|
92
|
+
stats.sum += other.sum;
|
|
93
|
+
stats.sumSquares += other.sumSquares;
|
|
94
|
+
stats.logn7Value += other.logn7Value;
|
|
95
|
+
stats.logn7Count += other.logn7Count;
|
|
96
|
+
stats.logn6Value += other.logn6Value;
|
|
97
|
+
stats.logn6Count += other.logn6Count;
|
|
98
|
+
stats.logn5Value += other.logn5Value;
|
|
99
|
+
stats.logn5Count += other.logn5Count;
|
|
100
|
+
stats.logn4Value += other.logn4Value;
|
|
101
|
+
stats.logn4Count += other.logn4Count;
|
|
102
|
+
stats.logn3Value += other.logn3Value;
|
|
103
|
+
stats.logn3Count += other.logn3Count;
|
|
104
|
+
stats.logn2Value += other.logn2Value;
|
|
105
|
+
stats.logn2Count += other.logn2Count;
|
|
106
|
+
stats.logn1Value += other.logn1Value;
|
|
107
|
+
stats.logn1Count += other.logn1Count;
|
|
108
|
+
stats.log0Value += other.log0Value;
|
|
109
|
+
stats.log0VCount += other.log0VCount;
|
|
110
|
+
stats.log1Value += other.log1Value;
|
|
111
|
+
stats.log1VCount += other.log1VCount;
|
|
112
|
+
stats.log2Value += other.log2Value;
|
|
113
|
+
stats.log2VCount += other.log2VCount;
|
|
114
|
+
stats.log3Value += other.log3Value;
|
|
115
|
+
stats.log3VCount += other.log3VCount;
|
|
116
|
+
stats.log4Value += other.log4Value;
|
|
117
|
+
stats.log4VCount += other.log4VCount;
|
|
118
|
+
stats.log5Value += other.log5Value;
|
|
119
|
+
stats.log5VCount += other.log5VCount;
|
|
120
|
+
stats.log6Value += other.log6Value;
|
|
121
|
+
stats.log6VCount += other.log6VCount;
|
|
122
|
+
stats.log7Value += other.log7Value;
|
|
123
|
+
stats.log7VCount += other.log7VCount;
|
|
124
|
+
stats.log8Value += other.log8Value;
|
|
125
|
+
stats.log8VCount += other.log8VCount;
|
|
126
|
+
stats.log9Value += other.log9Value;
|
|
127
|
+
stats.log9VCount += other.log9VCount;
|
|
128
|
+
}
|
|
129
|
+
exports.addToStats = addToStats;
|
|
130
|
+
// Ordered from lowest average to highest average
|
|
131
|
+
function getStatsBuckets(stats) {
|
|
132
|
+
return [
|
|
133
|
+
{ sum: stats.logn7Value, count: stats.logn7Count },
|
|
134
|
+
{ sum: stats.logn6Value, count: stats.logn6Count },
|
|
135
|
+
{ sum: stats.logn5Value, count: stats.logn5Count },
|
|
136
|
+
{ sum: stats.logn4Value, count: stats.logn4Count },
|
|
137
|
+
{ sum: stats.logn3Value, count: stats.logn3Count },
|
|
138
|
+
{ sum: stats.logn2Value, count: stats.logn2Count },
|
|
139
|
+
{ sum: stats.logn1Value, count: stats.logn1Count },
|
|
140
|
+
{ sum: stats.log0Value, count: stats.log0VCount },
|
|
141
|
+
{ sum: stats.log1Value, count: stats.log1VCount },
|
|
142
|
+
{ sum: stats.log2Value, count: stats.log2VCount },
|
|
143
|
+
{ sum: stats.log3Value, count: stats.log3VCount },
|
|
144
|
+
{ sum: stats.log4Value, count: stats.log4VCount },
|
|
145
|
+
{ sum: stats.log5Value, count: stats.log5VCount },
|
|
146
|
+
{ sum: stats.log6Value, count: stats.log6VCount },
|
|
147
|
+
{ sum: stats.log7Value, count: stats.log7VCount },
|
|
148
|
+
{ sum: stats.log8Value, count: stats.log8VCount },
|
|
149
|
+
{ sum: stats.log9Value, count: stats.log9VCount },
|
|
150
|
+
];
|
|
151
|
+
}
|
|
152
|
+
/** Identifies cases where the value is concentrated in few instances. This indicates most of the value (time)
|
|
153
|
+
* is not spent on the common case, but on an outlier. Which isn't a problem, it just means that the measurements
|
|
154
|
+
* should be more precise, to pull that heavy case out.
|
|
155
|
+
*/
|
|
156
|
+
function getStatsTop(stats) {
|
|
157
|
+
if (stats.sum === 0) {
|
|
158
|
+
return { countFraction: 1, valueFraction: 1, count: 0, value: 0, topHeavy: false, };
|
|
159
|
+
}
|
|
160
|
+
const minFraction = 0.2;
|
|
161
|
+
let totalSum = stats.sum;
|
|
162
|
+
let totalCount = stats.count;
|
|
163
|
+
let totalMean = totalSum / totalCount;
|
|
164
|
+
// Find the sum above the average (with a minimum of minFraction, as sometimes there isn't really anything above the average)
|
|
165
|
+
let buckets = getStatsBuckets(stats);
|
|
166
|
+
buckets.reverse();
|
|
167
|
+
let curSum = 0;
|
|
168
|
+
let curCount = 0;
|
|
169
|
+
for (let entry of buckets) {
|
|
170
|
+
let mean = entry.sum / entry.count;
|
|
171
|
+
if (curSum > totalSum * minFraction && mean < totalMean)
|
|
172
|
+
break;
|
|
173
|
+
curSum += entry.sum;
|
|
174
|
+
curCount += entry.count;
|
|
175
|
+
}
|
|
176
|
+
let countFraction = curCount / totalCount;
|
|
177
|
+
let valueFraction = curSum / totalSum;
|
|
178
|
+
return {
|
|
179
|
+
countFraction,
|
|
180
|
+
valueFraction,
|
|
181
|
+
count: curCount,
|
|
182
|
+
value: curSum,
|
|
183
|
+
// If more than 50% is above the average, it's top heavy
|
|
184
|
+
topHeavy: valueFraction / countFraction > 2 && valueFraction > 0.4,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
exports.getStatsTop = getStatsTop;
|
|
188
|
+
function benchmarkAddToStats() {
|
|
189
|
+
let stats = createStatsValue();
|
|
190
|
+
let start = Date.now();
|
|
191
|
+
const count = 1000000;
|
|
192
|
+
for (let i = 0; i < count; i++) {
|
|
193
|
+
addToStatsValue(stats, 10000000000);
|
|
194
|
+
}
|
|
195
|
+
let end = Date.now();
|
|
196
|
+
let time = end - start;
|
|
197
|
+
let timePer = (time) / count * 1000 * 1000;
|
|
198
|
+
console.log(`Time per: ${timePer}ns, in ${time}ms`);
|
|
199
|
+
}
|
|
200
|
+
//benchmarkAddToStats();
|
|
201
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdGF0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsd0VBQXdFOzs7QUFZeEUsU0FBZ0IsZ0JBQWdCO0lBQzVCLE9BQU87UUFDSCxLQUFLLEVBQUUsQ0FBQztRQUNSLEdBQUcsRUFBRSxDQUFDO1FBQ04sVUFBVSxFQUFFLENBQUM7UUFDYixVQUFVLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQztLQUNyZixDQUFDO0FBQ04sQ0FBQztBQVBELDRDQU9DO0FBRUQsdUdBQXVHO0FBQ3ZHLHdFQUF3RTtBQUN4RSxTQUFnQixlQUFlLENBQUMsS0FBaUIsRUFBRSxLQUFhO0lBQzVELEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNkLEtBQUssQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDO0lBQ25CLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNsQyxJQUFJLEtBQUssR0FBRyxRQUFRLEVBQUUsQ0FBQztRQUNuQixLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQztRQUMxQixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkIsQ0FBQztTQUFNLElBQUksS0FBSyxHQUFHLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDO1FBQzFCLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN2QixDQUFDO1NBQU0sSUFBSSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUM7UUFDMUIsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7U0FBTSxJQUFJLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQztRQUMxQixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkIsQ0FBQztTQUFNLElBQUksS0FBSyxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ3RCLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDO1FBQzFCLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN2QixDQUFDO1NBQU0sSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDckIsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUM7UUFDMUIsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7U0FBTSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNuQixLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQztRQUMxQixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkIsQ0FBQztTQUFNLElBQUksS0FBSyxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ3BCLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN2QixDQUFDO1NBQU0sSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDckIsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUM7UUFDekIsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7U0FBTSxJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUN0QixLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztRQUN6QixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkIsQ0FBQztTQUFNLElBQUksS0FBSyxHQUFHLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN2QixDQUFDO1NBQU0sSUFBSSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUM7UUFDekIsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7U0FBTSxJQUFJLEtBQUssR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUN6QixLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztRQUN6QixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkIsQ0FBQztTQUFNLElBQUksS0FBSyxHQUFHLFFBQVEsRUFBRSxDQUFDO1FBQzFCLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN2QixDQUFDO1NBQU0sSUFBSSxLQUFLLEdBQUcsU0FBUyxFQUFFLENBQUM7UUFDM0IsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUM7UUFDekIsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7U0FBTSxJQUFJLEtBQUssR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUM1QixLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztRQUN6QixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkIsQ0FBQztTQUFNLENBQUM7UUFDSixLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztRQUN6QixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkIsQ0FBQztBQUNMLENBQUM7QUF4REQsMENBd0RDO0FBRUQsU0FBZ0IsVUFBVSxDQUFDLEtBQWlCLEVBQUUsS0FBaUI7SUFDM0QsS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQzNCLEtBQUssQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQztJQUN2QixLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDckMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUNyQyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDckMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUNyQyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDckMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUNyQyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDckMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUNyQyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDckMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUNyQyxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUM7SUFDbkMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQztJQUNuQyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDckMsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDO0lBQ25DLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUNyQyxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUM7SUFDbkMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQztJQUNuQyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDckMsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDO0lBQ25DLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUNyQyxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUM7SUFDbkMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxD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QU8sQ0FBQztJQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDN0IsZUFBZSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7SUFDdkIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztJQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsT0FBTyxVQUFVLElBQUksSUFBSSxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUNELHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIFNlZSBzdGF0c0Zvcm1hdC50czpmb3JtYXRTdGF0cyBmb3IgYSBuaWNlIHdheSB0byBmb3JtYXQgYSBzdGF0cyB2YWx1ZVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRzVmFsdWUge1xuICAgIGNvdW50OiBudW1iZXI7XG4gICAgc3VtOiBudW1iZXI7XG4gICAgc3VtU3F1YXJlczogbnVtYmVyO1xuXG4gICAgLy8gQWxsIGxvZ3MgdXNlIGJhc2UgMTBcbiAgICAvLyAgVGhpcyBzdXBwb3J0cyB2YWx1ZXMgZnJvbSAwLjFucyB0byAxIHdlZWtcbiAgICBsb2duN1ZhbHVlOiBudW1iZXI7IGxvZ243Q291bnQ6IG51bWJlcjsgbG9nbjZWYWx1ZTogbnVtYmVyOyBsb2duNkNvdW50OiBudW1iZXI7IGxvZ241VmFsdWU6IG51bWJlcjsgbG9nbjVDb3VudDogbnVtYmVyOyBsb2duNFZhbHVlOiBudW1iZXI7IGxvZ240Q291bnQ6IG51bWJlcjsgbG9nbjNWYWx1ZTogbnVtYmVyOyBsb2duM0NvdW50OiBudW1iZXI7IGxvZ24yVmFsdWU6IG51bWJlcjsgbG9nbjJDb3VudDogbnVtYmVyOyBsb2duMVZhbHVlOiBudW1iZXI7IGxvZ24xQ291bnQ6IG51bWJlcjsgbG9nMFZhbHVlOiBudW1iZXI7IGxvZzBWQ291bnQ6IG51bWJlcjsgbG9nMVZhbHVlOiBudW1iZXI7IGxvZzFWQ291bnQ6IG51bWJlcjsgbG9nMlZhbHVlOiBudW1iZXI7IGxvZzJWQ291bnQ6IG51bWJlcjsgbG9nM1ZhbHVlOiBudW1iZXI7IGxvZzNWQ291bnQ6IG51bWJlcjsgbG9nNFZhbHVlOiBudW1iZXI7IGxvZzRWQ291bnQ6IG51bWJlcjsgbG9nNVZhbHVlOiBudW1iZXI7IGxvZzVWQ291bnQ6IG51bWJlcjsgbG9nNlZhbHVlOiBudW1iZXI7IGxvZzZWQ291bnQ6IG51bWJlcjsgbG9nN1ZhbHVlOiBudW1iZXI7IGxvZzdWQ291bnQ6IG51bWJlcjsgbG9nOFZhbHVlOiBudW1iZXI7IGxvZzhWQ291bnQ6IG51bWJlcjsgbG9nOVZhbHVlOiBudW1iZXI7IGxvZzlWQ291bnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YXRzVmFsdWUoKTogU3RhdHNWYWx1ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHN1bTogMCxcbiAgICAgICAgc3VtU3F1YXJlczogMCxcbiAgICAgICAgbG9nbjdWYWx1ZTogMCwgbG9nbjdDb3VudDogMCwgbG9nbjZWYWx1ZTogMCwgbG9nbjZDb3VudDogMCwgbG9nbjVWYWx1ZTogMCwgbG9nbjVDb3VudDogMCwgbG9nbjRWYWx1ZTogMCwgbG9nbjRDb3VudDogMCwgbG9nbjNWYWx1ZTogMCwgbG9nbjNDb3VudDogMCwgbG9nbjJWYWx1ZTogMCwgbG9nbjJDb3VudDogMCwgbG9nbjFWYWx1ZTogMCwgbG9nbjFDb3VudDogMCwgbG9nMFZhbHVlOiAwLCBsb2cwVkNvdW50OiAwLCBsb2cxVmFsdWU6IDAsIGxvZzFWQ291bnQ6IDAsIGxvZzJWYWx1ZTogMCwgbG9nMlZDb3VudDogMCwgbG9nM1ZhbHVlOiAwLCBsb2czVkNvdW50OiAwLCBsb2c0VmFsdWU6IDAsIGxvZzRWQ291bnQ6IDAsIGxvZzVWYWx1ZTogMCwgbG9nNVZDb3VudDogMCwgbG9nNlZhbHVlOiAwLCBsb2c2VkNvdW50OiAwLCBsb2c3VmFsdWU6IDAsIGxvZzdWQ291bnQ6IDAsIGxvZzhWYWx1ZTogMCwgbG9nOFZDb3VudDogMCwgbG9nOVZhbHVlOiAwLCBsb2c5VkNvdW50OiAwLFxuICAgIH07XG59XG5cbi8vIFRJTUlORzogQmV0d2VlbiA1LjZucyBhbmQgOG5zLCBkZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIHZhbHVlIChzbWFsbGVyIHZhbHVlcyBhcmUgZmFzdGVyIHRvIGFkZClcbi8vICAtIEEgQysrIGltcGxlbWVudGF0aW9uIHRha2VzIGFib3V0IDMuNW5zLCBzby4uLiB0aGlzIGlzIHByZXR0eSBmYXN0IVxuZXhwb3J0IGZ1bmN0aW9uIGFkZFRvU3RhdHNWYWx1ZShzdGF0czogU3RhdHNWYWx1ZSwgdmFsdWU6IG51bWJlcikge1xuICAgIHN0YXRzLmNvdW50Kys7XG4gICAgc3RhdHMuc3VtICs9IHZhbHVlO1xuICAgIHN0YXRzLnN1bVNxdWFyZXMgKz0gdmFsdWUgKiB2YWx1ZTtcbiAgICBpZiAodmFsdWUgPCAwLjAwMDAwMSkge1xuICAgICAgICBzdGF0cy5sb2duN1ZhbHVlICs9IHZhbHVlO1xuICAgICAgICBzdGF0cy5sb2duN0NvdW50Kys7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA8IDAuMDAwMDEpIHtcbiAgICAgICAgc3RhdHMubG9nbjZWYWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgc3RhdHMubG9nbjZDb3VudCsrO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPCAwLjAwMDEpIHtcbiAgICAgICAgc3RhdHMubG9nbjVWYWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgc3RhdHMubG9nbjVDb3VudCsrO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPCAwLjAwMSkge1xuICAgICAgICBzdGF0cy5sb2duNFZhbHVlICs9IHZhbHVlO1xuICAgICAgICBzdGF0cy5sb2duNENvdW50Kys7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA8IDAuMDEpIHtcbiAgICAgICAgc3RhdHMubG9nbjNWYWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgc3RhdHMubG9nbjNDb3VudCsrO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPCAwLjEpIHtcbiAgICAgICAgc3RhdHMubG9nbjJWYWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgc3RhdHMubG9nbjJDb3VudCsrO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPCAxKSB7XG4gICAgICAgIHN0YXRzLmxvZ24xVmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRzLmxvZ24xQ291bnQrKztcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMTApIHtcbiAgICAgICAgc3RhdHMubG9nMFZhbHVlICs9IHZhbHVlO1xuICAgICAgICBzdGF0cy5sb2cwVkNvdW50Kys7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA8IDEwMCkge1xuICAgICAgICBzdGF0cy5sb2cxVmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRzLmxvZzFWQ291bnQrKztcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMTAwMCkge1xuICAgICAgICBzdGF0cy5sb2cyVmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRzLmxvZzJWQ291bnQrKztcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMTAwMDApIHtcbiAgICAgICAgc3RhdHMubG9nM1ZhbHVlICs9IHZhbHVlO1xuICAgICAgICBzdGF0cy5sb2czVkNvdW50Kys7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA8IDEwMDAwMCkge1xuICAgICAgICBzdGF0cy5sb2c0VmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRzLmxvZzRWQ291bnQrKztcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMTAwMDAwMCkge1xuICAgICAgICBzdGF0cy5sb2c1VmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRzLmxvZzVWQ291bnQrKztcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMTAwMDAwMDApIHtcbiAgICAgICAgc3RhdHMubG9nNlZhbHVlICs9IHZhbHVlO1xuICAgICAgICBzdGF0cy5sb2c2VkNvdW50Kys7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA8IDEwMDAwMDAwMCkge1xuICAgICAgICBzdGF0cy5sb2c3VmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRzLmxvZzdWQ291bnQrKztcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMTAwMDAwMDAwMCkge1xuICAgICAgICBzdGF0cy5sb2c4VmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRzLmxvZzhWQ291bnQrKztcbiAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0cy5sb2c5VmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRzLmxvZzlWQ291bnQrKztcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRUb1N0YXRzKHN0YXRzOiBTdGF0c1ZhbHVlLCBvdGhlcjogU3RhdHNWYWx1ZSkge1xuICAgIHN0YXRzLmNvdW50ICs9IG90aGVyLmNvdW50O1xuICAgIHN0YXRzLnN1bSArPSBvdGhlci5zdW07XG4gICAgc3RhdHMuc3VtU3F1YXJlcyArPSBvdGhlci5zdW1TcXVhcmVzO1xuICAgIHN0YXRzLmxvZ243VmFsdWUgKz0gb3RoZXIubG9nbjdWYWx1ZTtcbiAgICBzdGF0cy5sb2duN0NvdW50ICs9IG90aGVyLmxvZ243Q291bnQ7XG4gICAgc3RhdHMubG9nbjZWYWx1ZSArPSBvdGhlci5sb2duNlZhbHVlO1xuICAgIHN0YXRzLmxvZ242Q291bnQgKz0gb3RoZXIubG9nbjZDb3VudDtcbiAgICBzdGF0cy5sb2duNVZhbHVlICs9IG90aGVyLmxvZ241VmFsdWU7XG4gICAgc3RhdHMubG9nbjVDb3VudCArPSBvdGhlci5sb2duNUNvdW50O1xuICAgIHN0YXRzLmxvZ240VmFsdWUgKz0gb3RoZXIubG9nbjRWYWx1ZTtcbiAgICBzdGF0cy5sb2duNENvdW50ICs9IG90aGVyLmxvZ240Q291bnQ7XG4gICAgc3RhdHMubG9nbjNWYWx1ZSArPSBvdGhlci5sb2duM1ZhbHVlO1xuICAgIHN0YXRzLmxvZ24zQ291bnQgKz0gb3RoZXIubG9nbjNDb3VudDtcbiAgICBzdGF0cy5sb2duMlZhbHVlICs9IG90aGVyLmxvZ24yVmFsdWU7XG4gICAgc3RhdHMubG9nbjJDb3VudCArPSBvdGhlci5sb2duMkNvdW50O1xuICAgIHN0YXRzLmxvZ24xVmFsdWUgKz0gb3RoZXIubG9nbjFWYWx1ZTtcbiAgICBzdGF0cy5sb2duMUNvdW50ICs9IG90aGVyLmxvZ24xQ291bnQ7XG4gICAgc3RhdHMubG9nMFZhbHVlICs9IG90aGVyLmxvZzBWYWx1ZTtcbiAgICBzdGF0cy5sb2cwVkNvdW50ICs9IG90aGVyLmxvZzBWQ291bnQ7XG4gICAgc3RhdHMubG9nMVZhbHVlICs9IG90aGVyLmxvZzFWYWx1ZTtcbiAgICBzdGF0cy5sb2cxVkNvdW50ICs9IG90aGVyLmxvZzFWQ291bnQ7XG4gICAgc3RhdHMubG9nMlZhbHVlICs9IG90aGVyLmxvZzJWYWx1ZTtcbiAgICBzdGF0cy5sb2cyVkNvdW50ICs9IG90aGVyLmxvZzJWQ291bnQ7XG4gICAgc3RhdHMubG9nM1ZhbHVlICs9IG90aGVyLmxvZzNWYWx1ZTtcbiAgICBzdGF0cy5sb2czVkNvdW50ICs9IG90aGVyLmxvZzNWQ291bnQ7XG4gICAgc3RhdHMubG9nNFZhbHVlICs9IG90aGVyLmxvZzRWYWx1ZTtcbiAgICBzdGF0cy5sb2c0VkNvdW50ICs9IG90aGVyLmxvZzRWQ291bnQ7XG4gICAgc3RhdHMubG9nNVZhbHVlICs9IG90aGVyLmxvZzVWYWx1ZTtcbiAgICBzdGF0cy5sb2c1VkNvdW50ICs9IG90aGVyLmxvZzVWQ291bnQ7XG4gICAgc3RhdHMubG9nNlZhbHVlICs9IG90aGVyLmxvZzZWYWx1ZTtcbiAgICBzdGF0cy5sb2c2VkNvdW50ICs9IG90aGVyLmxvZzZWQ291bnQ7XG4gICAgc3RhdHMubG9nN1ZhbHVlICs9IG90aGVyLmxvZzdWYWx1ZTtcbiAgICBzdGF0cy5sb2c3VkNvdW50ICs9IG90aGVyLmxvZzdWQ291bnQ7XG4gICAgc3RhdHMubG9nOFZhbHVlICs9IG90aGVyLmxvZzhWYWx1ZTtcbiAgICBzdGF0cy5sb2c4VkNvdW50ICs9IG90aGVyLmxvZzhWQ291bnQ7XG4gICAgc3RhdHMubG9nOVZhbHVlICs9IG90aGVyLmxvZzlWYWx1ZTtcbiAgICBzdGF0cy5sb2c5VkNvdW50ICs9IG90aGVyLmxvZzlWQ291bnQ7XG59XG5cbmludGVyZmFjZSBTdGF0c0J1Y2tldCB7XG4gICAgc3VtOiBudW1iZXI7XG4gICAgY291bnQ6IG51bWJlcjtcbn1cbi8vIE9yZGVyZWQgZnJvbSBsb3dlc3QgYXZlcmFnZSB0byBoaWdoZXN0IGF2ZXJhZ2VcbmZ1bmN0aW9uIGdldFN0YXRzQnVja2V0cyhzdGF0czogU3RhdHNWYWx1ZSk6IFN0YXRzQnVja2V0W10ge1xuICAgIHJldHVybiBbXG4gICAgICAgIHsgc3VtOiBzdGF0cy5sb2duN1ZhbHVlLCBjb3VudDogc3RhdHMubG9nbjdDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nbjZWYWx1ZSwgY291bnQ6IHN0YXRzLmxvZ242Q291bnQgfSxcbiAgICAgICAgeyBzdW06IHN0YXRzLmxvZ241VmFsdWUsIGNvdW50OiBzdGF0cy5sb2duNUNvdW50IH0sXG4gICAgICAgIHsgc3VtOiBzdGF0cy5sb2duNFZhbHVlLCBjb3VudDogc3RhdHMubG9nbjRDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nbjNWYWx1ZSwgY291bnQ6IHN0YXRzLmxvZ24zQ291bnQgfSxcbiAgICAgICAgeyBzdW06IHN0YXRzLmxvZ24yVmFsdWUsIGNvdW50OiBzdGF0cy5sb2duMkNvdW50IH0sXG4gICAgICAgIHsgc3VtOiBzdGF0cy5sb2duMVZhbHVlLCBjb3VudDogc3RhdHMubG9nbjFDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nMFZhbHVlLCBjb3VudDogc3RhdHMubG9nMFZDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nMVZhbHVlLCBjb3VudDogc3RhdHMubG9nMVZDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nMlZhbHVlLCBjb3VudDogc3RhdHMubG9nMlZDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nM1ZhbHVlLCBjb3VudDogc3RhdHMubG9nM1ZDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nNFZhbHVlLCBjb3VudDogc3RhdHMubG9nNFZDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nNVZhbHVlLCBjb3VudDogc3RhdHMubG9nNVZDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nNlZhbHVlLCBjb3VudDogc3RhdHMubG9nNlZDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nN1ZhbHVlLCBjb3VudDogc3RhdHMubG9nN1ZDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nOFZhbHVlLCBjb3VudDogc3RhdHMubG9nOFZDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nOVZhbHVlLCBjb3VudDogc3RhdHMubG9nOVZDb3VudCB9LFxuICAgIF07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHNUb3Age1xuICAgIC8vIE5PVEU6IGNvdW50RnJhY3Rpb24gPD0gdmFsdWVGcmFjdGlvbiwgYmVjYXVzZSB3ZSB0YWtlIHRoZSBsYXJnZXN0IHZhbHVlc1xuICAgIGNvdW50RnJhY3Rpb246IG51bWJlcjtcbiAgICB2YWx1ZUZyYWN0aW9uOiBudW1iZXI7XG4gICAgY291bnQ6IG51bWJlcjtcbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIHRvcEhlYXZ5OiBib29sZWFuO1xufVxuLyoqIElkZW50aWZpZXMgY2FzZXMgd2hlcmUgdGhlIHZhbHVlIGlzIGNvbmNlbnRyYXRlZCBpbiBmZXcgaW5zdGFuY2VzLiBUaGlzIGluZGljYXRlcyBtb3N0IG9mIHRoZSB2YWx1ZSAodGltZSlcbiAqICAgICAgaXMgbm90IHNwZW50IG9uIHRoZSBjb21tb24gY2FzZSwgYnV0IG9uIGFuIG91dGxpZXIuIFdoaWNoIGlzbid0IGEgcHJvYmxlbSwgaXQganVzdCBtZWFucyB0aGF0IHRoZSBtZWFzdXJlbWVudHNcbiAqICAgICAgc2hvdWxkIGJlIG1vcmUgcHJlY2lzZSwgdG8gcHVsbCB0aGF0IGhlYXZ5IGNhc2Ugb3V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhdHNUb3Aoc3RhdHM6IFN0YXRzVmFsdWUpOiBTdGF0c1RvcCB7XG4gICAgaWYgKHN0YXRzLnN1bSA9PT0gMCkge1xuICAgICAgICByZXR1cm4geyBjb3VudEZyYWN0aW9uOiAxLCB2YWx1ZUZyYWN0aW9uOiAxLCBjb3VudDogMCwgdmFsdWU6IDAsIHRvcEhlYXZ5OiBmYWxzZSwgfTtcbiAgICB9XG5cbiAgICBjb25zdCBtaW5GcmFjdGlvbiA9IDAuMjtcblxuICAgIGxldCB0b3RhbFN1bSA9IHN0YXRzLnN1bTtcbiAgICBsZXQgdG90YWxDb3VudCA9IHN0YXRzLmNvdW50O1xuICAgIGxldCB0b3RhbE1lYW4gPSB0b3RhbFN1bSAvIHRvdGFsQ291bnQ7XG5cbiAgICAvLyBGaW5kIHRoZSBzdW0gYWJvdmUgdGhlIGF2ZXJhZ2UgKHdpdGggYSBtaW5pbXVtIG9mIG1pbkZyYWN0aW9uLCBhcyBzb21ldGltZXMgdGhlcmUgaXNuJ3QgcmVhbGx5IGFueXRoaW5nIGFib3ZlIHRoZSBhdmVyYWdlKVxuICAgIGxldCBidWNrZXRzID0gZ2V0U3RhdHNCdWNrZXRzKHN0YXRzKTtcbiAgICBidWNrZXRzLnJldmVyc2UoKTtcblxuICAgIGxldCBjdXJTdW0gPSAwO1xuICAgIGxldCBjdXJDb3VudCA9IDA7XG4gICAgZm9yIChsZXQgZW50cnkgb2YgYnVja2V0cykge1xuICAgICAgICBsZXQgbWVhbiA9IGVudHJ5LnN1bSAvIGVudHJ5LmNvdW50O1xuICAgICAgICBpZiAoY3VyU3VtID4gdG90YWxTdW0gKiBtaW5GcmFjdGlvbiAmJiBtZWFuIDwgdG90YWxNZWFuKSBicmVhaztcblxuICAgICAgICBjdXJTdW0gKz0gZW50cnkuc3VtO1xuICAgICAgICBjdXJDb3VudCArPSBlbnRyeS5jb3VudDtcbiAgICB9XG5cbiAgICBsZXQgY291bnRGcmFjdGlvbiA9IGN1ckNvdW50IC8gdG90YWxDb3VudDtcbiAgICBsZXQgdmFsdWVGcmFjdGlvbiA9IGN1clN1bSAvIHRvdGFsU3VtO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY291bnRGcmFjdGlvbixcbiAgICAgICAgdmFsdWVGcmFjdGlvbixcbiAgICAgICAgY291bnQ6IGN1ckNvdW50LFxuICAgICAgICB2YWx1ZTogY3VyU3VtLFxuICAgICAgICAvLyBJZiBtb3JlIHRoYW4gNTAlIGlzIGFib3ZlIHRoZSBhdmVyYWdlLCBpdCdzIHRvcCBoZWF2eVxuICAgICAgICB0b3BIZWF2eTogdmFsdWVGcmFjdGlvbiAvIGNvdW50RnJhY3Rpb24gPiAyICYmIHZhbHVlRnJhY3Rpb24gPiAwLjQsXG4gICAgfTtcbn1cblxuXG5cblxuXG5mdW5jdGlvbiBiZW5jaG1hcmtBZGRUb1N0YXRzKCkge1xuICAgIGxldCBzdGF0cyA9IGNyZWF0ZVN0YXRzVmFsdWUoKTtcbiAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGNvdW50ID0gMTAwMDAwMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgYWRkVG9TdGF0c1ZhbHVlKHN0YXRzLCAxMDAwMDAwMDAwMCk7XG4gICAgfVxuICAgIGxldCBlbmQgPSBEYXRlLm5vdygpO1xuICAgIGxldCB0aW1lID0gZW5kIC0gc3RhcnQ7XG4gICAgbGV0IHRpbWVQZXIgPSAodGltZSkgLyBjb3VudCAqIDEwMDAgKiAxMDAwO1xuICAgIGNvbnNvbGUubG9nKGBUaW1lIHBlcjogJHt0aW1lUGVyfW5zLCBpbiAke3RpbWV9bXNgKTtcbn1cbi8vYmVuY2htYXJrQWRkVG9TdGF0cygpOyJdfQ==
|
|
202
|
+
/* _JS_SOURCE_HASH = "34c3da06d9308a7411dda3bccbd852eb60775b064ebec51cc9c4b413d9ee8e47"; */
|
|
@@ -0,0 +1,45 @@
|
|
|
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.formatStats = exports.percent = void 0;
|
|
4
|
+
const format_1 = require("../formatting/format");
|
|
5
|
+
const logColors_1 = require("../formatting/logColors");
|
|
6
|
+
const misc_1 = require("../misc");
|
|
7
|
+
const stats_1 = require("./stats");
|
|
8
|
+
function percent(value) {
|
|
9
|
+
return `${(value * 100).toFixed(2)}%`;
|
|
10
|
+
}
|
|
11
|
+
exports.percent = percent;
|
|
12
|
+
function formatStats(stats, config) {
|
|
13
|
+
function p(count, text) {
|
|
14
|
+
return String(text).padStart(count, " ");
|
|
15
|
+
}
|
|
16
|
+
let perText = (0, format_1.formatTime)(stats.sum / stats.count);
|
|
17
|
+
let countText = (0, format_1.formatNumber)(stats.count);
|
|
18
|
+
let sumText = (0, format_1.formatTime)(stats.sum);
|
|
19
|
+
let equation = (!(config === null || config === void 0 ? void 0 : config.noSum) && `${p(6, sumText)} = ` || "") + `${p(6, countText)} * ${p(6, perText)}`;
|
|
20
|
+
let top = (0, stats_1.getStatsTop)(stats);
|
|
21
|
+
if (top.topHeavy) {
|
|
22
|
+
let topText = (0, format_1.formatTime)(top.value / top.count);
|
|
23
|
+
let topCountText = (0, format_1.formatNumber)(top.count);
|
|
24
|
+
let bottomText = (0, format_1.formatTime)((stats.sum - top.value) / (stats.count - top.count) || 0);
|
|
25
|
+
let bottomCountText = (0, format_1.formatNumber)(stats.count - top.count);
|
|
26
|
+
let topPart = `${topCountText} * ${p(6, topText)}`;
|
|
27
|
+
let bottomPart = `${bottomCountText} * ${bottomText}`;
|
|
28
|
+
if (!(config === null || config === void 0 ? void 0 : config.noColor)) {
|
|
29
|
+
if ((0, misc_1.isNode)()) {
|
|
30
|
+
topPart = (0, logColors_1.red)(topPart);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
bottomPart = (0, logColors_1.white)(bottomPart);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
equation = (!(config === null || config === void 0 ? void 0 : config.noSum) && `${p(6, sumText)} = ` || "") + `${p(6, topPart)} + ${bottomPart}`;
|
|
37
|
+
}
|
|
38
|
+
if (config === null || config === void 0 ? void 0 : config.noSpaces) {
|
|
39
|
+
equation = equation.replace(/\s+/g, " ").trim();
|
|
40
|
+
}
|
|
41
|
+
return equation;
|
|
42
|
+
}
|
|
43
|
+
exports.formatStats = formatStats;
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHNGb3JtYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdGF0c0Zvcm1hdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBZ0U7QUFDaEUsdURBQXFEO0FBQ3JELGtDQUFpQztBQUNqQyxtQ0FBa0Q7QUFFbEQsU0FBZ0IsT0FBTyxDQUFDLEtBQWE7SUFDakMsT0FBTyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzFDLENBQUM7QUFGRCwwQkFFQztBQUVELFNBQWdCLFdBQVcsQ0FBQyxLQUFpQixFQUFFLE1BSTlDO0lBQ0csU0FBUyxDQUFDLENBQUMsS0FBYSxFQUFFLElBQXFCO1FBQzNDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUksT0FBTyxHQUFHLElBQUEsbUJBQVUsRUFBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRCxJQUFJLFNBQVMsR0FBRyxJQUFBLHFCQUFZLEVBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLElBQUksT0FBTyxHQUFHLElBQUEsbUJBQVUsRUFBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLEtBQUssQ0FBQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFFMUcsSUFBSSxHQUFHLEdBQUcsSUFBQSxtQkFBVyxFQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2YsSUFBSSxPQUFPLEdBQUcsSUFBQSxtQkFBVSxFQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELElBQUksWUFBWSxHQUFHLElBQUEscUJBQVksRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsSUFBSSxVQUFVLEdBQUcsSUFBQSxtQkFBVSxFQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0RixJQUFJLGVBQWUsR0FBRyxJQUFBLHFCQUFZLEVBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUQsSUFBSSxPQUFPLEdBQUcsR0FBRyxZQUFZLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ25ELElBQUksVUFBVSxHQUFHLEdBQUcsZUFBZSxNQUFNLFVBQVUsRUFBRSxDQUFDO1FBQ3RELElBQUksQ0FBQyxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxPQUFPLENBQUEsRUFBRSxDQUFDO1lBQ25CLElBQUksSUFBQSxhQUFNLEdBQUUsRUFBRSxDQUFDO2dCQUNYLE9BQU8sR0FBRyxJQUFBLGVBQUcsRUFBQyxPQUFPLENBQUMsQ0FBQztZQUMzQixDQUFDO2lCQUFNLENBQUM7Z0JBQ0osVUFBVSxHQUFHLElBQUEsaUJBQUssRUFBQyxVQUFVLENBQUMsQ0FBQztZQUNuQyxDQUFDO1FBQ0wsQ0FBQztRQUNELFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsS0FBSyxDQUFBLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxTQUFTLFVBQVUsRUFBRSxDQUFDO0lBQ3ZHLENBQUM7SUFDRCxJQUFJLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxRQUFRLEVBQUUsQ0FBQztRQUNuQixRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUM7QUFuQ0Qsa0NBbUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9ybWF0VGltZSwgZm9ybWF0TnVtYmVyIH0gZnJvbSBcIi4uL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQgeyByZWQsIHdoaXRlIH0gZnJvbSBcIi4uL2Zvcm1hdHRpbmcvbG9nQ29sb3JzXCI7XG5pbXBvcnQgeyBpc05vZGUgfSBmcm9tIFwiLi4vbWlzY1wiO1xuaW1wb3J0IHsgU3RhdHNWYWx1ZSwgZ2V0U3RhdHNUb3AgfSBmcm9tIFwiLi9zdGF0c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gcGVyY2VudCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGAkeyh2YWx1ZSAqIDEwMCkudG9GaXhlZCgyKX0lYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFN0YXRzKHN0YXRzOiBTdGF0c1ZhbHVlLCBjb25maWc/OiB7XG4gICAgbm9Db2xvcj86IGJvb2xlYW47XG4gICAgbm9TdW0/OiBib29sZWFuO1xuICAgIG5vU3BhY2VzPzogYm9vbGVhbjtcbn0pIHtcbiAgICBmdW5jdGlvbiBwKGNvdW50OiBudW1iZXIsIHRleHQ6IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHRleHQpLnBhZFN0YXJ0KGNvdW50LCBcIiBcIik7XG4gICAgfVxuXG4gICAgbGV0IHBlclRleHQgPSBmb3JtYXRUaW1lKHN0YXRzLnN1bSAvIHN0YXRzLmNvdW50KTtcbiAgICBsZXQgY291bnRUZXh0ID0gZm9ybWF0TnVtYmVyKHN0YXRzLmNvdW50KTtcbiAgICBsZXQgc3VtVGV4dCA9IGZvcm1hdFRpbWUoc3RhdHMuc3VtKTtcbiAgICBsZXQgZXF1YXRpb24gPSAoIWNvbmZpZz8ubm9TdW0gJiYgYCR7cCg2LCBzdW1UZXh0KX0gPSAgYCB8fCBcIlwiKSArIGAke3AoNiwgY291bnRUZXh0KX0gKiAke3AoNiwgcGVyVGV4dCl9YDtcblxuICAgIGxldCB0b3AgPSBnZXRTdGF0c1RvcChzdGF0cyk7XG4gICAgaWYgKHRvcC50b3BIZWF2eSkge1xuICAgICAgICBsZXQgdG9wVGV4dCA9IGZvcm1hdFRpbWUodG9wLnZhbHVlIC8gdG9wLmNvdW50KTtcbiAgICAgICAgbGV0IHRvcENvdW50VGV4dCA9IGZvcm1hdE51bWJlcih0b3AuY291bnQpO1xuICAgICAgICBsZXQgYm90dG9tVGV4dCA9IGZvcm1hdFRpbWUoKHN0YXRzLnN1bSAtIHRvcC52YWx1ZSkgLyAoc3RhdHMuY291bnQgLSB0b3AuY291bnQpIHx8IDApO1xuICAgICAgICBsZXQgYm90dG9tQ291bnRUZXh0ID0gZm9ybWF0TnVtYmVyKHN0YXRzLmNvdW50IC0gdG9wLmNvdW50KTtcbiAgICAgICAgbGV0IHRvcFBhcnQgPSBgJHt0b3BDb3VudFRleHR9ICogJHtwKDYsIHRvcFRleHQpfWA7XG4gICAgICAgIGxldCBib3R0b21QYXJ0ID0gYCR7Ym90dG9tQ291bnRUZXh0fSAqICR7Ym90dG9tVGV4dH1gO1xuICAgICAgICBpZiAoIWNvbmZpZz8ubm9Db2xvcikge1xuICAgICAgICAgICAgaWYgKGlzTm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgdG9wUGFydCA9IHJlZCh0b3BQYXJ0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYm90dG9tUGFydCA9IHdoaXRlKGJvdHRvbVBhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVxdWF0aW9uID0gKCFjb25maWc/Lm5vU3VtICYmIGAke3AoNiwgc3VtVGV4dCl9ID0gYCB8fCBcIlwiKSArIGAke3AoNiwgdG9wUGFydCl9ICAgKyAgJHtib3R0b21QYXJ0fWA7XG4gICAgfVxuICAgIGlmIChjb25maWc/Lm5vU3BhY2VzKSB7XG4gICAgICAgIGVxdWF0aW9uID0gZXF1YXRpb24ucmVwbGFjZSgvXFxzKy9nLCBcIiBcIikudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gZXF1YXRpb247XG59Il19
|
|
45
|
+
/* _JS_SOURCE_HASH = "c1203d6ed964b28ac79386911e4c6e74248215339c447df4344b77d4c29e14f2"; */
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import debugbreak from "debugbreak";
|
|
2
2
|
import { isNode } from "../misc";
|
|
3
|
+
import { createSingleton } from "../createSingleton";
|
|
3
4
|
// TODO: We could probably make this an optional / dev dependency, to allow
|
|
4
5
|
// for use on machines without the ability to compile?
|
|
5
6
|
//import { now } from "rdtsc-now";
|
|
@@ -15,7 +16,12 @@ export type OwnTimeObjInternal = OwnTimeObj & {
|
|
|
15
16
|
firstStartTime: number;
|
|
16
17
|
};
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
// Shared across every copy of this package loaded in the process, so a profile started via one
|
|
20
|
+
// copy's startMeasure nests correctly with getOwnTime calls made through another copy. The
|
|
21
|
+
// open-time stack MUST be a single instance, otherwise cross-copy nesting/own-time accounting
|
|
22
|
+
// breaks (a function wrapped by copy A calling one wrapped by copy B would push onto a different
|
|
23
|
+
// stack). See createSingleton.
|
|
24
|
+
const openTimes = createSingleton("measure.openTimes", 1, () => [] as OwnTimeObjInternal[]).get();
|
|
19
25
|
|
|
20
26
|
export function getOpenTimesBase(): OwnTimeObjInternal[] {
|
|
21
27
|
return openTimes;
|
package/src/profiling/measure.ts
CHANGED
|
@@ -7,25 +7,32 @@ import { addToStats, addToStatsValue, createStatsValue, getStatsTop, StatsValue
|
|
|
7
7
|
import { white } from "../formatting/logColors";
|
|
8
8
|
import { isNode } from "../misc";
|
|
9
9
|
import { formatStats, percent } from "./statsFormat";
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
import { createSingleton } from "../createSingleton";
|
|
11
|
+
|
|
12
|
+
// Shared across every copy of this package loaded in the process, so enable/disableMeasurements
|
|
13
|
+
// on any copy is honored by every copy's measureWrap, and so the skipped-function warning counts
|
|
14
|
+
// across all copies. Held as a mutated-in-place object because the flags are reassigned. See
|
|
15
|
+
// createSingleton.
|
|
16
|
+
const measureState = createSingleton("measure.state", 1, () => ({
|
|
17
|
+
measurementsEnabled: true,
|
|
18
|
+
measurementsDisabled: false,
|
|
19
|
+
functionsSkipped: 0,
|
|
20
|
+
})).get();
|
|
12
21
|
/** NOTE: Must be called BEFORE anything else is imported!
|
|
13
22
|
* NOTE: Measurements on on by default now, so this doesn't really need to be called...
|
|
14
23
|
*/
|
|
15
24
|
export function enableMeasurements() {
|
|
16
|
-
if (functionsSkipped) {
|
|
17
|
-
console.warn(red(`Skipped measure shimming ${functionsSkipped} functions. Fix this by calling enableMeasurements before any other imports.`));
|
|
25
|
+
if (measureState.functionsSkipped) {
|
|
26
|
+
console.warn(red(`Skipped measure shimming ${measureState.functionsSkipped} functions. Fix this by calling enableMeasurements before any other imports.`));
|
|
18
27
|
}
|
|
19
|
-
measurementsEnabled = true;
|
|
28
|
+
measureState.measurementsEnabled = true;
|
|
20
29
|
}
|
|
21
30
|
/** NOTE: Must be called BEFORE anything else is imported! */
|
|
22
31
|
export function disableMeasurements() {
|
|
23
|
-
measurementsEnabled = false;
|
|
24
|
-
measurementsDisabled = true;
|
|
32
|
+
measureState.measurementsEnabled = false;
|
|
33
|
+
measureState.measurementsDisabled = true;
|
|
25
34
|
}
|
|
26
35
|
|
|
27
|
-
let functionsSkipped = 0;
|
|
28
|
-
|
|
29
36
|
const measureOverhead = 5 / 1000;
|
|
30
37
|
|
|
31
38
|
const AsyncFunction = (async () => { }).constructor;
|
|
@@ -60,8 +67,8 @@ export function nameFunction<T extends Function>(name: string, fnc: T) {
|
|
|
60
67
|
}
|
|
61
68
|
// NOTE: Handles promises correctly
|
|
62
69
|
export function measureWrap<T extends (...args: any[]) => any>(fnc: T, name?: string): T {
|
|
63
|
-
if (!measurementsEnabled) {
|
|
64
|
-
functionsSkipped++;
|
|
70
|
+
if (!measureState.measurementsEnabled) {
|
|
71
|
+
measureState.functionsSkipped++;
|
|
65
72
|
return fnc;
|
|
66
73
|
}
|
|
67
74
|
let usedName = name || fnc.name || fnc.toString().slice(0, 100).replaceAll(/\s/g, " ");
|
|
@@ -78,7 +85,8 @@ export function measureBlock<T extends (...args: any[]) => any>(fnc: T, name?: s
|
|
|
78
85
|
return measureWrap(fnc, name)();
|
|
79
86
|
}
|
|
80
87
|
|
|
81
|
-
|
|
88
|
+
// Shared across copies so registerMeasureInfo on any copy is seen by logMeasureTable. See createSingleton.
|
|
89
|
+
const extraInfoGetters = createSingleton("measure.extraInfoGetters", 1, () => [] as (() => string | undefined)[]).get();
|
|
82
90
|
/** NOTE: You should often call registerNodeMetadata for this as well. registerMeasureInfo
|
|
83
91
|
* is for logs, while registerNodeMetadata is for the overview page.
|
|
84
92
|
*/
|
|
@@ -92,7 +100,7 @@ export function registerMeasureInfo(getInfo: () => string | undefined) {
|
|
|
92
100
|
export function startMeasure(): {
|
|
93
101
|
finish: () => MeasureProfile;
|
|
94
102
|
} {
|
|
95
|
-
if (!measurementsEnabled && !measurementsDisabled) {
|
|
103
|
+
if (!measureState.measurementsEnabled && !measureState.measurementsDisabled) {
|
|
96
104
|
console.warn(red(`To capture measurements enableMeasurements() must be called before any other imports in your entry point`));
|
|
97
105
|
}
|
|
98
106
|
let now = Date.now();
|
|
@@ -355,9 +363,10 @@ interface ProfileEntry {
|
|
|
355
363
|
stillOpenCount: number;
|
|
356
364
|
}
|
|
357
365
|
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
366
|
+
// Shared across copies so a profile started through one copy captures measureWrap'd functions from
|
|
367
|
+
// every other copy - otherwise a profile would only ever see functions wrapped by its own copy.
|
|
368
|
+
// See createSingleton.
|
|
369
|
+
const outstandingProfiles = createSingleton("measure.outstandingProfiles", 1, () => [] as MeasureProfile[]).get();
|
|
361
370
|
(globalThis as any).outstandingProfiles = outstandingProfiles;
|
|
362
371
|
function recordOwnTime(ownTimeObj: OwnTimeObj) {
|
|
363
372
|
if (outstandingProfiles.length === 0) return;
|