velocious 1.0.653 → 1.0.655
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 +4 -2
- package/build/environment-handlers/node/cli/commands/test.js +2 -1
- package/build/http-server/client/index.js +67 -5
- package/build/http-server/client/request-buffer/index.js +15 -1
- package/build/http-server/client/response-compression.js +6 -8
- package/build/src/environment-handlers/node/cli/commands/test.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/test.js +4 -2
- package/build/src/http-server/client/index.d.ts +9 -1
- package/build/src/http-server/client/index.d.ts.map +1 -1
- package/build/src/http-server/client/index.js +68 -6
- package/build/src/http-server/client/request-buffer/index.d.ts.map +1 -1
- package/build/src/http-server/client/request-buffer/index.js +16 -2
- package/build/src/http-server/client/response-compression.d.ts +4 -2
- package/build/src/http-server/client/response-compression.d.ts.map +1 -1
- package/build/src/http-server/client/response-compression.js +7 -8
- package/build/src/testing/test-runner.d.ts +23 -0
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +29 -2
- package/build/src/testing/velocious-runner-reporter.d.ts +7 -0
- package/build/src/testing/velocious-runner-reporter.d.ts.map +1 -1
- package/build/src/testing/velocious-runner-reporter.js +54 -12
- package/build/testing/test-runner.js +33 -1
- package/build/testing/velocious-runner-reporter.js +52 -11
- package/package.json +4 -4
- package/scripts/browser-test-session.js +21 -23
- package/src/environment-handlers/node/cli/commands/test.js +2 -1
- package/src/http-server/client/index.js +67 -5
- package/src/http-server/client/request-buffer/index.js +15 -1
- package/src/http-server/client/response-compression.js +6 -8
- package/src/testing/test-runner.js +33 -1
- package/src/testing/velocious-runner-reporter.js +52 -11
package/README.md
CHANGED
|
@@ -178,7 +178,7 @@ Baselines are generated against a fresh checkout (no generated dummy `configurat
|
|
|
178
178
|
# Testing
|
|
179
179
|
|
|
180
180
|
Application tests may import the testing DSL from the independent public package.
|
|
181
|
-
`@velocious/testing` `0.0.
|
|
181
|
+
`@velocious/testing` `0.0.12` is the declaration and execution engine. Compatible
|
|
182
182
|
installed copies share one protocol-1/schema-3 default registry. Velocious adapts each
|
|
183
183
|
package-owned attempt with its database, request, profiling, and cleanup behavior; the
|
|
184
184
|
existing Velocious facade exports the same declaration DSL and remains supported.
|
|
@@ -327,6 +327,8 @@ Use `consoleOutput: "live"` to preserve the previous passthrough behavior where
|
|
|
327
327
|
|
|
328
328
|
Listen for attempt and retry events if you need to reset shared state after a failed attempt or log retry lifecycle details. `testAttemptFailed` fires after every failed attempt, including the final failed attempt when no retries remain. `testRetrying` only fires before a retry, and `testFailed` only fires after retries are exhausted.
|
|
329
329
|
|
|
330
|
+
A shared resource owner may throw an error carrying `terminalResource: {scope: "run", name: "shared-resource"}`. With a compatible `@velocious/testing` runner, Velocious preserves this contract through causes and aggregate errors, reports the originating failure with full causal stacks, suppresses retries, and emits `testNotRun` for later selected cases instead of running their callbacks. `testNotRun` receives `{configuration, test, testRunner}`; `test` has `status: "not-run"`, `fullName`, `location`, and the originating `reason`. `testRunner.getNotRunTests()` and `getNotRunTestDetails()` expose this separate accounting. Entered suites clean up once; the CLI exits unsuccessfully even for terminal setup with zero executed cases. Unmatched filters retain their explanatory message and `no-tests` profile status, independently of terminal setup failures. This does not restart a browser or cancel already-issued work. Upgrade the shared runner and this reporter adapter together before enabling terminal resource owners; earlier shared runners ignore the marker. See [terminal resource reporting](docs/terminal-resource-reporting.md).
|
|
331
|
+
|
|
330
332
|
```js
|
|
331
333
|
import {testEvents} from "velocious/build/src/testing/test.js"
|
|
332
334
|
|
|
@@ -2887,7 +2889,7 @@ When the server runs in the `development` environment, Velocious watches applica
|
|
|
2887
2889
|
|
|
2888
2890
|
Starting the HTTP server creates `tmp/server.lock` under the configured application directory before Beacon, workers, or the TCP listener start. A second server for the same app fails fast with the lock owner details instead of partially starting. Normal shutdown removes the lock; stale locks with a dead local PID are reclaimed automatically, while locks from another host or unreadable metadata should be removed manually only after confirming no server is running. See [docs/http-server.md](docs/http-server.md#server-lock).
|
|
2889
2891
|
|
|
2890
|
-
Buffered string and `Uint8Array` responses are compressed with Brotli (`br`) or gzip by default whenever request negotiation and response eligibility allow — no opt-in is required. Disable compression globally with `httpServer.compression: false` or `httpServer.compression: {enabled: false}`, and tune it with `threshold`/`brotliQuality`/`gzipLevel` overrides. Negotiation honors `Accept-Encoding` q-values, wildcards, and identity semantics (empty `406` when no acceptable representation exists),
|
|
2892
|
+
Buffered string and `Uint8Array` responses are compressed with Brotli (`br`) or gzip by default whenever request negotiation and response eligibility allow — no opt-in is required. Disable compression globally with `httpServer.compression: false` or `httpServer.compression: {enabled: false}`, and tune it with `threshold`/`brotliQuality`/`gzipLevel` overrides. Negotiation honors `Accept-Encoding` q-values, wildcards, and identity semantics (empty `406` when no acceptable representation exists), combines repeated `Accept-Encoding` header fields in wire order, and advertises a framework-owned `Vary: Accept-Encoding` on every framework-selected representation (transformed, identity, `406`, and file) so caches key on the field. Streamed `sendFile` responses are never buffered or re-encoded: they are sent identity, so when the client forbids identity the server answers with the same empty `406` without opening or streaming the file. Transformation also skips already-encoded or `no-transform` responses, server-sent events, partial/range responses, bodyless statuses, and non-allowlisted content types. Transformation is additionally excluded automatically for credentialed traffic and validator-carrying responses — requests with `Authorization`/`Cookie` and responses with `Set-Cookie`, `ETag`, `Digest`, or `Content-Digest` are never compressed (compression-oracle protection, and validators stay application-owned). Controllers opt out per response with `response.disableCompression()`, and HEAD requests compute GET-equivalent representation headers without emitting a body. See [docs/http-server.md](docs/http-server.md#response-compression).
|
|
2891
2893
|
|
|
2892
2894
|
# Authorization (CanCan-style)
|
|
2893
2895
|
|
|
@@ -203,7 +203,7 @@ export default class VelociousCliCommandsTest extends BaseCommand {
|
|
|
203
203
|
const hasExampleFilters = examplePatterns.length > 0
|
|
204
204
|
const hasTagFilters = includeTags.length > 0 || effectiveExcludeTagCount > 0
|
|
205
205
|
|
|
206
|
-
if ((hasTagFilters || hasLineFilters || hasExampleFilters) &&
|
|
206
|
+
if ((hasTagFilters || hasLineFilters || hasExampleFilters) && testRunner.hasNoMatches()) {
|
|
207
207
|
console.error(picocolors.red("\nNo tests matched the provided filters"))
|
|
208
208
|
await finalizeProfile("no-tests")
|
|
209
209
|
process.exit(1)
|
|
@@ -247,6 +247,7 @@ export default class VelociousCliCommandsTest extends BaseCommand {
|
|
|
247
247
|
}
|
|
248
248
|
}
|
|
249
249
|
|
|
250
|
+
if (testRunner.getNotRunTests() > 0) console.error(`${testRunner.getNotRunTests()} tests not run because a shared resource failed`)
|
|
250
251
|
console.error(picocolors.red(`\nTest run failed with ${testRunner.getFailedTests()} failed tests and ${testRunner.getSuccessfulTests()} successfull`))
|
|
251
252
|
await finalizeProfile("failed")
|
|
252
253
|
process.exit(1)
|
|
@@ -8,7 +8,7 @@ import EventEmitter from "../../utils/event-emitter.js"
|
|
|
8
8
|
import Logger from "../../logger.js"
|
|
9
9
|
import Request from "./request.js"
|
|
10
10
|
import RequestRunner from "./request-runner.js"
|
|
11
|
-
import {applyResponseCompression} from "./response-compression.js"
|
|
11
|
+
import {addAcceptEncodingToVary, applyResponseCompression, negotiateContentEncoding} from "./response-compression.js"
|
|
12
12
|
import WebsocketSession from "./websocket-session.js"
|
|
13
13
|
|
|
14
14
|
/**
|
|
@@ -384,7 +384,15 @@ export default class VeoliciousHttpServerClient {
|
|
|
384
384
|
}
|
|
385
385
|
|
|
386
386
|
/**
|
|
387
|
-
*
|
|
387
|
+
* Sends a finished response to the client. Owns the framework-owned
|
|
388
|
+
* `Vary: Accept-Encoding` dimension (emitted for every selected
|
|
389
|
+
* representation — transformed, identity, 406, and file — and for
|
|
390
|
+
* header-present and header-absent requests alike, so it is stable across
|
|
391
|
+
* requests on the same connection; never added when compression is disabled,
|
|
392
|
+
* the response is truly bodyless, or the application supplied a fixed
|
|
393
|
+
* `Content-Encoding`) and the file 406 rule (a sendFile response whose
|
|
394
|
+
* client forbids identity is answered with the empty 406, the file is never
|
|
395
|
+
* opened or streamed, and `onFinished` settles once as "completed").
|
|
388
396
|
* @param {RequestRunner} requestRunner - Request runner.
|
|
389
397
|
* @returns {Promise<void>} - Resolves when complete.
|
|
390
398
|
*/
|
|
@@ -436,12 +444,41 @@ export default class VeoliciousHttpServerClient {
|
|
|
436
444
|
/** @type {string | Uint8Array | null} */
|
|
437
445
|
let bodyToEmit = body
|
|
438
446
|
|
|
447
|
+
// The response representation can depend on the client's Accept-Encoding:
|
|
448
|
+
// the same request is answered with an identity body (or a file) when
|
|
449
|
+
// identity is acceptable and with an empty 406 when it is forbidden.
|
|
450
|
+
const compression = this.configuration.getHttpServerCompression()
|
|
451
|
+
const negotiated = compression.enabled ? negotiateContentEncoding(request.header("accept-encoding")) : undefined
|
|
452
|
+
// An application-supplied Content-Encoding is an application-owned
|
|
453
|
+
// representation contract, captured before the framework may add its own.
|
|
454
|
+
// A file carrying one is a fixed, application-owned representation: the
|
|
455
|
+
// framework neither negotiates it nor re-advertises it, so it is never a
|
|
456
|
+
// candidate for the identity-only 406.
|
|
457
|
+
const hasApplicationContentEncoding = response.getHeader("Content-Encoding").length > 0
|
|
458
|
+
// A file response only ever serves the identity representation: whenever
|
|
459
|
+
// the client forbids identity (including the not-acceptable case where no
|
|
460
|
+
// coding applies) and the file does not carry an application-supplied
|
|
461
|
+
// Content-Encoding, the file is rejected with the empty 406. A truly
|
|
462
|
+
// bodyless status selects no representation, so it is never rejected here.
|
|
463
|
+
const isFileNotAcceptable = hasFilePath && !!negotiated && ("notAcceptable" in negotiated || negotiated.identityAcceptable === false) && hasApplicationContentEncoding === false && !isBodylessStatus
|
|
464
|
+
|
|
439
465
|
if (!isBodylessStatus) {
|
|
440
466
|
let contentLength
|
|
441
467
|
|
|
442
468
|
if (hasFilePath) {
|
|
443
|
-
|
|
444
|
-
|
|
469
|
+
if (isFileNotAcceptable) {
|
|
470
|
+
// The client forbids identity and files are only ever sent identity:
|
|
471
|
+
// answer with the same empty 406 every other representation path
|
|
472
|
+
// uses. The file is never opened or streamed; onFinished is settled
|
|
473
|
+
// below, after the committed 406 headers are emitted.
|
|
474
|
+
response.setStatus(406)
|
|
475
|
+
response.setBody("")
|
|
476
|
+
bodyToEmit = ""
|
|
477
|
+
contentLength = 0
|
|
478
|
+
} else {
|
|
479
|
+
const stats = await fs.stat(filePath)
|
|
480
|
+
contentLength = stats.size
|
|
481
|
+
}
|
|
445
482
|
} else {
|
|
446
483
|
// String bodies are UTF-8 framed, so the buffered bytes are the UTF-8 encoding;
|
|
447
484
|
// Uint8Array bodies are already the exact wire bytes.
|
|
@@ -474,6 +511,18 @@ export default class VeoliciousHttpServerClient {
|
|
|
474
511
|
response.setHeader("Content-Length", contentLength)
|
|
475
512
|
}
|
|
476
513
|
|
|
514
|
+
// Framework-owned Vary dimension: whenever compression is enabled and a
|
|
515
|
+
// representation was selected, the response depends on Accept-Encoding,
|
|
516
|
+
// so caches must key on it. Applied identically for every outcome
|
|
517
|
+
// (transformed, identity, 406, file) and for header-present and
|
|
518
|
+
// header-absent requests alike, so the header is stable across requests on
|
|
519
|
+
// the same connection. A truly bodyless response selects no representation
|
|
520
|
+
// and carries no dimension; an application-supplied Content-Encoding keeps
|
|
521
|
+
// the representation contract application-owned and is never re-advertised.
|
|
522
|
+
if (negotiated && !isBodylessStatus && hasApplicationContentEncoding === false) {
|
|
523
|
+
addAcceptEncodingToVary(response)
|
|
524
|
+
}
|
|
525
|
+
|
|
477
526
|
response.setHeader("Date", date.toUTCString())
|
|
478
527
|
response.setHeader("Server", "Velocious")
|
|
479
528
|
|
|
@@ -492,8 +541,21 @@ export default class VeoliciousHttpServerClient {
|
|
|
492
541
|
this.events.emit("output", headers)
|
|
493
542
|
this.logger.debug(() => ["sendResponse headers emitted", {clientCount: this.clientCount, headersLength: headers.length}])
|
|
494
543
|
|
|
495
|
-
|
|
544
|
+
// A negotiated file 406 is committed above (status 406, empty body) and its
|
|
545
|
+
// headers were just emitted: settle onFinished now, so the callback runs
|
|
546
|
+
// after the response is committed — a slow or app-stopping callback cannot
|
|
547
|
+
// delay or block delivery of the already-emitted 406. The file is never
|
|
548
|
+
// opened, streamed, or reported (no file event), and the callback settles
|
|
549
|
+
// exactly once as "completed".
|
|
550
|
+
if (isFileNotAcceptable) {
|
|
551
|
+
this.logger.debug(() => ["sendResponse file body suppressed for 406", {clientCount: this.clientCount, filePath}])
|
|
552
|
+
await this.runFileOnFinished({filePath, onFinished: fileOnFinished, result: "completed"})
|
|
553
|
+
} else if (isBodylessStatus) {
|
|
496
554
|
this.logger.debug(() => ["sendResponse body suppressed for no-body status", {clientCount: this.clientCount, statusCode: response.getStatusCode()}])
|
|
555
|
+
// A bodyless status (1xx/204/304) selects no representation, so no file
|
|
556
|
+
// body or framework Vary is emitted. The file-ownership path still settles
|
|
557
|
+
// onFinished exactly once as "completed" (nothing was aborted) — even when
|
|
558
|
+
// the client forbids identity — preserving the pre-change settlement.
|
|
497
559
|
if (hasFilePath) await this.sendFileOutput(filePath, false, fileOnFinished)
|
|
498
560
|
} else if (isHeadRequest) {
|
|
499
561
|
this.logger.debug(() => ["sendResponse body suppressed for HEAD request", {clientCount: this.clientCount}])
|
|
@@ -8,6 +8,12 @@ import Logger from "../../../logger.js"
|
|
|
8
8
|
import ParamsToObject from "../params-to-object.js"
|
|
9
9
|
import querystring from "querystring"
|
|
10
10
|
|
|
11
|
+
/**
|
|
12
|
+
* Request header fields whose repeated wire fields combine into one value
|
|
13
|
+
* (RFC 9110 §5.3) before the server consumes them.
|
|
14
|
+
* @type {Set<string>} */
|
|
15
|
+
const COMBINING_HEADER_FIELDS = new Set(["accept-encoding"])
|
|
16
|
+
|
|
11
17
|
/**
|
|
12
18
|
* Runs truncate preview.
|
|
13
19
|
* @param {string | undefined} input - Input string.
|
|
@@ -367,8 +373,16 @@ export default class RequestBuffer {
|
|
|
367
373
|
*/
|
|
368
374
|
addHeader(header) {
|
|
369
375
|
const formattedName = header.getFormattedName()
|
|
376
|
+
const existingHeader = this.headersByName[formattedName]
|
|
370
377
|
|
|
371
|
-
|
|
378
|
+
// RFC 9110 §5.3: a field may be repeated; its value is the concatenation of
|
|
379
|
+
// all field values separated by commas, in wire order. Only Accept-Encoding
|
|
380
|
+
// is consumed as a combined field by the server.
|
|
381
|
+
if (existingHeader && COMBINING_HEADER_FIELDS.has(formattedName)) {
|
|
382
|
+
existingHeader.value += `, ${header.getValue()}`
|
|
383
|
+
} else {
|
|
384
|
+
this.headersByName[formattedName] = header
|
|
385
|
+
}
|
|
372
386
|
|
|
373
387
|
if (formattedName == "content-length") this.contentLength = parseInt(header.getValue())
|
|
374
388
|
}
|
|
@@ -22,9 +22,9 @@ const COMPRESSIBLE_EXACT_MEDIA_TYPES = new Set([
|
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* RFC 9110 §12.4.2 qvalue grammar: `0` or `1` with at most three fractional
|
|
25
|
-
* digits, and only zeros after `1`.
|
|
25
|
+
* digits (the boundary forms `0.` and `1.` are valid), and only zeros after `1`.
|
|
26
26
|
* @type {RegExp} */
|
|
27
|
-
const QVALUE_PATTERN = /^(?:0(?:\.\d{
|
|
27
|
+
const QVALUE_PATTERN = /^(?:0(?:\.\d{0,3})?|1(?:\.0{0,3})?)$/u
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
30
|
* Runs parse accept encoding.
|
|
@@ -118,7 +118,9 @@ export function isCompressibleContentType(contentType) {
|
|
|
118
118
|
/**
|
|
119
119
|
* Merges Accept-Encoding into the response Vary header case-insensitively and
|
|
120
120
|
* without duplicates. An existing `Vary: *` already covers every request header
|
|
121
|
-
* and is preserved as-is.
|
|
121
|
+
* and is preserved as-is. Called by the response sender for every
|
|
122
|
+
* framework-selected representation so the header is identical for every
|
|
123
|
+
* request on the same connection.
|
|
122
124
|
* @param {import("./response.js").default} response - Response instance.
|
|
123
125
|
* @returns {void} - No return value.
|
|
124
126
|
*/
|
|
@@ -160,7 +162,7 @@ export function addAcceptEncodingToVary(response) {
|
|
|
160
162
|
* @param {import("../../configuration-types.js").NormalizedHttpCompressionConfiguration} args.compression - Normalized compression configuration.
|
|
161
163
|
* @param {import("./request.js").default | import("./websocket-request.js").default} args.request - Request object.
|
|
162
164
|
* @param {import("./response.js").default} args.response - Response instance.
|
|
163
|
-
* @returns {Promise<{outcome: "identity"} | {outcome: "compressed", body: Buffer} | {outcome: "not-acceptable"}>} - Compression outcome.
|
|
165
|
+
* @returns {Promise<{outcome: "identity"} | {outcome: "compressed", body: Buffer} | {outcome: "not-acceptable"}>} - Compression outcome. The caller owns the Vary header and the file/406 representation decisions.
|
|
164
166
|
*/
|
|
165
167
|
export async function applyResponseCompression({bodyBuffer, compression, request, response}) {
|
|
166
168
|
if (!compression.enabled) return {outcome: "identity"}
|
|
@@ -203,10 +205,6 @@ export async function applyResponseCompression({bodyBuffer, compression, request
|
|
|
203
205
|
return negotiated.identityAcceptable ? {outcome: "identity"} : {outcome: "not-acceptable"}
|
|
204
206
|
}
|
|
205
207
|
|
|
206
|
-
// The representation now depends on the request's Accept-Encoding, even when this
|
|
207
|
-
// particular response ends up identity (missing header, higher-q identity, below threshold).
|
|
208
|
-
addAcceptEncodingToVary(response)
|
|
209
|
-
|
|
210
208
|
if (negotiated.encoding == "identity") return {outcome: "identity"}
|
|
211
209
|
|
|
212
210
|
// Below the threshold the smaller identity representation is sent instead — but only
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../../../../src/environment-handlers/node/cli/commands/test.js"],"names":[],"mappings":"AAEA,OAAO,WAAW,MAAM,iCAAiC,CAAA;AAiBzD,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,WAAW;IACzD,OAAO,
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../../../../src/environment-handlers/node/cli/commands/test.js"],"names":[],"mappings":"AAEA,OAAO,WAAW,MAAM,iCAAiC,CAAA;AAiBzD,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,WAAW;IACzD,OAAO,kBA2PZ;CACF;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,EAAC,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,wBAAwB,EAAC,EAPpH;IAAqB,GAAG,EAAhB,MAAM,CACd;IAAsB,OAAO,EAArB,OAAO,CACf;IAAsB,eAAe,AAArC,CACA,EADQ,MAAM,CACd;IAAsB,kBAAkB,AAAxC,CACA,EADQ,MAAM,CACd;IAAsB,wBAAwB,AAA9C,CACA,EADQ,MAAM,CACd;CAEoH,GAF1G;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,wBAAwB,EAAE,MAAM,GAAG,SAAS,CAAA;CAAC,CA0BzJ;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,kBAAkB,EAHhD,MAAM,GAAG,SAGuC,GAF9C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,CAsBvD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAHrC,MAAM,GAAG,SAG4B,GAFnC,MAAM,CAMlB"}
|
|
@@ -165,7 +165,7 @@ export default class VelociousCliCommandsTest extends BaseCommand {
|
|
|
165
165
|
const hasLineFilters = Object.keys(lineFilters).length > 0;
|
|
166
166
|
const hasExampleFilters = examplePatterns.length > 0;
|
|
167
167
|
const hasTagFilters = includeTags.length > 0 || effectiveExcludeTagCount > 0;
|
|
168
|
-
if ((hasTagFilters || hasLineFilters || hasExampleFilters) &&
|
|
168
|
+
if ((hasTagFilters || hasLineFilters || hasExampleFilters) && testRunner.hasNoMatches()) {
|
|
169
169
|
console.error(picocolors.red("\nNo tests matched the provided filters"));
|
|
170
170
|
await finalizeProfile("no-tests");
|
|
171
171
|
process.exit(1);
|
|
@@ -199,6 +199,8 @@ export default class VelociousCliCommandsTest extends BaseCommand {
|
|
|
199
199
|
}
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
|
+
if (testRunner.getNotRunTests() > 0)
|
|
203
|
+
console.error(`${testRunner.getNotRunTests()} tests not run because a shared resource failed`);
|
|
202
204
|
console.error(picocolors.red(`\nTest run failed with ${testRunner.getFailedTests()} failed tests and ${testRunner.getSuccessfulTests()} successfull`));
|
|
203
205
|
await finalizeProfile("failed");
|
|
204
206
|
process.exit(1);
|
|
@@ -291,4 +293,4 @@ export function resolveSlowTestCount(rawEnvValue) {
|
|
|
291
293
|
return 10;
|
|
292
294
|
return Math.max(0, Math.floor(Number(rawEnvValue)) || 0);
|
|
293
295
|
}
|
|
294
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9ub2RlL2NsaS9jb21tYW5kcy90ZXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFdBQVcsTUFBTSxpQ0FBaUMsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUNuQyxPQUFPLGVBQWUsTUFBTSwwQ0FBMEMsQ0FBQTtBQUN0RSxPQUFPLFlBQVksTUFBTSxzQ0FBc0MsQ0FBQTtBQUMvRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQTtBQUM5RyxPQUFPLFVBQVUsTUFBTSxvQ0FBb0MsQ0FBQTtBQUMzRCxPQUFPLGlCQUFpQixNQUFNLDRDQUE0QyxDQUFBO0FBQzFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxZQUFZLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQTtBQUNsRyxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLHlCQUF5QixFQUN6QixzQkFBc0IsRUFDdkIsTUFBTSx3Q0FBd0MsQ0FBQTtBQUMvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUV2RSxNQUFNLENBQUMsT0FBTyxPQUFPLHdCQUF5QixTQUFRLFdBQVc7SUFDL0QsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLHdCQUF3QixFQUFFLENBQUE7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRTlDLElBQUksU0FBUyxDQUFBO1FBQ2IsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFBO1FBRXRCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lB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LENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDekQsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxrQkFBa0IsRUFBRSxFQUFFLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7SUFDMUYsQ0FBQztJQUVELElBQUksTUFBTSxDQUFBO0lBRVYsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDOUIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxrQkFBa0IsRUFBRSxFQUFFLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7SUFDM0YsQ0FBQztJQUVELE9BQU8sc0JBQXNCLENBQUMsTUFBTSxFQUFFLEVBQUMsTUFBTSxFQUFFLG1CQUFtQixrQkFBa0IsRUFBRSxFQUFDLENBQUMsQ0FBQTtBQUMxRixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFdBQVc7SUFDOUMsSUFBSSxXQUFXLEtBQUssU0FBUztRQUFFLE9BQU8sRUFBRSxDQUFBO0lBRXhDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtBQUMxRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBCYXNlQ29tbWFuZCBmcm9tIFwiLi4vLi4vLi4vLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHBpY29jb2xvcnMgZnJvbSBcInBpY29jb2xvcnNcIlxuaW1wb3J0IFRlc3RGaWxlc0ZpbmRlciBmcm9tIFwiLi4vLi4vLi4vLi4vdGVzdGluZy90ZXN0LWZpbGVzLWZpbmRlci5qc1wiXG5pbXBvcnQgVGVzdFByb2ZpbGVyIGZyb20gXCIuLi8uLi8uLi8uLi90ZXN0aW5nL3Rlc3QtcHJvZmlsZXIuanNcIlxuaW1wb3J0IHsgZm9ybWF0VGVzdFByb2ZpbGVTdW1tYXJ5LCB3cml0ZVRlc3RQcm9maWxlT3V0cHV0cyB9IGZyb20gXCIuLi8uLi8uLi8uLi90ZXN0aW5nL3Rlc3QtcHJvZmlsZS1vdXRwdXQuanNcIlxuaW1wb3J0IFRlc3RSdW5uZXIgZnJvbSBcIi4uLy4uLy4uLy4uL3Rlc3RpbmcvdGVzdC1ydW5uZXIuanNcIlxuaW1wb3J0IFRlc3RTdWl0ZVNwbGl0dGVyIGZyb20gXCIuLi8uLi8uLi8uLi90ZXN0aW5nL3Rlc3Qtc3VpdGUtc3BsaXR0ZXIuanNcIlxuaW1wb3J0IHsgbm9ybWFsaXplRXhhbXBsZVBhdHRlcm5zLCBwYXJzZUZpbHRlcnMgfSBmcm9tIFwiLi4vLi4vLi4vLi4vdGVzdGluZy90ZXN0LWZpbHRlci1wYXJzZXIuanNcIlxuaW1wb3J0IHtcbiAgY2Fub25pY2FsVGltaW5nTWFuaWZlc3RQYXRoLFxuICB0aW1pbmdNYW5pZmVzdEZpbGVTZXRIYXNoLFxuICB2YWxpZGF0ZVRpbWluZ01hbmlmZXN0XG59IGZyb20gXCIuLi8uLi8uLi8uLi90ZXN0aW5nL3RpbWluZy1tYW5pZmVzdC5qc1wiXG5pbXBvcnQgeyBwcmVwYXJlU291cmNlUGVlclBhY2thZ2UgfSBmcm9tIFwiLi4vLi4vc291cmNlLXBlZXItcGFja2FnZS5qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0NsaUNvbW1hbmRzVGVzdCBleHRlbmRzIEJhc2VDb21tYW5kIHtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICBhd2FpdCBwcmVwYXJlU291cmNlUGVlclBhY2thZ2UoKVxuICAgIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnNldEVudmlyb25tZW50KFwidGVzdFwiKVxuXG4gICAgbGV0IGRpcmVjdG9yeVxuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gW11cblxuICAgIGlmIChwcm9jZXNzLmVudi5WRUxPQ0lPVVNfVEVTVF9ESVIpIHtcbiAgICAgIGRpcmVjdG9yeSA9IHByb2Nlc3MuZW52LlZFTE9DSU9VU19URVNUX0RJUlxuICAgICAgZGlyZWN0b3JpZXMucHVzaChwcm9jZXNzLmVudi5WRUxPQ0lPVVNfVEVTVF9ESVIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRpcmVjdG9yeSA9IHRoaXMuZGlyZWN0b3J5KClcbiAgICAgIGRpcmVjdG9yaWVzLnB1c2goYCR7dGhpcy5kaXJlY3RvcnkoKX0vX190ZXN0c19fYClcbiAgICAgIGRpcmVjdG9yaWVzLnB1c2goYCR7dGhpcy5kaXJlY3RvcnkoKX0vdGVzdHNgKVxuICAgICAgZGlyZWN0b3JpZXMucHVzaChgJHt0aGlzLmRpcmVjdG9yeSgpfS9zcGVjYClcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBpbmNsdWRlVGFncyxcbiAgICAgIGV4Y2x1ZGVUYWdzLFxuICAgICAgZXhhbXBsZVBhdHRlcm5zLFxuICAgICAgZmlsdGVyZWRQcm9jZXNzQXJncyxcbiAgICAgIGdyb3VwcyxcbiAgICAgIGdyb3VwTnVtYmVyLFxuICAgICAgcHJvZmlsZSxcbiAgICAgIHByb2ZpbGVKc29uUGF0aCxcbiAgICAgIHRpbWluZ01hbmlmZXN0UGF0aCxcbiAgICAgIHRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aFxuICAgIH0gPSBwYXJzZUZpbHRlcnModGhpcy5wcm9jZXNzQXJncyB8fCBbXSlcbiAgICBjb25zdCBwcm9maWxlT3B0aW9ucyA9IHJlc29sdmVUZXN0UHJvZmlsZU9wdGlvbnMoe1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgcHJvZmlsZSxcbiAgICAgIHByb2ZpbGVKc29uUGF0aCxcbiAgICAgIHRpbWluZ01hbmlmZXN0UGF0aCxcbiAgICAgIHRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aFxuICAgIH0pXG4gICAgY29uc3Qgc2VsZWN0aW9uID0ge1xuICAgICAgZXhjbHVkZVRhZ0NvdW50OiBleGNsdWRlVGFncy5sZW5ndGgsXG4gICAgICBoYXNFeGFtcGxlRmlsdGVyczogZXhhbXBsZVBhdHRlcm5zLmxlbmd0aCA+IDAsXG4gICAgICBpbmNsdWRlVGFnQ291bnQ6IGluY2x1ZGVUYWdzLmxlbmd0aCxcbiAgICAgIHNoYXJkOiBncm91cHMgIT09IHVuZGVmaW5lZCAmJiBncm91cE51bWJlciAhPT0gdW5kZWZpbmVkID8ge2dyb3VwcywgZ3JvdXBOdW1iZXJ9IDogdW5kZWZpbmVkXG4gICAgfVxuICAgIGNvbnN0IHByb2ZpbGVyID0gcHJvZmlsZU9wdGlvbnMucHJvZmlsZVxuICAgICAgPyBuZXcgVGVzdFByb2ZpbGVyKHtjb25maWd1cmF0aW9uOiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKSwgcHJvamVjdERpcmVjdG9yeTogZGlyZWN0b3J5LCBzZWxlY3Rpb259KVxuICAgICAgOiB1bmRlZmluZWRcbiAgICBjb25zdCB0ZXN0RmlsZXNGaW5kZXIgPSBuZXcgVGVzdEZpbGVzRmluZGVyKHtkaXJlY3RvcnksIGRpcmVjdG9yaWVzLCBwcm9jZXNzQXJnczogZmlsdGVyZWRQcm9jZXNzQXJnc30pXG4gICAgLyoqIEB0eXBlIHtUZXN0UnVubmVyIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCB0ZXN0UnVubmVyXG4gICAgbGV0IHByb2ZpbGVGaW5hbGl6ZWQgPSBmYWxzZVxuXG4gICAgLyoqXG4gICAgICogRmluYWxpemVzIHJlcXVlc3RlZCBvdXRwdXRzIG9uY2UgZm9yIGV2ZXJ5IGNvbW1hbmQgb3V0Y29tZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RhdHVzIC0gUnVuIHN0YXR1cy5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciByZXF1ZXN0ZWQgb3V0cHV0cyBhcmUgd3JpdHRlbi5cbiAgICAgKi9cbiAgICBjb25zdCBmaW5hbGl6ZVByb2ZpbGUgPSBhc3luYyAoc3RhdHVzKSA9PiB7XG4gICAgICBpZiAoIXByb2ZpbGVyIHx8IHByb2ZpbGVGaW5hbGl6ZWQpIHJldHVyblxuXG4gICAgICBwcm9maWxlRmluYWxpemVkID0gdHJ1ZVxuICAgICAgY29uc3QgZmFpbGVkID0gdGVzdFJ1bm5lcj8uZ2V0RmFpbGVkVGVzdHMoKSA/PyAwXG4gICAgICBjb25zdCBwYXNzZWQgPSB0ZXN0UnVubmVyPy5nZXRTdWNjZXNzZnVsVGVzdHMoKSA/PyAwXG4gICAgICBjb25zdCBwcm9maWxlRG9jdW1lbnQgPSBwcm9maWxlci5maW5pc2goe1xuICAgICAgICBjb3VudHM6IHtcbiAgICAgICAgICBkaXNjb3ZlcmVkOiB0ZXN0UnVubmVyPy5nZXRUZXN0c0NvdW50KCkgPz8gMCxcbiAgICAgICAgICBleGVjdXRlZDogdGVzdFJ1bm5lcj8uZ2V0RXhlY3V0ZWRUZXN0c0NvdW50KCkgPz8gMCxcbiAgICAgICAgICBmYWlsZWQsXG4gICAgICAgICAgcGFzc2VkXG4gICAgICAgIH0sXG4gICAgICAgIGZvY3VzZWQ6IEJvb2xlYW4odGVzdFJ1bm5lcj8uYW55VGVzdHNGb2N1c3NlZCksXG4gICAgICAgIHN0YXR1c1xuICAgICAgfSlcblxuICAgICAgYXdhaXQgd3JpdGVUZXN0UHJvZmlsZU91dHB1dHMoe1xuICAgICAgICBwcm9maWxlOiBwcm9maWxlRG9jdW1lbnQsXG4gICAgICAgIHByb2ZpbGVKc29uUGF0aDogcHJvZmlsZU9wdGlvbnMucHJvZmlsZUpzb25QYXRoLFxuICAgICAgICB0aW1pbmdNYW5pZmVzdE91dHB1dFBhdGg6IHByb2ZpbGVPcHRpb25zLnRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aFxuICAgICAgfSlcbiAgICAgIGNvbnNvbGUubG9nKGBcXG4ke2Zvcm1hdFRlc3RQcm9maWxlU3VtbWFyeShwcm9maWxlRG9jdW1lbnQsIHByb2ZpbGVPcHRpb25zKX1gKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkaXNjb3ZlclRlc3RGaWxlcyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGltaW5nTWFuaWZlc3QgPSBhd2FpdCBsb2FkVGltaW5nTWFuaWZlc3QocHJvZmlsZU9wdGlvbnMudGltaW5nTWFuaWZlc3RQYXRoKVxuICAgICAgICBsZXQgZGlzY292ZXJlZFRlc3RGaWxlcyA9IGF3YWl0IHRlc3RGaWxlc0ZpbmRlci5maW5kVGVzdEZpbGVzKClcbiAgICAgICAgY29uc3QgbGluZUZpbHRlcnMgPSB0ZXN0RmlsZXNGaW5kZXIuZ2V0TGluZUZpbHRlcnNCeUZpbGUoKVxuXG4gICAgICAgIGlmIChwcm9maWxlcikge1xuICAgICAgICAgIGNvbnN0IGRpc2NvdmVyZWRGaWxlUGF0aHMgPSBkaXNjb3ZlcmVkVGVzdEZpbGVzLm1hcCgoZmlsZVBhdGgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjYW5vbmljYWxUaW1pbmdNYW5pZmVzdFBhdGgocGF0aC5yZWxhdGl2ZShkaXJlY3RvcnksIGZpbGVQYXRoKSlcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgcHJvZmlsZXIuc2V0U2VsZWN0aW9uKHtcbiAgICAgICAgICAgIGRpc2NvdmVyZWRGaWxlQ291bnQ6IGRpc2NvdmVyZWRUZXN0RmlsZXMubGVuZ3RoLFxuICAgICAgICAgICAgaGFzTGluZUZpbHRlcnM6IE9iamVjdC5rZXlzKGxpbmVGaWx0ZXJzKS5sZW5ndGggPiAwLFxuICAgICAgICAgICAgcGF0aEJhc2U6IHByb2Nlc3MuZW52LlZFTE9DSU9VU19URVNUX0RJUiA/IFwidGVzdC1kaXJlY3RvcnlcIiA6IFwiY29uZmlndXJhdGlvbi1kaXJlY3RvcnlcIixcbiAgICAgICAgICAgIHRlc3RGaWxlU2V0SGFzaDogdGltaW5nTWFuaWZlc3RGaWxlU2V0SGFzaChkaXNjb3ZlcmVkRmlsZVBhdGhzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ3JvdXBzICE9PSB1bmRlZmluZWQgfHwgZ3JvdXBOdW1iZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChncm91cHMgPT09IHVuZGVmaW5lZCB8fCBncm91cE51bWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCb3RoIC0tZ3JvdXBzIGFuZCAtLWdyb3VwLW51bWJlciBtdXN0IGJlIHByb3ZpZGVkIHRvZ2V0aGVyXCIpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc3BsaXR0ZXIgPSBuZXcgVGVzdFN1aXRlU3BsaXR0ZXIoe1xuICAgICAgICAgICAgZ3JvdXBzLFxuICAgICAgICAgICAgZ3JvdXBOdW1iZXIsXG4gICAgICAgICAgICB0ZXN0RmlsZXM6IGRpc2NvdmVyZWRUZXN0RmlsZXMsXG4gICAgICAgICAgICBiYXNlRGlyZWN0b3J5OiBkaXJlY3RvcnksXG4gICAgICAgICAgICB0aW1pbmdNYW5pZmVzdFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAocHJvZmlsZU9wdGlvbnMudGltaW5nTWFuaWZlc3RQYXRoKSB7XG4gICAgICAgICAgICBjb25zdCBjb3ZlcmFnZSA9IHNwbGl0dGVyLmdldFRpbWluZ01hbmlmZXN0Q292ZXJhZ2UoKVxuXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhwaWNvY29sb3JzLmN5YW4oXG4gICAgICAgICAgICAgIGBUaW1pbmcgbWFuaWZlc3QgY292ZXJhZ2U6IG1lYXN1cmVkPSR7Y292ZXJhZ2UubWVhc3VyZWRGaWxlc30gYCArXG4gICAgICAgICAgICAgIGBoZXVyaXN0aWM9JHtjb3ZlcmFnZS5oZXVyaXN0aWNGaWxlc30gc3RhbGU9JHtjb3ZlcmFnZS5zdGFsZUVudHJpZXN9YFxuICAgICAgICAgICAgKSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaXNjb3ZlcmVkVGVzdEZpbGVzID0gc3BsaXR0ZXIuZ2V0R3JvdXBGaWxlcygpXG4gICAgICAgICAgY29uc29sZS5sb2cocGljb2NvbG9ycy5jeWFuKGBSdW5uaW5nIGdyb3VwICR7Z3JvdXBOdW1iZXJ9IG9mICR7Z3JvdXBzfSAoJHtkaXNjb3ZlcmVkVGVzdEZpbGVzLmxlbmd0aH0gZmlsZXMpYCkpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGlzY292ZXJlZFRlc3RGaWxlc1xuICAgICAgfVxuICAgICAgY29uc3QgdGVzdEZpbGVzID0gcHJvZmlsZXJcbiAgICAgICAgPyBhd2FpdCBwcm9maWxlci5tZWFzdXJlUGhhc2UoXCJkaXNjb3ZlcnlcIiwgZGlzY292ZXJUZXN0RmlsZXMpXG4gICAgICAgIDogYXdhaXQgZGlzY292ZXJUZXN0RmlsZXMoKVxuXG4gICAgICBwcm9maWxlcj8uc2V0U2VsZWN0aW9uKHtmaWxlQ291bnQ6IHRlc3RGaWxlcy5sZW5ndGh9KVxuICAgICAgdGVzdFJ1bm5lciA9IG5ldyBUZXN0UnVubmVyKHtcbiAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5nZXRDb25maWd1cmF0aW9uKCksXG4gICAgICAgIGV4Y2x1ZGVUYWdzLFxuICAgICAgICBpbmNsdWRlVGFncyxcbiAgICAgICAgdGVzdEZpbGVzLFxuICAgICAgICBsaW5lRmlsdGVyczogdGVzdEZpbGVzRmluZGVyLmdldExpbmVGaWx0ZXJzQnlGaWxlKCksXG4gICAgICAgIGV4YW1wbGVQYXR0ZXJuczogbm9ybWFsaXplRXhhbXBsZVBhdHRlcm5zKGV4YW1wbGVQYXR0ZXJucyksXG4gICAgICAgIHByb2ZpbGVyXG4gICAgICB9KVxuICAgICAgY29uc3QgYWN0aXZlVGVzdFJ1bm5lciA9IHRlc3RSdW5uZXJcbiAgICAgIGxldCBzaWduYWxIYW5kbGVkID0gZmFsc2VcblxuICAgICAgY29uc3QgaGFuZGxlU2lnbmFsID0gYXN5bmMgKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBzaWduYWwpID0+IHtcbiAgICAgICAgaWYgKHNpZ25hbEhhbmRsZWQpIHJldHVyblxuICAgICAgICBzaWduYWxIYW5kbGVkID0gdHJ1ZVxuICAgICAgICBwcm9maWxlcj8uaW50ZXJydXB0KClcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxuUmVjZWl2ZWQgJHtzaWduYWx9LCBydW5uaW5nIGFmdGVyQWxsIGhvb2tzIGJlZm9yZSBleGl0Li4uYClcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGFjdGl2ZVRlc3RSdW5uZXIucnVuQWZ0ZXJBbGxzRm9yQWN0aXZlU2NvcGVzKClcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHdoaWxlIHJ1bm5pbmcgYWZ0ZXJBbGwgaG9va3M6XCIsIGVycm9yKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmaW5hbGl6ZVByb2ZpbGUoXCJpbnRlcnJ1cHRlZFwiKVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHdoaWxlIHdyaXRpbmcgaW50ZXJydXB0ZWQgdGVzdCBwcm9maWxlOlwiLCBlcnJvcilcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KDEzMClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLm9uY2UoXCJTSUdJTlRcIiwgKCkgPT4geyB2b2lkIGhhbmRsZVNpZ25hbChcIlNJR0lOVFwiKSB9KVxuICAgICAgcHJvY2Vzcy5vbmNlKFwiU0lHVEVSTVwiLCAoKSA9PiB7IHZvaWQgaGFuZGxlU2lnbmFsKFwiU0lHVEVSTVwiKSB9KVxuXG4gICAgICBhd2FpdCB0ZXN0UnVubmVyLnByZXBhcmUoKVxuICAgICAgY29uc3QgZWZmZWN0aXZlRXhjbHVkZVRhZ0NvdW50ID0gdGVzdFJ1bm5lci5nZXRFeGNsdWRlVGFnU2V0KCkuc2l6ZVxuXG4gICAgICBwcm9maWxlcj8uc2V0U2VsZWN0aW9uKHtleGNsdWRlVGFnQ291bnQ6IGVmZmVjdGl2ZUV4Y2x1ZGVUYWdDb3VudH0pXG5cbiAgICAgIGlmICh0ZXN0UnVubmVyLmdldFRlc3RzQ291bnQoKSA9PT0gMCkge1xuICAgICAgICBhd2FpdCBmaW5hbGl6ZVByb2ZpbGUoXCJuby10ZXN0c1wiKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGVzdFJ1bm5lci5nZXRUZXN0c0NvdW50KCl9IHRlc3RzIHdhcyBmb3VuZCBpbiAke3Rlc3RGaWxlcy5sZW5ndGh9IGZpbGUocylgKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0ZXN0UnVubmVyLnJ1bigpXG5cbiAgICAgIGNvbnN0IGV4ZWN1dGVkVGVzdHMgPSB0ZXN0UnVubmVyLmdldEV4ZWN1dGVkVGVzdHNDb3VudCgpXG4gICAgICBjb25zdCBsaW5lRmlsdGVycyA9IHRlc3RSdW5uZXIuZ2V0TGluZUZpbHRlcnMoKVxuICAgICAgY29uc3QgaGFzTGluZUZpbHRlcnMgPSBPYmplY3Qua2V5cyhsaW5lRmlsdGVycykubGVuZ3RoID4gMFxuICAgICAgY29uc3QgaGFzRXhhbXBsZUZpbHRlcnMgPSBleGFtcGxlUGF0dGVybnMubGVuZ3RoID4gMFxuICAgICAgY29uc3QgaGFzVGFnRmlsdGVycyA9IGluY2x1ZGVUYWdzLmxlbmd0aCA+IDAgfHwgZWZmZWN0aXZlRXhjbHVkZVRhZ0NvdW50ID4gMFxuXG4gICAgICBpZiAoKGhhc1RhZ0ZpbHRlcnMgfHwgaGFzTGluZUZpbHRlcnMgfHwgaGFzRXhhbXBsZUZpbHRlcnMpICYmIGV4ZWN1dGVkVGVzdHMgPT09IDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihwaWNvY29sb3JzLnJlZChcIlxcbk5vIHRlc3RzIG1hdGNoZWQgdGhlIHByb3ZpZGVkIGZpbHRlcnNcIikpXG4gICAgICAgIGF3YWl0IGZpbmFsaXplUHJvZmlsZShcIm5vLXRlc3RzXCIpXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgfVxuXG4gICAgICAvLyBSZXBvcnQgdGhlIHNsb3dlc3QgdGVzdHMgc28gc3VpdGUgaG90c3BvdHMgYXJlIHZpc2libGUgZXZlcnkgcnVuLiBEZWZhdWx0cyB0b1xuICAgICAgLy8gdGhlIHRvcCAxMDsgdHVuZSB3aXRoIFZFTE9DSU9VU19TTE9XX1RFU1RfQ09VTlQgKDAgZGlzYWJsZXMpLiBTa2lwcGVkIGZvclxuICAgICAgLy8gc2luZ2xlLXRlc3QgcnVucyB3aGVyZSBpdCB3b3VsZCBqdXN0IGJlIG5vaXNlLlxuICAgICAgY29uc3Qgc2xvd1Rlc3RDb3VudCA9IHJlc29sdmVTbG93VGVzdENvdW50KHByb2Nlc3MuZW52LlZFTE9DSU9VU19TTE9XX1RFU1RfQ09VTlQpXG5cbiAgICAgIGlmIChzbG93VGVzdENvdW50ID4gMCAmJiBleGVjdXRlZFRlc3RzID4gMSkge1xuICAgICAgICBjb25zdCBzbG93ZXN0VGVzdHMgPSB0ZXN0UnVubmVyLmdldFNsb3dlc3RUZXN0cyhzbG93VGVzdENvdW50KVxuXG4gICAgICAgIGlmIChzbG93ZXN0VGVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHBpY29jb2xvcnMuY3lhbihgXFxuU2xvd2VzdCAke3Nsb3dlc3RUZXN0cy5sZW5ndGh9IHRlc3RzOmApKVxuXG4gICAgICAgICAgZm9yIChjb25zdCBzbG93VGVzdCBvZiBzbG93ZXN0VGVzdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gc2xvd1Rlc3QuZmlsZVBhdGggJiYgc2xvd1Rlc3QubGluZSA/IGAgKCR7c2xvd1Rlc3QuZmlsZVBhdGh9OiR7c2xvd1Rlc3QubGluZX0pYCA6IFwiXCJcblxuICAgICAgICAgICAgY29uc29sZS5sb2cocGljb2NvbG9ycy5jeWFuKGAgICR7U3RyaW5nKHNsb3dUZXN0LmR1cmF0aW9uTXMpLnBhZFN0YXJ0KDYpfW1zICAke3Nsb3dUZXN0LmZ1bGxEZXNjcmlwdGlvbn0ke2xvY2F0aW9ufWApKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGVzdFJ1bm5lci5pc0ZhaWxlZCgpKSB7XG4gICAgICAgIGF3YWl0IHRlc3RSdW5uZXIucGVyc2lzdEZhaWxlZFRlc3RDb25zb2xlT3V0cHV0c1RvQXNzZXRzKClcbiAgICAgICAgY29uc3QgZmFpbGVkVGVzdHMgPSB0ZXN0UnVubmVyLmdldEZhaWxlZFRlc3REZXRhaWxzKClcblxuICAgICAgICBpZiAoZmFpbGVkVGVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IocGljb2NvbG9ycy5yZWQoXCJcXG5GYWlsZWQgdGVzdHM6XCIpKVxuXG4gICAgICAgICAgZm9yIChjb25zdCBmYWlsZWQgb2YgZmFpbGVkVGVzdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gZmFpbGVkLmZpbGVQYXRoICYmIGZhaWxlZC5saW5lXG4gICAgICAgICAgICAgID8gYCAoJHtmYWlsZWQuZmlsZVBhdGh9OiR7ZmFpbGVkLmxpbmV9KWBcbiAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKHBpY29jb2xvcnMucmVkKGAtICR7ZmFpbGVkLmZ1bGxEZXNjcmlwdGlvbn0ke2xvY2F0aW9ufWApKVxuXG4gICAgICAgICAgICBpZiAoZmFpbGVkLmNvbnNvbGVMb2dQYXRoKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocGljb2NvbG9ycy5yZWQoYCAgQ29uc29sZSBsb2c6ICR7ZmFpbGVkLmNvbnNvbGVMb2dQYXRofWApKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IocGljb2NvbG9ycy5yZWQoYFxcblRlc3QgcnVuIGZhaWxlZCB3aXRoICR7dGVzdFJ1bm5lci5nZXRGYWlsZWRUZXN0cygpfSBmYWlsZWQgdGVzdHMgYW5kICR7dGVzdFJ1bm5lci5nZXRTdWNjZXNzZnVsVGVzdHMoKX0gc3VjY2Vzc2Z1bGxgKSlcbiAgICAgICAgYXdhaXQgZmluYWxpemVQcm9maWxlKFwiZmFpbGVkXCIpXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgfSBlbHNlIGlmICh0ZXN0UnVubmVyLmFyZUFueVRlc3RzRm9jdXNzZWQoKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKHBpY29jb2xvcnMucmVkKGBcXG5Gb2N1c3NlZCBydW4gd2l0aCAke3Rlc3RSdW5uZXIuZ2V0RmFpbGVkVGVzdHMoKX0gZmFpbGVkIHRlc3RzIGFuZCAke3Rlc3RSdW5uZXIuZ2V0U3VjY2Vzc2Z1bFRlc3RzKCl9IHN1Y2Nlc3NmdWxsYCkpXG4gICAgICAgIGF3YWl0IGZpbmFsaXplUHJvZmlsZShcImZvY3VzZWRcIilcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhwaWNvY29sb3JzLmdyZWVuKGBcXG5UZXN0IHJ1biBzdWNjZWVkZWQgd2l0aCAke3Rlc3RSdW5uZXIuZ2V0U3VjY2Vzc2Z1bFRlc3RzKCl9IHN1Y2Nlc3NmdWwgdGVzdHNgKSlcbiAgICAgICAgYXdhaXQgZmluYWxpemVQcm9maWxlKFwicGFzc2VkXCIpXG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmaW5hbGl6ZVByb2ZpbGUoXCJlcnJvclwiKVxuICAgICAgfSBjYXRjaCAocHJvZmlsZUVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihbZXJyb3IsIHByb2ZpbGVFcnJvcl0sIFwiVGVzdCBjb21tYW5kIGFuZCBwcm9maWxlIGZpbmFsaXphdGlvbiBib3RoIGZhaWxlZFwiLCB7Y2F1c2U6IHByb2ZpbGVFcnJvcn0pXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYW5kIHZhbGlkYXRlcyBwcm9maWxpbmcgcGF0aHMgYmVmb3JlIHRlc3QgZGlzY292ZXJ5IHN0YXJ0cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUmF3IHByb2ZpbGluZyBvcHRpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY3dkIC0gQ29tbWFuZCB3b3JraW5nIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYXJncy5wcm9maWxlIC0gV2hldGhlciBjb25zb2xlIHByb2ZpbGluZyB3YXMgcmVxdWVzdGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnByb2ZpbGVKc29uUGF0aF0gLSBSaWNoIHByb2ZpbGUgb3V0cHV0IHBhdGguXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudGltaW5nTWFuaWZlc3RQYXRoXSAtIFRpbWluZyBtYW5pZmVzdCBpbnB1dCBwYXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aF0gLSBUaW1pbmcgbWFuaWZlc3Qgb3V0cHV0IHBhdGguXG4gKiBAcmV0dXJucyB7e3Byb2ZpbGU6IGJvb2xlYW4sIHByb2ZpbGVKc29uUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLCB0aW1pbmdNYW5pZmVzdFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCwgdGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWR9fSAtIFJlc29sdmVkIHByb2ZpbGluZyBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRlc3RQcm9maWxlT3B0aW9ucyh7Y3dkLCBwcm9maWxlLCBwcm9maWxlSnNvblBhdGgsIHRpbWluZ01hbmlmZXN0UGF0aCwgdGltaW5nTWFuaWZlc3RPdXRwdXRQYXRofSkge1xuICBjb25zdCByZXNvbHZlZFByb2ZpbGVKc29uUGF0aCA9IHByb2ZpbGVKc29uUGF0aCA/IHBhdGgucmVzb2x2ZShjd2QsIHByb2ZpbGVKc29uUGF0aCkgOiB1bmRlZmluZWRcbiAgY29uc3QgcmVzb2x2ZWRUaW1pbmdNYW5pZmVzdFBhdGggPSB0aW1pbmdNYW5pZmVzdFBhdGggPyBwYXRoLnJlc29sdmUoY3dkLCB0aW1pbmdNYW5pZmVzdFBhdGgpIDogdW5kZWZpbmVkXG4gIGNvbnN0IHJlc29sdmVkVGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoID0gdGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoXG4gICAgPyBwYXRoLnJlc29sdmUoY3dkLCB0aW1pbmdNYW5pZmVzdE91dHB1dFBhdGgpXG4gICAgOiB1bmRlZmluZWRcblxuICBpZiAocmVzb2x2ZWRQcm9maWxlSnNvblBhdGggJiYgcmVzb2x2ZWRUaW1pbmdNYW5pZmVzdE91dHB1dFBhdGggJiYgcmVzb2x2ZWRQcm9maWxlSnNvblBhdGggPT09IHJlc29sdmVkVGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGVzdCBwcm9maWxpbmcgb3V0cHV0IHBhdGhzIG11c3QgYmUgZGlmZmVyZW50XCIpXG4gIH1cblxuICBpZiAocmVzb2x2ZWRUaW1pbmdNYW5pZmVzdFBhdGggJiYgKFxuICAgIHJlc29sdmVkUHJvZmlsZUpzb25QYXRoID09PSByZXNvbHZlZFRpbWluZ01hbmlmZXN0UGF0aCB8fFxuICAgIHJlc29sdmVkVGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoID09PSByZXNvbHZlZFRpbWluZ01hbmlmZXN0UGF0aFxuICApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGVzdCBwcm9maWxpbmcgb3V0cHV0cyBtdXN0IG5vdCBvdmVyd3JpdGUgLS10aW1pbmctbWFuaWZlc3QgaW5wdXRcIilcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcHJvZmlsZTogcHJvZmlsZSB8fCBCb29sZWFuKHJlc29sdmVkUHJvZmlsZUpzb25QYXRoIHx8IHJlc29sdmVkVGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoKSxcbiAgICBwcm9maWxlSnNvblBhdGg6IHJlc29sdmVkUHJvZmlsZUpzb25QYXRoLFxuICAgIHRpbWluZ01hbmlmZXN0UGF0aDogcmVzb2x2ZWRUaW1pbmdNYW5pZmVzdFBhdGgsXG4gICAgdGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoOiByZXNvbHZlZFRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aFxuICB9XG59XG5cbi8qKlxuICogTG9hZHMgYW5kIHZhbGlkYXRlcyBhbiBleHBsaWNpdGx5IHN1cHBsaWVkIHBsYWluIEpTT04gdGltaW5nIG1hbmlmZXN0LlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHRpbWluZ01hbmlmZXN0UGF0aCAtIFRpbWluZyBtYW5pZmVzdCBwYXRoLlxuICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPiB8IHVuZGVmaW5lZD59IC0gQ2Fub25pY2FsIG1hbmlmZXN0LCBvciB1bmRlZmluZWQgd2hlbiBub3QgcmVxdWVzdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFRpbWluZ01hbmlmZXN0KHRpbWluZ01hbmlmZXN0UGF0aCkge1xuICBpZiAoIXRpbWluZ01hbmlmZXN0UGF0aCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGxldCBjb250ZW50XG5cbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUodGltaW5nTWFuaWZlc3RQYXRoLCBcInV0ZjhcIilcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWFkIHRpbWluZyBtYW5pZmVzdDogJHt0aW1pbmdNYW5pZmVzdFBhdGh9YCwge2NhdXNlOiBlcnJvcn0pXG4gIH1cblxuICBsZXQgcGFyc2VkXG5cbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnQpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgdGltaW5nIG1hbmlmZXN0OiAke3RpbWluZ01hbmlmZXN0UGF0aH1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZVRpbWluZ01hbmlmZXN0KHBhcnNlZCwge3NvdXJjZTogYFRpbWluZyBtYW5pZmVzdCAke3RpbWluZ01hbmlmZXN0UGF0aH1gfSlcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBob3cgbWFueSBzbG93ZXN0IHRlc3RzIHRvIHJlcG9ydCBmcm9tIHRoZSBgVkVMT0NJT1VTX1NMT1dfVEVTVF9DT1VOVGBcbiAqIGVudiB2YWx1ZTogZGVmYXVsdHMgdG8gMTAgd2hlbiB1bnNldDsgMCAob3IgYW4gdW5wYXJzZWFibGUgdmFsdWUpIGRpc2FibGVzIHRoZVxuICogcmVwb3J0OyBvdGhlcndpc2UgdGhlIGZsb29yZWQsIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHJhd0VudlZhbHVlIC0gUmF3IGVudiB2YWx1ZS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gTnVtYmVyIG9mIHNsb3dlc3QgdGVzdHMgdG8gcmVwb3J0ICgwIGRpc2FibGVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTbG93VGVzdENvdW50KHJhd0VudlZhbHVlKSB7XG4gIGlmIChyYXdFbnZWYWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMTBcblxuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihOdW1iZXIocmF3RW52VmFsdWUpKSB8fCAwKVxufVxuIl19
|
|
296
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9ub2RlL2NsaS9jb21tYW5kcy90ZXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFdBQVcsTUFBTSxpQ0FBaUMsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUNuQyxPQUFPLGVBQWUsTUFBTSwwQ0FBMEMsQ0FBQTtBQUN0RSxPQUFPLFlBQVksTUFBTSxzQ0FBc0MsQ0FBQTtBQUMvRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQTtBQUM5RyxPQUFPLFVBQVUsTUFBTSxvQ0FBb0MsQ0FBQTtBQUMzRCxPQUFPLGlCQUFpQixNQUFNLDRDQUE0QyxDQUFBO0FBQzFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxZQUFZLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQTtBQUNsRyxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLHlCQUF5QixFQUN6QixzQkFBc0IsRUFDdkIsTUFBTSx3Q0FBd0MsQ0FBQTtBQUMvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUV2RSxNQUFNLENBQUMsT0FBTyxPQUFPLHdCQUF5QixTQUFRLFdBQVc7SUFDL0QsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLHdCQUF3QixFQUFFLENBQUE7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRTlDLElBQUksU0FBUyxDQUFBO1FBQ2IsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFBO1FBRXRCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lB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QjtJQUN6RCxJQUFJLENBQUMsa0JBQWtCO1FBQUUsT0FBTyxTQUFTLENBQUE7SUFFekMsSUFBSSxPQUFPLENBQUE7SUFFWCxJQUFJLENBQUM7UUFDSCxPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBQ3pELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsa0JBQWtCLEVBQUUsRUFBRSxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO0lBQzFGLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQTtJQUVWLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0Msa0JBQWtCLEVBQUUsRUFBRSxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO0lBQzNGLENBQUM7SUFFRCxPQUFPLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxFQUFDLE1BQU0sRUFBRSxtQkFBbUIsa0JBQWtCLEVBQUUsRUFBQyxDQUFDLENBQUE7QUFDMUYsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxXQUFXO0lBQzlDLElBQUksV0FBVyxLQUFLLFNBQVM7UUFBRSxPQUFPLEVBQUUsQ0FBQTtJQUV4QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7QUFDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQmFzZUNvbW1hbmQgZnJvbSBcIi4uLy4uLy4uLy4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBwaWNvY29sb3JzIGZyb20gXCJwaWNvY29sb3JzXCJcbmltcG9ydCBUZXN0RmlsZXNGaW5kZXIgZnJvbSBcIi4uLy4uLy4uLy4uL3Rlc3RpbmcvdGVzdC1maWxlcy1maW5kZXIuanNcIlxuaW1wb3J0IFRlc3RQcm9maWxlciBmcm9tIFwiLi4vLi4vLi4vLi4vdGVzdGluZy90ZXN0LXByb2ZpbGVyLmpzXCJcbmltcG9ydCB7IGZvcm1hdFRlc3RQcm9maWxlU3VtbWFyeSwgd3JpdGVUZXN0UHJvZmlsZU91dHB1dHMgfSBmcm9tIFwiLi4vLi4vLi4vLi4vdGVzdGluZy90ZXN0LXByb2ZpbGUtb3V0cHV0LmpzXCJcbmltcG9ydCBUZXN0UnVubmVyIGZyb20gXCIuLi8uLi8uLi8uLi90ZXN0aW5nL3Rlc3QtcnVubmVyLmpzXCJcbmltcG9ydCBUZXN0U3VpdGVTcGxpdHRlciBmcm9tIFwiLi4vLi4vLi4vLi4vdGVzdGluZy90ZXN0LXN1aXRlLXNwbGl0dGVyLmpzXCJcbmltcG9ydCB7IG5vcm1hbGl6ZUV4YW1wbGVQYXR0ZXJucywgcGFyc2VGaWx0ZXJzIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3Rlc3RpbmcvdGVzdC1maWx0ZXItcGFyc2VyLmpzXCJcbmltcG9ydCB7XG4gIGNhbm9uaWNhbFRpbWluZ01hbmlmZXN0UGF0aCxcbiAgdGltaW5nTWFuaWZlc3RGaWxlU2V0SGFzaCxcbiAgdmFsaWRhdGVUaW1pbmdNYW5pZmVzdFxufSBmcm9tIFwiLi4vLi4vLi4vLi4vdGVzdGluZy90aW1pbmctbWFuaWZlc3QuanNcIlxuaW1wb3J0IHsgcHJlcGFyZVNvdXJjZVBlZXJQYWNrYWdlIH0gZnJvbSBcIi4uLy4uL3NvdXJjZS1wZWVyLXBhY2thZ2UuanNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNDbGlDb21tYW5kc1Rlc3QgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgYXdhaXQgcHJlcGFyZVNvdXJjZVBlZXJQYWNrYWdlKClcbiAgICB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5zZXRFbnZpcm9ubWVudChcInRlc3RcIilcblxuICAgIGxldCBkaXJlY3RvcnlcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IFtdXG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuVkVMT0NJT1VTX1RFU1RfRElSKSB7XG4gICAgICBkaXJlY3RvcnkgPSBwcm9jZXNzLmVudi5WRUxPQ0lPVVNfVEVTVF9ESVJcbiAgICAgIGRpcmVjdG9yaWVzLnB1c2gocHJvY2Vzcy5lbnYuVkVMT0NJT1VTX1RFU1RfRElSKVxuICAgIH0gZWxzZSB7XG4gICAgICBkaXJlY3RvcnkgPSB0aGlzLmRpcmVjdG9yeSgpXG4gICAgICBkaXJlY3Rvcmllcy5wdXNoKGAke3RoaXMuZGlyZWN0b3J5KCl9L19fdGVzdHNfX2ApXG4gICAgICBkaXJlY3Rvcmllcy5wdXNoKGAke3RoaXMuZGlyZWN0b3J5KCl9L3Rlc3RzYClcbiAgICAgIGRpcmVjdG9yaWVzLnB1c2goYCR7dGhpcy5kaXJlY3RvcnkoKX0vc3BlY2ApXG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgaW5jbHVkZVRhZ3MsXG4gICAgICBleGNsdWRlVGFncyxcbiAgICAgIGV4YW1wbGVQYXR0ZXJucyxcbiAgICAgIGZpbHRlcmVkUHJvY2Vzc0FyZ3MsXG4gICAgICBncm91cHMsXG4gICAgICBncm91cE51bWJlcixcbiAgICAgIHByb2ZpbGUsXG4gICAgICBwcm9maWxlSnNvblBhdGgsXG4gICAgICB0aW1pbmdNYW5pZmVzdFBhdGgsXG4gICAgICB0aW1pbmdNYW5pZmVzdE91dHB1dFBhdGhcbiAgICB9ID0gcGFyc2VGaWx0ZXJzKHRoaXMucHJvY2Vzc0FyZ3MgfHwgW10pXG4gICAgY29uc3QgcHJvZmlsZU9wdGlvbnMgPSByZXNvbHZlVGVzdFByb2ZpbGVPcHRpb25zKHtcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICAgIHByb2ZpbGUsXG4gICAgICBwcm9maWxlSnNvblBhdGgsXG4gICAgICB0aW1pbmdNYW5pZmVzdFBhdGgsXG4gICAgICB0aW1pbmdNYW5pZmVzdE91dHB1dFBhdGhcbiAgICB9KVxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHtcbiAgICAgIGV4Y2x1ZGVUYWdDb3VudDogZXhjbHVkZVRhZ3MubGVuZ3RoLFxuICAgICAgaGFzRXhhbXBsZUZpbHRlcnM6IGV4YW1wbGVQYXR0ZXJucy5sZW5ndGggPiAwLFxuICAgICAgaW5jbHVkZVRhZ0NvdW50OiBpbmNsdWRlVGFncy5sZW5ndGgsXG4gICAgICBzaGFyZDogZ3JvdXBzICE9PSB1bmRlZmluZWQgJiYgZ3JvdXBOdW1iZXIgIT09IHVuZGVmaW5lZCA/IHtncm91cHMsIGdyb3VwTnVtYmVyfSA6IHVuZGVmaW5lZFxuICAgIH1cbiAgICBjb25zdCBwcm9maWxlciA9IHByb2ZpbGVPcHRpb25zLnByb2ZpbGVcbiAgICAgID8gbmV3IFRlc3RQcm9maWxlcih7Y29uZmlndXJhdGlvbjogdGhpcy5nZXRDb25maWd1cmF0aW9uKCksIHByb2plY3REaXJlY3Rvcnk6IGRpcmVjdG9yeSwgc2VsZWN0aW9ufSlcbiAgICAgIDogdW5kZWZpbmVkXG4gICAgY29uc3QgdGVzdEZpbGVzRmluZGVyID0gbmV3IFRlc3RGaWxlc0ZpbmRlcih7ZGlyZWN0b3J5LCBkaXJlY3RvcmllcywgcHJvY2Vzc0FyZ3M6IGZpbHRlcmVkUHJvY2Vzc0FyZ3N9KVxuICAgIC8qKiBAdHlwZSB7VGVzdFJ1bm5lciB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgdGVzdFJ1bm5lclxuICAgIGxldCBwcm9maWxlRmluYWxpemVkID0gZmFsc2VcblxuICAgIC8qKlxuICAgICAqIEZpbmFsaXplcyByZXF1ZXN0ZWQgb3V0cHV0cyBvbmNlIGZvciBldmVyeSBjb21tYW5kIG91dGNvbWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0YXR1cyAtIFJ1biBzdGF0dXMuXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgcmVxdWVzdGVkIG91dHB1dHMgYXJlIHdyaXR0ZW4uXG4gICAgICovXG4gICAgY29uc3QgZmluYWxpemVQcm9maWxlID0gYXN5bmMgKHN0YXR1cykgPT4ge1xuICAgICAgaWYgKCFwcm9maWxlciB8fCBwcm9maWxlRmluYWxpemVkKSByZXR1cm5cblxuICAgICAgcHJvZmlsZUZpbmFsaXplZCA9IHRydWVcbiAgICAgIGNvbnN0IGZhaWxlZCA9IHRlc3RSdW5uZXI/LmdldEZhaWxlZFRlc3RzKCkgPz8gMFxuICAgICAgY29uc3QgcGFzc2VkID0gdGVzdFJ1bm5lcj8uZ2V0U3VjY2Vzc2Z1bFRlc3RzKCkgPz8gMFxuICAgICAgY29uc3QgcHJvZmlsZURvY3VtZW50ID0gcHJvZmlsZXIuZmluaXNoKHtcbiAgICAgICAgY291bnRzOiB7XG4gICAgICAgICAgZGlzY292ZXJlZDogdGVzdFJ1bm5lcj8uZ2V0VGVzdHNDb3VudCgpID8/IDAsXG4gICAgICAgICAgZXhlY3V0ZWQ6IHRlc3RSdW5uZXI/LmdldEV4ZWN1dGVkVGVzdHNDb3VudCgpID8/IDAsXG4gICAgICAgICAgZmFpbGVkLFxuICAgICAgICAgIHBhc3NlZFxuICAgICAgICB9LFxuICAgICAgICBmb2N1c2VkOiBCb29sZWFuKHRlc3RSdW5uZXI/LmFueVRlc3RzRm9jdXNzZWQpLFxuICAgICAgICBzdGF0dXNcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHdyaXRlVGVzdFByb2ZpbGVPdXRwdXRzKHtcbiAgICAgICAgcHJvZmlsZTogcHJvZmlsZURvY3VtZW50LFxuICAgICAgICBwcm9maWxlSnNvblBhdGg6IHByb2ZpbGVPcHRpb25zLnByb2ZpbGVKc29uUGF0aCxcbiAgICAgICAgdGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoOiBwcm9maWxlT3B0aW9ucy50aW1pbmdNYW5pZmVzdE91dHB1dFBhdGhcbiAgICAgIH0pXG4gICAgICBjb25zb2xlLmxvZyhgXFxuJHtmb3JtYXRUZXN0UHJvZmlsZVN1bW1hcnkocHJvZmlsZURvY3VtZW50LCBwcm9maWxlT3B0aW9ucyl9YClcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGlzY292ZXJUZXN0RmlsZXMgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWluZ01hbmlmZXN0ID0gYXdhaXQgbG9hZFRpbWluZ01hbmlmZXN0KHByb2ZpbGVPcHRpb25zLnRpbWluZ01hbmlmZXN0UGF0aClcbiAgICAgICAgbGV0IGRpc2NvdmVyZWRUZXN0RmlsZXMgPSBhd2FpdCB0ZXN0RmlsZXNGaW5kZXIuZmluZFRlc3RGaWxlcygpXG4gICAgICAgIGNvbnN0IGxpbmVGaWx0ZXJzID0gdGVzdEZpbGVzRmluZGVyLmdldExpbmVGaWx0ZXJzQnlGaWxlKClcblxuICAgICAgICBpZiAocHJvZmlsZXIpIHtcbiAgICAgICAgICBjb25zdCBkaXNjb3ZlcmVkRmlsZVBhdGhzID0gZGlzY292ZXJlZFRlc3RGaWxlcy5tYXAoKGZpbGVQYXRoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsVGltaW5nTWFuaWZlc3RQYXRoKHBhdGgucmVsYXRpdmUoZGlyZWN0b3J5LCBmaWxlUGF0aCkpXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHByb2ZpbGVyLnNldFNlbGVjdGlvbih7XG4gICAgICAgICAgICBkaXNjb3ZlcmVkRmlsZUNvdW50OiBkaXNjb3ZlcmVkVGVzdEZpbGVzLmxlbmd0aCxcbiAgICAgICAgICAgIGhhc0xpbmVGaWx0ZXJzOiBPYmplY3Qua2V5cyhsaW5lRmlsdGVycykubGVuZ3RoID4gMCxcbiAgICAgICAgICAgIHBhdGhCYXNlOiBwcm9jZXNzLmVudi5WRUxPQ0lPVVNfVEVTVF9ESVIgPyBcInRlc3QtZGlyZWN0b3J5XCIgOiBcImNvbmZpZ3VyYXRpb24tZGlyZWN0b3J5XCIsXG4gICAgICAgICAgICB0ZXN0RmlsZVNldEhhc2g6IHRpbWluZ01hbmlmZXN0RmlsZVNldEhhc2goZGlzY292ZXJlZEZpbGVQYXRocylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdyb3VwcyAhPT0gdW5kZWZpbmVkIHx8IGdyb3VwTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoZ3JvdXBzID09PSB1bmRlZmluZWQgfHwgZ3JvdXBOdW1iZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQm90aCAtLWdyb3VwcyBhbmQgLS1ncm91cC1udW1iZXIgbXVzdCBiZSBwcm92aWRlZCB0b2dldGhlclwiKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNwbGl0dGVyID0gbmV3IFRlc3RTdWl0ZVNwbGl0dGVyKHtcbiAgICAgICAgICAgIGdyb3VwcyxcbiAgICAgICAgICAgIGdyb3VwTnVtYmVyLFxuICAgICAgICAgICAgdGVzdEZpbGVzOiBkaXNjb3ZlcmVkVGVzdEZpbGVzLFxuICAgICAgICAgICAgYmFzZURpcmVjdG9yeTogZGlyZWN0b3J5LFxuICAgICAgICAgICAgdGltaW5nTWFuaWZlc3RcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgaWYgKHByb2ZpbGVPcHRpb25zLnRpbWluZ01hbmlmZXN0UGF0aCkge1xuICAgICAgICAgICAgY29uc3QgY292ZXJhZ2UgPSBzcGxpdHRlci5nZXRUaW1pbmdNYW5pZmVzdENvdmVyYWdlKClcblxuICAgICAgICAgICAgY29uc29sZS5sb2cocGljb2NvbG9ycy5jeWFuKFxuICAgICAgICAgICAgICBgVGltaW5nIG1hbmlmZXN0IGNvdmVyYWdlOiBtZWFzdXJlZD0ke2NvdmVyYWdlLm1lYXN1cmVkRmlsZXN9IGAgK1xuICAgICAgICAgICAgICBgaGV1cmlzdGljPSR7Y292ZXJhZ2UuaGV1cmlzdGljRmlsZXN9IHN0YWxlPSR7Y292ZXJhZ2Uuc3RhbGVFbnRyaWVzfWBcbiAgICAgICAgICAgICkpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGlzY292ZXJlZFRlc3RGaWxlcyA9IHNwbGl0dGVyLmdldEdyb3VwRmlsZXMoKVxuICAgICAgICAgIGNvbnNvbGUubG9nKHBpY29jb2xvcnMuY3lhbihgUnVubmluZyBncm91cCAke2dyb3VwTnVtYmVyfSBvZiAke2dyb3Vwc30gKCR7ZGlzY292ZXJlZFRlc3RGaWxlcy5sZW5ndGh9IGZpbGVzKWApKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRpc2NvdmVyZWRUZXN0RmlsZXNcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRlc3RGaWxlcyA9IHByb2ZpbGVyXG4gICAgICAgID8gYXdhaXQgcHJvZmlsZXIubWVhc3VyZVBoYXNlKFwiZGlzY292ZXJ5XCIsIGRpc2NvdmVyVGVzdEZpbGVzKVxuICAgICAgICA6IGF3YWl0IGRpc2NvdmVyVGVzdEZpbGVzKClcblxuICAgICAgcHJvZmlsZXI/LnNldFNlbGVjdGlvbih7ZmlsZUNvdW50OiB0ZXN0RmlsZXMubGVuZ3RofSlcbiAgICAgIHRlc3RSdW5uZXIgPSBuZXcgVGVzdFJ1bm5lcih7XG4gICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLFxuICAgICAgICBleGNsdWRlVGFncyxcbiAgICAgICAgaW5jbHVkZVRhZ3MsXG4gICAgICAgIHRlc3RGaWxlcyxcbiAgICAgICAgbGluZUZpbHRlcnM6IHRlc3RGaWxlc0ZpbmRlci5nZXRMaW5lRmlsdGVyc0J5RmlsZSgpLFxuICAgICAgICBleGFtcGxlUGF0dGVybnM6IG5vcm1hbGl6ZUV4YW1wbGVQYXR0ZXJucyhleGFtcGxlUGF0dGVybnMpLFxuICAgICAgICBwcm9maWxlclxuICAgICAgfSlcbiAgICAgIGNvbnN0IGFjdGl2ZVRlc3RSdW5uZXIgPSB0ZXN0UnVubmVyXG4gICAgICBsZXQgc2lnbmFsSGFuZGxlZCA9IGZhbHNlXG5cbiAgICAgIGNvbnN0IGhhbmRsZVNpZ25hbCA9IGFzeW5jICgvKiogQHR5cGUge3N0cmluZ30gKi8gc2lnbmFsKSA9PiB7XG4gICAgICAgIGlmIChzaWduYWxIYW5kbGVkKSByZXR1cm5cbiAgICAgICAgc2lnbmFsSGFuZGxlZCA9IHRydWVcbiAgICAgICAgcHJvZmlsZXI/LmludGVycnVwdCgpXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcblJlY2VpdmVkICR7c2lnbmFsfSwgcnVubmluZyBhZnRlckFsbCBob29rcyBiZWZvcmUgZXhpdC4uLmApXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhY3RpdmVUZXN0UnVubmVyLnJ1bkFmdGVyQWxsc0ZvckFjdGl2ZVNjb3BlcygpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB3aGlsZSBydW5uaW5nIGFmdGVyQWxsIGhvb2tzOlwiLCBlcnJvcilcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZmluYWxpemVQcm9maWxlKFwiaW50ZXJydXB0ZWRcIilcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB3aGlsZSB3cml0aW5nIGludGVycnVwdGVkIHRlc3QgcHJvZmlsZTpcIiwgZXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxMzApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5vbmNlKFwiU0lHSU5UXCIsICgpID0+IHsgdm9pZCBoYW5kbGVTaWduYWwoXCJTSUdJTlRcIikgfSlcbiAgICAgIHByb2Nlc3Mub25jZShcIlNJR1RFUk1cIiwgKCkgPT4geyB2b2lkIGhhbmRsZVNpZ25hbChcIlNJR1RFUk1cIikgfSlcblxuICAgICAgYXdhaXQgdGVzdFJ1bm5lci5wcmVwYXJlKClcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZUV4Y2x1ZGVUYWdDb3VudCA9IHRlc3RSdW5uZXIuZ2V0RXhjbHVkZVRhZ1NldCgpLnNpemVcblxuICAgICAgcHJvZmlsZXI/LnNldFNlbGVjdGlvbih7ZXhjbHVkZVRhZ0NvdW50OiBlZmZlY3RpdmVFeGNsdWRlVGFnQ291bnR9KVxuXG4gICAgICBpZiAodGVzdFJ1bm5lci5nZXRUZXN0c0NvdW50KCkgPT09IDApIHtcbiAgICAgICAgYXdhaXQgZmluYWxpemVQcm9maWxlKFwibm8tdGVzdHNcIilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Rlc3RSdW5uZXIuZ2V0VGVzdHNDb3VudCgpfSB0ZXN0cyB3YXMgZm91bmQgaW4gJHt0ZXN0RmlsZXMubGVuZ3RofSBmaWxlKHMpYClcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGVzdFJ1bm5lci5ydW4oKVxuXG4gICAgICBjb25zdCBleGVjdXRlZFRlc3RzID0gdGVzdFJ1bm5lci5nZXRFeGVjdXRlZFRlc3RzQ291bnQoKVxuICAgICAgY29uc3QgbGluZUZpbHRlcnMgPSB0ZXN0UnVubmVyLmdldExpbmVGaWx0ZXJzKClcbiAgICAgIGNvbnN0IGhhc0xpbmVGaWx0ZXJzID0gT2JqZWN0LmtleXMobGluZUZpbHRlcnMpLmxlbmd0aCA+IDBcbiAgICAgIGNvbnN0IGhhc0V4YW1wbGVGaWx0ZXJzID0gZXhhbXBsZVBhdHRlcm5zLmxlbmd0aCA+IDBcbiAgICAgIGNvbnN0IGhhc1RhZ0ZpbHRlcnMgPSBpbmNsdWRlVGFncy5sZW5ndGggPiAwIHx8IGVmZmVjdGl2ZUV4Y2x1ZGVUYWdDb3VudCA+IDBcblxuICAgICAgaWYgKChoYXNUYWdGaWx0ZXJzIHx8IGhhc0xpbmVGaWx0ZXJzIHx8IGhhc0V4YW1wbGVGaWx0ZXJzKSAmJiB0ZXN0UnVubmVyLmhhc05vTWF0Y2hlcygpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IocGljb2NvbG9ycy5yZWQoXCJcXG5ObyB0ZXN0cyBtYXRjaGVkIHRoZSBwcm92aWRlZCBmaWx0ZXJzXCIpKVxuICAgICAgICBhd2FpdCBmaW5hbGl6ZVByb2ZpbGUoXCJuby10ZXN0c1wiKVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cblxuICAgICAgLy8gUmVwb3J0IHRoZSBzbG93ZXN0IHRlc3RzIHNvIHN1aXRlIGhvdHNwb3RzIGFyZSB2aXNpYmxlIGV2ZXJ5IHJ1bi4gRGVmYXVsdHMgdG9cbiAgICAgIC8vIHRoZSB0b3AgMTA7IHR1bmUgd2l0aCBWRUxPQ0lPVVNfU0xPV19URVNUX0NPVU5UICgwIGRpc2FibGVzKS4gU2tpcHBlZCBmb3JcbiAgICAgIC8vIHNpbmdsZS10ZXN0IHJ1bnMgd2hlcmUgaXQgd291bGQganVzdCBiZSBub2lzZS5cbiAgICAgIGNvbnN0IHNsb3dUZXN0Q291bnQgPSByZXNvbHZlU2xvd1Rlc3RDb3VudChwcm9jZXNzLmVudi5WRUxPQ0lPVVNfU0xPV19URVNUX0NPVU5UKVxuXG4gICAgICBpZiAoc2xvd1Rlc3RDb3VudCA+IDAgJiYgZXhlY3V0ZWRUZXN0cyA+IDEpIHtcbiAgICAgICAgY29uc3Qgc2xvd2VzdFRlc3RzID0gdGVzdFJ1bm5lci5nZXRTbG93ZXN0VGVzdHMoc2xvd1Rlc3RDb3VudClcblxuICAgICAgICBpZiAoc2xvd2VzdFRlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhwaWNvY29sb3JzLmN5YW4oYFxcblNsb3dlc3QgJHtzbG93ZXN0VGVzdHMubGVuZ3RofSB0ZXN0czpgKSlcblxuICAgICAgICAgIGZvciAoY29uc3Qgc2xvd1Rlc3Qgb2Ygc2xvd2VzdFRlc3RzKSB7XG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHNsb3dUZXN0LmZpbGVQYXRoICYmIHNsb3dUZXN0LmxpbmUgPyBgICgke3Nsb3dUZXN0LmZpbGVQYXRofToke3Nsb3dUZXN0LmxpbmV9KWAgOiBcIlwiXG5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHBpY29jb2xvcnMuY3lhbihgICAke1N0cmluZyhzbG93VGVzdC5kdXJhdGlvbk1zKS5wYWRTdGFydCg2KX1tcyAgJHtzbG93VGVzdC5mdWxsRGVzY3JpcHRpb259JHtsb2NhdGlvbn1gKSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRlc3RSdW5uZXIuaXNGYWlsZWQoKSkge1xuICAgICAgICBhd2FpdCB0ZXN0UnVubmVyLnBlcnNpc3RGYWlsZWRUZXN0Q29uc29sZU91dHB1dHNUb0Fzc2V0cygpXG4gICAgICAgIGNvbnN0IGZhaWxlZFRlc3RzID0gdGVzdFJ1bm5lci5nZXRGYWlsZWRUZXN0RGV0YWlscygpXG5cbiAgICAgICAgaWYgKGZhaWxlZFRlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKHBpY29jb2xvcnMucmVkKFwiXFxuRmFpbGVkIHRlc3RzOlwiKSlcblxuICAgICAgICAgIGZvciAoY29uc3QgZmFpbGVkIG9mIGZhaWxlZFRlc3RzKSB7XG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGZhaWxlZC5maWxlUGF0aCAmJiBmYWlsZWQubGluZVxuICAgICAgICAgICAgICA/IGAgKCR7ZmFpbGVkLmZpbGVQYXRofToke2ZhaWxlZC5saW5lfSlgXG4gICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihwaWNvY29sb3JzLnJlZChgLSAke2ZhaWxlZC5mdWxsRGVzY3JpcHRpb259JHtsb2NhdGlvbn1gKSlcblxuICAgICAgICAgICAgaWYgKGZhaWxlZC5jb25zb2xlTG9nUGF0aCkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHBpY29jb2xvcnMucmVkKGAgIENvbnNvbGUgbG9nOiAke2ZhaWxlZC5jb25zb2xlTG9nUGF0aH1gKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGVzdFJ1bm5lci5nZXROb3RSdW5UZXN0cygpID4gMCkgY29uc29sZS5lcnJvcihgJHt0ZXN0UnVubmVyLmdldE5vdFJ1blRlc3RzKCl9IHRlc3RzIG5vdCBydW4gYmVjYXVzZSBhIHNoYXJlZCByZXNvdXJjZSBmYWlsZWRgKVxuICAgICAgICBjb25zb2xlLmVycm9yKHBpY29jb2xvcnMucmVkKGBcXG5UZXN0IHJ1biBmYWlsZWQgd2l0aCAke3Rlc3RSdW5uZXIuZ2V0RmFpbGVkVGVzdHMoKX0gZmFpbGVkIHRlc3RzIGFuZCAke3Rlc3RSdW5uZXIuZ2V0U3VjY2Vzc2Z1bFRlc3RzKCl9IHN1Y2Nlc3NmdWxsYCkpXG4gICAgICAgIGF3YWl0IGZpbmFsaXplUHJvZmlsZShcImZhaWxlZFwiKVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH0gZWxzZSBpZiAodGVzdFJ1bm5lci5hcmVBbnlUZXN0c0ZvY3Vzc2VkKCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihwaWNvY29sb3JzLnJlZChgXFxuRm9jdXNzZWQgcnVuIHdpdGggJHt0ZXN0UnVubmVyLmdldEZhaWxlZFRlc3RzKCl9IGZhaWxlZCB0ZXN0cyBhbmQgJHt0ZXN0UnVubmVyLmdldFN1Y2Nlc3NmdWxUZXN0cygpfSBzdWNjZXNzZnVsbGApKVxuICAgICAgICBhd2FpdCBmaW5hbGl6ZVByb2ZpbGUoXCJmb2N1c2VkXCIpXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2cocGljb2NvbG9ycy5ncmVlbihgXFxuVGVzdCBydW4gc3VjY2VlZGVkIHdpdGggJHt0ZXN0UnVubmVyLmdldFN1Y2Nlc3NmdWxUZXN0cygpfSBzdWNjZXNzZnVsIHRlc3RzYCkpXG4gICAgICAgIGF3YWl0IGZpbmFsaXplUHJvZmlsZShcInBhc3NlZFwiKVxuICAgICAgICBwcm9jZXNzLmV4aXQoMClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZmluYWxpemVQcm9maWxlKFwiZXJyb3JcIilcbiAgICAgIH0gY2F0Y2ggKHByb2ZpbGVFcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoW2Vycm9yLCBwcm9maWxlRXJyb3JdLCBcIlRlc3QgY29tbWFuZCBhbmQgcHJvZmlsZSBmaW5hbGl6YXRpb24gYm90aCBmYWlsZWRcIiwge2NhdXNlOiBwcm9maWxlRXJyb3J9KVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIGFuZCB2YWxpZGF0ZXMgcHJvZmlsaW5nIHBhdGhzIGJlZm9yZSB0ZXN0IGRpc2NvdmVyeSBzdGFydHMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFJhdyBwcm9maWxpbmcgb3B0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmN3ZCAtIENvbW1hbmQgd29ya2luZyBkaXJlY3RvcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFyZ3MucHJvZmlsZSAtIFdoZXRoZXIgY29uc29sZSBwcm9maWxpbmcgd2FzIHJlcXVlc3RlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5wcm9maWxlSnNvblBhdGhdIC0gUmljaCBwcm9maWxlIG91dHB1dCBwYXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnRpbWluZ01hbmlmZXN0UGF0aF0gLSBUaW1pbmcgbWFuaWZlc3QgaW5wdXQgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy50aW1pbmdNYW5pZmVzdE91dHB1dFBhdGhdIC0gVGltaW5nIG1hbmlmZXN0IG91dHB1dCBwYXRoLlxuICogQHJldHVybnMge3twcm9maWxlOiBib29sZWFuLCBwcm9maWxlSnNvblBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCwgdGltaW5nTWFuaWZlc3RQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsIHRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkfX0gLSBSZXNvbHZlZCBwcm9maWxpbmcgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZXN0UHJvZmlsZU9wdGlvbnMoe2N3ZCwgcHJvZmlsZSwgcHJvZmlsZUpzb25QYXRoLCB0aW1pbmdNYW5pZmVzdFBhdGgsIHRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aH0pIHtcbiAgY29uc3QgcmVzb2x2ZWRQcm9maWxlSnNvblBhdGggPSBwcm9maWxlSnNvblBhdGggPyBwYXRoLnJlc29sdmUoY3dkLCBwcm9maWxlSnNvblBhdGgpIDogdW5kZWZpbmVkXG4gIGNvbnN0IHJlc29sdmVkVGltaW5nTWFuaWZlc3RQYXRoID0gdGltaW5nTWFuaWZlc3RQYXRoID8gcGF0aC5yZXNvbHZlKGN3ZCwgdGltaW5nTWFuaWZlc3RQYXRoKSA6IHVuZGVmaW5lZFxuICBjb25zdCByZXNvbHZlZFRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aCA9IHRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aFxuICAgID8gcGF0aC5yZXNvbHZlKGN3ZCwgdGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoKVxuICAgIDogdW5kZWZpbmVkXG5cbiAgaWYgKHJlc29sdmVkUHJvZmlsZUpzb25QYXRoICYmIHJlc29sdmVkVGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoICYmIHJlc29sdmVkUHJvZmlsZUpzb25QYXRoID09PSByZXNvbHZlZFRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRlc3QgcHJvZmlsaW5nIG91dHB1dCBwYXRocyBtdXN0IGJlIGRpZmZlcmVudFwiKVxuICB9XG5cbiAgaWYgKHJlc29sdmVkVGltaW5nTWFuaWZlc3RQYXRoICYmIChcbiAgICByZXNvbHZlZFByb2ZpbGVKc29uUGF0aCA9PT0gcmVzb2x2ZWRUaW1pbmdNYW5pZmVzdFBhdGggfHxcbiAgICByZXNvbHZlZFRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aCA9PT0gcmVzb2x2ZWRUaW1pbmdNYW5pZmVzdFBhdGhcbiAgKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRlc3QgcHJvZmlsaW5nIG91dHB1dHMgbXVzdCBub3Qgb3ZlcndyaXRlIC0tdGltaW5nLW1hbmlmZXN0IGlucHV0XCIpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHByb2ZpbGU6IHByb2ZpbGUgfHwgQm9vbGVhbihyZXNvbHZlZFByb2ZpbGVKc29uUGF0aCB8fCByZXNvbHZlZFRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aCksXG4gICAgcHJvZmlsZUpzb25QYXRoOiByZXNvbHZlZFByb2ZpbGVKc29uUGF0aCxcbiAgICB0aW1pbmdNYW5pZmVzdFBhdGg6IHJlc29sdmVkVGltaW5nTWFuaWZlc3RQYXRoLFxuICAgIHRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aDogcmVzb2x2ZWRUaW1pbmdNYW5pZmVzdE91dHB1dFBhdGhcbiAgfVxufVxuXG4vKipcbiAqIExvYWRzIGFuZCB2YWxpZGF0ZXMgYW4gZXhwbGljaXRseSBzdXBwbGllZCBwbGFpbiBKU09OIHRpbWluZyBtYW5pZmVzdC5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB0aW1pbmdNYW5pZmVzdFBhdGggLSBUaW1pbmcgbWFuaWZlc3QgcGF0aC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCB1bmRlZmluZWQ+fSAtIENhbm9uaWNhbCBtYW5pZmVzdCwgb3IgdW5kZWZpbmVkIHdoZW4gbm90IHJlcXVlc3RlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRUaW1pbmdNYW5pZmVzdCh0aW1pbmdNYW5pZmVzdFBhdGgpIHtcbiAgaWYgKCF0aW1pbmdNYW5pZmVzdFBhdGgpIHJldHVybiB1bmRlZmluZWRcblxuICBsZXQgY29udGVudFxuXG4gIHRyeSB7XG4gICAgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHRpbWluZ01hbmlmZXN0UGF0aCwgXCJ1dGY4XCIpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVhZCB0aW1pbmcgbWFuaWZlc3Q6ICR7dGltaW5nTWFuaWZlc3RQYXRofWAsIHtjYXVzZTogZXJyb3J9KVxuICB9XG5cbiAgbGV0IHBhcnNlZFxuXG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIHRpbWluZyBtYW5pZmVzdDogJHt0aW1pbmdNYW5pZmVzdFBhdGh9YCwge2NhdXNlOiBlcnJvcn0pXG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVUaW1pbmdNYW5pZmVzdChwYXJzZWQsIHtzb3VyY2U6IGBUaW1pbmcgbWFuaWZlc3QgJHt0aW1pbmdNYW5pZmVzdFBhdGh9YH0pXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgaG93IG1hbnkgc2xvd2VzdCB0ZXN0cyB0byByZXBvcnQgZnJvbSB0aGUgYFZFTE9DSU9VU19TTE9XX1RFU1RfQ09VTlRgXG4gKiBlbnYgdmFsdWU6IGRlZmF1bHRzIHRvIDEwIHdoZW4gdW5zZXQ7IDAgKG9yIGFuIHVucGFyc2VhYmxlIHZhbHVlKSBkaXNhYmxlcyB0aGVcbiAqIHJlcG9ydDsgb3RoZXJ3aXNlIHRoZSBmbG9vcmVkLCBub24tbmVnYXRpdmUgaW50ZWdlci5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSByYXdFbnZWYWx1ZSAtIFJhdyBlbnYgdmFsdWUuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIE51bWJlciBvZiBzbG93ZXN0IHRlc3RzIHRvIHJlcG9ydCAoMCBkaXNhYmxlcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2xvd1Rlc3RDb3VudChyYXdFbnZWYWx1ZSkge1xuICBpZiAocmF3RW52VmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDEwXG5cbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGguZmxvb3IoTnVtYmVyKHJhd0VudlZhbHVlKSkgfHwgMClcbn1cbiJdfQ==
|
|
@@ -84,7 +84,15 @@ export default class VeoliciousHttpServerClient {
|
|
|
84
84
|
_drainDoneRequests(): Promise<void>;
|
|
85
85
|
sendDoneRequests(): Promise<void>;
|
|
86
86
|
/**
|
|
87
|
-
*
|
|
87
|
+
* Sends a finished response to the client. Owns the framework-owned
|
|
88
|
+
* `Vary: Accept-Encoding` dimension (emitted for every selected
|
|
89
|
+
* representation — transformed, identity, 406, and file — and for
|
|
90
|
+
* header-present and header-absent requests alike, so it is stable across
|
|
91
|
+
* requests on the same connection; never added when compression is disabled,
|
|
92
|
+
* the response is truly bodyless, or the application supplied a fixed
|
|
93
|
+
* `Content-Encoding`) and the file 406 rule (a sendFile response whose
|
|
94
|
+
* client forbids identity is answered with the empty 406, the file is never
|
|
95
|
+
* opened or streamed, and `onFinished` settles once as "completed").
|
|
88
96
|
* @param {RequestRunner} requestRunner - Request runner.
|
|
89
97
|
* @returns {Promise<void>} - Resolves when complete.
|
|
90
98
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/index.js"],"names":[],"mappings":"AAOA,OAAO,MAAM,MAAM,iBAAiB,CAAA;AACpC,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,aAAa,MAAM,qBAAqB,CAAA;AAE/C,OAAO,gBAAgB,MAAM,wBAAwB,CAAA;AAerD,MAAM,CAAC,OAAO,OAAO,0BAA0B;IAwBtC,MAAM;IACN,WAAW;IACX,aAAa;IACb,aAAa;IAElB;;iCAE6B;IACxB,cAAc,EADT,aAAa,EAAE;IAGzB,sEAAsE;IACjE,oBAAoB,EADd,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IA4D7D,cAAc;IA2Kd,gBAAgB;IAxQvB,MAAM,6DAAqB;IAC3B,KAAK,SAAY;IAEjB;;yBAEqB;IACrB,wBAAwB,EADd,OAAO,CACe;IAEhC;;yBAEqB;IACrB,yBAAyB,EADf,OAAO,CACgB;IAEjC;;;;;;OAMG;IACH,YAAY,EAAC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAC,EAJpD;QAAqB,WAAW,EAAxB,MAAM,CACd;QAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO,CAChD;QAAsB,aAAa,AAAnC,CACF,EADU,MAAM,CAChB;KACsD,EAetD;IAED;;;;OAIG;IACH,uBAAuB,CAAC,OAAO,EAHpB,MAGoB,GAFlB,IAAI,CAgBhB;IAED;;;;OAIG;IACH,uBAAuB,CAAC,OAAO,EAHpB,MAGoB,GAFlB,IAAI,CAgBhB;IAED;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAHX,KAGW,GAFT,IAAI,CAehB;IAED,qBAAqB,aAkCpB;IAED;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAHD,MAGC,GAFC,IAAI,CAgEhB;IAED;;;;OAIG;IACH,mBAAmB,CAAC,OAAO,EAHhB,OAAO,cAAc,EAAE,OAGP,GAFd,OAAO,CAOnB;IAED;;;OAGG;IACH,mBAAmB,IAFN,IAAI,CAyEhB;IAED,WAAW,sBAOV;IAED;;;;;;OAMG;IACG,kBAAkB,IAFX,OAAO,CAAC,IAAI,CAAC,CAkBzB;IAEK,gBAAgB,kBA6BrB;IAED
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/index.js"],"names":[],"mappings":"AAOA,OAAO,MAAM,MAAM,iBAAiB,CAAA;AACpC,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,aAAa,MAAM,qBAAqB,CAAA;AAE/C,OAAO,gBAAgB,MAAM,wBAAwB,CAAA;AAerD,MAAM,CAAC,OAAO,OAAO,0BAA0B;IAwBtC,MAAM;IACN,WAAW;IACX,aAAa;IACb,aAAa;IAElB;;iCAE6B;IACxB,cAAc,EADT,aAAa,EAAE;IAGzB,sEAAsE;IACjE,oBAAoB,EADd,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IA4D7D,cAAc;IA2Kd,gBAAgB;IAxQvB,MAAM,6DAAqB;IAC3B,KAAK,SAAY;IAEjB;;yBAEqB;IACrB,wBAAwB,EADd,OAAO,CACe;IAEhC;;yBAEqB;IACrB,yBAAyB,EADf,OAAO,CACgB;IAEjC;;;;;;OAMG;IACH,YAAY,EAAC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAC,EAJpD;QAAqB,WAAW,EAAxB,MAAM,CACd;QAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO,CAChD;QAAsB,aAAa,AAAnC,CACF,EADU,MAAM,CAChB;KACsD,EAetD;IAED;;;;OAIG;IACH,uBAAuB,CAAC,OAAO,EAHpB,MAGoB,GAFlB,IAAI,CAgBhB;IAED;;;;OAIG;IACH,uBAAuB,CAAC,OAAO,EAHpB,MAGoB,GAFlB,IAAI,CAgBhB;IAED;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAHX,KAGW,GAFT,IAAI,CAehB;IAED,qBAAqB,aAkCpB;IAED;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAHD,MAGC,GAFC,IAAI,CAgEhB;IAED;;;;OAIG;IACH,mBAAmB,CAAC,OAAO,EAHhB,OAAO,cAAc,EAAE,OAGP,GAFd,OAAO,CAOnB;IAED;;;OAGG;IACH,mBAAmB,IAFN,IAAI,CAyEhB;IAED,WAAW,sBAOV;IAED;;;;;;OAMG;IACG,kBAAkB,IAFX,OAAO,CAAC,IAAI,CAAC,CAkBzB;IAEK,gBAAgB,kBA6BrB;IAED;;;;;;;;;;;;OAYG;IACG,YAAY,CAAC,aAAa,EAHrB,aAGqB,GAFnB,OAAO,CAAC,IAAI,CAAC,CAmLzB;IAED;;;;;;OAMG;IACG,cAAc,CAAC,QAAQ,EALlB,MAKkB,EAAE,QAAQ,EAJ5B,OAI4B,EAAE,UAAU,EAHxC,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAGtB,GAFtC,OAAO,CAAC,IAAI,CAAC,CAuBzB;IAED;;;;;;;OAOG;IACG,iBAAiB,CAAC,EAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAC,EALnD;QAAqB,QAAQ,EAArB,MAAM,CACd;QAAiF,UAAU,EAAnF,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAC1E;QAAsC,MAAM,EAApC,WAAW,GAAG,SAAS,CAC/B;KAEmD,GAFzC,OAAO,CAAC,IAAI,CAAC,CAoBzB;IAED;;;OAGG;IACG,yBAAyB,IAFlB,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;;OAIG;IACH,qBAAqB,CAAC,OAAO,EAHlB,OAAO,cAAc,EAAE,OAAO,GAAG,OAAO,wBAAwB,EAAE,OAGhD,GAFhB,OAAO,CAenB;CACF"}
|