squally-reporter 0.10.1 → 0.11.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/README.md +80 -20
- package/dist/index.d.ts +116 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +420 -56
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -208,7 +208,7 @@ runners). Other CI systems deliver a cancel in their own way - check that
|
|
|
208
208
|
Playwright is the process that receives it.
|
|
209
209
|
|
|
210
210
|
Without that - or after any hard kill (SIGKILL) - the reporter never gets to
|
|
211
|
-
report the end: the run stays *running* until Squally's
|
|
211
|
+
report the end: the run stays *running* until Squally's hourly check marks it
|
|
212
212
|
**incomplete** once the project's run timeout (60 minutes by default) has
|
|
213
213
|
passed. A run stopped before its first test starts sends nothing, like any
|
|
214
214
|
run that never ran a test, and `globalTimeout` running out is not a cancel -
|
|
@@ -236,8 +236,11 @@ which CI system it is running on from that system's own environment:
|
|
|
236
236
|
|
|
237
237
|
- **`CI` counts only as `true` or `1`.** `CI=false` or `CI=0` is a local run -
|
|
238
238
|
unless one of the providers above is recognised, which always wins. A run
|
|
239
|
-
that is none of these is local
|
|
240
|
-
|
|
239
|
+
that is none of these is local. Local runs are listed with all other runs,
|
|
240
|
+
and have numbers of their own: Squally's figures count CI runs by default,
|
|
241
|
+
and the **All · CI · Local** switch shows local runs on their own, or both.
|
|
242
|
+
A local run never posts a GitHub check, a pull-request comment or a Slack
|
|
243
|
+
message.
|
|
241
244
|
- **Pull requests are reported under their own head commit and source
|
|
242
245
|
branch**, not the merge commit CI checks out - that is the commit Squally's
|
|
243
246
|
GitHub check and pull-request comment have to find. The commit message and
|
|
@@ -256,6 +259,22 @@ which CI system it is running on from that system's own environment:
|
|
|
256
259
|
`SQUALLY_DISABLE_HEAD_COMMIT_FETCH=true` turns the fetch off.
|
|
257
260
|
- **A tag build has no branch.** A detached checkout never reports `HEAD` as a
|
|
258
261
|
branch name, and `refs/heads/` or `origin/` prefixes are removed.
|
|
262
|
+
- **A link to the CI run (0.11.0).** The reporter sends the page of the CI run,
|
|
263
|
+
so Squally can link a run to it. It is read from each provider's own
|
|
264
|
+
variable, sent only as an `https://` URL of at most 2,048 characters, and
|
|
265
|
+
never opened by Squally - only shown as a link:
|
|
266
|
+
|
|
267
|
+
| Provider | Link |
|
|
268
|
+
|---|---|
|
|
269
|
+
| GitHub Actions | `GITHUB_SERVER_URL`/`GITHUB_REPOSITORY`/actions/runs/`GITHUB_RUN_ID`/attempts/`GITHUB_RUN_ATTEMPT` |
|
|
270
|
+
| GitLab CI | `CI_PIPELINE_URL` |
|
|
271
|
+
| Jenkins | `BUILD_URL` (only with Jenkins served over https) |
|
|
272
|
+
| Buildkite | `BUILDKITE_BUILD_URL` |
|
|
273
|
+
| Travis CI | `TRAVIS_BUILD_WEB_URL` |
|
|
274
|
+
| Drone | `DRONE_BUILD_LINK` |
|
|
275
|
+
|
|
276
|
+
Other providers send no link. It is the run's page, never one job's, and it
|
|
277
|
+
is the same with `SQUALLY_CI_RUN_ID` set.
|
|
259
278
|
|
|
260
279
|
## Tests marked with `test.fail()`
|
|
261
280
|
|
|
@@ -302,24 +321,64 @@ invocations, set `SQUALLY_CI_RUN_ID` to the same value for every shard of one
|
|
|
302
321
|
run - anything unique per CI run and shared by its shards works, e.g. a build
|
|
303
322
|
number your CI system already exposes.
|
|
304
323
|
|
|
305
|
-
**Several jobs in one CI run need their own
|
|
306
|
-
everything in one CI run, so two jobs that are *not* shards of each other -
|
|
307
|
-
|
|
308
|
-
into the same Squally run
|
|
309
|
-
|
|
310
|
-
more for that job. Give each job its own id, shared only by its own shards:
|
|
324
|
+
**Several jobs in one CI run need their own key (0.11.0).** The id is shared
|
|
325
|
+
by everything in one CI run, so two jobs that are *not* shards of each other -
|
|
326
|
+
a GitHub Actions matrix over browsers run without `--shard`, or an `api` and a
|
|
327
|
+
`ui` suite - would report into the same Squally run. Give each job its own
|
|
328
|
+
`SQUALLY_CI_JOB_KEY`, shared only by that job's own shards:
|
|
311
329
|
|
|
312
330
|
```yaml
|
|
313
|
-
|
|
314
|
-
|
|
331
|
+
jobs:
|
|
332
|
+
test:
|
|
333
|
+
strategy:
|
|
334
|
+
matrix:
|
|
335
|
+
browser: [chromium, firefox]
|
|
336
|
+
env:
|
|
337
|
+
SQUALLY_CI_JOB_KEY: ${{ matrix.browser }}
|
|
338
|
+
steps:
|
|
339
|
+
- run: exec ./node_modules/.bin/playwright test --project=${{ matrix.browser }}
|
|
315
340
|
```
|
|
316
341
|
|
|
317
|
-
The
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
342
|
+
The reporter puts the key into the id - `<GITHUB_RUN_ID>-<key>-<GITHUB_RUN_ATTEMPT>`
|
|
343
|
+
on GitHub Actions, `<provider id>-<key>` elsewhere - so each job is its own run
|
|
344
|
+
in Squally, and a re-run of one job links to that job's own earlier attempt.
|
|
345
|
+
The key may hold letters, digits, `.`, `_` and `-`, at most 64 characters; an
|
|
346
|
+
invalid key is reported once and ignored, and your test run is unaffected.
|
|
347
|
+
Without a key the id is exactly what it was before 0.11.0. A suite that is
|
|
348
|
+
sharded *and* split into jobs uses the same key for all shards of one job:
|
|
349
|
+
`SQUALLY_CI_JOB_KEY: ${{ matrix.suite }}` beside `--shard=${{ matrix.shard }}/2`.
|
|
350
|
+
|
|
351
|
+
**Replaces the hand-built id.** Until 0.11.0 this section suggested
|
|
352
|
+
`SQUALLY_CI_RUN_ID: ${{ github.run_id }}-${{ github.run_attempt }}-${{ matrix.browser }}`.
|
|
353
|
+
It still groups each job correctly, but Squally cannot tell its attempts apart,
|
|
354
|
+
so a re-run is never linked to the attempt before it. Switch to
|
|
355
|
+
`SQUALLY_CI_JOB_KEY`. An explicit `SQUALLY_CI_RUN_ID` still wins for the id;
|
|
356
|
+
the key is then only sent alongside it.
|
|
357
|
+
|
|
358
|
+
**When two jobs collide anyway, Squally refuses the second one at the start**
|
|
359
|
+
(squally-app with block 1b, reporter 0.11.0). The reporter prints one block,
|
|
360
|
+
sends nothing more for that job, and leaves your test run and its exit code
|
|
361
|
+
alone:
|
|
362
|
+
|
|
363
|
+
- `ci_run_collision` - another job already reports under this CI run id (and
|
|
364
|
+
shard). Give every job its own `SQUALLY_CI_JOB_KEY`.
|
|
365
|
+
- `ci_run_mixed` - the id would put a sharded job and an unsharded one, or
|
|
366
|
+
shards of different totals, into one run. The same fix.
|
|
367
|
+
|
|
368
|
+
Before 0.11.0 the second job was handed the first job's run instead, and its
|
|
369
|
+
results were refused once that run completed; a reporter older than 0.11.0
|
|
370
|
+
still behaves that way, and prints "Squally has already completed run …".
|
|
371
|
+
|
|
372
|
+
**Re-runs.** On GitHub Actions every re-run attempt is its own run in Squally,
|
|
373
|
+
linked to the attempt before it ("Re-run of #N"). "Re-run failed jobs" runs only
|
|
374
|
+
the shards that did not pass; that attempt waits only for those shards,
|
|
375
|
+
completes once they have reported, and passes or fails on the tests they ran -
|
|
376
|
+
the reused shards are neither waited for nor counted, and the run page shows
|
|
377
|
+
them as "passed in #N · not re-run". A re-run shard that never reports still
|
|
378
|
+
leaves the run incomplete after the run timeout. Other CI systems re-run a job
|
|
379
|
+
under the id of a run that has already completed - a GitLab job retry, an Azure
|
|
380
|
+
Pipelines re-run, a Bitbucket re-run of failed steps, a Buildkite retry - and
|
|
381
|
+
those results are refused, with the "already completed" message above.
|
|
323
382
|
|
|
324
383
|
**`playwright merge-reports` is not part of this and is not recommended** for
|
|
325
384
|
getting a single run in Squally - the automatic correlation above is the
|
|
@@ -389,9 +448,10 @@ happens, so a value that looks different in the dashboard is not a mystery.
|
|
|
389
448
|
|
|
390
449
|
## Troubleshooting
|
|
391
450
|
|
|
392
|
-
Set `SQUALLY_DEBUG=1` to print detail that is otherwise kept quiet -
|
|
393
|
-
|
|
394
|
-
|
|
451
|
+
Set `SQUALLY_DEBUG=1` to print detail that is otherwise kept quiet - the
|
|
452
|
+
browser-console extraction (how many messages were found, or that an attempt's
|
|
453
|
+
trace held none) and, since 0.11.0, a CI run link that was not sent because it
|
|
454
|
+
was not an `https://` URL. Everything that is *not* ordinary (a trace that
|
|
395
455
|
cannot be read, an unsupported schema version, a rejected upload) is printed
|
|
396
456
|
without it.
|
|
397
457
|
|
package/dist/index.d.ts
CHANGED
|
@@ -160,7 +160,75 @@ declare function resolveGitContext(env: NodeJS.ProcessEnv, io?: GitContextIo): G
|
|
|
160
160
|
* to hold it - at actions/checkout's default depth of 1 it does not.
|
|
161
161
|
*/
|
|
162
162
|
declare function resolveGitContextForRun(env: NodeJS.ProcessEnv, io?: GitContextIo): Promise<GitContext>;
|
|
163
|
-
declare function detectCiRunId(env: NodeJS.ProcessEnv, generateFallback: () => string): string;
|
|
163
|
+
declare function detectCiRunId(env: NodeJS.ProcessEnv, generateFallback: () => string, jobKey?: string | null): string;
|
|
164
|
+
/**
|
|
165
|
+
* SQUALLY_CI_JOB_KEY, checked by squally-app's own rule (letters, digits,
|
|
166
|
+
* '.', '_' and '-', at most 64). An invalid key is a warning, never a failed
|
|
167
|
+
* test run: the reporter continues WITHOUT a key - the id it would have built
|
|
168
|
+
* without one, and no ciJobKey - rather than send a value the server refuses
|
|
169
|
+
* or guess a cleaned-up one. Unset or empty: no key, no warning.
|
|
170
|
+
*/
|
|
171
|
+
declare function resolveCiJobKey(env: NodeJS.ProcessEnv): {
|
|
172
|
+
key: string | null;
|
|
173
|
+
warning: string | null;
|
|
174
|
+
};
|
|
175
|
+
/**
|
|
176
|
+
* The attempt to send as ciRunAttempt (0.11.0) - only when THIS reporter built
|
|
177
|
+
* the CI run id from GITHUB_RUN_ATTEMPT, so the id ends in "-<attempt>" and
|
|
178
|
+
* squally-app can link a re-run to the attempt before it (detectCiAttempt
|
|
179
|
+
* there reads the stem off that suffix). Never with SQUALLY_CI_RUN_ID: only
|
|
180
|
+
* the reporter knows the id is GitHub's, and an id the user wrote proves
|
|
181
|
+
* nothing about its suffix.
|
|
182
|
+
*
|
|
183
|
+
* GITHUB ONLY, by the providers' documentation: GitHub's attempt counts runs
|
|
184
|
+
* of the whole workflow run and is part of its id. GitLab's
|
|
185
|
+
* CI_JOB_RETRY_COUNT, Buildkite's BUILDKITE_RETRY_COUNT and Azure's job
|
|
186
|
+
* attempt count retries of ONE JOB inside a build whose id stays the same - not
|
|
187
|
+
* an attempt of the run squally-app groups - and Jenkins, Travis and Drone
|
|
188
|
+
* document no counter at all.
|
|
189
|
+
*/
|
|
190
|
+
declare function detectCiRunAttempt(env: NodeJS.ProcessEnv): number | null;
|
|
191
|
+
/** An absolute https: URL with a host - squally-app's isHttpsUrl. */
|
|
192
|
+
declare function isHttpsUrl(value: string): boolean;
|
|
193
|
+
/**
|
|
194
|
+
* The CI run's page, sent as ciRunUrl (0.11.0) so Squally can link a run to
|
|
195
|
+
* its CI run. One builder per provider, from each provider's documented
|
|
196
|
+
* variable:
|
|
197
|
+
* - GitHub Actions: GITHUB_SERVER_URL/GITHUB_REPOSITORY/actions/runs/
|
|
198
|
+
* GITHUB_RUN_ID - the URL GitHub's own docs give - and /attempts/
|
|
199
|
+
* GITHUB_RUN_ATTEMPT when set, the page of exactly this attempt;
|
|
200
|
+
* - GitLab CI: CI_PIPELINE_URL ("The URL for the pipeline details");
|
|
201
|
+
* - Jenkins: BUILD_URL ("The URL where the results of this build can be
|
|
202
|
+
* found");
|
|
203
|
+
* - Buildkite: BUILDKITE_BUILD_URL ("The url for this build on Buildkite");
|
|
204
|
+
* - Travis CI: TRAVIS_BUILD_WEB_URL ("URL to the build log");
|
|
205
|
+
* - Drone: DRONE_BUILD_LINK ("a deep link the Drone build results").
|
|
206
|
+
* The run, never the job: the id groups a whole build's jobs, so its link is
|
|
207
|
+
* the build's. Independent of SQUALLY_CI_RUN_ID - the page is the same.
|
|
208
|
+
*
|
|
209
|
+
* ONLY HTTPS, AT MOST 2048 CHARACTERS (squally-app's rule). Anything else - a
|
|
210
|
+
* Jenkins without TLS, a value that is not a URL - is left out silently, with
|
|
211
|
+
* a debug line: a missing link is no reason to warn on every run.
|
|
212
|
+
*/
|
|
213
|
+
declare function detectCiRunUrl(env: NodeJS.ProcessEnv): string | null;
|
|
214
|
+
/**
|
|
215
|
+
* What the reporter prints when squally-app refuses this job's begin with a
|
|
216
|
+
* 409 (0.11.0). One block per code; nothing is retried and nothing more is
|
|
217
|
+
* sent for this job - the test run itself is untouched.
|
|
218
|
+
* - ci_run_collision: another job already reports this CI run id's slot;
|
|
219
|
+
* - ci_run_mixed: the id would group an unsharded job with a sharded one,
|
|
220
|
+
* or shards of different totals;
|
|
221
|
+
* - anything else: the server's own sentence.
|
|
222
|
+
*/
|
|
223
|
+
declare function beginRefusalMessage(refusal: {
|
|
224
|
+
code: string | null;
|
|
225
|
+
message: string | null;
|
|
226
|
+
detail: string;
|
|
227
|
+
}, where: {
|
|
228
|
+
ciRunId: string;
|
|
229
|
+
shardIndex: number | null;
|
|
230
|
+
jobKey: string | null;
|
|
231
|
+
}): string;
|
|
164
232
|
interface ProjectSuiteLike {
|
|
165
233
|
project(): {
|
|
166
234
|
name: string;
|
|
@@ -176,6 +244,8 @@ declare function resolveTestedRevision(env?: NodeJS.ProcessEnv, io?: GitContextI
|
|
|
176
244
|
declare function toPosixPath(p: string): string;
|
|
177
245
|
declare function stripAnsi(value: string): string;
|
|
178
246
|
declare function maskSecrets(value: string): string;
|
|
247
|
+
/** One piece of free text as it goes on the wire: masked, then cut to maxChars. */
|
|
248
|
+
declare function outgoingText(value: string, maxChars: number): string;
|
|
179
249
|
/**
|
|
180
250
|
* The console output to send, and the size it had before the cut.
|
|
181
251
|
*
|
|
@@ -203,6 +273,31 @@ declare function prepareConsoleOutput(value: string | null): {
|
|
|
203
273
|
truncatedFromBytes: number | null;
|
|
204
274
|
};
|
|
205
275
|
declare function mapErrors(errors: readonly TestError[]): AppendErrorEntry[] | undefined;
|
|
276
|
+
/**
|
|
277
|
+
* A result's free text as it goes on the wire (0.10.2): THE one place it is
|
|
278
|
+
* masked and cut. Every error's message, stack and snippet, the page snapshot
|
|
279
|
+
* (errorContext) and the console output - the same fields squally-app masks
|
|
280
|
+
* on arrival (maskResultText, lib/ingest-v2-core.ts), with the same patterns.
|
|
281
|
+
*
|
|
282
|
+
* One function rather than a mask at each field's call site, so a field added
|
|
283
|
+
* to a result later is added here - next to the others - or not at all.
|
|
284
|
+
*
|
|
285
|
+
* FAILS CLOSED. Masking is plain regex replacement and is not expected to
|
|
286
|
+
* throw, but onTestEnd must never throw into the customer's run, and falling
|
|
287
|
+
* back to the UNMASKED text would be the one outcome worse than a crash here.
|
|
288
|
+
* So a failure drops the text: the result still goes out, with its status,
|
|
289
|
+
* and one placeholder error saying why its text is missing.
|
|
290
|
+
*/
|
|
291
|
+
declare function outgoingResultText(raw: {
|
|
292
|
+
errors: AppendErrorEntry[] | undefined;
|
|
293
|
+
errorContext: string | null;
|
|
294
|
+
consoleOutput: string | null;
|
|
295
|
+
}): {
|
|
296
|
+
errors: AppendErrorEntry[] | undefined;
|
|
297
|
+
errorContext: string | null;
|
|
298
|
+
consoleOutput: string | null;
|
|
299
|
+
consoleTruncatedFromBytes: number | null;
|
|
300
|
+
};
|
|
206
301
|
declare function attemptQualifiesForArtifacts(mappedStatus: AppendResultEntry["status"], retryCount: number): boolean;
|
|
207
302
|
declare function artifactKey(testName: string, filePath: string, retryCount: number, repeatIndex: number, type: ArtifactType): string;
|
|
208
303
|
declare function parseRetryAfterMs(headerValue: string | null, nowMs: number): number | null;
|
|
@@ -221,6 +316,14 @@ export default class SquallyReporter implements Reporter {
|
|
|
221
316
|
private dispatcher;
|
|
222
317
|
private ciRunId;
|
|
223
318
|
private shardIndex;
|
|
319
|
+
/**
|
|
320
|
+
* 0.11.0: one per reporter process, the same on every retry of begin - a
|
|
321
|
+
* retried begin is the same job, another process with the same CI run id
|
|
322
|
+
* and shard is not (squally-app answers that one 409 ci_run_collision).
|
|
323
|
+
*/
|
|
324
|
+
private readonly beginToken;
|
|
325
|
+
/** SQUALLY_CI_JOB_KEY, validated (resolveCiJobKey) - or null. */
|
|
326
|
+
private ciJobKey;
|
|
224
327
|
private shardTotal;
|
|
225
328
|
private projectName;
|
|
226
329
|
private runTags;
|
|
@@ -308,6 +411,11 @@ export declare const __internal: {
|
|
|
308
411
|
toPosixPath: typeof toPosixPath;
|
|
309
412
|
detectCiRunId: typeof detectCiRunId;
|
|
310
413
|
detectCiProvider: typeof detectCiProvider;
|
|
414
|
+
resolveCiJobKey: typeof resolveCiJobKey;
|
|
415
|
+
detectCiRunAttempt: typeof detectCiRunAttempt;
|
|
416
|
+
detectCiRunUrl: typeof detectCiRunUrl;
|
|
417
|
+
isHttpsUrl: typeof isHttpsUrl;
|
|
418
|
+
beginRefusalMessage: typeof beginRefusalMessage;
|
|
311
419
|
resolveGitContext: typeof resolveGitContext;
|
|
312
420
|
resolveGitContextForRun: typeof resolveGitContextForRun;
|
|
313
421
|
fetchCommitFromOrigin: typeof fetchCommitFromOrigin;
|
|
@@ -316,6 +424,13 @@ export declare const __internal: {
|
|
|
316
424
|
resolveTimeoutMs: typeof resolveTimeoutMs;
|
|
317
425
|
resolveProjectName: typeof resolveProjectName;
|
|
318
426
|
maskSecrets: typeof maskSecrets;
|
|
427
|
+
MASK_PATTERNS: {
|
|
428
|
+
name: string;
|
|
429
|
+
pattern: RegExp;
|
|
430
|
+
replace: string;
|
|
431
|
+
}[];
|
|
432
|
+
outgoingText: typeof outgoingText;
|
|
433
|
+
outgoingResultText: typeof outgoingResultText;
|
|
319
434
|
prepareConsoleOutput: typeof prepareConsoleOutput;
|
|
320
435
|
mapErrors: typeof mapErrors;
|
|
321
436
|
parseRetryAfterMs: typeof parseRetryAfterMs;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,SAAS,EACT,UAAU,EACX,MAAM,2BAA2B,CAAC;AAcnC,UAAU,sBAAsB;IAI9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,SAAS,EACT,UAAU,EACX,MAAM,2BAA2B,CAAC;AAcnC,UAAU,sBAAsB;IAI9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA+CD,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAED,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;;OAIG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;;;;OAMG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAkDD,KAAK,YAAY,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,CAAC;AA+MvD,iBAAS,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIpD;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAExE;AA+ED;;;;;;;;;;GAUG;AACH,iBAAS,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAG3D;AA2CD,iBAAS,yBAAyB,CAAC,MAAM,EAAE,UAAU,EAAE,kBAAkB,EAAE,OAAO,GAAG,IAAI,CAsBxF;AAsED,iBAAS,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAI5E;AAUD,iBAAS,iBAAiB,CAAC,cAAc,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,OAAO,CAGxH;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,iBAAS,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG;IAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAE1G;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,iBAAS,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,CAIhG;AA8CD,iBAAS,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,GAAG,IAAI,CAK/D;AA+DD,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AA2BD;oEACoE;AACpE,UAAU,YAAY;IACpB,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,oGAAoG;IACpG,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACnE;AAaD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,iBAAS,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CA6B5G;AAwDD,iBAAS,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAStE;AAsRD,iBAAS,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,GAAE,YAAqC,GAAG,UAAU,CAExG;AAED;;;;;;;GAOG;AACH,iBAAe,uBAAuB,CACpC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,EAAE,GAAE,YAAqC,GACxC,OAAO,CAAC,UAAU,CAAC,CAKrB;AAwMD,iBAAS,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,gBAAgB,EAAE,MAAM,MAAM,EAAE,MAAM,GAAE,MAAM,GAAG,IAAW,GAAG,MAAM,CAqBnH;AAED;;;;;;GAMG;AACH,iBAAS,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG;IAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAc/F;AAED;;;;;;;;;;;;;;GAcG;AACH,iBAAS,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,GAAG,IAAI,CAKjE;AAED,qEAAqE;AACrE,iBAAS,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAO1C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,iBAAS,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,GAAG,IAAI,CAQ7D;AAqCD;;;;;;;;GAQG;AACH,iBAAS,mBAAmB,CAC1B,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACxE,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC3E,MAAM,CA0BR;AA4BD,UAAU,gBAAgB;IACxB,OAAO,IAAI;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CACzC;AAED,iBAAS,kBAAkB,CAAC,aAAa,EAAE,SAAS,gBAAgB,EAAE,GAAG,MAAM,GAAG,IAAI,CAIrF;AAkCD,iBAAS,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiB9C;AAED,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,GAAG,cAAc,CAAC;CACtC;AAkBD,iBAAS,qBAAqB,CAC5B,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,EAAE,GAAE,YAAqC,GACxC,gBAAgB,GAAG,IAAI,CAkBzB;AAgBD,iBAAS,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtC;AAkCD,iBAAS,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExC;AAsED,iBAAS,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAU1C;AAqBD,mFAAmF;AACnF,iBAAS,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7D;AAiBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,iBAAS,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG;IACnD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC,CAqBA;AA0BD,iBAAS,SAAS,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,gBAAgB,EAAE,GAAG,SAAS,CAuB/E;AAqCD;;;;;;;;;;;;;;GAcG;AACH,iBAAS,kBAAkB,CAAC,GAAG,EAAE;IAC/B,MAAM,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IACvC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,GAAG;IACF,MAAM,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IACvC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C,CAuBA;AA0LD,iBAAS,4BAA4B,CAAC,YAAY,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAE5G;AAeD,iBAAS,WAAW,CAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,YAAY,GACjB,MAAM,CAIR;AAiED,iBAAS,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOnF;AAGD,iBAAS,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAErD;AA4ED,iBAAS,iBAAiB,CACxB,OAAO,EAAE,sBAAsB,EAC/B,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,MAAM,GAAE,GAAG,CAAC,MAAM,CAAsB,GACvC;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CA2CtC;AAED,MAAM,CAAC,OAAO,OAAO,eAAgB,YAAW,QAAQ;IACtD,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,MAAM,CAAM;IACpB,uEAAuE;IACvE,OAAO,CAAC,iBAAiB,CAAS;IAIlC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAc;IAkB/B,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,UAAU,CAAuB;IACzC;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,iEAAiE;IACjE,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,SAAS,CAA6B;IAE9C,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,SAAS,CAA2B;IAC5C;;;6DAGyD;IACzD,OAAO,CAAC,mBAAmB,CAAqB;IAEhD;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,OAAO,CAAC,eAAe,CAAK;IAM5B,OAAO,CAAC,eAAe,CAAS;IAKhC,OAAO,CAAC,qBAAqB,CAAS;IAEtC,OAAO,CAAC,gBAAgB,CAA8C;IACtE,OAAO,CAAC,eAAe,CAA4B;IAKnD,OAAO,CAAC,UAAU,CAAS;IAO3B,OAAO,CAAC,YAAY,CAAiD;IAIrE,OAAO,CAAC,KAAK,CAAuB;gBAExB,OAAO,GAAE,sBAA2B;IAiBhD,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK;IAgExC;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ;IAYhB,WAAW;IAkBX,OAAO,CAAC,gBAAgB;IAUxB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU;IA8M5C,KAAK,GAAU,QAAQ,UAAU,mBA6B/B;YAsBY,gBAAgB;IA6D9B,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,YAAY;YAQN,KAAK;YA6BL,SAAS;YAoET,QAAQ;YAoGR,WAAW;YAiCX,UAAU;YA6CV,WAAW;YAyEX,eAAe;YAQf,gBAAgB;CAuK/B;AAKD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;cA5wDM,MAAM;iBAAW,MAAM;iBAAW,MAAM;;;;;;;;;;;CAgzDpE,CAAC"}
|