@arghajit/playwright-pulse-report 0.3.3 → 0.3.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.
- package/README.md +95 -85
- package/dist/lib/report-types.d.ts +2 -0
- package/dist/reporter/playwright-pulse-reporter.d.ts +18 -1
- package/dist/reporter/playwright-pulse-reporter.js +157 -129
- package/dist/reporter/tsconfig.reporter.tsbuildinfo +1 -0
- package/dist/types/index.d.ts +53 -9
- package/dist/utils/compression-utils.d.ts +19 -0
- package/dist/utils/compression-utils.js +112 -0
- package/package.json +18 -9
- package/scripts/config-reader.mjs +114 -124
- package/scripts/generate-email-report.mjs +96 -21
- package/scripts/generate-report.mjs +1172 -531
- package/scripts/generate-static-report.mjs +1269 -540
- package/scripts/generate-trend.mjs +8 -4
- package/scripts/{merge-pulse-report.js → merge-pulse-report.mjs} +64 -35
- package/scripts/merge-sequential-reports.mjs +172 -0
- package/scripts/sendReport.mjs +156 -202
- package/scripts/terminal-logo.mjs +51 -0
- package/dist/index.d.ts +0 -5
- package/dist/index.js +0 -26
- package/dist/playwright-pulse-reporter.d.ts +0 -26
- package/dist/playwright-pulse-reporter.js +0 -304
- package/dist/reporter/lib/report-types.d.ts +0 -8
- package/dist/reporter/lib/report-types.js +0 -2
- package/dist/reporter/reporter/playwright-pulse-reporter.d.ts +0 -1
- package/dist/reporter/reporter/playwright-pulse-reporter.js +0 -398
- package/dist/reporter/types/index.d.ts +0 -52
- package/dist/reporter/types/index.js +0 -2
|
@@ -42,6 +42,7 @@ const path = __importStar(require("path"));
|
|
|
42
42
|
const crypto_1 = require("crypto");
|
|
43
43
|
const ua_parser_js_1 = __importDefault(require("ua-parser-js"));
|
|
44
44
|
const os = __importStar(require("os"));
|
|
45
|
+
const compression_utils_1 = require("../utils/compression-utils");
|
|
45
46
|
const convertStatus = (status, testCase) => {
|
|
46
47
|
if ((testCase === null || testCase === void 0 ? void 0 : testCase.expectedStatus) === "failed") {
|
|
47
48
|
return "failed";
|
|
@@ -63,19 +64,21 @@ const convertStatus = (status, testCase) => {
|
|
|
63
64
|
};
|
|
64
65
|
const TEMP_SHARD_FILE_PREFIX = ".pulse-shard-results-";
|
|
65
66
|
const ATTACHMENTS_SUBDIR = "attachments";
|
|
66
|
-
const INDIVIDUAL_REPORTS_SUBDIR = "pulse-results";
|
|
67
67
|
class PlaywrightPulseReporter {
|
|
68
68
|
constructor(options = {}) {
|
|
69
|
-
var _a, _b, _c;
|
|
69
|
+
var _a, _b, _c, _d;
|
|
70
70
|
this.results = [];
|
|
71
|
+
this._pendingTestEnds = [];
|
|
71
72
|
this.baseOutputFile = "playwright-pulse-report.json";
|
|
73
|
+
this.individualReportsSubDir = "pulse-results";
|
|
72
74
|
this.isSharded = false;
|
|
73
75
|
this.shardIndex = undefined;
|
|
74
76
|
this.options = options;
|
|
75
77
|
this.baseOutputFile = (_a = options.outputFile) !== null && _a !== void 0 ? _a : this.baseOutputFile;
|
|
76
78
|
this.outputDir = (_b = options.outputDir) !== null && _b !== void 0 ? _b : "pulse-report";
|
|
79
|
+
this.individualReportsSubDir = (_c = options.individualReportsSubDir) !== null && _c !== void 0 ? _c : "pulse-results";
|
|
77
80
|
this.attachmentsDir = path.join(this.outputDir, ATTACHMENTS_SUBDIR);
|
|
78
|
-
this.resetOnEachRun = (
|
|
81
|
+
this.resetOnEachRun = (_d = options.resetOnEachRun) !== null && _d !== void 0 ? _d : true;
|
|
79
82
|
}
|
|
80
83
|
printsToStdio() {
|
|
81
84
|
return this.shardIndex === undefined || this.shardIndex === 0;
|
|
@@ -98,12 +101,12 @@ class PlaywrightPulseReporter {
|
|
|
98
101
|
? this.config.shard.current - 1
|
|
99
102
|
: undefined;
|
|
100
103
|
this._ensureDirExists(this.outputDir)
|
|
101
|
-
.then(() => {
|
|
104
|
+
.then(async () => {
|
|
102
105
|
if (this.printsToStdio()) {
|
|
103
106
|
console.log(`PlaywrightPulseReporter: Starting test run with ${suite.allTests().length} tests${this.isSharded ? ` across ${totalShards} shards` : ""}. Pulse outputting to ${this.outputDir}`);
|
|
104
107
|
if (this.shardIndex === undefined ||
|
|
105
108
|
(this.isSharded && this.shardIndex === 0)) {
|
|
106
|
-
|
|
109
|
+
await this._cleanupTemporaryFiles();
|
|
107
110
|
}
|
|
108
111
|
}
|
|
109
112
|
})
|
|
@@ -116,6 +119,24 @@ class PlaywrightPulseReporter {
|
|
|
116
119
|
const severityAnnotation = annotations.find((a) => a.type === "pulse_severity");
|
|
117
120
|
return (severityAnnotation === null || severityAnnotation === void 0 ? void 0 : severityAnnotation.description) || "Medium";
|
|
118
121
|
}
|
|
122
|
+
extractCodeSnippet(filePath, targetLine, targetColumn) {
|
|
123
|
+
var _a;
|
|
124
|
+
try {
|
|
125
|
+
const fsSync = require("fs");
|
|
126
|
+
if (!fsSync.existsSync(filePath)) {
|
|
127
|
+
return "";
|
|
128
|
+
}
|
|
129
|
+
const content = fsSync.readFileSync(filePath, "utf8");
|
|
130
|
+
const lines = content.split("\n");
|
|
131
|
+
if (targetLine < 1 || targetLine > lines.length) {
|
|
132
|
+
return "";
|
|
133
|
+
}
|
|
134
|
+
return ((_a = lines[targetLine - 1]) === null || _a === void 0 ? void 0 : _a.trim()) || "";
|
|
135
|
+
}
|
|
136
|
+
catch (e) {
|
|
137
|
+
return "";
|
|
138
|
+
}
|
|
139
|
+
}
|
|
119
140
|
getBrowserDetails(test) {
|
|
120
141
|
var _a, _b, _c, _d;
|
|
121
142
|
const project = (_a = test.parent) === null || _a === void 0 ? void 0 : _a.project();
|
|
@@ -180,8 +201,10 @@ class PlaywrightPulseReporter {
|
|
|
180
201
|
const startTime = new Date(step.startTime);
|
|
181
202
|
const endTime = new Date(startTime.getTime() + Math.max(0, duration));
|
|
182
203
|
let codeLocation = "";
|
|
204
|
+
let codeSnippet = "";
|
|
183
205
|
if (step.location) {
|
|
184
206
|
codeLocation = `${path.relative(this.config.rootDir, step.location.file)}:${step.location.line}:${step.location.column}`;
|
|
207
|
+
codeSnippet = this.extractCodeSnippet(step.location.file, step.location.line, step.location.column);
|
|
185
208
|
}
|
|
186
209
|
return {
|
|
187
210
|
id: `${testId}_step_${startTime.toISOString()}-${duration}-${(0, crypto_1.randomUUID)()}`,
|
|
@@ -194,6 +217,7 @@ class PlaywrightPulseReporter {
|
|
|
194
217
|
errorMessage: errorMessage,
|
|
195
218
|
stackTrace: ((_d = step.error) === null || _d === void 0 ? void 0 : _d.stack) || undefined,
|
|
196
219
|
codeLocation: codeLocation || undefined,
|
|
220
|
+
codeSnippet: codeSnippet,
|
|
197
221
|
isHook: step.category === "hook",
|
|
198
222
|
hookType: step.category === "hook"
|
|
199
223
|
? step.title.toLowerCase().includes("before")
|
|
@@ -204,16 +228,38 @@ class PlaywrightPulseReporter {
|
|
|
204
228
|
};
|
|
205
229
|
}
|
|
206
230
|
async onTestEnd(test, result) {
|
|
207
|
-
|
|
231
|
+
// Track this async call so onEnd() can wait for all in-flight processing
|
|
232
|
+
// before it reads this.results. This prevents the race condition where
|
|
233
|
+
// onEnd() fires before an interrupted test's onTestEnd() has finished
|
|
234
|
+
// its async attachment I/O and pushed to this.results.
|
|
235
|
+
const p = this._processTestEnd(test, result);
|
|
236
|
+
this._pendingTestEnds.push(p);
|
|
237
|
+
await p;
|
|
238
|
+
}
|
|
239
|
+
async _processTestEnd(test, result) {
|
|
240
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
208
241
|
const project = (_a = test.parent) === null || _a === void 0 ? void 0 : _a.project();
|
|
209
242
|
const browserDetails = this.getBrowserDetails(test);
|
|
210
|
-
const
|
|
243
|
+
const uniqueTestId = `${(project === null || project === void 0 ? void 0 : project.name) || "default"}-${test.id}`;
|
|
244
|
+
// Captured outcome from Playwright
|
|
245
|
+
const outcome = test.outcome();
|
|
246
|
+
// Calculate final status based on the last result (Last-Run-Wins)
|
|
247
|
+
// result.status in onTestEnd is typically the status of the test run (passed if flaky passed)
|
|
248
|
+
// But we double check the last result in test.results just to be sure/consistent
|
|
249
|
+
const lastResult = test.results[test.results.length - 1];
|
|
250
|
+
const finalStatus = convertStatus(lastResult ? lastResult.status : result.status, test);
|
|
251
|
+
// Existing behavior: fail if flaky (implied by user request "existing status field should remain failed")
|
|
252
|
+
// If outcome is flaky, status should be 'failed' to indicate initial failure, but final_status is 'passed'
|
|
253
|
+
let testStatus = finalStatus;
|
|
254
|
+
if (outcome === "flaky") {
|
|
255
|
+
testStatus = "flaky";
|
|
256
|
+
}
|
|
211
257
|
const startTime = new Date(result.startTime);
|
|
212
258
|
const endTime = new Date(startTime.getTime() + result.duration);
|
|
213
259
|
const processAllSteps = async (steps) => {
|
|
214
260
|
let processed = [];
|
|
215
261
|
for (const step of steps) {
|
|
216
|
-
const processedStep = await this.processStep(step,
|
|
262
|
+
const processedStep = await this.processStep(step, uniqueTestId, browserDetails, test);
|
|
217
263
|
processed.push(processedStep);
|
|
218
264
|
if (step.steps && step.steps.length > 0) {
|
|
219
265
|
processedStep.steps = await processAllSteps(step.steps);
|
|
@@ -221,15 +267,9 @@ class PlaywrightPulseReporter {
|
|
|
221
267
|
}
|
|
222
268
|
return processed;
|
|
223
269
|
};
|
|
224
|
-
let codeSnippet =
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
const relativePath = path.relative(this.config.rootDir, test.location.file);
|
|
228
|
-
codeSnippet = `Test defined at: ${relativePath}:${test.location.line}:${test.location.column}`;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
catch (e) {
|
|
232
|
-
console.warn(`Pulse Reporter: Could not extract code snippet for ${test.title}`, e);
|
|
270
|
+
let codeSnippet = "";
|
|
271
|
+
if (((_b = test.location) === null || _b === void 0 ? void 0 : _b.file) && ((_c = test.location) === null || _c === void 0 ? void 0 : _c.line) && ((_d = test.location) === null || _d === void 0 ? void 0 : _d.column)) {
|
|
272
|
+
codeSnippet = this.extractCodeSnippet(test.location.file, test.location.line, test.location.column);
|
|
233
273
|
}
|
|
234
274
|
// 1. Get Spec File Name
|
|
235
275
|
const specFileName = ((_e = test.location) === null || _e === void 0 ? void 0 : _e.file)
|
|
@@ -256,22 +296,24 @@ class PlaywrightPulseReporter {
|
|
|
256
296
|
: undefined,
|
|
257
297
|
};
|
|
258
298
|
const pulseResult = {
|
|
259
|
-
id:
|
|
299
|
+
id: uniqueTestId,
|
|
260
300
|
runId: "TBD",
|
|
261
301
|
describe: describeBlockName,
|
|
262
302
|
spec_file: specFileName,
|
|
263
303
|
name: test.titlePath().join(" > "),
|
|
264
304
|
suiteName: (project === null || project === void 0 ? void 0 : project.name) || ((_g = this.config.projects[0]) === null || _g === void 0 ? void 0 : _g.name) || "Default Suite",
|
|
265
305
|
status: testStatus,
|
|
306
|
+
outcome: outcome === "flaky" ? outcome : undefined, // Only Include if flaky
|
|
307
|
+
final_status: finalStatus, // New Field
|
|
266
308
|
duration: result.duration,
|
|
267
309
|
startTime: startTime,
|
|
268
310
|
endTime: endTime,
|
|
269
311
|
browser: browserDetails,
|
|
270
312
|
retries: result.retry,
|
|
271
|
-
steps:
|
|
272
|
-
errorMessage: (
|
|
273
|
-
stackTrace: (
|
|
274
|
-
snippet: (
|
|
313
|
+
steps: result.steps ? await processAllSteps(result.steps) : [],
|
|
314
|
+
errorMessage: (_h = result.error) === null || _h === void 0 ? void 0 : _h.message,
|
|
315
|
+
stackTrace: (_j = result.error) === null || _j === void 0 ? void 0 : _j.stack,
|
|
316
|
+
snippet: (_k = result.error) === null || _k === void 0 ? void 0 : _k.snippet,
|
|
275
317
|
codeSnippet: codeSnippet,
|
|
276
318
|
tags: test.tags.map((tag) => tag.startsWith("@") ? tag.substring(1) : tag),
|
|
277
319
|
severity: this._getSeverity(test.annotations),
|
|
@@ -281,14 +323,14 @@ class PlaywrightPulseReporter {
|
|
|
281
323
|
attachments: [],
|
|
282
324
|
stdout: stdoutMessages.length > 0 ? stdoutMessages : undefined,
|
|
283
325
|
stderr: stderrMessages.length > 0 ? stderrMessages : undefined,
|
|
284
|
-
annotations: ((
|
|
326
|
+
annotations: ((_l = test.annotations) === null || _l === void 0 ? void 0 : _l.length) > 0 ? test.annotations : undefined,
|
|
285
327
|
...testSpecificData,
|
|
286
328
|
};
|
|
287
329
|
for (const [index, attachment] of result.attachments.entries()) {
|
|
288
330
|
if (!attachment.path)
|
|
289
331
|
continue;
|
|
290
332
|
try {
|
|
291
|
-
const testSubfolder =
|
|
333
|
+
const testSubfolder = uniqueTestId.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
292
334
|
const safeAttachmentName = path
|
|
293
335
|
.basename(attachment.path)
|
|
294
336
|
.replace(/[^a-zA-Z0-9_.-]/g, "_");
|
|
@@ -296,18 +338,21 @@ class PlaywrightPulseReporter {
|
|
|
296
338
|
const relativeDestPath = path.join(ATTACHMENTS_SUBDIR, testSubfolder, uniqueFileName);
|
|
297
339
|
const absoluteDestPath = path.join(this.outputDir, relativeDestPath);
|
|
298
340
|
await this._ensureDirExists(path.dirname(absoluteDestPath));
|
|
341
|
+
// Copy file first
|
|
299
342
|
await fs.copyFile(attachment.path, absoluteDestPath);
|
|
343
|
+
// Compress in-place (preserves path/name)
|
|
344
|
+
await (0, compression_utils_1.compressAttachment)(absoluteDestPath, attachment.contentType);
|
|
300
345
|
if (attachment.contentType.startsWith("image/")) {
|
|
301
|
-
(
|
|
346
|
+
(_m = pulseResult.screenshots) === null || _m === void 0 ? void 0 : _m.push(relativeDestPath);
|
|
302
347
|
}
|
|
303
348
|
else if (attachment.contentType.startsWith("video/")) {
|
|
304
|
-
(
|
|
349
|
+
(_o = pulseResult.videoPath) === null || _o === void 0 ? void 0 : _o.push(relativeDestPath);
|
|
305
350
|
}
|
|
306
351
|
else if (attachment.name === "trace") {
|
|
307
352
|
pulseResult.tracePath = relativeDestPath;
|
|
308
353
|
}
|
|
309
354
|
else {
|
|
310
|
-
(
|
|
355
|
+
(_p = pulseResult.attachments) === null || _p === void 0 ? void 0 : _p.push({
|
|
311
356
|
name: attachment.name,
|
|
312
357
|
path: relativeDestPath,
|
|
313
358
|
contentType: attachment.contentType,
|
|
@@ -321,15 +366,49 @@ class PlaywrightPulseReporter {
|
|
|
321
366
|
this.results.push(pulseResult);
|
|
322
367
|
}
|
|
323
368
|
_getFinalizedResults(allResults) {
|
|
324
|
-
const
|
|
369
|
+
const resultsMap = new Map();
|
|
325
370
|
for (const result of allResults) {
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
371
|
+
if (!resultsMap.has(result.id)) {
|
|
372
|
+
resultsMap.set(result.id, []);
|
|
373
|
+
}
|
|
374
|
+
resultsMap.get(result.id).push(result);
|
|
375
|
+
}
|
|
376
|
+
const finalResults = [];
|
|
377
|
+
for (const [testId, attempts] of resultsMap.entries()) {
|
|
378
|
+
// Sort by retry count (ASC) then timestamp (DESC) to ensure stable resolution
|
|
379
|
+
attempts.sort((a, b) => {
|
|
380
|
+
if (a.retries !== b.retries)
|
|
381
|
+
return a.retries - b.retries;
|
|
382
|
+
return (new Date(b.startTime).getTime() - new Date(a.startTime).getTime());
|
|
383
|
+
});
|
|
384
|
+
const firstAttempt = attempts[0];
|
|
385
|
+
const retryAttempts = attempts.slice(1);
|
|
386
|
+
// Only populate retryHistory if there were actual failures that triggered retries
|
|
387
|
+
// If all attempts passed, we don't need to show retry history
|
|
388
|
+
const hasActualRetries = retryAttempts.length > 0 &&
|
|
389
|
+
retryAttempts.some((attempt) => attempt.status === "failed" ||
|
|
390
|
+
attempt.status === "flaky" ||
|
|
391
|
+
firstAttempt.status === "failed" ||
|
|
392
|
+
firstAttempt.status === "flaky");
|
|
393
|
+
if (hasActualRetries) {
|
|
394
|
+
firstAttempt.retryHistory = retryAttempts;
|
|
395
|
+
// Calculate final status and outcome from the last attempt if retries exist
|
|
396
|
+
const lastAttempt = attempts[attempts.length - 1];
|
|
397
|
+
firstAttempt.final_status = lastAttempt.status;
|
|
398
|
+
// If the last attempt was flaky, ensure outcome is set on the main result
|
|
399
|
+
if (lastAttempt.outcome === "flaky" || lastAttempt.status === "flaky") {
|
|
400
|
+
firstAttempt.outcome = "flaky";
|
|
401
|
+
firstAttempt.status = "flaky";
|
|
402
|
+
}
|
|
330
403
|
}
|
|
404
|
+
else {
|
|
405
|
+
// If no actual retries (all attempts passed), ensure final_status and retryHistory are removed
|
|
406
|
+
delete firstAttempt.final_status;
|
|
407
|
+
delete firstAttempt.retryHistory;
|
|
408
|
+
}
|
|
409
|
+
finalResults.push(firstAttempt);
|
|
331
410
|
}
|
|
332
|
-
return
|
|
411
|
+
return finalResults;
|
|
333
412
|
}
|
|
334
413
|
onError(error) {
|
|
335
414
|
var _a;
|
|
@@ -386,9 +465,10 @@ class PlaywrightPulseReporter {
|
|
|
386
465
|
}
|
|
387
466
|
const finalResultsList = this._getFinalizedResults(allShardProcessedResults);
|
|
388
467
|
finalResultsList.forEach((r) => (r.runId = finalRunData.id));
|
|
389
|
-
finalRunData.passed = finalResultsList.filter((r) => r.status === "passed").length;
|
|
390
|
-
finalRunData.failed = finalResultsList.filter((r) => r.status === "failed").length;
|
|
391
|
-
finalRunData.skipped = finalResultsList.filter((r) => r.status === "skipped").length;
|
|
468
|
+
finalRunData.passed = finalResultsList.filter((r) => (r.final_status || r.status) === "passed").length;
|
|
469
|
+
finalRunData.failed = finalResultsList.filter((r) => (r.final_status || r.status) === "failed").length;
|
|
470
|
+
finalRunData.skipped = finalResultsList.filter((r) => (r.final_status || r.status) === "skipped").length;
|
|
471
|
+
finalRunData.flaky = finalResultsList.filter((r) => (r.final_status || r.status) === "flaky").length;
|
|
392
472
|
finalRunData.totalTests = finalResultsList.length;
|
|
393
473
|
const reviveDates = (key, value) => {
|
|
394
474
|
const isoDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?Z$/;
|
|
@@ -402,7 +482,11 @@ class PlaywrightPulseReporter {
|
|
|
402
482
|
return {
|
|
403
483
|
run: finalRunData,
|
|
404
484
|
results: properlyTypedResults,
|
|
405
|
-
metadata: {
|
|
485
|
+
metadata: {
|
|
486
|
+
generatedAt: new Date().toISOString(),
|
|
487
|
+
reportDescription: this.options.reportDescription,
|
|
488
|
+
logo: this.options.logo,
|
|
489
|
+
},
|
|
406
490
|
};
|
|
407
491
|
}
|
|
408
492
|
async _cleanupTemporaryFiles() {
|
|
@@ -419,6 +503,20 @@ class PlaywrightPulseReporter {
|
|
|
419
503
|
}
|
|
420
504
|
}
|
|
421
505
|
}
|
|
506
|
+
/**
|
|
507
|
+
* Removes all individual run JSON files from the `pulse-results/` directory
|
|
508
|
+
* that were left over from previous test sessions.
|
|
509
|
+
*
|
|
510
|
+
* When `resetOnEachRun: false`, each run writes its own timestamped JSON to
|
|
511
|
+
* `pulse-results/` and then `_mergeAllRunReports()` merges them all. However,
|
|
512
|
+
* if files from *older* sessions accumulate there (e.g. because a previous run
|
|
513
|
+
* was interrupted before the post-merge cleanup, or because the user ran tests
|
|
514
|
+
* on a previous day), `_getFinalizedResults()` de-duplicates by `test.id` and
|
|
515
|
+
* collapses results from both sessions into a single entry — producing a
|
|
516
|
+
* `totalTests` count lower than the actual number of tests that ran.
|
|
517
|
+
*
|
|
518
|
+
* Cleaning up at `onBegin` time guarantees each run starts with a fresh slate.
|
|
519
|
+
*/
|
|
422
520
|
async _ensureDirExists(dirPath) {
|
|
423
521
|
try {
|
|
424
522
|
await fs.mkdir(dirPath, { recursive: true });
|
|
@@ -431,6 +529,11 @@ class PlaywrightPulseReporter {
|
|
|
431
529
|
}
|
|
432
530
|
}
|
|
433
531
|
async onEnd(result) {
|
|
532
|
+
// Wait for ALL in-flight onTestEnd calls to finish before reading this.results.
|
|
533
|
+
// This guards against Playwright calling onEnd() concurrently with (or just
|
|
534
|
+
// before) the last onTestEnd() finishing its async attachment I/O — which
|
|
535
|
+
// would cause that test to be silently dropped from the report.
|
|
536
|
+
await Promise.allSettled(this._pendingTestEnds);
|
|
434
537
|
if (this.shardIndex !== undefined) {
|
|
435
538
|
await this._writeShardResults();
|
|
436
539
|
return;
|
|
@@ -446,9 +549,10 @@ class PlaywrightPulseReporter {
|
|
|
446
549
|
timestamp: new Date(this.runStartTime),
|
|
447
550
|
// Use the length of the de-duplicated array for all counts
|
|
448
551
|
totalTests: finalResults.length,
|
|
449
|
-
passed: finalResults.filter((r) => r.status === "passed").length,
|
|
450
|
-
failed: finalResults.filter((r) => r.status === "failed").length,
|
|
451
|
-
skipped: finalResults.filter((r) => r.status === "skipped").length,
|
|
552
|
+
passed: finalResults.filter((r) => (r.final_status || r.status) === "passed").length,
|
|
553
|
+
failed: finalResults.filter((r) => (r.final_status || r.status) === "failed").length,
|
|
554
|
+
skipped: finalResults.filter((r) => (r.final_status || r.status) === "skipped").length,
|
|
555
|
+
flaky: finalResults.filter((r) => (r.final_status || r.status) === "flaky").length,
|
|
452
556
|
duration,
|
|
453
557
|
environment: environmentDetails,
|
|
454
558
|
};
|
|
@@ -463,7 +567,11 @@ class PlaywrightPulseReporter {
|
|
|
463
567
|
run: runData,
|
|
464
568
|
// Use the de-duplicated results
|
|
465
569
|
results: finalResults,
|
|
466
|
-
metadata: {
|
|
570
|
+
metadata: {
|
|
571
|
+
generatedAt: new Date().toISOString(),
|
|
572
|
+
reportDescription: this.options.reportDescription,
|
|
573
|
+
logo: this.options.logo,
|
|
574
|
+
},
|
|
467
575
|
};
|
|
468
576
|
}
|
|
469
577
|
if (!finalReport) {
|
|
@@ -492,108 +600,28 @@ class PlaywrightPulseReporter {
|
|
|
492
600
|
}
|
|
493
601
|
else {
|
|
494
602
|
// Logic for appending/merging reports
|
|
495
|
-
const pulseResultsDir = path.join(this.outputDir,
|
|
496
|
-
const
|
|
603
|
+
const pulseResultsDir = path.join(this.outputDir, this.individualReportsSubDir);
|
|
604
|
+
const shardPrefix = this.baseOutputFile.replace(".json", "-");
|
|
605
|
+
const individualReportPath = path.join(pulseResultsDir, `${shardPrefix}${Date.now()}.json`);
|
|
497
606
|
try {
|
|
498
607
|
await this._ensureDirExists(pulseResultsDir);
|
|
499
608
|
await fs.writeFile(individualReportPath, JSON.stringify(finalReport, jsonReplacer, 2));
|
|
500
609
|
if (this.printsToStdio()) {
|
|
501
610
|
console.log(`PlaywrightPulseReporter: Individual run report for merging written to ${individualReportPath}`);
|
|
502
611
|
}
|
|
503
|
-
|
|
612
|
+
// DEFERRED MERGING:
|
|
613
|
+
// We do not call _mergeAllRunReports() here anymore when resetOnEachRun is false.
|
|
614
|
+
// The individual JSON files in pulse-results/ will be collected and merged
|
|
615
|
+
// into the main JSON when the user next runs one of the report generator commands.
|
|
504
616
|
}
|
|
505
617
|
catch (error) {
|
|
506
|
-
console.error(`Pulse Reporter: Failed to write
|
|
618
|
+
console.error(`Pulse Reporter: Failed to write report. Error: ${error.message}`);
|
|
507
619
|
}
|
|
508
620
|
}
|
|
509
621
|
if (this.isSharded) {
|
|
510
622
|
await this._cleanupTemporaryFiles();
|
|
511
623
|
}
|
|
512
624
|
}
|
|
513
|
-
async _mergeAllRunReports() {
|
|
514
|
-
const pulseResultsDir = path.join(this.outputDir, INDIVIDUAL_REPORTS_SUBDIR);
|
|
515
|
-
const finalOutputPath = path.join(this.outputDir, this.baseOutputFile);
|
|
516
|
-
let reportFiles;
|
|
517
|
-
try {
|
|
518
|
-
const allFiles = await fs.readdir(pulseResultsDir);
|
|
519
|
-
reportFiles = allFiles.filter((file) => file.startsWith("playwright-pulse-report-") && file.endsWith(".json"));
|
|
520
|
-
}
|
|
521
|
-
catch (error) {
|
|
522
|
-
if (error.code === "ENOENT") {
|
|
523
|
-
if (this.printsToStdio()) {
|
|
524
|
-
console.log(`Pulse Reporter: No individual reports directory found at ${pulseResultsDir}. Skipping merge.`);
|
|
525
|
-
}
|
|
526
|
-
return;
|
|
527
|
-
}
|
|
528
|
-
console.error(`Pulse Reporter: Error reading report directory ${pulseResultsDir}:`, error);
|
|
529
|
-
return;
|
|
530
|
-
}
|
|
531
|
-
if (reportFiles.length === 0) {
|
|
532
|
-
if (this.printsToStdio()) {
|
|
533
|
-
console.log("Pulse Reporter: No matching JSON report files found to merge.");
|
|
534
|
-
}
|
|
535
|
-
return;
|
|
536
|
-
}
|
|
537
|
-
const allResultsFromAllFiles = [];
|
|
538
|
-
let latestTimestamp = new Date(0);
|
|
539
|
-
let lastRunEnvironment = undefined;
|
|
540
|
-
let totalDuration = 0;
|
|
541
|
-
for (const file of reportFiles) {
|
|
542
|
-
const filePath = path.join(pulseResultsDir, file);
|
|
543
|
-
try {
|
|
544
|
-
const content = await fs.readFile(filePath, "utf-8");
|
|
545
|
-
const json = JSON.parse(content);
|
|
546
|
-
if (json.run) {
|
|
547
|
-
const runTimestamp = new Date(json.run.timestamp);
|
|
548
|
-
if (runTimestamp > latestTimestamp) {
|
|
549
|
-
latestTimestamp = runTimestamp;
|
|
550
|
-
lastRunEnvironment = json.run.environment || undefined;
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
if (json.results) {
|
|
554
|
-
allResultsFromAllFiles.push(...json.results);
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
catch (err) {
|
|
558
|
-
console.warn(`Pulse Reporter: Could not parse report file ${filePath}. Skipping. Error: ${err.message}`);
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
// De-duplicate the results from ALL merged files using the helper function
|
|
562
|
-
const finalMergedResults = this._getFinalizedResults(allResultsFromAllFiles);
|
|
563
|
-
// Sum the duration from the final, de-duplicated list of tests
|
|
564
|
-
totalDuration = finalMergedResults.reduce((acc, r) => acc + (r.duration || 0), 0);
|
|
565
|
-
const combinedRun = {
|
|
566
|
-
id: `merged-${Date.now()}`,
|
|
567
|
-
timestamp: latestTimestamp,
|
|
568
|
-
environment: lastRunEnvironment,
|
|
569
|
-
// Recalculate counts based on the truly final, de-duplicated list
|
|
570
|
-
totalTests: finalMergedResults.length,
|
|
571
|
-
passed: finalMergedResults.filter((r) => r.status === "passed").length,
|
|
572
|
-
failed: finalMergedResults.filter((r) => r.status === "failed").length,
|
|
573
|
-
skipped: finalMergedResults.filter((r) => r.status === "skipped").length,
|
|
574
|
-
duration: totalDuration,
|
|
575
|
-
};
|
|
576
|
-
const finalReport = {
|
|
577
|
-
run: combinedRun,
|
|
578
|
-
results: finalMergedResults, // Use the de-duplicated list
|
|
579
|
-
metadata: {
|
|
580
|
-
generatedAt: new Date().toISOString(),
|
|
581
|
-
},
|
|
582
|
-
};
|
|
583
|
-
try {
|
|
584
|
-
await fs.writeFile(finalOutputPath, JSON.stringify(finalReport, (key, value) => {
|
|
585
|
-
if (value instanceof Date)
|
|
586
|
-
return value.toISOString();
|
|
587
|
-
return value;
|
|
588
|
-
}, 2));
|
|
589
|
-
if (this.printsToStdio()) {
|
|
590
|
-
console.log(`PlaywrightPulseReporter: ✅ Merged report with ${finalMergedResults.length} total results saved to ${finalOutputPath}`);
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
catch (err) {
|
|
594
|
-
console.error(`Pulse Reporter: Failed to write final merged report to ${finalOutputPath}. Error: ${err.message}`);
|
|
595
|
-
}
|
|
596
|
-
}
|
|
597
625
|
}
|
|
598
626
|
exports.PlaywrightPulseReporter = PlaywrightPulseReporter;
|
|
599
627
|
exports.default = PlaywrightPulseReporter;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/typescript/lib/lib.es2024.d.ts","../../node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2024.collection.d.ts","../../node_modules/typescript/lib/lib.es2024.object.d.ts","../../node_modules/typescript/lib/lib.es2024.promise.d.ts","../../node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2024.string.d.ts","../../node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/typescript/lib/lib.esnext.iterator.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/playwright-core/types/protocol.d.ts","../../node_modules/playwright-core/types/structs.d.ts","../../node_modules/playwright-core/types/types.d.ts","../../node_modules/playwright/types/test.d.ts","../../node_modules/playwright/types/testreporter.d.ts","../../node_modules/@playwright/test/reporter.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/lucide-react/dist/lucide-react.d.ts","../../src/types/index.ts","../../src/lib/report-types.ts","../../src/reporter/playwright-pulse-reporter.ts","../../node_modules/@types/caseless/index.d.ts","../../node_modules/@types/d3-array/index.d.ts","../../node_modules/@types/d3-color/index.d.ts","../../node_modules/@types/d3-ease/index.d.ts","../../node_modules/@types/d3-interpolate/index.d.ts","../../node_modules/@types/d3-path/index.d.ts","../../node_modules/@types/d3-time/index.d.ts","../../node_modules/@types/d3-scale/index.d.ts","../../node_modules/@types/d3-shape/index.d.ts","../../node_modules/@types/d3-timer/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/long/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/request/node_modules/form-data/index.d.ts","../../node_modules/@types/tough-cookie/index.d.ts","../../node_modules/@types/request/index.d.ts","../../node_modules/@types/shimmer/index.d.ts","../../node_modules/@types/triple-beam/index.d.ts","../../node_modules/@types/yauzl/index.d.ts"],"fileIdsList":[[83,110,153],[110,153],[95,110,153],[99,110,153],[98,110,153],[110,150,153],[110,152,153],[153],[110,153,158,187],[110,153,154,159,165,166,173,184,195],[110,153,154,155,165,173],[105,106,107,110,153],[110,153,156,196],[110,153,157,158,166,174],[110,153,158,184,192],[110,153,159,161,165,173],[110,152,153,160],[110,153,161,162],[110,153,165],[110,153,163,165],[110,152,153,165],[110,153,165,166,167,184,195],[110,153,165,166,167,180,184,187],[110,148,153,200],[110,153,161,165,168,173,184,195],[110,153,165,166,168,169,173,184,192,195],[110,153,168,170,184,192,195],[108,109,110,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201],[110,153,165,171],[110,153,172,195,200],[110,153,161,165,173,184],[110,153,174],[110,153,175],[110,152,153,176],[110,150,151,152,153,154,155,156,157,158,159,160,161,162,163,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201],[110,153,178],[110,153,179],[110,153,165,180,181],[110,153,180,182,196,198],[110,153,165,184,185,186,187],[110,153,184,186],[110,153,184,185],[110,153,187],[110,153,188],[110,150,153,184],[110,153,165,190,191],[110,153,190,191],[110,153,158,173,184,192],[110,153,193],[110,153,173,194],[110,153,168,179,195],[110,153,158,196],[110,153,184,197],[110,153,172,198],[110,153,199],[110,153,158,165,167,176,184,195,198,200],[110,153,184,201],[88,110,153],[85,86,87,110,153],[93,110,153,166,168,170,173,184,195,202,204,205],[110,153,168,184,202],[110,153,165,184,202],[81,110,153],[79,80,110,153,154,166,184],[82,110,153],[110,120,124,153,195],[110,120,153,184,195],[110,115,153],[110,117,120,153,192,195],[110,153,173,192],[110,153,202],[110,115,153,202],[110,117,120,153,173,195],[110,112,113,116,119,153,165,184,195],[110,120,127,153],[110,112,118,153],[110,120,141,142,153],[110,116,120,153,187,195,202],[110,141,153,202],[110,114,115,153,202],[110,120,153],[110,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,144,145,146,147,153],[110,120,135,153],[110,120,127,128,153],[110,118,120,128,129,153],[110,119,153],[110,112,115,120,153],[110,120,124,128,129,153],[110,124,153],[110,118,120,123,153,195],[110,112,117,120,127,153],[110,153,184],[110,115,120,141,153,200,202],[90,110,153],[84,90,91,110,153,167,175],[89,110,153]],"fileInfos":[{"version":"e41c290ef7dd7dab3493e6cbe5909e0148edf4a8dad0271be08edec368a0f7b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"e12a46ce14b817d4c9e6b2b478956452330bf00c9801b79de46f7a1815b5bd40","impliedFormat":1},{"version":"4fd3f3422b2d2a3dfd5cdd0f387b3a8ec45f006c6ea896a4cb41264c2100bb2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"69e65d976bf166ce4a9e6f6c18f94d2424bf116e90837ace179610dbccad9b42","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"62bb211266ee48b2d0edf0d8d1b191f0c24fc379a82bd4c1692a082c540bc6b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f1e2a172204962276504466a6393426d2ca9c54894b1ad0a6c9dad867a65f876","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"bab26767638ab3557de12c900f0b91f710c7dc40ee9793d5a27d32c04f0bf646","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"61d6a2092f48af66dbfb220e31eea8b10bc02b6932d6e529005fd2d7b3281290","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ef72620b8ed8555b1a571fba0573059b427c72c0f8fe0af12117c01deaa62aa","impliedFormat":1},{"version":"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e","impliedFormat":1},{"version":"317522008ac4f9a976630cb65fd5b072d7aea6da0a93ec0cfe0c0b0336337ee2","impliedFormat":1},{"version":"e241a236efd22fd53f0cad74d812bece9bc1691bf3890e95705a6e3b73e2f98e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3cd566b0923109e83f1fe321c59266003ba22668d73195cf53e2eab3a71746f","impliedFormat":1},{"version":"04392f8e190f9e51301f73d17bbb34babd54858c1efc932d2193962f66dabae2","impliedFormat":1},{"version":"36a2e4c9a67439aca5f91bb304611d5ae6e20d420503e96c230cf8fcdc948d94","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"b89c2ddec6bd955e8721d41e24ca667de06882338d88b183c2cdc1f41f4c5a34","affectsGlobalScope":true,"impliedFormat":1},{"version":"6717dad91e44ad22d68f1fc0db74e5eb5398c2c06a2943bf06d3a168e8b1ba45","impliedFormat":99},{"version":"83aa54434d56363ddc949b3af4dd9eccd2fa9db2ecbae5c4a12b6984f66a630c","signature":"9f468e28df7bf40a346ac2cdd8b64e9f10cf2fbec522b58b92fef46b17c42720"},{"version":"331a971aff7a6da8693ab1ab38961996fecd854f6a639d430c81f8207dc92e96","signature":"14e0d6b6ab7688c7a2b60eb9c844d911175dd49a0e950b19863a5e09b8f9f6bd"},{"version":"c43cfd76af4b5b3dbe5d13d8f3e4ff975093fc952e444f1ad7d2263160c04b25","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"2174e20517788d2a1379fc0aaacd87899a70f9e0197b4295edabfe75c4db03d8","impliedFormat":1},{"version":"e0c868a08451c879984ccf4d4e3c1240b3be15af8988d230214977a3a3dad4ce","impliedFormat":1},{"version":"6fc1a4f64372593767a9b7b774e9b3b92bf04e8785c3f9ea98973aa9f4bbe490","impliedFormat":1},{"version":"ff09b6fbdcf74d8af4e131b8866925c5e18d225540b9b19ce9485ca93e574d84","impliedFormat":1},{"version":"d5895252efa27a50f134a9b580aa61f7def5ab73d0a8071f9b5bf9a317c01c2d","impliedFormat":1},{"version":"2c378d9368abcd2eba8c29b294d40909845f68557bc0b38117e4f04fc56e5f9c","impliedFormat":1},{"version":"56208c500dcb5f42be7e18e8cb578f257a1a89b94b3280c506818fed06391805","impliedFormat":1},{"version":"0c94c2e497e1b9bcfda66aea239d5d36cd980d12a6d9d59e66f4be1fa3da5d5a","impliedFormat":1},{"version":"bb220eaac1677e2ad82ac4e7fd3e609a0c7b6f2d6d9c673a35068c97f9fcd5cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"1f366bde16e0513fa7b64f87f86689c4d36efd85afce7eb24753e9c99b91c319","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"0e60e0cbf2283adfd5a15430ae548cd2f662d581b5da6ecd98220203e7067c70","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fd06258805d26c72f5997e07a23155d322d5f05387adb3744a791fe6a0b042d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"4d2b0eb911816f66abe4970898f97a2cfc902bcd743cbfa5017fad79f7ef90d8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"24b8685c62562f5d98615c5a0c1d05f297cf5065f15246edfe99e81ec4c0e011","impliedFormat":1},{"version":"93507c745e8f29090efb99399c3f77bec07db17acd75634249dc92f961573387","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"08faa97886e71757779428dd4c69a545c32c85fd629d1116d42710b32c6378bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"a72ffc815104fb5c075106ebca459b2d55d07862a773768fce89efc621b3964b","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3d77c73be94570813f8cadd1f05ebc3dc5e2e4fdefe4d340ca20cd018724ee36","impliedFormat":1},{"version":"d674383111e06b6741c4ad2db962131b5b0fa4d0294b998566c635e86195a453","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3e58c4c18a031cbb17abec7a4ad0bd5ae9fc70c1f4ba1e7fb921ad87c504aca","impliedFormat":1},{"version":"a3e8bafb2af8e850c644f4be7f5156cf7d23b7bfdc3b786bd4d10ed40329649c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"f77d9188e41291acf14f476e931972460a303e1952538f9546e7b370cb8d0d20","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d04e3640dd9eb67f7f1e5bd3d0bf96c784666f7aefc8ac1537af6f2d38d4c29","impliedFormat":1},{"version":"3c884d9d9ec454bdf0d5a0b8465bf8297d2caa4d853851d92cc417ac6f30b969","impliedFormat":1},{"version":"5a369483ac4cfbdf0331c248deeb36140e6907db5e1daed241546b4a2055f82c","impliedFormat":1},{"version":"e8f5b5cc36615c17d330eaf8eebbc0d6bdd942c25991f96ef122f246f4ff722f","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ada07543808f3b967624645a8e1ccd446f8b01ade47842acf1328aec899fed0","affectsGlobalScope":true,"impliedFormat":1},{"version":"c4a806152acbef81593f96cae6f2b04784d776457d97adbe2694478b243fcf03","impliedFormat":1},{"version":"71adf5dbc59568663d252a46179e71e4d544c053978bfc526d11543a3f716f42","impliedFormat":1},{"version":"c60db41f7bee80fb80c0b12819f5e465c8c8b465578da43e36d04f4a4646f57d","impliedFormat":1},{"version":"93bd413918fa921c8729cef45302b24d8b6c7855d72d5bf82d3972595ae8dcbf","impliedFormat":1},{"version":"4ff41188773cbf465807dd2f7059c7494cbee5115608efc297383832a1150c43","impliedFormat":1},{"version":"dccdf1677e531e33f8ac961a68bc537418c9a414797c1ea7e91307501cdc3f5e","impliedFormat":1},{"version":"e184c4b8918ef56c8c9e68bd79f3f3780e2d0d75bf2b8a41da1509a40c2deb46","affectsGlobalScope":true,"impliedFormat":1},{"version":"d206b4baf4ddcc15d9d69a9a2f4999a72a2c6adeaa8af20fa7a9960816287555","impliedFormat":1},{"version":"93f437e1398a4f06a984f441f7fa7a9f0535c04399619b5c22e0b87bdee182cb","impliedFormat":1},{"version":"afbe24ab0d74694372baa632ecb28bb375be53f3be53f9b07ecd7fc994907de5","impliedFormat":1},{"version":"70731d10d5311bd4cf710ef7f6539b62660f4b0bfdbb3f9fbe1d25fe6366a7fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"6b19db3600a17af69d4f33d08cc7076a7d19fb65bb36e442cac58929ec7c9482","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"137c2894e8f3e9672d401cc0a305dc7b1db7c69511cf6d3970fb53302f9eae09","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"235bfb54b4869c26f7e98e3d1f68dbfc85acf4cf5c38a4444a006fbf74a8a43d","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"bb715efb4857eb94539eafb420352105a0cff40746837c5140bf6b035dd220ba","affectsGlobalScope":true,"impliedFormat":1},{"version":"1851a3b4db78664f83901bb9cac9e45e03a37bb5933cc5bf37e10bb7e91ab4eb","impliedFormat":1},{"version":"fdedf82878e4c744bc2a1c1e802ae407d63474da51f14a54babe039018e53d8f","affectsGlobalScope":true,"impliedFormat":1},{"version":"27d8987fd22d92efe6560cf0ce11767bf089903ffe26047727debfd1f3bf438b","affectsGlobalScope":true,"impliedFormat":1},{"version":"578d8bb6dcb2a1c03c4c3f8eb71abc9677e1a5c788b7f24848e3138ce17f3400","impliedFormat":1},{"version":"4f029899f9bae07e225c43aef893590541b2b43267383bf5e32e3a884d219ed5","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"5b566927cad2ed2139655d55d690ffa87df378b956e7fe1c96024c4d9f75c4cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"bce947017cb7a2deebcc4f5ba04cead891ce6ad1602a4438ae45ed9aa1f39104","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3dffd70e6375b872f0b4e152de4ae682d762c61a24881ecc5eb9f04c5caf76f","impliedFormat":1},{"version":"e2c72c065a36bc9ab2a00ac6a6f51e71501619a72c0609defd304d46610487a4","impliedFormat":1},{"version":"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c","impliedFormat":1},{"version":"616075a6ac578cf5a013ee12964188b4412823796ce0b202c6f1d2e4ca8480d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8a979b8af001c9fc2e774e7809d233c8ca955a28756f52ee5dee88ccb0611d2","impliedFormat":1},{"version":"cac793cc47c29e26e4ac3601dcb00b4435ebed26203485790e44f2ad8b6ad847","impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"e91ad231af87f864b3f07cd0e39b1cf6c133988156f087c1c3ccb0a5491c9115","impliedFormat":1},{"version":"03c258e060b7da220973f84b89615e4e9850e9b5d30b3a8e4840b3e3268ae8eb","impliedFormat":1},{"version":"319c37263037e8d9481a3dc7eadf6afa6a5f5c002189ebe28776ac1a62a38e15","impliedFormat":1},{"version":"837f5c12e3e94ee97aca37aa2a50ede521e5887fb7fa89330f5625b70597e116","impliedFormat":1},{"version":"908217c4f2244ec402b73533ebfcc46d6dcd34fc1c807ff403d7f98702abb3bc","impliedFormat":1},{"version":"74d5a87c3616cd5d8691059d531504403aa857e09cbaecb1c64dfb9ace0db185","impliedFormat":1}],"root":[90,92],"options":{"allowJs":true,"declaration":true,"declarationDir":"./","emitDeclarationOnly":false,"esModuleInterop":true,"jsx":2,"module":1,"outDir":"./","skipLibCheck":true,"strict":true,"target":3},"referencedMap":[[84,1],[93,2],[94,2],[95,2],[96,2],[97,3],[98,2],[100,4],[101,5],[99,2],[102,2],[103,2],[104,2],[150,6],[151,6],[152,7],[110,8],[153,9],[154,10],[155,11],[105,2],[108,12],[106,2],[107,2],[156,13],[157,14],[158,15],[159,16],[160,17],[161,18],[162,18],[164,19],[163,20],[165,21],[166,22],[167,23],[149,24],[109,2],[168,25],[169,26],[170,27],[202,28],[171,29],[172,30],[173,31],[174,32],[175,33],[176,34],[177,35],[178,36],[179,37],[180,38],[181,38],[182,39],[183,2],[184,40],[186,41],[185,42],[187,43],[188,44],[189,45],[190,46],[191,47],[192,48],[193,49],[194,50],[195,51],[196,52],[197,53],[198,54],[199,55],[200,56],[201,57],[87,2],[203,58],[85,2],[88,59],[206,60],[204,61],[207,2],[205,2],[208,2],[209,62],[111,2],[86,2],[89,58],[79,2],[80,63],[81,64],[82,63],[83,65],[77,2],[78,2],[13,2],[14,2],[16,2],[15,2],[2,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[23,2],[24,2],[3,2],[25,2],[26,2],[4,2],[27,2],[31,2],[28,2],[29,2],[30,2],[32,2],[33,2],[34,2],[5,2],[35,2],[36,2],[37,2],[38,2],[6,2],[42,2],[39,2],[40,2],[41,2],[43,2],[7,2],[44,2],[49,2],[50,2],[45,2],[46,2],[47,2],[48,2],[8,2],[54,2],[51,2],[52,2],[53,2],[55,2],[9,2],[56,2],[57,2],[58,2],[60,2],[59,2],[61,2],[62,2],[10,2],[63,2],[64,2],[65,2],[11,2],[66,2],[67,2],[68,2],[69,2],[70,2],[1,2],[71,2],[72,2],[12,2],[75,2],[74,2],[73,2],[76,2],[127,66],[137,67],[126,66],[147,68],[118,69],[117,70],[146,71],[140,72],[145,73],[120,74],[134,75],[119,76],[143,77],[115,78],[114,71],[144,79],[116,80],[121,81],[122,2],[125,81],[112,2],[148,82],[138,83],[129,84],[130,85],[132,86],[128,87],[131,88],[141,71],[123,89],[124,90],[133,91],[113,92],[136,83],[135,81],[139,2],[142,93],[91,94],[92,95],[90,96]],"version":"5.7.3"}
|