fetch-retrier 0.3.6 → 0.4.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # Fetch Retrier
2
2
 
3
- A lightweight wrapper around `fetch` that adds **retries**, **per-attempt timeout**, and **full jitter** backoff. Pass standard `RequestInit` options (`method`, `body`, `credentials`, and more) for POST/PUT APIs and other HTTP calls that may be rate-limited (429) or temporarily unavailable (5xx).
3
+ A lightweight wrapper around `fetch` that adds **retries**, **per-attempt timeout**, **full jitter** backoff, and **option validation**. Pass standard `RequestInit` options (`method`, `body`, `credentials`, and more) for POST/PUT APIs and other HTTP calls that may be rate-limited or temporarily unavailable.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/fetch-retrier.svg)](https://www.npmjs.com/package/fetch-retrier)
6
6
  [![npm downloads](https://img.shields.io/npm/dm/fetch-retrier.svg)](https://www.npmjs.com/package/fetch-retrier)
@@ -9,14 +9,16 @@ A lightweight wrapper around `fetch` that adds **retries**, **per-attempt timeou
9
9
 
10
10
  ## Features
11
11
 
12
- - **Configurable retries** – Set the maximum number of attempts per request.
13
- - **Per-attempt timeout** – Abort each attempt when it exceeds a given duration.
14
- - **Full jitter backoff** – Exponential backoff with random jitter (AWS-style) between retries.
12
+ - **Configurable retries** – Set the maximum number of attempts per request (`retries >= 1`).
13
+ - **Per-attempt timeout** – Abort each attempt when it exceeds a given duration (`timeoutMs > 0`).
14
+ - **Full jitter backoff** – Exponential backoff with random jitter (AWS-style) between retries (`baseBackoffMs >= 0`).
15
+ - **Option validation** – Invalid numeric options throw `FetchRetrierInvalidOptionsError` at call time.
15
16
  - **RequestInit forwarding** – Pass `method`, `body`, `credentials`, `redirect`, and other `fetch` options via `init` on every attempt.
16
17
  - **Header shorthand** – Optional top-level `headers` override `init.headers` when both are set.
17
- - **Custom retry predicate** – Control which responses trigger a retry (default: 429, 500, 502, 503, 504).
18
+ - **Default retry policy** – Retries transient HTTP statuses (408, 425, 429, 500, 502, 503, 504) via `defaultShouldRetry` and `DEFAULT_RETRYABLE_HTTP_STATUSES`.
19
+ - **Extensible retry predicate** – Compose `defaultShouldRetry` with custom `shouldRetry` logic.
18
20
  - **External cancellation** – Pass an `AbortSignal` to cancel in-flight requests.
19
- - **Typed errors** – `FetchRetrierHttpError`, `FetchRetrierNetworkError`, `FetchRetrierAbortError`, and related classes.
21
+ - **Typed errors** – `FetchRetrierHttpError`, `FetchRetrierNetworkError`, `FetchRetrierAbortError`, `FetchRetrierInvalidOptionsError`, and related classes.
20
22
  - **TypeScript** – Exported types including `RequestOptions` and `FetchInitOptions`.
21
23
 
22
24
  ## Installation
@@ -80,17 +82,27 @@ The same `init` (including `body`) is applied on every retry attempt. Per-attemp
80
82
 
81
83
  ### Custom retry logic
82
84
 
85
+ Extend the default predicate instead of reimplementing the status list:
86
+
83
87
  ```typescript
88
+ import {
89
+ DEFAULT_RETRYABLE_HTTP_STATUSES,
90
+ defaultShouldRetry,
91
+ fetchRetrier,
92
+ } from 'fetch-retrier';
93
+
84
94
  const response = await fetchRetrier('https://api.example.com/data', {
85
95
  retries: 5,
86
96
  timeoutMs: 10000,
87
97
  baseBackoffMs: 500,
88
98
  shouldRetry: (res, body) => {
89
- if ([429, 500, 502, 503].includes(res.status)) return true;
99
+ if (defaultShouldRetry(res, body)) return true;
90
100
  if (res.status === 200 && body.includes('"retry": true')) return true;
91
101
  return false;
92
102
  },
93
103
  });
104
+
105
+ // DEFAULT_RETRYABLE_HTTP_STATUSES is [408, 425, 429, 500, 502, 503, 504]
94
106
  ```
95
107
 
96
108
  ### Cancellation with `AbortController`
@@ -111,6 +123,7 @@ await fetchRetrier('https://api.example.com/data', {
111
123
  ### Retry and error behavior
112
124
 
113
125
  - **Success** – If `response.ok` is true, the response is returned immediately.
126
+ - **Invalid options** – If `retries < 1`, `timeoutMs <= 0`, or `baseBackoffMs < 0`, `FetchRetrierInvalidOptionsError` is thrown before any request is made.
114
127
  - **Retriable failure** – If the response is not OK and `shouldRetry(response, body)` returns true, the client waits (full jitter backoff) and retries until `retries` is exhausted. On the last attempt, `FetchRetrierHttpError` is thrown (includes `status`).
115
128
  - **Non-retriable failure** – If `shouldRetry` returns false, `FetchRetrierHttpError` is thrown immediately (e.g. `Non-retriable HTTP error: 404`).
116
129
  - **Timeout** – If a request exceeds `timeoutMs`, it is aborted and retried until `retries` is exhausted; the final failure is `FetchRetrierAbortError`.
@@ -121,13 +134,20 @@ await fetchRetrier('https://api.example.com/data', {
121
134
 
122
135
  | Option | Type | Required | Description |
123
136
  |--------|------|----------|-------------|
124
- | `retries` | `number` | Yes | Maximum number of attempts (including the first request). |
125
- | `timeoutMs` | `number` | Yes | Timeout in milliseconds for each attempt. Exceeded attempts are aborted and retried. |
126
- | `baseBackoffMs` | `number` | Yes | Base delay in milliseconds for backoff. Delay is capped at `baseBackoffMs * 2^attempt` and randomized (full jitter). |
137
+ | `retries` | `number` | Yes | Maximum number of attempts (including the first request). Must be `>= 1`. |
138
+ | `timeoutMs` | `number` | Yes | Timeout in milliseconds for each attempt. Exceeded attempts are aborted and retried. Must be `> 0`. |
139
+ | `baseBackoffMs` | `number` | Yes | Base delay in milliseconds for backoff. Delay is capped at `baseBackoffMs * 2^attempt` and randomized (full jitter). Must be `>= 0` (`0` skips backoff delay). |
127
140
  | `init` | `FetchInitOptions` | No | `fetch` options forwarded to every attempt: `method`, `body`, `credentials`, `redirect`, `mode`, `cache`, etc. `signal` is reserved for internal timeout and cancellation. |
128
141
  | `headers` | `Record<string, string>` | No | Headers sent on every attempt. Overrides `init.headers` when both are set. |
129
142
  | `signal` | `AbortSignal` | No | External abort signal. If already aborted, `FetchRetrierAlreadyAbortedError` is thrown. If aborted during an attempt, the request is aborted and retried until `retries` is exhausted. |
130
- | `shouldRetry` | `(response: Response, body: string) => boolean` | No | Called after `response.text()` when `response.ok` is false. Return `true` to retry. Default: 429, 500, 502, 503, 504. |
143
+ | `shouldRetry` | `(response: Response, body: string) => boolean` | No | Called after `response.text()` when `response.ok` is false. Return `true` to retry. Default: `defaultShouldRetry` (statuses in `DEFAULT_RETRYABLE_HTTP_STATUSES`: 408, 425, 429, 500, 502, 503, 504). |
144
+
145
+ ### Exported helpers
146
+
147
+ | Export | Description |
148
+ |--------|-------------|
149
+ | `defaultShouldRetry` | Default `shouldRetry` predicate; compose with custom logic. |
150
+ | `DEFAULT_RETRYABLE_HTTP_STATUSES` | Readonly list of HTTP status codes retried by default. |
131
151
 
132
152
  ## Requirements
133
153
 
@@ -136,4 +156,4 @@ await fetchRetrier('https://api.example.com/data', {
136
156
 
137
157
  ## License
138
158
 
139
- This project is licensed under the (Apache-2.0) License.
159
+ This project is licensed under the Apache-2.0 License.
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Retry-enabled `fetch` wrapper with per-attempt timeout, full-jitter backoff, and typed errors.
2
+ * Retry-enabled `fetch` wrapper with per-attempt timeout, full-jitter backoff, option validation, and typed errors.
3
3
  *
4
4
  * @module fetch-retrier
5
5
  */
@@ -16,6 +16,9 @@ export type FetchInitOptions = Omit<RequestInit, 'signal'>;
16
16
  *
17
17
  * Request shape is built as `{ ...init, headers?, signal }` on each attempt. Top-level `headers`
18
18
  * override `init.headers` when both are provided.
19
+ *
20
+ * Numeric fields are validated when {@link fetchRetrier} is called; invalid values throw
21
+ * {@link FetchRetrierInvalidOptionsError}.
19
22
  */
20
23
  export interface RequestOptions {
21
24
  /**
@@ -28,12 +31,19 @@ export interface RequestOptions {
28
31
  * The same `init` is reused across retries.
29
32
  */
30
33
  init?: FetchInitOptions;
31
- /** Maximum number of attempts, including the first. */
34
+ /**
35
+ * Maximum number of attempts, including the first.
36
+ * Must be `>= 1`.
37
+ */
32
38
  retries: number;
33
- /** Per-attempt timeout in milliseconds; uses an internal {@link AbortController} when exceeded. */
39
+ /**
40
+ * Per-attempt timeout in milliseconds; uses an internal {@link AbortController} when exceeded.
41
+ * Must be `> 0`.
42
+ */
34
43
  timeoutMs: number;
35
44
  /**
36
45
  * Base backoff in milliseconds for full jitter. The cap for attempt `n` is `baseBackoffMs * 2^n`.
46
+ * Must be `>= 0` (`0` skips backoff delay between attempts).
37
47
  */
38
48
  baseBackoffMs: number;
39
49
  /**
@@ -44,10 +54,11 @@ export interface RequestOptions {
44
54
  /**
45
55
  * Invoked after `response.text()` when `response.ok` is false.
46
56
  * Return `true` to schedule another attempt (until `retries` is exhausted).
47
- * Default: retry on status 429, 500, 502, 503, or 504.
57
+ * Default: {@link defaultShouldRetry} (see {@link DEFAULT_RETRYABLE_HTTP_STATUSES}).
48
58
  *
49
59
  * @param response - Non-OK response from the current attempt
50
60
  * @param body - Response body text from `response.text()`
61
+ * @returns `true` to schedule another attempt (until `retries` is exhausted)
51
62
  */
52
63
  shouldRetry?: (response: Response, body: string) => boolean;
53
64
  }
@@ -99,6 +110,20 @@ export declare class FetchRetrierNetworkError extends Error {
99
110
  */
100
111
  constructor(message?: string, cause?: unknown | undefined);
101
112
  }
113
+ /**
114
+ * Error thrown when {@link RequestOptions} contains invalid numeric values.
115
+ *
116
+ * Subclass of {@link TypeError} for compatibility with `instanceof TypeError`. Distinct from
117
+ * network-level `TypeError` values thrown by `fetch`, which are retried and surfaced as
118
+ * {@link FetchRetrierNetworkError} after the last attempt.
119
+ */
120
+ export declare class FetchRetrierInvalidOptionsError extends TypeError {
121
+ readonly name: string;
122
+ /**
123
+ * @param message - Human-readable reason describing the invalid option
124
+ */
125
+ constructor(message: string);
126
+ }
102
127
  /**
103
128
  * Error thrown when an internal invariant fails (should not happen in normal use).
104
129
  */
@@ -109,17 +134,36 @@ export declare class FetchRetrierUnreachableError extends Error {
109
134
  */
110
135
  constructor(message?: string);
111
136
  }
137
+ /**
138
+ * HTTP status codes retried by default when {@link RequestOptions.shouldRetry} is omitted.
139
+ *
140
+ * Includes transient client/server errors: 408, 425, 429, and common 5xx gateway or overload responses.
141
+ */
142
+ export declare const DEFAULT_RETRYABLE_HTTP_STATUSES: readonly number[];
143
+ /**
144
+ * Default {@link RequestOptions.shouldRetry}: retries responses whose status is in
145
+ * {@link DEFAULT_RETRYABLE_HTTP_STATUSES}.
146
+ *
147
+ * Compose with custom logic, for example:
148
+ * `(res, body) => defaultShouldRetry(res, body) || res.status === 418`.
149
+ *
150
+ * @param response - Response from the failed attempt
151
+ * @param _body - Response body text (unused by the default predicate)
152
+ * @returns `true` when another attempt should be scheduled
153
+ */
154
+ export declare const defaultShouldRetry: (response: Response, _body: string) => boolean;
112
155
  /**
113
156
  * Wraps `fetch` with retries, per-attempt timeout, full-jitter backoff, and optional cancellation.
114
157
  *
115
158
  * Each attempt calls `fetch(url, { ...options.init, headers?, signal })` with an internal
116
159
  * {@link AbortSignal} for `timeoutMs`. Non-OK responses are retried when `shouldRetry` returns
117
- * `true` (default: 429 and 5xx). The same {@link FetchInitOptions} (including `body`) is reused
160
+ * `true` (default: {@link DEFAULT_RETRYABLE_HTTP_STATUSES}). The same {@link FetchInitOptions} (including `body`) is reused
118
161
  * on every attempt.
119
162
  *
120
163
  * @param url - Request URL passed to `fetch`
121
164
  * @param options - {@link RequestOptions} controlling retries, timeout, request init, and cancellation
122
165
  * @returns The first {@link Response} for which `ok` is `true`
166
+ * @throws {FetchRetrierInvalidOptionsError} If `retries < 1`, `timeoutMs <= 0`, or `baseBackoffMs < 0`
123
167
  * @throws {FetchRetrierAlreadyAbortedError} If `options.signal` is already aborted before an attempt
124
168
  * @throws {FetchRetrierHttpError} On a non-OK response that is not retried or after the last attempt
125
169
  * @throws {FetchRetrierNetworkError} On a network `TypeError` after the last attempt
package/lib/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  /**
3
- * Retry-enabled `fetch` wrapper with per-attempt timeout, full-jitter backoff, and typed errors.
3
+ * Retry-enabled `fetch` wrapper with per-attempt timeout, full-jitter backoff, option validation, and typed errors.
4
4
  *
5
5
  * @module fetch-retrier
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.fetchRetrier = exports.FetchRetrierUnreachableError = exports.FetchRetrierNetworkError = exports.FetchRetrierHttpError = exports.FetchRetrierAlreadyAbortedError = exports.FetchRetrierAbortError = void 0;
8
+ exports.fetchRetrier = exports.defaultShouldRetry = exports.DEFAULT_RETRYABLE_HTTP_STATUSES = exports.FetchRetrierUnreachableError = exports.FetchRetrierInvalidOptionsError = exports.FetchRetrierNetworkError = exports.FetchRetrierHttpError = exports.FetchRetrierAlreadyAbortedError = exports.FetchRetrierAbortError = void 0;
9
9
  /**
10
10
  * Error thrown when a request is cancelled by timeout or an external {@link AbortSignal}.
11
11
  */
@@ -70,6 +70,24 @@ class FetchRetrierNetworkError extends Error {
70
70
  }
71
71
  }
72
72
  exports.FetchRetrierNetworkError = FetchRetrierNetworkError;
73
+ /**
74
+ * Error thrown when {@link RequestOptions} contains invalid numeric values.
75
+ *
76
+ * Subclass of {@link TypeError} for compatibility with `instanceof TypeError`. Distinct from
77
+ * network-level `TypeError` values thrown by `fetch`, which are retried and surfaced as
78
+ * {@link FetchRetrierNetworkError} after the last attempt.
79
+ */
80
+ class FetchRetrierInvalidOptionsError extends TypeError {
81
+ /**
82
+ * @param message - Human-readable reason describing the invalid option
83
+ */
84
+ constructor(message) {
85
+ super(message);
86
+ this.name = 'FetchRetrierInvalidOptionsError';
87
+ Object.setPrototypeOf(this, FetchRetrierInvalidOptionsError.prototype);
88
+ }
89
+ }
90
+ exports.FetchRetrierInvalidOptionsError = FetchRetrierInvalidOptionsError;
73
91
  /**
74
92
  * Error thrown when an internal invariant fails (should not happen in normal use).
75
93
  */
@@ -85,25 +103,58 @@ class FetchRetrierUnreachableError extends Error {
85
103
  }
86
104
  exports.FetchRetrierUnreachableError = FetchRetrierUnreachableError;
87
105
  /**
88
- * Default {@link RequestOptions.shouldRetry}: retry on HTTP 429, 500, 502, 503, or 504.
106
+ * HTTP status codes retried by default when {@link RequestOptions.shouldRetry} is omitted.
107
+ *
108
+ * Includes transient client/server errors: 408, 425, 429, and common 5xx gateway or overload responses.
109
+ */
110
+ exports.DEFAULT_RETRYABLE_HTTP_STATUSES = [408, 425, 429, 500, 502, 503, 504];
111
+ /**
112
+ * Default {@link RequestOptions.shouldRetry}: retries responses whose status is in
113
+ * {@link DEFAULT_RETRYABLE_HTTP_STATUSES}.
114
+ *
115
+ * Compose with custom logic, for example:
116
+ * `(res, body) => defaultShouldRetry(res, body) || res.status === 418`.
89
117
  *
90
- * @param res - Response from the failed attempt
118
+ * @param response - Response from the failed attempt
119
+ * @param _body - Response body text (unused by the default predicate)
91
120
  * @returns `true` when another attempt should be scheduled
92
121
  */
93
- const defaultShouldRetry = (res) => {
94
- return [429, 500, 502, 503, 504].includes(res.status);
122
+ const defaultShouldRetry = (response, _body) => {
123
+ return exports.DEFAULT_RETRYABLE_HTTP_STATUSES.includes(response.status);
124
+ };
125
+ exports.defaultShouldRetry = defaultShouldRetry;
126
+ /**
127
+ * Validates retry policy numeric fields on {@link RequestOptions}.
128
+ *
129
+ * Constraints: `retries >= 1`, `timeoutMs > 0`, `baseBackoffMs >= 0`.
130
+ *
131
+ * @param options - Options whose `retries`, `timeoutMs`, and `baseBackoffMs` are checked
132
+ * @throws {FetchRetrierInvalidOptionsError} When any constraint is violated
133
+ */
134
+ const validateRequestOptions = (options) => {
135
+ const { retries, timeoutMs, baseBackoffMs } = options;
136
+ if (retries < 1) {
137
+ throw new FetchRetrierInvalidOptionsError('retries must be >= 1');
138
+ }
139
+ if (timeoutMs <= 0) {
140
+ throw new FetchRetrierInvalidOptionsError('timeoutMs must be > 0');
141
+ }
142
+ if (baseBackoffMs < 0) {
143
+ throw new FetchRetrierInvalidOptionsError('baseBackoffMs must be >= 0');
144
+ }
95
145
  };
96
146
  /**
97
147
  * Wraps `fetch` with retries, per-attempt timeout, full-jitter backoff, and optional cancellation.
98
148
  *
99
149
  * Each attempt calls `fetch(url, { ...options.init, headers?, signal })` with an internal
100
150
  * {@link AbortSignal} for `timeoutMs`. Non-OK responses are retried when `shouldRetry` returns
101
- * `true` (default: 429 and 5xx). The same {@link FetchInitOptions} (including `body`) is reused
151
+ * `true` (default: {@link DEFAULT_RETRYABLE_HTTP_STATUSES}). The same {@link FetchInitOptions} (including `body`) is reused
102
152
  * on every attempt.
103
153
  *
104
154
  * @param url - Request URL passed to `fetch`
105
155
  * @param options - {@link RequestOptions} controlling retries, timeout, request init, and cancellation
106
156
  * @returns The first {@link Response} for which `ok` is `true`
157
+ * @throws {FetchRetrierInvalidOptionsError} If `retries < 1`, `timeoutMs <= 0`, or `baseBackoffMs < 0`
107
158
  * @throws {FetchRetrierAlreadyAbortedError} If `options.signal` is already aborted before an attempt
108
159
  * @throws {FetchRetrierHttpError} On a non-OK response that is not retried or after the last attempt
109
160
  * @throws {FetchRetrierNetworkError} On a network `TypeError` after the last attempt
@@ -111,7 +162,8 @@ const defaultShouldRetry = (res) => {
111
162
  * @throws {FetchRetrierUnreachableError} If the retry loop exits without returning (internal bug)
112
163
  */
113
164
  const fetchRetrier = async (url, options) => {
114
- const { headers, init, retries, timeoutMs, baseBackoffMs, signal: externalSignal, shouldRetry = defaultShouldRetry, } = options;
165
+ const { headers, init, retries, timeoutMs, baseBackoffMs, signal: externalSignal, shouldRetry = exports.defaultShouldRetry, } = options;
166
+ validateRequestOptions({ retries, timeoutMs, baseBackoffMs });
115
167
  for (let attempt = 1; attempt <= retries; attempt++) {
116
168
  if (externalSignal?.aborted) {
117
169
  throw new FetchRetrierAlreadyAbortedError();
@@ -189,4 +241,4 @@ const fullJitter = (base, attempt) => {
189
241
  const cap = base * Math.pow(2, attempt);
190
242
  return Math.floor(Math.random() * cap);
191
243
  };
192
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQW9ESDs7R0FFRztBQUNILE1BQWEsc0JBQXVCLFNBQVEsS0FBSztJQUUvQzs7T0FFRztJQUNILFlBQVksT0FBTyxHQUFHLFNBQVM7UUFDN0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBTEMsU0FBSSxHQUFXLHdCQUF3QixDQUFDO1FBTXhELE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7Q0FDRjtBQVRELHdEQVNDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLCtCQUFnQyxTQUFRLHNCQUFzQjtJQUV6RTs7T0FFRztJQUNILFlBQVksT0FBTyxHQUFHLDRCQUE0QjtRQUNoRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFMQyxTQUFJLEdBQVcsaUNBQWlDLENBQUM7UUFNakUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsK0JBQStCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekUsQ0FBQztDQUNGO0FBVEQsMEVBU0M7QUFFRDs7OztHQUlHO0FBQ0gsTUFBYSxxQkFBc0IsU0FBUSxLQUFLO0lBRTlDOzs7T0FHRztJQUNILFlBQ0UsT0FBZSxFQUNDLE1BQWM7UUFFOUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRkMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQVBkLFNBQUksR0FBVyx1QkFBdUIsQ0FBQztRQVV2RCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvRCxDQUFDO0NBQ0Y7QUFiRCxzREFhQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFhLHdCQUF5QixTQUFRLEtBQUs7SUFFakQ7OztPQUdHO0lBQ0gsWUFBWSxPQUFPLEdBQUcsZUFBZSxFQUFr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QUFNLElBQUksNEJBQTRCLEVBQUUsQ0FBQztBQUMzQyxDQUFDLENBQUM7QUExRVcsUUFBQSxZQUFZLGdCQTBFdkI7QUFFRjs7Ozs7R0FLRztBQUNILE1BQU0sSUFBSSxHQUFHLENBQUMsRUFBVSxFQUFpQixFQUFFO0lBQ3pDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzRCxDQUFDLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsR0FBRyxDQUFDLElBQVksRUFBRSxPQUFlLEVBQVUsRUFBRTtJQUMzRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN6QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJldHJ5LWVuYWJsZWQgYGZldGNoYCB3cmFwcGVyIHdpdGggcGVyLWF0dGVtcHQgdGltZW91dCwgZnVsbC1qaXR0ZXIgYmFja29mZiwgYW5kIHR5cGVkIGVycm9ycy5cbiAqXG4gKiBAbW9kdWxlIGZldGNoLXJldHJpZXJcbiAqL1xuXG4vKipcbiAqIGBmZXRjaGAgb3B0aW9ucyBmb3J3YXJkZWQgdG8gZXZlcnkgYXR0ZW1wdCwgZXhjbHVkaW5nIGBzaWduYWxgLlxuICpcbiAqIFVzZSBmb3IgYG1ldGhvZGAsIGBib2R5YCwgYGNyZWRlbnRpYWxzYCwgYHJlZGlyZWN0YCwgYG1vZGVgLCBgY2FjaGVgLCBhbmQgb3RoZXJcbiAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVxdWVzdEluaXQgfCBSZXF1ZXN0SW5pdH0gZmllbGRzLlxuICogUGVyLWF0dGVtcHQgYWJvcnQgYW5kIHRpbWVvdXQgYXJlIGhhbmRsZWQgaW50ZXJuYWxseSB2aWEgYHNpZ25hbGAgYW5kIG11c3Qgbm90IGJlIHNldCBoZXJlLlxuICovXG5leHBvcnQgdHlwZSBGZXRjaEluaXRPcHRpb25zID0gT21pdDxSZXF1ZXN0SW5pdCwgJ3NpZ25hbCc+O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBmZXRjaFJldHJpZXJ9OiByZXRyeSBwb2xpY3ksIHRpbWVvdXQsIGJhY2tvZmYsIHJlcXVlc3QgcGF5bG9hZCwgYW5kIGNhbmNlbGxhdGlvbi5cbiAqXG4gKiBSZXF1ZXN0IHNoYXBlIGlzIGJ1aWx0IGFzIGB7IC4uLmluaXQsIGhlYWRlcnM/LCBzaWduYWwgfWAgb24gZWFjaCBhdHRlbXB0LiBUb3AtbGV2ZWwgYGhlYWRlcnNgXG4gKiBvdmVycmlkZSBgaW5pdC5oZWFkZXJzYCB3aGVuIGJvdGggYXJlIHByb3ZpZGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIEhUVFAgaGVhZGVycyBzZW50IG9uIGV2ZXJ5IGF0dGVtcHQuXG4gICAqIFdoZW4gYGluaXQuaGVhZGVyc2AgaXMgYWxzbyBzZXQsIHRoZXNlIHZhbHVlcyB0YWtlIHByZWNlZGVuY2UgZm9yIGR1cGxpY2F0ZSBrZXlzLlxuICAgKi9cbiAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHtAbGluayBGZXRjaEluaXRPcHRpb25zfSBtZXJnZWQgaW50byBlYWNoIGBmZXRjaGAgY2FsbCAoZS5nLiBQT1NUIGBtZXRob2RgIGFuZCBKU09OIGBib2R5YCkuXG4gICAqIFRoZSBzYW1lIGBpbml0YCBpcyByZXVzZWQgYWNyb3NzIHJldHJpZXMuXG4gICAqL1xuICBpbml0PzogRmV0Y2hJbml0T3B0aW9ucztcbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGZpcnN0LiAqL1xuICByZXRyaWVzOiBudW1iZXI7XG4gIC8qKiBQZXItYXR0ZW1wdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kczsgdXNlcyBhbiBpbnRlcm5hbCB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSB3aGVuIGV4Y2VlZGVkLiAqL1xuICB0aW1lb3V0TXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIEJhc2UgYmFja29mZiBpbiBtaWxsaXNlY29uZHMgZm9yIGZ1bGwgaml0dGVyLiBUaGUgY2FwIGZvciBhdHRlbXB0IGBuYCBpcyBgYmFzZUJhY2tvZmZNcyAqIDJebmAuXG4gICAqL1xuICBiYXNlQmFja29mZk1zOiBudW1iZXI7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBleHRlcm5hbCB7QGxpbmsgQWJvcnRTaWduYWx9LiBXaGVuIGFib3J0ZWQsIHRoZSBpbi1mbGlnaHQgcmVxdWVzdCBpcyBhYm9ydGVkOyBvbiB0aGVcbiAgICogZmluYWwgYXR0ZW1wdCwgY2FuY2VsbGF0aW9uIHN1cmZhY2VzIGFzIHtAbGluayBGZXRjaFJldHJpZXJBYm9ydEVycm9yfS5cbiAgICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKipcbiAgICogSW52b2tlZCBhZnRlciBgcmVzcG9uc2UudGV4dCgpYCB3aGVuIGByZXNwb25zZS5va2AgaXMgZmFsc2UuXG4gICAqIFJldHVybiBgdHJ1ZWAgdG8gc2NoZWR1bGUgYW5vdGhlciBhdHRlbXB0ICh1bnRpbCBgcmV0cmllc2AgaXMgZXhoYXVzdGVkKS5cbiAgICogRGVmYXVsdDogcmV0cnkgb24gc3RhdHVzIDQyOSwgNTAwLCA1MDIsIDUwMywgb3IgNTA0LlxuICAgKlxuICAgKiBAcGFyYW0gcmVzcG9uc2UgLSBOb24tT0sgcmVzcG9uc2UgZnJvbSB0aGUgY3VycmVudCBhdHRlbXB0XG4gICAqIEBwYXJhbSBib2R5IC0gUmVzcG9uc2UgYm9keSB0ZXh0IGZyb20gYHJlc3BvbnNlLnRleHQoKWBcbiAgICovXG4gIHNob3VsZFJldHJ5PzogKHJlc3BvbnNlOiBSZXNwb25zZSwgYm9keTogc3RyaW5nKSA9PiBib29sZWFuO1xufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGEgcmVxdWVzdCBpcyBjYW5jZWxsZWQgYnkgdGltZW91dCBvciBhbiBleHRlcm5hbCB7QGxpbmsgQWJvcnRTaWduYWx9LlxuICovXG5leHBvcnQgY2xhc3MgRmV0Y2hSZXRyaWVyQWJvcnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nID0gJ0ZldGNoUmV0cmllckFib3J0RXJyb3InO1xuICAvKipcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBIdW1hbi1yZWFkYWJsZSByZWFzb24gKGRlZmF1bHQ6IGAnQWJvcnRlZCdgKVxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSA9ICdBYm9ydGVkJykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBGZXRjaFJldHJpZXJBYm9ydEVycm9yLnByb3RvdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB7QGxpbmsgUmVxdWVzdE9wdGlvbnMuc2lnbmFsfSBpcyBhbHJlYWR5IGFib3J0ZWQgYmVmb3JlIGFuIGF0dGVtcHQgc3RhcnRzLlxuICovXG5leHBvcnQgY2xhc3MgRmV0Y2hSZXRyaWVyQWxyZWFkeUFib3J0ZWRFcnJvciBleHRlbmRzIEZldGNoUmV0cmllckFib3J0RXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBuYW1lOiBzdHJpbmcgPSAnRmV0Y2hSZXRyaWVyQWxyZWFkeUFib3J0ZWRFcnJvcic7XG4gIC8qKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIEh1bWFuLXJlYWRhYmxlIHJlYXNvbiAoZGVmYXVsdDogYCdTaWduYWwgd2FzIGFscmVhZHkgYWJvcnRlZCdgKVxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSA9ICdTaWduYWwgd2FzIGFscmVhZHkgYWJvcnRlZCcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgRmV0Y2hSZXRyaWVyQWxyZWFkeUFib3J0ZWRFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIGEgbm9uLU9LIEhUVFAgc3RhdHVzIGFuZCBubyBmdXJ0aGVyIHJldHJ5IGlzIHBlcmZvcm1lZC5cbiAqXG4gKiBAcHJvcGVydHkgc3RhdHVzIC0gSFRUUCBzdGF0dXMgY29kZSBmcm9tIHRoZSBsYXN0IG5vbi1PSyByZXNwb25zZVxuICovXG5leHBvcnQgY2xhc3MgRmV0Y2hSZXRyaWVySHR0cEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBuYW1lOiBzdHJpbmcgPSAnRmV0Y2hSZXRyaWVySHR0cEVycm9yJztcbiAgLyoqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gRXJyb3IgZGVzY3JpcHRpb25cbiAgICogQHBhcmFtIHN0YXR1cyAtIEhUVFAgc3RhdHVzIGNvZGUgZnJvbSB0aGUgbGFzdCBub24tT0sgcmVzcG9uc2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBGZXRjaFJldHJpZXJIdHRwRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGEgZmV0Y2ggZmFpbHMgd2l0aCBhIG5ldHdvcmstbGV2ZWwgZXJyb3IgKGUuZy4gRE5TIGZhaWx1cmUsIGNvbm5lY3Rpb24gcmVmdXNlZCkuXG4gKlxuICogQHByb3BlcnR5IGNhdXNlIC0gT3JpZ2luYWwgZXJyb3IgZnJvbSB0aGUgdW5kZXJseWluZyBgZmV0Y2hgLCB3aGVuIGF2YWlsYWJsZVxuICovXG5leHBvcnQgY2xhc3MgRmV0Y2hSZXRyaWVyTmV0d29ya0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBuYW1lOiBzdHJpbmcgPSAnRmV0Y2hSZXRyaWVyTmV0d29ya0Vycm9yJztcbiAgLyoqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gSHVtYW4tcmVhZGFibGUgcmVhc29uIChkZWZhdWx0OiBgJ05ldHdvcmsgZXJyb3InYClcbiAgICogQHBhcmFtIGNhdXNlIC0gT3JpZ2luYWwgZXJyb3IgZnJvbSB0aGUgdW5kZXJseWluZyBgZmV0Y2hgLCB3aGVuIGF2YWlsYWJsZVxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSA9ICdOZXR3b3JrIGVycm9yJywgcHVibGljIHJlYWRvbmx5IGNhdXNlPzogdW5rbm93bikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBGZXRjaFJldHJpZXJOZXR3b3JrRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGFuIGludGVybmFsIGludmFyaWFudCBmYWlscyAoc2hvdWxkIG5vdCBoYXBwZW4gaW4gbm9ybWFsIHVzZSkuXG4gKi9cbmV4cG9ydCBjbGFzcyBGZXRjaFJldHJpZXJVbnJlYWNoYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBuYW1lOiBzdHJpbmcgPSAnRmV0Y2hSZXRyaWVyVW5yZWFjaGFibGVFcnJvcic7XG4gIC8qKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIEh1bWFuLXJlYWRhYmxlIHJlYXNvbiAoZGVmYXVsdDogYCdVbnJlYWNoYWJsZSdgKVxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSA9ICdVbnJlYWNoYWJsZScpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgRmV0Y2hSZXRyaWVyVW5yZWFjaGFibGVFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRGVmYXVsdCB7QGxpbmsgUmVxdWVzdE9wdGlvbnMuc2hvdWxkUmV0cnl9OiByZXRyeSBvbiBIVFRQIDQyOSwgNTAwLCA1MDIsIDUwMywgb3IgNTA0LlxuICpcbiAqIEBwYXJhbSByZXMgLSBSZXNwb25zZSBmcm9tIHRoZSBmYWlsZWQgYXR0ZW1wdFxuICogQHJldHVybnMgYHRydWVgIHdoZW4gYW5vdGhlciBhdHRlbXB0IHNob3VsZCBiZSBzY2hlZHVsZWRcbiAqL1xuY29uc3QgZGVmYXVsdFNob3VsZFJldHJ5ID0gKHJlczogUmVzcG9uc2UpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIFs0MjksIDUwMCwgNTAyLCA1MDMsIDUwNF0uaW5jbHVkZXMocmVzLnN0YXR1cyk7XG59O1xuXG4vKipcbiAqIFdyYXBzIGBmZXRjaGAgd2l0aCByZXRyaWVzLCBwZXItYXR0ZW1wdCB0aW1lb3V0LCBmdWxsLWppdHRlciBiYWNrb2ZmLCBhbmQgb3B0aW9uYWwgY2FuY2VsbGF0aW9uLlxuICpcbiAqIEVhY2ggYXR0ZW1wdCBjYWxscyBgZmV0Y2godXJsLCB7IC4uLm9wdGlvbnMuaW5pdCwgaGVhZGVycz8sIHNpZ25hbCB9KWAgd2l0aCBhbiBpbnRlcm5hbFxuICoge0BsaW5rIEFib3J0U2lnbmFsfSBmb3IgYHRpbWVvdXRNc2AuIE5vbi1PSyByZXNwb25zZXMgYXJlIHJldHJpZWQgd2hlbiBgc2hvdWxkUmV0cnlgIHJldHVybnNcbiAqIGB0cnVlYCAoZGVmYXVsdDogNDI5IGFuZCA1eHgpLiBUaGUgc2FtZSB7QGxpbmsgRmV0Y2hJbml0T3B0aW9uc30gKGluY2x1ZGluZyBgYm9keWApIGlzIHJldXNlZFxuICogb24gZXZlcnkgYXR0ZW1wdC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gUmVxdWVzdCBVUkwgcGFzc2VkIHRvIGBmZXRjaGBcbiAqIEBwYXJhbSBvcHRpb25zIC0ge0BsaW5rIFJlcXVlc3RPcHRpb25zfSBjb250cm9sbGluZyByZXRyaWVzLCB0aW1lb3V0LCByZXF1ZXN0IGluaXQsIGFuZCBjYW5jZWxsYXRpb25cbiAqIEByZXR1cm5zIFRoZSBmaXJzdCB7QGxpbmsgUmVzcG9uc2V9IGZvciB3aGljaCBgb2tgIGlzIGB0cnVlYFxuICogQHRocm93cyB7RmV0Y2hSZXRyaWVyQWxyZWFkeUFib3J0ZWRFcnJvcn0gSWYgYG9wdGlvbnMuc2lnbmFsYCBpcyBhbHJlYWR5IGFib3J0ZWQgYmVmb3JlIGFuIGF0dGVtcHRcbiAqIEB0aHJvd3Mge0ZldGNoUmV0cmllckh0dHBFcnJvcn0gT24gYSBub24tT0sgcmVzcG9uc2UgdGhhdCBpcyBub3QgcmV0cmllZCBvciBhZnRlciB0aGUgbGFzdCBhdHRlbXB0XG4gKiBAdGhyb3dzIHtGZXRjaFJldHJpZXJOZXR3b3JrRXJyb3J9IE9uIGEgbmV0d29yayBgVHlwZUVycm9yYCBhZnRlciB0aGUgbGFzdCBhdHRlbXB0XG4gKiBAdGhyb3dzIHtGZXRjaFJldHJpZXJBYm9ydEVycm9yfSBPbiB0aW1lb3V0IG9yIGV4dGVybmFsIGFib3J0IGFmdGVyIHRoZSBsYXN0IGF0dGVtcHRcbiAqIEB0aHJvd3Mge0ZldGNoUmV0cmllclVucmVhY2hhYmxlRXJyb3J9IElmIHRoZSByZXRyeSBsb29wIGV4aXRzIHdpdGhvdXQgcmV0dXJuaW5nIChpbnRlcm5hbCBidWcpXG4gKi9cbmV4cG9ydCBjb25zdCBmZXRjaFJldHJpZXIgPSBhc3luYyAodXJsOiBzdHJpbmcsIG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxSZXNwb25zZT4gPT4ge1xuICBjb25zdCB7XG4gICAgaGVhZGVycyxcbiAgICBpbml0LFxuICAgIHJldHJpZXMsXG4gICAgdGltZW91dE1zLFxuICAgIGJhc2VCYWNrb2ZmTXMsXG4gICAgc2lnbmFsOiBleHRlcm5hbFNpZ25hbCxcbiAgICBzaG91bGRSZXRyeSA9IGRlZmF1bHRTaG91bGRSZXRyeSxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gcmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgaWYgKGV4dGVybmFsU2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRmV0Y2hSZXRyaWVyQWxyZWFkeUFib3J0ZWRFcnJvcigpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGltZW91dE1zKTtcblxuICAgIGNvbnN0IG9uRXh0ZXJuYWxBYm9ydCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgfTtcblxuICAgIGlmIChleHRlcm5hbFNpZ25hbCkge1xuICAgICAgZXh0ZXJuYWxTaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkV4dGVybmFsQWJvcnQpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgLi4uaW5pdCxcbiAgICAgICAgLi4uKGhlYWRlcnMgIT09IHVuZGVmaW5lZCA/IHsgaGVhZGVycyB9IDoge30pLFxuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSk7XG5cbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICBleHRlcm5hbFNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkV4dGVybmFsQWJvcnQpO1xuXG4gICAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgY29uc3QgaXNDb250aW51ZSA9IHNob3VsZFJldHJ5KHJlcywgdGV4dCk7XG5cbiAgICAgIGlmIChpc0NvbnRpbnVlKSB7XG4gICAgICAgIGlmIChhdHRlbXB0ID09PSByZXRyaWVzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZldGNoUmV0cmllckh0dHBFcnJvcihgSFRUUCAke3Jlcy5zdGF0dXN9YCwgcmVzLnN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgd2FpdChmdWxsSml0dGVyKGJhc2VCYWNrb2ZmTXMsIGF0dGVtcHQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBGZXRjaFJldHJpZXJIdHRwRXJyb3IoYE5vbi1yZXRyaWFibGUgSFRUUCBlcnJvcjogJHtyZXMuc3RhdHVzfWAsIHJlcy5zdGF0dXMpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIGV4dGVybmFsU2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uRXh0ZXJuYWxBYm9ydCk7XG5cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGlmIChhdHRlbXB0ID09PSByZXRyaWVzKSB0aHJvdyBlcnIgaW5zdGFuY2VvZiBGZXRjaFJldHJpZXJBYm9ydEVycm9yID8gZXJyIDogbmV3IEZldGNoUmV0cmllckFib3J0RXJyb3IoKTtcbiAgICAgICAgYXdhaXQgd2FpdChmdWxsSml0dGVyKGJhc2VCYWNrb2ZmTXMsIGF0dGVtcHQpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcbiAgICAgICAgaWYgKGF0dGVtcHQgPT09IHJldHJpZXMpIHRocm93IG5ldyBGZXRjaFJldHJpZXJOZXR3b3JrRXJyb3IoJ05ldHdvcmsgZXJyb3InLCBlcnIpO1xuICAgICAgICBhd2FpdCB3YWl0KGZ1bGxKaXR0ZXIoYmFzZUJhY2tvZmZNcywgYXR0ZW1wdCkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBGZXRjaFJldHJpZXJVbnJlYWNoYWJsZUVycm9yKCk7XG59O1xuXG4vKipcbiAqIERlbGF5cyBleGVjdXRpb24gZm9yIHRoZSBnaXZlbiBkdXJhdGlvbiAodXNlZCBiZXR3ZWVuIHJldHJ5IGF0dGVtcHRzKS5cbiAqXG4gKiBAcGFyYW0gbXMgLSBEZWxheSBpbiBtaWxsaXNlY29uZHNcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGBtc2BcbiAqL1xuY29uc3Qgd2FpdCA9IChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufTtcblxuLyoqXG4gKiBGdWxsIGppdHRlciBiYWNrb2ZmOiByYW5kb20gZGVsYXkgaW4gYFswLCBiYXNlICogMl5hdHRlbXB0KWAgbXMgKEFXUy1yZWNvbW1lbmRlZCBwYXR0ZXJuKS5cbiAqXG4gKiBAcGFyYW0gYmFzZSAtIEJhc2UgYmFja29mZiBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSBhdHRlbXB0IC0gMS1iYXNlZCBhdHRlbXB0IGluZGV4IChmaXJzdCByZXRyeSB1c2VzIGBhdHRlbXB0ID09PSAxYClcbiAqIEByZXR1cm5zIFdhaXQgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgbmV4dCBhdHRlbXB0XG4gKi9cbmNvbnN0IGZ1bGxKaXR0ZXIgPSAoYmFzZTogbnVtYmVyLCBhdHRlbXB0OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICBjb25zdCBjYXAgPSBiYXNlICogTWF0aC5wb3coMiwgYXR0ZW1wdCk7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjYXApO1xufTtcbiJdfQ==
244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQStESDs7R0FFRztBQUNILE1BQWEsc0JBQXVCLFNBQVEsS0FBSztJQUUvQzs7T0FFRztJQUNILFlBQVksT0FBTyxHQUFHLFNBQVM7UUFDN0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBTEMsU0FBSSxHQUFXLHdCQUF3QixDQUFDO1FBTXhELE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7Q0FDRjtBQVRELHdEQVNDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLCtCQUFnQyxTQUFRLHNCQUFzQjtJQUV6RTs7T0FFRztJQUNILFlBQVksT0FBTyxHQUFHLDRCQUE0QjtRQUNoRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFMQyxTQUFJLEdBQVcsaUNBQWlDLENBQUM7UUFNakUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsK0JBQStCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekUsQ0FBQztDQUNGO0FBVEQsMEVBU0M7QUFFRDs7OztHQUlHO0FBQ0gsTUFBYSxxQkFBc0IsU0FBUSxLQUFLO0lBRTlDOzs7T0FHRztJQUNILFlBQ0UsT0FBZSxFQUNDLE1BQWM7UUFFOUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRkMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQVBkLFNBQUksR0FBVyx1QkFBdUIsQ0FBQztRQVV2RCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvRCxDQUFDO0NBQ0Y7QUFiRCxzREFhQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFhLHdCQUF5QixTQUFRLEtBQUs7SUFFakQ7OztPQUdHO0lBQ0gsWUFBWSxPQUFPLEdBQUcsZUFBZSxFQUFr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QUFDLEVBQVUsRUFBaUIsRUFBRTtJQUN6QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQyxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFZLEVBQUUsT0FBZSxFQUFVLEVBQUU7SUFDM0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXRyeS1lbmFibGVkIGBmZXRjaGAgd3JhcHBlciB3aXRoIHBlci1hdHRlbXB0IHRpbWVvdXQsIGZ1bGwtaml0dGVyIGJhY2tvZmYsIG9wdGlvbiB2YWxpZGF0aW9uLCBhbmQgdHlwZWQgZXJyb3JzLlxuICpcbiAqIEBtb2R1bGUgZmV0Y2gtcmV0cmllclxuICovXG5cbi8qKlxuICogYGZldGNoYCBvcHRpb25zIGZvcndhcmRlZCB0byBldmVyeSBhdHRlbXB0LCBleGNsdWRpbmcgYHNpZ25hbGAuXG4gKlxuICogVXNlIGZvciBgbWV0aG9kYCwgYGJvZHlgLCBgY3JlZGVudGlhbHNgLCBgcmVkaXJlY3RgLCBgbW9kZWAsIGBjYWNoZWAsIGFuZCBvdGhlclxuICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXF1ZXN0SW5pdCB8IFJlcXVlc3RJbml0fSBmaWVsZHMuXG4gKiBQZXItYXR0ZW1wdCBhYm9ydCBhbmQgdGltZW91dCBhcmUgaGFuZGxlZCBpbnRlcm5hbGx5IHZpYSBgc2lnbmFsYCBhbmQgbXVzdCBub3QgYmUgc2V0IGhlcmUuXG4gKi9cbmV4cG9ydCB0eXBlIEZldGNoSW5pdE9wdGlvbnMgPSBPbWl0PFJlcXVlc3RJbml0LCAnc2lnbmFsJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGZldGNoUmV0cmllcn06IHJldHJ5IHBvbGljeSwgdGltZW91dCwgYmFja29mZiwgcmVxdWVzdCBwYXlsb2FkLCBhbmQgY2FuY2VsbGF0aW9uLlxuICpcbiAqIFJlcXVlc3Qgc2hhcGUgaXMgYnVpbHQgYXMgYHsgLi4uaW5pdCwgaGVhZGVycz8sIHNpZ25hbCB9YCBvbiBlYWNoIGF0dGVtcHQuIFRvcC1sZXZlbCBgaGVhZGVyc2BcbiAqIG92ZXJyaWRlIGBpbml0LmhlYWRlcnNgIHdoZW4gYm90aCBhcmUgcHJvdmlkZWQuXG4gKlxuICogTnVtZXJpYyBmaWVsZHMgYXJlIHZhbGlkYXRlZCB3aGVuIHtAbGluayBmZXRjaFJldHJpZXJ9IGlzIGNhbGxlZDsgaW52YWxpZCB2YWx1ZXMgdGhyb3dcbiAqIHtAbGluayBGZXRjaFJldHJpZXJJbnZhbGlkT3B0aW9uc0Vycm9yfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIVFRQIGhlYWRlcnMgc2VudCBvbiBldmVyeSBhdHRlbXB0LlxuICAgKiBXaGVuIGBpbml0LmhlYWRlcnNgIGlzIGFsc28gc2V0LCB0aGVzZSB2YWx1ZXMgdGFrZSBwcmVjZWRlbmNlIGZvciBkdXBsaWNhdGUga2V5cy5cbiAgICovXG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKipcbiAgICogQWRkaXRpb25hbCB7QGxpbmsgRmV0Y2hJbml0T3B0aW9uc30gbWVyZ2VkIGludG8gZWFjaCBgZmV0Y2hgIGNhbGwgKGUuZy4gUE9TVCBgbWV0aG9kYCBhbmQgSlNPTiBgYm9keWApLlxuICAgKiBUaGUgc2FtZSBgaW5pdGAgaXMgcmV1c2VkIGFjcm9zcyByZXRyaWVzLlxuICAgKi9cbiAgaW5pdD86IEZldGNoSW5pdE9wdGlvbnM7XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBmaXJzdC5cbiAgICogTXVzdCBiZSBgPj0gMWAuXG4gICAqL1xuICByZXRyaWVzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBQZXItYXR0ZW1wdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kczsgdXNlcyBhbiBpbnRlcm5hbCB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSB3aGVuIGV4Y2VlZGVkLlxuICAgKiBNdXN0IGJlIGA+IDBgLlxuICAgKi9cbiAgdGltZW91dE1zOiBudW1iZXI7XG4gIC8qKlxuICAgKiBCYXNlIGJhY2tvZmYgaW4gbWlsbGlzZWNvbmRzIGZvciBmdWxsIGppdHRlci4gVGhlIGNhcCBmb3IgYXR0ZW1wdCBgbmAgaXMgYGJhc2VCYWNrb2ZmTXMgKiAyXm5gLlxuICAgKiBNdXN0IGJlIGA+PSAwYCAoYDBgIHNraXBzIGJhY2tvZmYgZGVsYXkgYmV0d2VlbiBhdHRlbXB0cykuXG4gICAqL1xuICBiYXNlQmFja29mZk1zOiBudW1iZXI7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBleHRlcm5hbCB7QGxpbmsgQWJvcnRTaWduYWx9LiBXaGVuIGFib3J0ZWQsIHRoZSBpbi1mbGlnaHQgcmVxdWVzdCBpcyBhYm9ydGVkOyBvbiB0aGVcbiAgICogZmluYWwgYXR0ZW1wdCwgY2FuY2VsbGF0aW9uIHN1cmZhY2VzIGFzIHtAbGluayBGZXRjaFJldHJpZXJBYm9ydEVycm9yfS5cbiAgICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKipcbiAgICogSW52b2tlZCBhZnRlciBgcmVzcG9uc2UudGV4dCgpYCB3aGVuIGByZXNwb25zZS5va2AgaXMgZmFsc2UuXG4gICAqIFJldHVybiBgdHJ1ZWAgdG8gc2NoZWR1bGUgYW5vdGhlciBhdHRlbXB0ICh1bnRpbCBgcmV0cmllc2AgaXMgZXhoYXVzdGVkKS5cbiAgICogRGVmYXVsdDoge0BsaW5rIGRlZmF1bHRTaG91bGRSZXRyeX0gKHNlZSB7QGxpbmsgREVGQVVMVF9SRVRSWUFCTEVfSFRUUF9TVEFUVVNFU30pLlxuICAgKlxuICAgKiBAcGFyYW0gcmVzcG9uc2UgLSBOb24tT0sgcmVzcG9uc2UgZnJvbSB0aGUgY3VycmVudCBhdHRlbXB0XG4gICAqIEBwYXJhbSBib2R5IC0gUmVzcG9uc2UgYm9keSB0ZXh0IGZyb20gYHJlc3BvbnNlLnRleHQoKWBcbiAgICogQHJldHVybnMgYHRydWVgIHRvIHNjaGVkdWxlIGFub3RoZXIgYXR0ZW1wdCAodW50aWwgYHJldHJpZXNgIGlzIGV4aGF1c3RlZClcbiAgICovXG4gIHNob3VsZFJldHJ5PzogKHJlc3BvbnNlOiBSZXNwb25zZSwgYm9keTogc3RyaW5nKSA9PiBib29sZWFuO1xufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGEgcmVxdWVzdCBpcyBjYW5jZWxsZWQgYnkgdGltZW91dCBvciBhbiBleHRlcm5hbCB7QGxpbmsgQWJvcnRTaWduYWx9LlxuICovXG5leHBvcnQgY2xhc3MgRmV0Y2hSZXRyaWVyQWJvcnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nID0gJ0ZldGNoUmV0cmllckFib3J0RXJyb3InO1xuICAvKipcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBIdW1hbi1yZWFkYWJsZSByZWFzb24gKGRlZmF1bHQ6IGAnQWJvcnRlZCdgKVxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSA9ICdBYm9ydGVkJykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBGZXRjaFJldHJpZXJBYm9ydEVycm9yLnByb3RvdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB7QGxpbmsgUmVxdWVzdE9wdGlvbnMuc2lnbmFsfSBpcyBhbHJlYWR5IGFib3J0ZWQgYmVmb3JlIGFuIGF0dGVtcHQgc3RhcnRzLlxuICovXG5leHBvcnQgY2xhc3MgRmV0Y2hSZXRyaWVyQWxyZWFkeUFib3J0ZWRFcnJvciBleHRlbmRzIEZldGNoUmV0cmllckFib3J0RXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBuYW1lOiBzdHJpbmcgPSAnRmV0Y2hSZXRyaWVyQWxyZWFkeUFib3J0ZWRFcnJvcic7XG4gIC8qKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIEh1bWFuLXJlYWRhYmxlIHJlYXNvbiAoZGVmYXVsdDogYCdTaWduYWwgd2FzIGFscmVhZHkgYWJvcnRlZCdgKVxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSA9ICdTaWduYWwgd2FzIGFscmVhZHkgYWJvcnRlZCcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgRmV0Y2hSZXRyaWVyQWxyZWFkeUFib3J0ZWRFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIGEgbm9uLU9LIEhUVFAgc3RhdHVzIGFuZCBubyBmdXJ0aGVyIHJldHJ5IGlzIHBlcmZvcm1lZC5cbiAqXG4gKiBAcHJvcGVydHkgc3RhdHVzIC0gSFRUUCBzdGF0dXMgY29kZSBmcm9tIHRoZSBsYXN0IG5vbi1PSyByZXNwb25zZVxuICovXG5leHBvcnQgY2xhc3MgRmV0Y2hSZXRyaWVySHR0cEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBuYW1lOiBzdHJpbmcgPSAnRmV0Y2hSZXRyaWVySHR0cEVycm9yJztcbiAgLyoqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gRXJyb3IgZGVzY3JpcHRpb25cbiAgICogQHBhcmFtIHN0YXR1cyAtIEhUVFAgc3RhdHVzIGNvZGUgZnJvbSB0aGUgbGFzdCBub24tT0sgcmVzcG9uc2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBGZXRjaFJldHJpZXJIdHRwRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGEgZmV0Y2ggZmFpbHMgd2l0aCBhIG5ldHdvcmstbGV2ZWwgZXJyb3IgKGUuZy4gRE5TIGZhaWx1cmUsIGNvbm5lY3Rpb24gcmVmdXNlZCkuXG4gKlxuICogQHByb3BlcnR5IGNhdXNlIC0gT3JpZ2luYWwgZXJyb3IgZnJvbSB0aGUgdW5kZXJseWluZyBgZmV0Y2hgLCB3aGVuIGF2YWlsYWJsZVxuICovXG5leHBvcnQgY2xhc3MgRmV0Y2hSZXRyaWVyTmV0d29ya0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBuYW1lOiBzdHJpbmcgPSAnRmV0Y2hSZXRyaWVyTmV0d29ya0Vycm9yJztcbiAgLyoqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gSHVtYW4tcmVhZGFibGUgcmVhc29uIChkZWZhdWx0OiBgJ05ldHdvcmsgZXJyb3InYClcbiAgICogQHBhcmFtIGNhdXNlIC0gT3JpZ2luYWwgZXJyb3IgZnJvbSB0aGUgdW5kZXJseWluZyBgZmV0Y2hgLCB3aGVuIGF2YWlsYWJsZVxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSA9ICdOZXR3b3JrIGVycm9yJywgcHVibGljIHJlYWRvbmx5IGNhdXNlPzogdW5rbm93bikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBGZXRjaFJldHJpZXJOZXR3b3JrRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHtAbGluayBSZXF1ZXN0T3B0aW9uc30gY29udGFpbnMgaW52YWxpZCBudW1lcmljIHZhbHVlcy5cbiAqXG4gKiBTdWJjbGFzcyBvZiB7QGxpbmsgVHlwZUVycm9yfSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGBpbnN0YW5jZW9mIFR5cGVFcnJvcmAuIERpc3RpbmN0IGZyb21cbiAqIG5ldHdvcmstbGV2ZWwgYFR5cGVFcnJvcmAgdmFsdWVzIHRocm93biBieSBgZmV0Y2hgLCB3aGljaCBhcmUgcmV0cmllZCBhbmQgc3VyZmFjZWQgYXNcbiAqIHtAbGluayBGZXRjaFJldHJpZXJOZXR3b3JrRXJyb3J9IGFmdGVyIHRoZSBsYXN0IGF0dGVtcHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBGZXRjaFJldHJpZXJJbnZhbGlkT3B0aW9uc0Vycm9yIGV4dGVuZHMgVHlwZUVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nID0gJ0ZldGNoUmV0cmllckludmFsaWRPcHRpb25zRXJyb3InO1xuICAvKipcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBIdW1hbi1yZWFkYWJsZSByZWFzb24gZGVzY3JpYmluZyB0aGUgaW52YWxpZCBvcHRpb25cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBGZXRjaFJldHJpZXJJbnZhbGlkT3B0aW9uc0Vycm9yLnByb3RvdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBhbiBpbnRlcm5hbCBpbnZhcmlhbnQgZmFpbHMgKHNob3VsZCBub3QgaGFwcGVuIGluIG5vcm1hbCB1c2UpLlxuICovXG5leHBvcnQgY2xhc3MgRmV0Y2hSZXRyaWVyVW5yZWFjaGFibGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nID0gJ0ZldGNoUmV0cmllclVucmVhY2hhYmxlRXJyb3InO1xuICAvKipcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBIdW1hbi1yZWFkYWJsZSByZWFzb24gKGRlZmF1bHQ6IGAnVW5yZWFjaGFibGUnYClcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSAnVW5yZWFjaGFibGUnKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEZldGNoUmV0cmllclVucmVhY2hhYmxlRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEhUVFAgc3RhdHVzIGNvZGVzIHJldHJpZWQgYnkgZGVmYXVsdCB3aGVuIHtAbGluayBSZXF1ZXN0T3B0aW9ucy5zaG91bGRSZXRyeX0gaXMgb21pdHRlZC5cbiAqXG4gKiBJbmNsdWRlcyB0cmFuc2llbnQgY2xpZW50L3NlcnZlciBlcnJvcnM6IDQwOCwgNDI1LCA0MjksIGFuZCBjb21tb24gNXh4IGdhdGV3YXkgb3Igb3ZlcmxvYWQgcmVzcG9uc2VzLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRVRSWUFCTEVfSFRUUF9TVEFUVVNFUzogcmVhZG9ubHkgbnVtYmVyW10gPSBbNDA4LCA0MjUsIDQyOSwgNTAwLCA1MDIsIDUwMywgNTA0XTtcblxuLyoqXG4gKiBEZWZhdWx0IHtAbGluayBSZXF1ZXN0T3B0aW9ucy5zaG91bGRSZXRyeX06IHJldHJpZXMgcmVzcG9uc2VzIHdob3NlIHN0YXR1cyBpcyBpblxuICoge0BsaW5rIERFRkFVTFRfUkVUUllBQkxFX0hUVFBfU1RBVFVTRVN9LlxuICpcbiAqIENvbXBvc2Ugd2l0aCBjdXN0b20gbG9naWMsIGZvciBleGFtcGxlOlxuICogYChyZXMsIGJvZHkpID0+IGRlZmF1bHRTaG91bGRSZXRyeShyZXMsIGJvZHkpIHx8IHJlcy5zdGF0dXMgPT09IDQxOGAuXG4gKlxuICogQHBhcmFtIHJlc3BvbnNlIC0gUmVzcG9uc2UgZnJvbSB0aGUgZmFpbGVkIGF0dGVtcHRcbiAqIEBwYXJhbSBfYm9keSAtIFJlc3BvbnNlIGJvZHkgdGV4dCAodW51c2VkIGJ5IHRoZSBkZWZhdWx0IHByZWRpY2F0ZSlcbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIGFub3RoZXIgYXR0ZW1wdCBzaG91bGQgYmUgc2NoZWR1bGVkXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0U2hvdWxkUmV0cnkgPSAocmVzcG9uc2U6IFJlc3BvbnNlLCBfYm9keTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBERUZBVUxUX1JFVFJZQUJMRV9IVFRQX1NUQVRVU0VTLmluY2x1ZGVzKHJlc3BvbnNlLnN0YXR1cyk7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyByZXRyeSBwb2xpY3kgbnVtZXJpYyBmaWVsZHMgb24ge0BsaW5rIFJlcXVlc3RPcHRpb25zfS5cbiAqXG4gKiBDb25zdHJhaW50czogYHJldHJpZXMgPj0gMWAsIGB0aW1lb3V0TXMgPiAwYCwgYGJhc2VCYWNrb2ZmTXMgPj0gMGAuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHdob3NlIGByZXRyaWVzYCwgYHRpbWVvdXRNc2AsIGFuZCBgYmFzZUJhY2tvZmZNc2AgYXJlIGNoZWNrZWRcbiAqIEB0aHJvd3Mge0ZldGNoUmV0cmllckludmFsaWRPcHRpb25zRXJyb3J9IFdoZW4gYW55IGNvbnN0cmFpbnQgaXMgdmlvbGF0ZWRcbiAqL1xuY29uc3QgdmFsaWRhdGVSZXF1ZXN0T3B0aW9ucyA9IChvcHRpb25zOiBQaWNrPFJlcXVlc3RPcHRpb25zLCAncmV0cmllcycgfCAndGltZW91dE1zJyB8ICdiYXNlQmFja29mZk1zJz4pOiB2b2lkID0+IHtcbiAgY29uc3QgeyByZXRyaWVzLCB0aW1lb3V0TXMsIGJhc2VCYWNrb2ZmTXMgfSA9IG9wdGlvbnM7XG5cbiAgaWYgKHJldHJpZXMgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEZldGNoUmV0cmllckludmFsaWRPcHRpb25zRXJyb3IoJ3JldHJpZXMgbXVzdCBiZSA+PSAxJyk7XG4gIH1cbiAgaWYgKHRpbWVvdXRNcyA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEZldGNoUmV0cmllckludmFsaWRPcHRpb25zRXJyb3IoJ3RpbWVvdXRNcyBtdXN0IGJlID4gMCcpO1xuICB9XG4gIGlmIChiYXNlQmFja29mZk1zIDwgMCkge1xuICAgIHRocm93IG5ldyBGZXRjaFJldHJpZXJJbnZhbGlkT3B0aW9uc0Vycm9yKCdiYXNlQmFja29mZk1zIG11c3QgYmUgPj0gMCcpO1xuICB9XG59O1xuXG4vKipcbiAqIFdyYXBzIGBmZXRjaGAgd2l0aCByZXRyaWVzLCBwZXItYXR0ZW1wdCB0aW1lb3V0LCBmdWxsLWppdHRlciBiYWNrb2ZmLCBhbmQgb3B0aW9uYWwgY2FuY2VsbGF0aW9uLlxuICpcbiAqIEVhY2ggYXR0ZW1wdCBjYWxscyBgZmV0Y2godXJsLCB7IC4uLm9wdGlvbnMuaW5pdCwgaGVhZGVycz8sIHNpZ25hbCB9KWAgd2l0aCBhbiBpbnRlcm5hbFxuICoge0BsaW5rIEFib3J0U2lnbmFsfSBmb3IgYHRpbWVvdXRNc2AuIE5vbi1PSyByZXNwb25zZXMgYXJlIHJldHJpZWQgd2hlbiBgc2hvdWxkUmV0cnlgIHJldHVybnNcbiAqIGB0cnVlYCAoZGVmYXVsdDoge0BsaW5rIERFRkFVTFRfUkVUUllBQkxFX0hUVFBfU1RBVFVTRVN9KS4gVGhlIHNhbWUge0BsaW5rIEZldGNoSW5pdE9wdGlvbnN9IChpbmNsdWRpbmcgYGJvZHlgKSBpcyByZXVzZWRcbiAqIG9uIGV2ZXJ5IGF0dGVtcHQuXG4gKlxuICogQHBhcmFtIHVybCAtIFJlcXVlc3QgVVJMIHBhc3NlZCB0byBgZmV0Y2hgXG4gKiBAcGFyYW0gb3B0aW9ucyAtIHtAbGluayBSZXF1ZXN0T3B0aW9uc30gY29udHJvbGxpbmcgcmV0cmllcywgdGltZW91dCwgcmVxdWVzdCBpbml0LCBhbmQgY2FuY2VsbGF0aW9uXG4gKiBAcmV0dXJucyBUaGUgZmlyc3Qge0BsaW5rIFJlc3BvbnNlfSBmb3Igd2hpY2ggYG9rYCBpcyBgdHJ1ZWBcbiAqIEB0aHJvd3Mge0ZldGNoUmV0cmllckludmFsaWRPcHRpb25zRXJyb3J9IElmIGByZXRyaWVzIDwgMWAsIGB0aW1lb3V0TXMgPD0gMGAsIG9yIGBiYXNlQmFja29mZk1zIDwgMGBcbiAqIEB0aHJvd3Mge0ZldGNoUmV0cmllckFscmVhZHlBYm9ydGVkRXJyb3J9IElmIGBvcHRpb25zLnNpZ25hbGAgaXMgYWxyZWFkeSBhYm9ydGVkIGJlZm9yZSBhbiBhdHRlbXB0XG4gKiBAdGhyb3dzIHtGZXRjaFJldHJpZXJIdHRwRXJyb3J9IE9uIGEgbm9uLU9LIHJlc3BvbnNlIHRoYXQgaXMgbm90IHJldHJpZWQgb3IgYWZ0ZXIgdGhlIGxhc3QgYXR0ZW1wdFxuICogQHRocm93cyB7RmV0Y2hSZXRyaWVyTmV0d29ya0Vycm9yfSBPbiBhIG5ldHdvcmsgYFR5cGVFcnJvcmAgYWZ0ZXIgdGhlIGxhc3QgYXR0ZW1wdFxuICogQHRocm93cyB7RmV0Y2hSZXRyaWVyQWJvcnRFcnJvcn0gT24gdGltZW91dCBvciBleHRlcm5hbCBhYm9ydCBhZnRlciB0aGUgbGFzdCBhdHRlbXB0XG4gKiBAdGhyb3dzIHtGZXRjaFJldHJpZXJVbnJlYWNoYWJsZUVycm9yfSBJZiB0aGUgcmV0cnkgbG9vcCBleGl0cyB3aXRob3V0IHJldHVybmluZyAoaW50ZXJuYWwgYnVnKVxuICovXG5leHBvcnQgY29uc3QgZmV0Y2hSZXRyaWVyID0gYXN5bmMgKHVybDogc3RyaW5nLCBvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8UmVzcG9uc2U+ID0+IHtcbiAgY29uc3Qge1xuICAgIGhlYWRlcnMsXG4gICAgaW5pdCxcbiAgICByZXRyaWVzLFxuICAgIHRpbWVvdXRNcyxcbiAgICBiYXNlQmFja29mZk1zLFxuICAgIHNpZ25hbDogZXh0ZXJuYWxTaWduYWwsXG4gICAgc2hvdWxkUmV0cnkgPSBkZWZhdWx0U2hvdWxkUmV0cnksXG4gIH0gPSBvcHRpb25zO1xuXG4gIHZhbGlkYXRlUmVxdWVzdE9wdGlvbnMoeyByZXRyaWVzLCB0aW1lb3V0TXMsIGJhc2VCYWNrb2ZmTXMgfSk7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gcmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgaWYgKGV4dGVybmFsU2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRmV0Y2hSZXRyaWVyQWxyZWFkeUFib3J0ZWRFcnJvcigpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGltZW91dE1zKTtcblxuICAgIGNvbnN0IG9uRXh0ZXJuYWxBYm9ydCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgfTtcblxuICAgIGlmIChleHRlcm5hbFNpZ25hbCkge1xuICAgICAgZXh0ZXJuYWxTaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkV4dGVybmFsQWJvcnQpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgLi4uaW5pdCxcbiAgICAgICAgLi4uKGhlYWRlcnMgIT09IHVuZGVmaW5lZCA/IHsgaGVhZGVycyB9IDoge30pLFxuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSk7XG5cbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICBleHRlcm5hbFNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkV4dGVybmFsQWJvcnQpO1xuXG4gICAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgY29uc3QgaXNDb250aW51ZSA9IHNob3VsZFJldHJ5KHJlcywgdGV4dCk7XG5cbiAgICAgIGlmIChpc0NvbnRpbnVlKSB7XG4gICAgICAgIGlmIChhdHRlbXB0ID09PSByZXRyaWVzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZldGNoUmV0cmllckh0dHBFcnJvcihgSFRUUCAke3Jlcy5zdGF0dXN9YCwgcmVzLnN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgd2FpdChmdWxsSml0dGVyKGJhc2VCYWNrb2ZmTXMsIGF0dGVtcHQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBGZXRjaFJldHJpZXJIdHRwRXJyb3IoYE5vbi1yZXRyaWFibGUgSFRUUCBlcnJvcjogJHtyZXMuc3RhdHVzfWAsIHJlcy5zdGF0dXMpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIGV4dGVybmFsU2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uRXh0ZXJuYWxBYm9ydCk7XG5cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGlmIChhdHRlbXB0ID09PSByZXRyaWVzKSB0aHJvdyBlcnIgaW5zdGFuY2VvZiBGZXRjaFJldHJpZXJBYm9ydEVycm9yID8gZXJyIDogbmV3IEZldGNoUmV0cmllckFib3J0RXJyb3IoKTtcbiAgICAgICAgYXdhaXQgd2FpdChmdWxsSml0dGVyKGJhc2VCYWNrb2ZmTXMsIGF0dGVtcHQpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcbiAgICAgICAgaWYgKGF0dGVtcHQgPT09IHJldHJpZXMpIHRocm93IG5ldyBGZXRjaFJldHJpZXJOZXR3b3JrRXJyb3IoJ05ldHdvcmsgZXJyb3InLCBlcnIpO1xuICAgICAgICBhd2FpdCB3YWl0KGZ1bGxKaXR0ZXIoYmFzZUJhY2tvZmZNcywgYXR0ZW1wdCkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBGZXRjaFJldHJpZXJVbnJlYWNoYWJsZUVycm9yKCk7XG59O1xuXG4vKipcbiAqIERlbGF5cyBleGVjdXRpb24gZm9yIHRoZSBnaXZlbiBkdXJhdGlvbiAodXNlZCBiZXR3ZWVuIHJldHJ5IGF0dGVtcHRzKS5cbiAqXG4gKiBAcGFyYW0gbXMgLSBEZWxheSBpbiBtaWxsaXNlY29uZHNcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGBtc2BcbiAqL1xuY29uc3Qgd2FpdCA9IChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufTtcblxuLyoqXG4gKiBGdWxsIGppdHRlciBiYWNrb2ZmOiByYW5kb20gZGVsYXkgaW4gYFswLCBiYXNlICogMl5hdHRlbXB0KWAgbXMgKEFXUy1yZWNvbW1lbmRlZCBwYXR0ZXJuKS5cbiAqXG4gKiBAcGFyYW0gYmFzZSAtIEJhc2UgYmFja29mZiBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSBhdHRlbXB0IC0gMS1iYXNlZCBhdHRlbXB0IGluZGV4IChmaXJzdCByZXRyeSB1c2VzIGBhdHRlbXB0ID09PSAxYClcbiAqIEByZXR1cm5zIFdhaXQgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgbmV4dCBhdHRlbXB0XG4gKi9cbmNvbnN0IGZ1bGxKaXR0ZXIgPSAoYmFzZTogbnVtYmVyLCBhdHRlbXB0OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICBjb25zdCBjYXAgPSBiYXNlICogTWF0aC5wb3coMiwgYXR0ZW1wdCk7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjYXApO1xufTtcbiJdfQ==
package/package.json CHANGED
@@ -55,7 +55,7 @@
55
55
  "publishConfig": {
56
56
  "access": "public"
57
57
  },
58
- "version": "0.3.6",
58
+ "version": "0.4.0",
59
59
  "jest": {
60
60
  "coverageProvider": "v8",
61
61
  "testMatch": [