stats-gl 3.8.0 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/core.cjs ADDED
@@ -0,0 +1,421 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ class StatsCore {
4
+ constructor({
5
+ trackGPU = false,
6
+ trackCPT = false,
7
+ trackHz = false,
8
+ trackFPS = true,
9
+ logsPerSecond = 4,
10
+ graphsPerSecond = 30,
11
+ samplesLog = 40,
12
+ samplesGraph = 10,
13
+ precision = 2
14
+ } = {}) {
15
+ this.gl = null;
16
+ this.ext = null;
17
+ this.gpuDevice = null;
18
+ this.gpuBackend = null;
19
+ this.renderer = null;
20
+ this.activeQuery = null;
21
+ this.gpuQueries = [];
22
+ this.threeRendererPatched = false;
23
+ this.webgpuNative = false;
24
+ this.gpuQuerySet = null;
25
+ this.gpuResolveBuffer = null;
26
+ this.gpuReadBuffers = [];
27
+ this.gpuWriteBufferIndex = 0;
28
+ this.gpuFrameCount = 0;
29
+ this.pendingResolve = null;
30
+ this.frameTimes = [];
31
+ this.renderCount = 0;
32
+ this.totalCpuDuration = 0;
33
+ this.totalGpuDuration = 0;
34
+ this.totalGpuDurationCompute = 0;
35
+ this.averageFps = { logs: [], graph: [] };
36
+ this.averageCpu = { logs: [], graph: [] };
37
+ this.averageGpu = { logs: [], graph: [] };
38
+ this.averageGpuCompute = { logs: [], graph: [] };
39
+ this.trackGPU = trackGPU;
40
+ this.trackCPT = trackCPT;
41
+ this.trackHz = trackHz;
42
+ this.trackFPS = trackFPS;
43
+ this.samplesLog = samplesLog;
44
+ this.samplesGraph = samplesGraph;
45
+ this.precision = precision;
46
+ this.logsPerSecond = logsPerSecond;
47
+ this.graphsPerSecond = graphsPerSecond;
48
+ const now = performance.now();
49
+ this.prevGraphTime = now;
50
+ this.beginTime = now;
51
+ this.prevTextTime = now;
52
+ this.prevCpuTime = now;
53
+ }
54
+ async init(canvasOrGL) {
55
+ if (!canvasOrGL) {
56
+ console.error('Stats: The "canvas" parameter is undefined.');
57
+ return;
58
+ }
59
+ if (this.handleThreeRenderer(canvasOrGL))
60
+ return;
61
+ if (await this.handleWebGPURenderer(canvasOrGL))
62
+ return;
63
+ if (this.handleNativeWebGPU(canvasOrGL))
64
+ return;
65
+ if (this.initializeWebGL(canvasOrGL)) {
66
+ if (this.trackGPU) {
67
+ this.initializeGPUTracking();
68
+ }
69
+ return;
70
+ } else {
71
+ console.error("Stats-gl: Failed to initialize WebGL context");
72
+ }
73
+ }
74
+ handleNativeWebGPU(device) {
75
+ var _a;
76
+ if (device && typeof device.createCommandEncoder === "function" && typeof device.createQuerySet === "function" && device.queue) {
77
+ this.gpuDevice = device;
78
+ this.webgpuNative = true;
79
+ if (this.trackGPU && ((_a = device.features) == null ? void 0 : _a.has("timestamp-query"))) {
80
+ this.initializeWebGPUTiming();
81
+ this.onWebGPUTimestampSupported();
82
+ }
83
+ return true;
84
+ }
85
+ return false;
86
+ }
87
+ initializeWebGPUTiming() {
88
+ if (!this.gpuDevice)
89
+ return;
90
+ this.gpuQuerySet = this.gpuDevice.createQuerySet({
91
+ type: "timestamp",
92
+ count: 2
93
+ });
94
+ this.gpuResolveBuffer = this.gpuDevice.createBuffer({
95
+ size: 16,
96
+ usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC
97
+ });
98
+ for (let i = 0; i < 2; i++) {
99
+ this.gpuReadBuffers.push(this.gpuDevice.createBuffer({
100
+ size: 16,
101
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
102
+ }));
103
+ }
104
+ }
105
+ handleThreeRenderer(renderer) {
106
+ if (renderer.isWebGLRenderer && !this.threeRendererPatched) {
107
+ this.patchThreeRenderer(renderer);
108
+ this.gl = renderer.getContext();
109
+ if (this.trackGPU) {
110
+ this.initializeGPUTracking();
111
+ }
112
+ return true;
113
+ }
114
+ return false;
115
+ }
116
+ async handleWebGPURenderer(renderer) {
117
+ var _a;
118
+ if (renderer.isWebGPURenderer) {
119
+ this.renderer = renderer;
120
+ if (this.trackGPU || this.trackCPT) {
121
+ renderer.backend.trackTimestamp = true;
122
+ if (!renderer._initialized) {
123
+ await renderer.init();
124
+ }
125
+ if (renderer.hasFeature("timestamp-query")) {
126
+ this.onWebGPUTimestampSupported();
127
+ }
128
+ }
129
+ this.info = renderer.info;
130
+ this.gpuBackend = renderer.backend;
131
+ this.gpuDevice = ((_a = renderer.backend) == null ? void 0 : _a.device) || null;
132
+ this.patchThreeWebGPU(renderer);
133
+ return true;
134
+ }
135
+ return false;
136
+ }
137
+ onWebGPUTimestampSupported() {
138
+ }
139
+ initializeWebGL(canvasOrGL) {
140
+ if (canvasOrGL instanceof WebGL2RenderingContext) {
141
+ this.gl = canvasOrGL;
142
+ } else if (canvasOrGL instanceof HTMLCanvasElement || canvasOrGL instanceof OffscreenCanvas) {
143
+ this.gl = canvasOrGL.getContext("webgl2");
144
+ if (!this.gl) {
145
+ console.error("Stats: Unable to obtain WebGL2 context.");
146
+ return false;
147
+ }
148
+ } else {
149
+ console.error(
150
+ "Stats: Invalid input type. Expected WebGL2RenderingContext, HTMLCanvasElement, or OffscreenCanvas."
151
+ );
152
+ return false;
153
+ }
154
+ return true;
155
+ }
156
+ initializeGPUTracking() {
157
+ if (this.gl) {
158
+ this.ext = this.gl.getExtension("EXT_disjoint_timer_query_webgl2");
159
+ if (this.ext) {
160
+ this.onGPUTrackingInitialized();
161
+ }
162
+ }
163
+ }
164
+ onGPUTrackingInitialized() {
165
+ }
166
+ /**
167
+ * Get timestampWrites configuration for WebGPU render pass.
168
+ * Use this when creating your render pass descriptor.
169
+ * @returns timestampWrites object or undefined if not tracking GPU
170
+ */
171
+ getTimestampWrites() {
172
+ if (!this.webgpuNative || !this.gpuQuerySet)
173
+ return void 0;
174
+ return {
175
+ querySet: this.gpuQuerySet,
176
+ beginningOfPassWriteIndex: 0,
177
+ endOfPassWriteIndex: 1
178
+ };
179
+ }
180
+ begin(encoder) {
181
+ this.beginProfiling("cpu-started");
182
+ if (this.webgpuNative) {
183
+ return;
184
+ }
185
+ if (!this.gl || !this.ext)
186
+ return;
187
+ if (this.activeQuery) {
188
+ this.gl.endQuery(this.ext.TIME_ELAPSED_EXT);
189
+ }
190
+ this.activeQuery = this.gl.createQuery();
191
+ if (this.activeQuery) {
192
+ this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT, this.activeQuery);
193
+ }
194
+ }
195
+ end(encoder) {
196
+ this.renderCount++;
197
+ if (this.webgpuNative && encoder && this.gpuQuerySet && this.gpuResolveBuffer && this.gpuReadBuffers.length > 0) {
198
+ this.gpuFrameCount++;
199
+ const writeBuffer = this.gpuReadBuffers[this.gpuWriteBufferIndex];
200
+ if (writeBuffer.mapState === "unmapped") {
201
+ encoder.resolveQuerySet(this.gpuQuerySet, 0, 2, this.gpuResolveBuffer, 0);
202
+ encoder.copyBufferToBuffer(this.gpuResolveBuffer, 0, writeBuffer, 0, 16);
203
+ }
204
+ this.endProfiling("cpu-started", "cpu-finished", "cpu-duration");
205
+ return;
206
+ }
207
+ if (this.gl && this.ext && this.activeQuery) {
208
+ this.gl.endQuery(this.ext.TIME_ELAPSED_EXT);
209
+ this.gpuQueries.push({ query: this.activeQuery });
210
+ this.activeQuery = null;
211
+ }
212
+ this.endProfiling("cpu-started", "cpu-finished", "cpu-duration");
213
+ }
214
+ /**
215
+ * Resolve WebGPU timestamp queries. Call this after queue.submit().
216
+ * Returns a promise that resolves to the GPU duration in milliseconds.
217
+ */
218
+ async resolveTimestampsAsync() {
219
+ if (!this.webgpuNative || this.gpuReadBuffers.length === 0) {
220
+ return this.totalGpuDuration;
221
+ }
222
+ if (this.pendingResolve) {
223
+ return this.pendingResolve;
224
+ }
225
+ const readBufferIndex = (this.gpuWriteBufferIndex + 1) % 2;
226
+ const readBuffer = this.gpuReadBuffers[readBufferIndex];
227
+ this.gpuWriteBufferIndex = (this.gpuWriteBufferIndex + 1) % 2;
228
+ if (this.gpuFrameCount < 2) {
229
+ return this.totalGpuDuration;
230
+ }
231
+ if (readBuffer.mapState !== "unmapped") {
232
+ return this.totalGpuDuration;
233
+ }
234
+ this.pendingResolve = this._resolveTimestamps(readBuffer);
235
+ try {
236
+ const result = await this.pendingResolve;
237
+ return result;
238
+ } finally {
239
+ this.pendingResolve = null;
240
+ }
241
+ }
242
+ async _resolveTimestamps(readBuffer) {
243
+ try {
244
+ await readBuffer.mapAsync(GPUMapMode.READ);
245
+ const data = new BigInt64Array(readBuffer.getMappedRange());
246
+ const startTime = data[0];
247
+ const endTime = data[1];
248
+ readBuffer.unmap();
249
+ const durationNs = Number(endTime - startTime);
250
+ this.totalGpuDuration = durationNs / 1e6;
251
+ return this.totalGpuDuration;
252
+ } catch (_) {
253
+ return this.totalGpuDuration;
254
+ }
255
+ }
256
+ processGpuQueries() {
257
+ if (!this.gl || !this.ext)
258
+ return;
259
+ this.totalGpuDuration = 0;
260
+ for (let i = this.gpuQueries.length - 1; i >= 0; i--) {
261
+ const queryInfo = this.gpuQueries[i];
262
+ const available = this.gl.getQueryParameter(queryInfo.query, this.gl.QUERY_RESULT_AVAILABLE);
263
+ const disjoint = this.gl.getParameter(this.ext.GPU_DISJOINT_EXT);
264
+ if (available && !disjoint) {
265
+ const elapsed = this.gl.getQueryParameter(queryInfo.query, this.gl.QUERY_RESULT);
266
+ const duration = elapsed * 1e-6;
267
+ this.totalGpuDuration += duration;
268
+ this.gl.deleteQuery(queryInfo.query);
269
+ this.gpuQueries.splice(i, 1);
270
+ }
271
+ }
272
+ }
273
+ processWebGPUTimestamps() {
274
+ this.totalGpuDuration = this.info.render.timestamp;
275
+ this.totalGpuDurationCompute = this.info.compute.timestamp;
276
+ }
277
+ beginProfiling(marker) {
278
+ if (typeof performance !== "undefined") {
279
+ try {
280
+ performance.clearMarks(marker);
281
+ performance.mark(marker);
282
+ } catch (error) {
283
+ console.debug("Stats: Performance marking failed:", error);
284
+ }
285
+ }
286
+ }
287
+ endProfiling(startMarker, endMarker, measureName) {
288
+ if (typeof performance === "undefined" || !endMarker || !startMarker)
289
+ return;
290
+ try {
291
+ const entries = performance.getEntriesByName(startMarker, "mark");
292
+ if (entries.length === 0) {
293
+ this.beginProfiling(startMarker);
294
+ }
295
+ performance.clearMarks(endMarker);
296
+ performance.mark(endMarker);
297
+ performance.clearMeasures(measureName);
298
+ const cpuMeasure = performance.measure(measureName, startMarker, endMarker);
299
+ this.totalCpuDuration += cpuMeasure.duration;
300
+ performance.clearMarks(startMarker);
301
+ performance.clearMarks(endMarker);
302
+ performance.clearMeasures(measureName);
303
+ } catch (error) {
304
+ console.debug("Stats: Performance measurement failed:", error);
305
+ }
306
+ }
307
+ calculateFps() {
308
+ const currentTime = performance.now();
309
+ this.frameTimes.push(currentTime);
310
+ while (this.frameTimes.length > 0 && this.frameTimes[0] <= currentTime - 1e3) {
311
+ this.frameTimes.shift();
312
+ }
313
+ return Math.round(this.frameTimes.length);
314
+ }
315
+ updateAverages() {
316
+ this.addToAverage(this.totalCpuDuration, this.averageCpu);
317
+ this.addToAverage(this.totalGpuDuration, this.averageGpu);
318
+ if (this.info && this.totalGpuDurationCompute !== void 0) {
319
+ this.addToAverage(this.totalGpuDurationCompute, this.averageGpuCompute);
320
+ }
321
+ }
322
+ addToAverage(value, averageArray) {
323
+ averageArray.logs.push(value);
324
+ while (averageArray.logs.length > this.samplesLog) {
325
+ averageArray.logs.shift();
326
+ }
327
+ averageArray.graph.push(value);
328
+ while (averageArray.graph.length > this.samplesGraph) {
329
+ averageArray.graph.shift();
330
+ }
331
+ }
332
+ resetCounters() {
333
+ this.renderCount = 0;
334
+ this.totalCpuDuration = 0;
335
+ this.beginTime = performance.now();
336
+ }
337
+ getData() {
338
+ const fpsLogs = this.averageFps.logs;
339
+ const cpuLogs = this.averageCpu.logs;
340
+ const gpuLogs = this.averageGpu.logs;
341
+ const gpuComputeLogs = this.averageGpuCompute.logs;
342
+ return {
343
+ fps: fpsLogs.length > 0 ? fpsLogs[fpsLogs.length - 1] : 0,
344
+ cpu: cpuLogs.length > 0 ? cpuLogs[cpuLogs.length - 1] : 0,
345
+ gpu: gpuLogs.length > 0 ? gpuLogs[gpuLogs.length - 1] : 0,
346
+ gpuCompute: gpuComputeLogs.length > 0 ? gpuComputeLogs[gpuComputeLogs.length - 1] : 0
347
+ };
348
+ }
349
+ patchThreeWebGPU(renderer) {
350
+ const originalAnimationLoop = renderer.info.reset;
351
+ const statsInstance = this;
352
+ renderer.info.reset = function() {
353
+ statsInstance.beginProfiling("cpu-started");
354
+ originalAnimationLoop.call(this);
355
+ };
356
+ }
357
+ patchThreeRenderer(renderer) {
358
+ const originalRenderMethod = renderer.render;
359
+ const statsInstance = this;
360
+ renderer.render = function(scene, camera) {
361
+ statsInstance.begin();
362
+ originalRenderMethod.call(this, scene, camera);
363
+ statsInstance.end();
364
+ };
365
+ this.threeRendererPatched = true;
366
+ }
367
+ /**
368
+ * Dispose of all resources. Call when done using the stats instance.
369
+ */
370
+ dispose() {
371
+ if (this.gl) {
372
+ if (this.activeQuery && this.ext) {
373
+ try {
374
+ this.gl.endQuery(this.ext.TIME_ELAPSED_EXT);
375
+ } catch (_) {
376
+ }
377
+ this.gl.deleteQuery(this.activeQuery);
378
+ this.activeQuery = null;
379
+ }
380
+ for (const queryInfo of this.gpuQueries) {
381
+ this.gl.deleteQuery(queryInfo.query);
382
+ }
383
+ this.gpuQueries.length = 0;
384
+ }
385
+ if (this.gpuQuerySet) {
386
+ this.gpuQuerySet.destroy();
387
+ this.gpuQuerySet = null;
388
+ }
389
+ if (this.gpuResolveBuffer) {
390
+ this.gpuResolveBuffer.destroy();
391
+ this.gpuResolveBuffer = null;
392
+ }
393
+ for (const buffer of this.gpuReadBuffers) {
394
+ if (buffer.mapState === "mapped") {
395
+ buffer.unmap();
396
+ }
397
+ buffer.destroy();
398
+ }
399
+ this.gpuReadBuffers.length = 0;
400
+ this.gpuFrameCount = 0;
401
+ this.pendingResolve = null;
402
+ this.webgpuNative = false;
403
+ this.gl = null;
404
+ this.ext = null;
405
+ this.info = void 0;
406
+ this.gpuDevice = null;
407
+ this.gpuBackend = null;
408
+ this.renderer = null;
409
+ this.frameTimes.length = 0;
410
+ this.averageFps.logs.length = 0;
411
+ this.averageFps.graph.length = 0;
412
+ this.averageCpu.logs.length = 0;
413
+ this.averageCpu.graph.length = 0;
414
+ this.averageGpu.logs.length = 0;
415
+ this.averageGpu.graph.length = 0;
416
+ this.averageGpuCompute.logs.length = 0;
417
+ this.averageGpuCompute.graph.length = 0;
418
+ }
419
+ }
420
+ exports.StatsCore = StatsCore;
421
+ //# sourceMappingURL=core.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.cjs","sources":["../lib/core.ts"],"sourcesContent":null,"names":[],"mappings":";;AAsCO,MAAM,UAAU;AAAA,EAgDrB,YAAY;AAAA,IACV,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,eAAe;AAAA,IACf,YAAY;AAAA,EACd,IAAsB,IAAI;AA/C1B,SAAO,KAAoC;AAC3C,SAAO,MAAkB;AAEzB,SAAO,YAA8B;AACrC,SAAO,aAAyB;AAChC,SAAO,WAAuB;AAC9B,SAAU,cAAiC;AAC3C,SAAU,aAA0B;AACpC,SAAU,uBAAuB;AAGjC,SAAU,eAAwB;AAClC,SAAU,cAAkC;AAC5C,SAAU,mBAAqC;AAC/C,SAAU,iBAA8B;AACxC,SAAU,sBAA8B;AACxC,SAAU,gBAAwB;AAClC,SAAU,iBAAyC;AAInD,SAAU,aAAuB;AAEjC,SAAU,cAAc;AAExB,SAAU,mBAAmB;AAC7B,SAAU,mBAAmB;AAC7B,SAAU,0BAA0B;AAEpC,SAAO,aAA0B,EAAE,MAAM,CAAA,GAAI,OAAO,CAAA;AACpD,SAAO,aAA0B,EAAE,MAAM,CAAA,GAAI,OAAO,CAAA;AACpD,SAAO,aAA0B,EAAE,MAAM,CAAA,GAAI,OAAO,CAAA;AACpD,SAAO,oBAAiC,EAAE,MAAM,CAAA,GAAI,OAAO,CAAA;AAgBzD,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,SAAK,aAAa;AAClB,SAAK,eAAe;AACpB,SAAK,YAAY;AACjB,SAAK,gBAAgB;AACrB,SAAK,kBAAkB;AAEjB,UAAA,MAAM,YAAY;AACxB,SAAK,gBAAgB;AACrB,SAAK,YAAY;AACjB,SAAK,eAAe;AACpB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,MAAa,KACX,YACe;AACf,QAAI,CAAC,YAAY;AACf,cAAQ,MAAM,6CAA6C;AAC3D;AAAA,IACF;AAEI,QAAA,KAAK,oBAAoB,UAAU;AAAG;AACtC,QAAA,MAAM,KAAK,qBAAqB,UAAU;AAAG;AAG7C,QAAA,KAAK,mBAAmB,UAAU;AAAG;AAErC,QAAA,KAAK,gBAAgB,UAAU,GAAG;AACpC,UAAI,KAAK,UAAU;AACjB,aAAK,sBAAsB;AAAA,MAC7B;AACA;AAAA,IAAA,OACK;AACL,cAAQ,MAAM,8CAA8C;AAAA,IAC9D;AAAA,EACF;AAAA,EAEU,mBAAmB,QAAsB;;AAE7C,QAAA,UAAU,OAAO,OAAO,yBAAyB,cACjD,OAAO,OAAO,mBAAmB,cAAc,OAAO,OAAO;AAC/D,WAAK,YAAY;AACjB,WAAK,eAAe;AAEpB,UAAI,KAAK,cAAY,YAAO,aAAP,mBAAiB,IAAI,qBAAoB;AAC5D,aAAK,uBAAuB;AAC5B,aAAK,2BAA2B;AAAA,MAClC;AACO,aAAA;AAAA,IACT;AACO,WAAA;AAAA,EACT;AAAA,EAEU,yBAA+B;AACvC,QAAI,CAAC,KAAK;AAAW;AAGhB,SAAA,cAAc,KAAK,UAAU,eAAe;AAAA,MAC/C,MAAM;AAAA,MACN,OAAO;AAAA,IAAA,CACR;AAGI,SAAA,mBAAmB,KAAK,UAAU,aAAa;AAAA,MAClD,MAAM;AAAA,MACN,OAAO,eAAe,gBAAgB,eAAe;AAAA,IAAA,CACtD;AAGD,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,WAAK,eAAe,KAAK,KAAK,UAAU,aAAa;AAAA,QACnD,MAAM;AAAA,QACN,OAAO,eAAe,WAAW,eAAe;AAAA,MACjD,CAAA,CAAC;AAAA,IACJ;AAAA,EACF;AAAA,EAEU,oBAAoB,UAAwB;AACpD,QAAI,SAAS,mBAAmB,CAAC,KAAK,sBAAsB;AAC1D,WAAK,mBAAmB,QAAQ;AAC3B,WAAA,KAAK,SAAS;AAEnB,UAAI,KAAK,UAAU;AACjB,aAAK,sBAAsB;AAAA,MAC7B;AACO,aAAA;AAAA,IACT;AACO,WAAA;AAAA,EACT;AAAA,EAEA,MAAgB,qBAAqB,UAAiC;;AACpE,QAAI,SAAS,kBAAkB;AAC7B,WAAK,WAAW;AAEZ,UAAA,KAAK,YAAY,KAAK,UAAU;AAClC,iBAAS,QAAQ,iBAAiB;AAC9B,YAAA,CAAC,SAAS,cAAc;AAC1B,gBAAM,SAAS;QACjB;AACI,YAAA,SAAS,WAAW,iBAAiB,GAAG;AAC1C,eAAK,2BAA2B;AAAA,QAClC;AAAA,MACF;AACA,WAAK,OAAO,SAAS;AAErB,WAAK,aAAa,SAAS;AACtB,WAAA,cAAY,cAAS,YAAT,mBAAkB,WAAU;AAC7C,WAAK,iBAAiB,QAAQ;AACvB,aAAA;AAAA,IACT;AACO,WAAA;AAAA,EACT;AAAA,EAEU,6BAAmC;AAAA,EAE7C;AAAA,EAEU,gBACR,YACS;AACT,QAAI,sBAAsB,wBAAwB;AAChD,WAAK,KAAK;AAAA,IAEV,WAAA,sBAAsB,qBACtB,sBAAsB,iBACtB;AACK,WAAA,KAAK,WAAW,WAAW,QAAQ;AACpC,UAAA,CAAC,KAAK,IAAI;AACZ,gBAAQ,MAAM,yCAAyC;AAChD,eAAA;AAAA,MACT;AAAA,IAAA,OACK;AACG,cAAA;AAAA,QACN;AAAA,MAAA;AAEK,aAAA;AAAA,IACT;AACO,WAAA;AAAA,EACT;AAAA,EAEU,wBAA8B;AACtC,QAAI,KAAK,IAAI;AACX,WAAK,MAAM,KAAK,GAAG,aAAa,iCAAiC;AACjE,UAAI,KAAK,KAAK;AACZ,aAAK,yBAAyB;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EAEU,2BAAiC;AAAA,EAE3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,qBAA+D;AACpE,QAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK;AAAoB,aAAA;AAC7C,WAAA;AAAA,MACL,UAAU,KAAK;AAAA,MACf,2BAA2B;AAAA,MAC3B,qBAAqB;AAAA,IAAA;AAAA,EAEzB;AAAA,EAEO,MAAM,SAAmC;AAC9C,SAAK,eAAe,aAAa;AAGjC,QAAI,KAAK,cAAc;AACrB;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,MAAM,CAAC,KAAK;AAAK;AAE3B,QAAI,KAAK,aAAa;AACpB,WAAK,GAAG,SAAS,KAAK,IAAI,gBAAgB;AAAA,IAC5C;AAEK,SAAA,cAAc,KAAK,GAAG,YAAY;AACvC,QAAI,KAAK,aAAa;AACpB,WAAK,GAAG,WAAW,KAAK,IAAI,kBAAkB,KAAK,WAAW;AAAA,IAChE;AAAA,EACF;AAAA,EAEO,IAAI,SAAmC;AACvC,SAAA;AAGD,QAAA,KAAK,gBAAgB,WAAW,KAAK,eAAe,KAAK,oBAAoB,KAAK,eAAe,SAAS,GAAG;AAE1G,WAAA;AAGL,YAAM,cAAc,KAAK,eAAe,KAAK,mBAAmB;AAG3D,UAAA,YAAoB,aAAa,YAAY;AAChD,gBAAQ,gBAAgB,KAAK,aAAa,GAAG,GAAG,KAAK,kBAAkB,CAAC;AACxE,gBAAQ,mBAAmB,KAAK,kBAAkB,GAAG,aAAa,GAAG,EAAE;AAAA,MACzE;AAEK,WAAA,aAAa,eAAe,gBAAgB,cAAc;AAC/D;AAAA,IACF;AAEA,QAAI,KAAK,MAAM,KAAK,OAAO,KAAK,aAAa;AAC3C,WAAK,GAAG,SAAS,KAAK,IAAI,gBAAgB;AAC1C,WAAK,WAAW,KAAK,EAAE,OAAO,KAAK,aAAa;AAChD,WAAK,cAAc;AAAA,IACrB;AAEK,SAAA,aAAa,eAAe,gBAAgB,cAAc;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,yBAA0C;AACrD,QAAI,CAAC,KAAK,gBAAgB,KAAK,eAAe,WAAW,GAAG;AAC1D,aAAO,KAAK;AAAA,IACd;AAGA,QAAI,KAAK,gBAAgB;AACvB,aAAO,KAAK;AAAA,IACd;AAIM,UAAA,mBAAmB,KAAK,sBAAsB,KAAK;AACnD,UAAA,aAAa,KAAK,eAAe,eAAe;AAGjD,SAAA,uBAAuB,KAAK,sBAAsB,KAAK;AAGxD,QAAA,KAAK,gBAAgB,GAAG;AAC1B,aAAO,KAAK;AAAA,IACd;AAGK,QAAA,WAAmB,aAAa,YAAY;AAC/C,aAAO,KAAK;AAAA,IACd;AAEK,SAAA,iBAAiB,KAAK,mBAAmB,UAAU;AAEpD,QAAA;AACI,YAAA,SAAS,MAAM,KAAK;AACnB,aAAA;AAAA,IAAA,UACP;AACA,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAc,mBAAmB,YAAwC;AACnE,QAAA;AACI,YAAA,WAAW,SAAS,WAAW,IAAI;AACzC,YAAM,OAAO,IAAI,cAAc,WAAW,eAAgB,CAAA;AACpD,YAAA,YAAY,KAAK,CAAC;AAClB,YAAA,UAAU,KAAK,CAAC;AACtB,iBAAW,MAAM;AAGX,YAAA,aAAa,OAAO,UAAU,SAAS;AAC7C,WAAK,mBAAmB,aAAa;AACrC,aAAO,KAAK;AAAA,aACL,GAAG;AAEV,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EAEU,oBAA0B;AAClC,QAAI,CAAC,KAAK,MAAM,CAAC,KAAK;AAAK;AAE3B,SAAK,mBAAmB;AAGxB,aAAS,IAAI,KAAK,WAAW,SAAS,GAAG,KAAK,GAAG,KAAK;AAC9C,YAAA,YAAY,KAAK,WAAW,CAAC;AAC7B,YAAA,YAAY,KAAK,GAAG,kBAAkB,UAAU,OAAO,KAAK,GAAG,sBAAsB;AAC3F,YAAM,WAAW,KAAK,GAAG,aAAa,KAAK,IAAI,gBAAgB;AAE3D,UAAA,aAAa,CAAC,UAAU;AACpB,cAAA,UAAU,KAAK,GAAG,kBAAkB,UAAU,OAAO,KAAK,GAAG,YAAY;AAC/E,cAAM,WAAW,UAAU;AAC3B,aAAK,oBAAoB;AACpB,aAAA,GAAG,YAAY,UAAU,KAAK;AAC9B,aAAA,WAAW,OAAO,GAAG,CAAC;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA,EAEU,0BAAgC;AACnC,SAAA,mBAAmB,KAAK,KAAM,OAAO;AACrC,SAAA,0BAA0B,KAAK,KAAM,QAAQ;AAAA,EACpD;AAAA,EAEU,eAAe,QAAsB;AACzC,QAAA,OAAO,gBAAgB,aAAa;AAClC,UAAA;AACF,oBAAY,WAAW,MAAM;AAC7B,oBAAY,KAAK,MAAM;AAAA,eAChB,OAAO;AACN,gBAAA,MAAM,sCAAsC,KAAK;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAAA,EAEU,aAAa,aAA6D,WAA+B,aAA2B;AAC5I,QAAI,OAAO,gBAAgB,eAAe,CAAC,aAAa,CAAC;AAAa;AAElE,QAAA;AACF,YAAM,UAAU,YAAY,iBAAiB,aAAuB,MAAM;AACtE,UAAA,QAAQ,WAAW,GAAG;AACxB,aAAK,eAAe,WAAqB;AAAA,MAC3C;AAEA,kBAAY,WAAW,SAAS;AAChC,kBAAY,KAAK,SAAS;AAE1B,kBAAY,cAAc,WAAW;AAErC,YAAM,aAAa,YAAY,QAAQ,aAAa,aAAa,SAAS;AAC1E,WAAK,oBAAoB,WAAW;AAEpC,kBAAY,WAAW,WAAqB;AAC5C,kBAAY,WAAW,SAAS;AAChC,kBAAY,cAAc,WAAW;AAAA,aAC9B,OAAO;AACN,cAAA,MAAM,0CAA0C,KAAK;AAAA,IAC/D;AAAA,EACF;AAAA,EAEU,eAAuB;AACzB,UAAA,cAAc,YAAY;AAE3B,SAAA,WAAW,KAAK,WAAW;AAEzB,WAAA,KAAK,WAAW,SAAS,KAAK,KAAK,WAAW,CAAC,KAAK,cAAc,KAAM;AAC7E,WAAK,WAAW;IAClB;AAEA,WAAO,KAAK,MAAM,KAAK,WAAW,MAAM;AAAA,EAC1C;AAAA,EAEU,iBAAuB;AAC/B,SAAK,aAAa,KAAK,kBAAkB,KAAK,UAAU;AACxD,SAAK,aAAa,KAAK,kBAAkB,KAAK,UAAU;AACxD,QAAI,KAAK,QAAQ,KAAK,4BAA4B,QAAW;AAC3D,WAAK,aAAa,KAAK,yBAAyB,KAAK,iBAAiB;AAAA,IACxE;AAAA,EACF;AAAA,EAEU,aAAa,OAAe,cAAgD;AACvE,iBAAA,KAAK,KAAK,KAAK;AAC5B,WAAO,aAAa,KAAK,SAAS,KAAK,YAAY;AACjD,mBAAa,KAAK;IACpB;AAEa,iBAAA,MAAM,KAAK,KAAK;AAC7B,WAAO,aAAa,MAAM,SAAS,KAAK,cAAc;AACpD,mBAAa,MAAM;IACrB;AAAA,EACF;AAAA,EAEU,gBAAsB;AAC9B,SAAK,cAAc;AACnB,SAAK,mBAAmB;AACnB,SAAA,YAAY,YAAY;EAC/B;AAAA,EAEO,UAAqB;AACpB,UAAA,UAAU,KAAK,WAAW;AAC1B,UAAA,UAAU,KAAK,WAAW;AAC1B,UAAA,UAAU,KAAK,WAAW;AAC1B,UAAA,iBAAiB,KAAK,kBAAkB;AAEvC,WAAA;AAAA,MACL,KAAK,QAAQ,SAAS,IAAI,QAAQ,QAAQ,SAAS,CAAC,IAAI;AAAA,MACxD,KAAK,QAAQ,SAAS,IAAI,QAAQ,QAAQ,SAAS,CAAC,IAAI;AAAA,MACxD,KAAK,QAAQ,SAAS,IAAI,QAAQ,QAAQ,SAAS,CAAC,IAAI;AAAA,MACxD,YAAY,eAAe,SAAS,IAAI,eAAe,eAAe,SAAS,CAAC,IAAI;AAAA,IAAA;AAAA,EAExF;AAAA,EAEU,iBAAiB,UAAqB;AACxC,UAAA,wBAAwB,SAAS,KAAK;AAC5C,UAAM,gBAAgB;AAEb,aAAA,KAAK,QAAQ,WAAY;AAChC,oBAAc,eAAe,aAAa;AAC1C,4BAAsB,KAAK,IAAI;AAAA,IAAA;AAAA,EAEnC;AAAA,EAEU,mBAAmB,UAAqB;AAChD,UAAM,uBAAuB,SAAS;AACtC,UAAM,gBAAgB;AAEb,aAAA,SAAS,SAAU,OAAY,QAAa;AACnD,oBAAc,MAAM;AACC,2BAAA,KAAK,MAAM,OAAO,MAAM;AAC7C,oBAAc,IAAI;AAAA,IAAA;AAGpB,SAAK,uBAAuB;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKO,UAAgB;AAErB,QAAI,KAAK,IAAI;AAEP,UAAA,KAAK,eAAe,KAAK,KAAK;AAC5B,YAAA;AACF,eAAK,GAAG,SAAS,KAAK,IAAI,gBAAgB;AAAA,iBACnC,GAAG;AAAA,QAEZ;AACK,aAAA,GAAG,YAAY,KAAK,WAAW;AACpC,aAAK,cAAc;AAAA,MACrB;AAGW,iBAAA,aAAa,KAAK,YAAY;AAClC,aAAA,GAAG,YAAY,UAAU,KAAK;AAAA,MACrC;AACA,WAAK,WAAW,SAAS;AAAA,IAC3B;AAGA,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY;AACjB,WAAK,cAAc;AAAA,IACrB;AACA,QAAI,KAAK,kBAAkB;AACzB,WAAK,iBAAiB;AACtB,WAAK,mBAAmB;AAAA,IAC1B;AACW,eAAA,UAAU,KAAK,gBAAgB;AACnC,UAAA,OAAe,aAAa,UAAU;AACzC,eAAO,MAAM;AAAA,MACf;AACA,aAAO,QAAQ;AAAA,IACjB;AACA,SAAK,eAAe,SAAS;AAC7B,SAAK,gBAAgB;AACrB,SAAK,iBAAiB;AACtB,SAAK,eAAe;AAGpB,SAAK,KAAK;AACV,SAAK,MAAM;AACX,SAAK,OAAO;AACZ,SAAK,YAAY;AACjB,SAAK,aAAa;AAClB,SAAK,WAAW;AAGhB,SAAK,WAAW,SAAS;AACpB,SAAA,WAAW,KAAK,SAAS;AACzB,SAAA,WAAW,MAAM,SAAS;AAC1B,SAAA,WAAW,KAAK,SAAS;AACzB,SAAA,WAAW,MAAM,SAAS;AAC1B,SAAA,WAAW,KAAK,SAAS;AACzB,SAAA,WAAW,MAAM,SAAS;AAC1B,SAAA,kBAAkB,KAAK,SAAS;AAChC,SAAA,kBAAkB,MAAM,SAAS;AAAA,EACxC;AACF;;"}