@anansi/core 0.22.2 → 0.22.4
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/CHANGELOG.md +16 -0
- package/README.md +340 -44
- package/lib/scripts/proxyUtils.d.ts +17 -0
- package/lib/scripts/proxyUtils.d.ts.map +1 -0
- package/lib/scripts/proxyUtils.js +26 -0
- package/lib/scripts/scripts/proxyUtils.js +26 -0
- package/lib/scripts/scripts/startDevserver.js +3 -2
- package/lib/scripts/startDevserver.d.ts.map +1 -1
- package/lib/scripts/startDevserver.js +3 -2
- package/package.json +2 -2
- package/src/scripts/__tests__/proxyUtils.test.ts +89 -0
- package/src/scripts/proxyUtils.ts +35 -0
- package/src/scripts/startDevserver.ts +2 -3
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,22 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [0.22.4](/github.com/ntucker/anansi/compare/@anansi/core@0.22.3...@anansi/core@0.22.4) (2026-01-10)
|
|
7
|
+
|
|
8
|
+
### 📦 Package
|
|
9
|
+
|
|
10
|
+
* Update all non-major dependencies ([#2930](/github.com/ntucker/anansi/issues/2930)) ([6162e2b](/github.com/ntucker/anansi/commit/6162e2bfff24989e670d57e62ec93d6a1d42d839))
|
|
11
|
+
|
|
12
|
+
## [0.22.3](/github.com/ntucker/anansi/compare/@anansi/core@0.22.2...@anansi/core@0.22.3) (2026-01-02)
|
|
13
|
+
|
|
14
|
+
### 💅 Enhancement
|
|
15
|
+
|
|
16
|
+
* Improve webpack proxy handling ([0413bc6](/github.com/ntucker/anansi/commit/0413bc6ff3ea9eb107d4ca5259c21e1b7efef29c))
|
|
17
|
+
|
|
18
|
+
### 📝 Documentation
|
|
19
|
+
|
|
20
|
+
* Update readme ([b42d500](/github.com/ntucker/anansi/commit/b42d50069157979ac2c21fce92c4750f3219461a))
|
|
21
|
+
|
|
6
22
|
## [0.22.2](/github.com/ntucker/anansi/compare/@anansi/core@0.22.1...@anansi/core@0.22.2) (2025-12-31)
|
|
7
23
|
|
|
8
24
|
### 🐛 Bug Fix
|
package/README.md
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# @anansi/core
|
|
2
2
|
|
|
3
|
-
<!--[](https://circleci.com/gh/notwillk/pojo-router)-->
|
|
4
|
-
|
|
5
3
|
[](https://www.npmjs.com/package/@anansi/core)
|
|
6
4
|
[](https://bundlephobia.com/result?p=@anansi/core)
|
|
7
5
|
[](https://www.npmjs.com/package/@anansi/core)
|
|
@@ -12,106 +10,404 @@
|
|
|
12
10
|
> Out came the sun, and dried up all the rain,
|
|
13
11
|
> and the itsy bitsy spider went up the spout again
|
|
14
12
|
|
|
15
|
-
|
|
13
|
+
React 19 framework with streaming SSR support, built on a composable "spouts" architecture.
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
yarn add @anansi/core
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Quick Start
|
|
22
|
+
|
|
23
|
+
Anansi uses a dual-entry pattern for SSR: one entry for the server and one for the client.
|
|
16
24
|
|
|
17
25
|
```bash
|
|
18
|
-
yarn start-anansi./src/index.tsx
|
|
26
|
+
yarn start-anansi ./src/index.tsx
|
|
19
27
|
```
|
|
20
28
|
|
|
21
|
-
This
|
|
29
|
+
This automatically uses `./src/index.tsx` for the client and `./src/index.server.tsx` for the server.
|
|
30
|
+
|
|
31
|
+
## Concepts
|
|
32
|
+
|
|
33
|
+
### Spouts
|
|
34
|
+
|
|
35
|
+
Spouts are composable middleware for building React applications. They handle concerns like routing, data fetching, document structure, and more.
|
|
22
36
|
|
|
23
|
-
|
|
37
|
+
- **Server**: `laySpouts()` - Lays out the spouts for SSR, streaming React to the response
|
|
38
|
+
- **Client**: `floodSpouts()` - Hydrates the application on the client
|
|
39
|
+
|
|
40
|
+
The spout pattern allows you to compose functionality in a declarative, nested structure where each spout can:
|
|
41
|
+
- Inject props to downstream spouts
|
|
42
|
+
- Wrap the rendered application with providers
|
|
43
|
+
- Serialize data for hydration
|
|
44
|
+
|
|
45
|
+
## Entry Points
|
|
46
|
+
|
|
47
|
+
### Client Entry (`index.tsx`)
|
|
24
48
|
|
|
25
49
|
```tsx
|
|
26
50
|
import { useController } from '@data-client/react';
|
|
27
51
|
import {
|
|
28
|
-
|
|
52
|
+
floodSpouts,
|
|
29
53
|
documentSpout,
|
|
30
54
|
dataClientSpout,
|
|
31
|
-
prefetchSpout,
|
|
32
55
|
routerSpout,
|
|
33
56
|
JSONSpout,
|
|
34
57
|
appSpout,
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
import app from 'app';
|
|
58
|
+
navigatorSpout,
|
|
59
|
+
} from '@anansi/core';
|
|
38
60
|
|
|
61
|
+
import App from './App';
|
|
39
62
|
import { createRouter } from './routing';
|
|
40
63
|
|
|
41
|
-
const spouts =
|
|
42
|
-
|
|
43
|
-
|
|
64
|
+
const spouts = documentSpout({ title: 'My App' })(
|
|
65
|
+
JSONSpout()(
|
|
66
|
+
navigatorSpout()(
|
|
44
67
|
dataClientSpout()(
|
|
45
68
|
routerSpout({ useResolveWith: useController, createRouter })(
|
|
46
|
-
appSpout(
|
|
69
|
+
appSpout(<App />),
|
|
47
70
|
),
|
|
48
71
|
),
|
|
49
72
|
),
|
|
50
73
|
),
|
|
51
74
|
);
|
|
52
75
|
|
|
53
|
-
|
|
76
|
+
floodSpouts(spouts);
|
|
54
77
|
```
|
|
55
78
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
<details open><summary>index.tsx</summary>
|
|
79
|
+
### Server Entry (`index.server.tsx`)
|
|
59
80
|
|
|
60
81
|
```tsx
|
|
61
82
|
import { useController } from '@data-client/react';
|
|
62
83
|
import {
|
|
63
|
-
|
|
84
|
+
laySpouts,
|
|
64
85
|
documentSpout,
|
|
65
86
|
dataClientSpout,
|
|
87
|
+
prefetchSpout,
|
|
66
88
|
routerSpout,
|
|
67
89
|
JSONSpout,
|
|
68
90
|
appSpout,
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
import app from 'app';
|
|
91
|
+
navigatorSpout,
|
|
92
|
+
} from '@anansi/core/server';
|
|
72
93
|
|
|
94
|
+
import App from './App';
|
|
73
95
|
import { createRouter } from './routing';
|
|
74
96
|
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
97
|
+
const spouts = prefetchSpout('controller')(
|
|
98
|
+
documentSpout({ title: 'My App' })(
|
|
99
|
+
JSONSpout()(
|
|
100
|
+
navigatorSpout()(
|
|
101
|
+
dataClientSpout()(
|
|
102
|
+
routerSpout({ useResolveWith: useController, createRouter })(
|
|
103
|
+
appSpout(<App />),
|
|
104
|
+
),
|
|
105
|
+
),
|
|
82
106
|
),
|
|
83
107
|
),
|
|
84
108
|
),
|
|
85
109
|
);
|
|
86
110
|
|
|
87
|
-
|
|
111
|
+
export default laySpouts(spouts);
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Spouts Reference
|
|
115
|
+
|
|
116
|
+
### appSpout
|
|
117
|
+
|
|
118
|
+
The innermost spout that wraps your React application.
|
|
119
|
+
|
|
120
|
+
```tsx
|
|
121
|
+
import { appSpout } from '@anansi/core';
|
|
122
|
+
|
|
123
|
+
appSpout(<App />)
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### documentSpout
|
|
127
|
+
|
|
128
|
+
Generates the HTML document structure with proper asset loading.
|
|
129
|
+
|
|
130
|
+
```tsx
|
|
131
|
+
import { documentSpout } from '@anansi/core';
|
|
132
|
+
|
|
133
|
+
documentSpout({
|
|
134
|
+
title: 'My App', // Page title
|
|
135
|
+
head?: ReactNode, // Additional head elements
|
|
136
|
+
lang?: string, // HTML lang attribute (default: undefined)
|
|
137
|
+
rootId?: string, // Root element ID (default: 'anansi-root')
|
|
138
|
+
charSet?: string, // Character set (default: 'utf-8')
|
|
139
|
+
csPolicy?: CSPolicy, // Content Security Policy
|
|
140
|
+
})
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
#### Content Security Policy
|
|
144
|
+
|
|
145
|
+
The `csPolicy` option configures CSP headers. In production, it sets `Content-Security-Policy`; in development, it uses `Content-Security-Policy-Report-Only`.
|
|
146
|
+
|
|
147
|
+
```tsx
|
|
148
|
+
const csPolicy = {
|
|
149
|
+
'base-uri': "'self'",
|
|
150
|
+
'object-src': "'none'",
|
|
151
|
+
'script-src': ["'self'", "'unsafe-inline'"],
|
|
152
|
+
'style-src': ["'unsafe-inline'", "'self'"],
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
documentSpout({ title: 'My App', csPolicy })
|
|
88
156
|
```
|
|
89
157
|
|
|
90
|
-
|
|
158
|
+
Nonces are automatically injected into `script-src` for inline scripts.
|
|
159
|
+
|
|
160
|
+
### routerSpout
|
|
91
161
|
|
|
92
|
-
|
|
162
|
+
Integrates [@anansi/router](https://github.com/ntucker/anansi/tree/master/packages/router) for client-side navigation.
|
|
93
163
|
|
|
94
|
-
|
|
164
|
+
```tsx
|
|
165
|
+
import { routerSpout } from '@anansi/core';
|
|
166
|
+
|
|
167
|
+
routerSpout({
|
|
168
|
+
useResolveWith: () => any, // Hook returning data passed to route resolvers
|
|
169
|
+
createRouter: (history) => RouteController, // Router factory function
|
|
170
|
+
onChange?: (update, callback) => void, // Client-only: navigation callback
|
|
171
|
+
})
|
|
172
|
+
```
|
|
95
173
|
|
|
96
|
-
|
|
174
|
+
**Provides to downstream spouts:**
|
|
175
|
+
- `matchedRoutes` - Array of matched route objects
|
|
176
|
+
- `router` - RouteController instance
|
|
177
|
+
- `searchParams` - URLSearchParams from the current URL
|
|
97
178
|
|
|
179
|
+
### dataClientSpout
|
|
180
|
+
|
|
181
|
+
Integrates [@data-client/react](https://dataclient.io) for data fetching with automatic SSR hydration.
|
|
182
|
+
|
|
183
|
+
```tsx
|
|
184
|
+
import { dataClientSpout } from '@anansi/core';
|
|
185
|
+
|
|
186
|
+
dataClientSpout({
|
|
187
|
+
getManagers?: () => Manager[], // Custom managers (default: [NetworkManager])
|
|
188
|
+
})
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Server-side, it creates a persisted store and serializes state for hydration. Client-side, it hydrates from the serialized state.
|
|
192
|
+
|
|
193
|
+
### JSONSpout
|
|
194
|
+
|
|
195
|
+
Serializes data from upstream spouts into `<script type="application/json">` tags for hydration.
|
|
196
|
+
|
|
197
|
+
```tsx
|
|
198
|
+
import { JSONSpout } from '@anansi/core';
|
|
199
|
+
|
|
200
|
+
JSONSpout({
|
|
201
|
+
id?: string, // Base ID for script tags (default: 'anansi-json')
|
|
202
|
+
})
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### navigatorSpout
|
|
206
|
+
|
|
207
|
+
Provides browser navigator-like properties (language preferences) that work on both server and client.
|
|
208
|
+
|
|
209
|
+
```tsx
|
|
210
|
+
import { navigatorSpout, useNavigator } from '@anansi/core';
|
|
211
|
+
|
|
212
|
+
// In spouts config
|
|
213
|
+
navigatorSpout()
|
|
214
|
+
|
|
215
|
+
// In components
|
|
216
|
+
function MyComponent() {
|
|
217
|
+
const { language, languages } = useNavigator();
|
|
218
|
+
// language: string - Primary language (e.g., 'en-US')
|
|
219
|
+
// languages: readonly string[] - All accepted languages by preference
|
|
220
|
+
}
|
|
221
|
+
```
|
|
98
222
|
|
|
99
|
-
|
|
223
|
+
### prefetchSpout (Server Only)
|
|
224
|
+
|
|
225
|
+
Prefetches route data before rendering. Must wrap `routerSpout`.
|
|
226
|
+
|
|
227
|
+
```tsx
|
|
228
|
+
import { prefetchSpout } from '@anansi/core/server';
|
|
229
|
+
|
|
230
|
+
// 'controller' is the field name from dataClientSpout to use for resolving routes
|
|
231
|
+
prefetchSpout('controller')(
|
|
232
|
+
// ... other spouts including routerSpout
|
|
233
|
+
)
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
This calls `route.resolveData()` and `route.component.preload()` for all matched routes before SSR.
|
|
237
|
+
|
|
238
|
+
### antdSpout (Ant Design)
|
|
239
|
+
|
|
240
|
+
Integrates Ant Design's CSS-in-JS with SSR support.
|
|
241
|
+
|
|
242
|
+
```tsx
|
|
243
|
+
// Client
|
|
244
|
+
import { antdSpout } from '@anansi/core/antd';
|
|
245
|
+
|
|
246
|
+
// Server
|
|
247
|
+
import { antdSpout } from '@anansi/core/antd/server';
|
|
248
|
+
|
|
249
|
+
antdSpout()
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## Core Functions
|
|
253
|
+
|
|
254
|
+
### laySpouts (Server)
|
|
255
|
+
|
|
256
|
+
Wraps spouts for server-side rendering with streaming support.
|
|
257
|
+
|
|
258
|
+
```tsx
|
|
259
|
+
import { laySpouts } from '@anansi/core/server';
|
|
260
|
+
|
|
261
|
+
export default laySpouts(spouts, {
|
|
262
|
+
timeoutMS?: number, // SSR timeout (default: 10000)
|
|
263
|
+
onError?: (error) => void, // Error callback
|
|
264
|
+
});
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
Returns a render function compatible with Express: `(clientManifest, req, res) => Promise<void>`
|
|
268
|
+
|
|
269
|
+
### floodSpouts (Client)
|
|
270
|
+
|
|
271
|
+
Hydrates the application on the client.
|
|
272
|
+
|
|
273
|
+
```tsx
|
|
274
|
+
import { floodSpouts } from '@anansi/core';
|
|
275
|
+
|
|
276
|
+
floodSpouts(spouts, {
|
|
277
|
+
rootId?: string, // Root element ID (default: 'anansi-root')
|
|
278
|
+
});
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
## CLI Commands
|
|
282
|
+
|
|
283
|
+
### start-anansi
|
|
284
|
+
|
|
285
|
+
Development server with hot module replacement for both client and server.
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
yarn start-anansi ./src/index.tsx
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
Features:
|
|
292
|
+
- Dual webpack compilation (client + server)
|
|
293
|
+
- In-memory filesystem for fast rebuilds
|
|
294
|
+
- Hot reloading for both bundles
|
|
295
|
+
- Automatic SSR on all non-asset routes
|
|
296
|
+
- Proxy support from webpack devServer config
|
|
297
|
+
|
|
298
|
+
### serve-anansi
|
|
299
|
+
|
|
300
|
+
Production server for pre-built applications.
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
yarn serve-anansi ./dist-server/App.js
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
## Scripts API
|
|
307
|
+
|
|
308
|
+
For programmatic usage:
|
|
309
|
+
|
|
310
|
+
```ts
|
|
311
|
+
import { serve, devServe } from '@anansi/core/scripts';
|
|
312
|
+
```
|
|
100
313
|
|
|
101
314
|
### serve(entry, options?)
|
|
102
315
|
|
|
316
|
+
Starts a production server.
|
|
317
|
+
|
|
318
|
+
```ts
|
|
319
|
+
serve('./dist-server/App.js', {
|
|
320
|
+
serveAssets?: boolean, // Serve static assets (default: false)
|
|
321
|
+
serveProxy?: boolean, // Enable proxy from webpack config (default: false)
|
|
322
|
+
});
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
**Environment Variables:**
|
|
326
|
+
- `PORT` - Server port (default: 8080)
|
|
327
|
+
- `WEBPACK_PUBLIC_PATH` - Public path for assets
|
|
328
|
+
|
|
329
|
+
#### Options
|
|
330
|
+
|
|
331
|
+
| Option | Type | Description |
|
|
332
|
+
|--------|------|-------------|
|
|
333
|
+
| `serveAssets` | `boolean` | Serve static assets from the build output. Useful for local validation; use a dedicated HTTP server in production. |
|
|
334
|
+
| `serveProxy` | `boolean` | Enable proxying based on webpack devServer config. Useful for local validation; use a reverse proxy in production. |
|
|
335
|
+
|
|
336
|
+
### devServe(entry, env?)
|
|
337
|
+
|
|
338
|
+
Starts a development server with HMR.
|
|
339
|
+
|
|
340
|
+
```ts
|
|
341
|
+
devServe('./src/index.tsx', {
|
|
342
|
+
// Additional env variables passed to webpack config
|
|
343
|
+
});
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
## Types
|
|
347
|
+
|
|
348
|
+
### ServerProps
|
|
349
|
+
|
|
350
|
+
Props available to server-side spouts:
|
|
351
|
+
|
|
352
|
+
```ts
|
|
353
|
+
interface ServerProps {
|
|
354
|
+
req: Request | IncomingMessage;
|
|
355
|
+
res: Response | ServerResponse;
|
|
356
|
+
clientManifest: StatsCompilation;
|
|
357
|
+
nonce: string;
|
|
358
|
+
}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### Spout Types
|
|
362
|
+
|
|
103
363
|
```ts
|
|
104
|
-
import {
|
|
364
|
+
import type { Spout, ServerProps, NavigatorProperties } from '@anansi/core';
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
### CSPolicy
|
|
368
|
+
|
|
369
|
+
Content Security Policy configuration:
|
|
105
370
|
|
|
106
|
-
|
|
371
|
+
```ts
|
|
372
|
+
interface CSPolicy {
|
|
373
|
+
[directive: string]: string | string[];
|
|
374
|
+
}
|
|
107
375
|
```
|
|
108
376
|
|
|
109
|
-
|
|
377
|
+
## Exports
|
|
378
|
+
|
|
379
|
+
### `@anansi/core`
|
|
380
|
+
|
|
381
|
+
Client-side exports:
|
|
382
|
+
|
|
383
|
+
- `floodSpouts` - Hydrate the application
|
|
384
|
+
- `documentSpout` - Document structure
|
|
385
|
+
- `dataClientSpout` - Data Client integration
|
|
386
|
+
- `routerSpout` - Router integration
|
|
387
|
+
- `JSONSpout` - JSON serialization for hydration
|
|
388
|
+
- `appSpout` - Application wrapper
|
|
389
|
+
- `navigatorSpout` - Navigator properties
|
|
390
|
+
- `useNavigator` - Hook for navigator properties
|
|
391
|
+
|
|
392
|
+
### `@anansi/core/server`
|
|
393
|
+
|
|
394
|
+
Server-side exports (all client exports plus):
|
|
395
|
+
|
|
396
|
+
- `laySpouts` - SSR render function
|
|
397
|
+
- `prefetchSpout` - Route data prefetching
|
|
398
|
+
- `CSPolicy` - CSP type
|
|
399
|
+
|
|
400
|
+
### `@anansi/core/scripts`
|
|
401
|
+
|
|
402
|
+
Build/dev scripts:
|
|
403
|
+
|
|
404
|
+
- `serve` - Production server
|
|
405
|
+
- `devServe` - Development server
|
|
406
|
+
|
|
407
|
+
### `@anansi/core/antd`
|
|
110
408
|
|
|
111
|
-
|
|
112
|
-
typically want to use a dedicated HTTP server for static assets in production.
|
|
409
|
+
Ant Design integration (client-side).
|
|
113
410
|
|
|
114
|
-
|
|
411
|
+
### `@anansi/core/antd/server`
|
|
115
412
|
|
|
116
|
-
|
|
117
|
-
In production it is much more performant to use a separate reverse proxy.
|
|
413
|
+
Ant Design integration (server-side).
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ProxyConfigArray } from 'webpack-dev-server';
|
|
2
|
+
/**
|
|
3
|
+
* Extracts route patterns from webpack-dev-server proxy configuration.
|
|
4
|
+
*
|
|
5
|
+
* Handles the webpack-dev-server proxy array format:
|
|
6
|
+
* ```
|
|
7
|
+
* proxy: [
|
|
8
|
+
* { context: ['/api'], target: 'http://localhost:3000' },
|
|
9
|
+
* { context: '/ws', target: 'http://localhost:3001' },
|
|
10
|
+
* { path: '/legacy', target: 'http://localhost:3002' },
|
|
11
|
+
* ]
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* @see https://webpack.js.org/configuration/dev-server/#devserverproxy
|
|
15
|
+
*/
|
|
16
|
+
export declare function extractProxyRoutes(proxy: ProxyConfigArray | undefined): string[];
|
|
17
|
+
//# sourceMappingURL=proxyUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxyUtils.d.ts","sourceRoot":"","sources":["../../src/scripts/proxyUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,gBAAgB,GAAG,SAAS,GAClC,MAAM,EAAE,CAgBV"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts route patterns from webpack-dev-server proxy configuration.
|
|
3
|
+
*
|
|
4
|
+
* Handles the webpack-dev-server proxy array format:
|
|
5
|
+
* ```
|
|
6
|
+
* proxy: [
|
|
7
|
+
* { context: ['/api'], target: 'http://localhost:3000' },
|
|
8
|
+
* { context: '/ws', target: 'http://localhost:3001' },
|
|
9
|
+
* { path: '/legacy', target: 'http://localhost:3002' },
|
|
10
|
+
* ]
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* @see https://webpack.js.org/configuration/dev-server/#devserverproxy
|
|
14
|
+
*/
|
|
15
|
+
export function extractProxyRoutes(proxy) {
|
|
16
|
+
if (!proxy) return [];
|
|
17
|
+
return proxy.filter(item => typeof item === 'object' && item !== null).flatMap(item => {
|
|
18
|
+
// webpack-dev-server proxy supports both 'context' and 'path' properties
|
|
19
|
+
// and each can be a string or an array of strings
|
|
20
|
+
const context = item.context ?? item.path;
|
|
21
|
+
if (Array.isArray(context)) return context;
|
|
22
|
+
if (typeof context === 'string') return [context];
|
|
23
|
+
return [];
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleHRyYWN0UHJveHlSb3V0ZXMiLCJwcm94eSIsImZpbHRlciIsIml0ZW0iLCJmbGF0TWFwIiwiY29udGV4dCIsInBhdGgiLCJBcnJheSIsImlzQXJyYXkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9wcm94eVV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJveHlDb25maWdBcnJheSB9IGZyb20gJ3dlYnBhY2stZGV2LXNlcnZlcic7XG5cbi8qKlxuICogRXh0cmFjdHMgcm91dGUgcGF0dGVybnMgZnJvbSB3ZWJwYWNrLWRldi1zZXJ2ZXIgcHJveHkgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBIYW5kbGVzIHRoZSB3ZWJwYWNrLWRldi1zZXJ2ZXIgcHJveHkgYXJyYXkgZm9ybWF0OlxuICogYGBgXG4gKiBwcm94eTogW1xuICogICB7IGNvbnRleHQ6IFsnL2FwaSddLCB0YXJnZXQ6ICdodHRwOi8vbG9jYWxob3N0OjMwMDAnIH0sXG4gKiAgIHsgY29udGV4dDogJy93cycsIHRhcmdldDogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMScgfSxcbiAqICAgeyBwYXRoOiAnL2xlZ2FjeScsIHRhcmdldDogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMicgfSxcbiAqIF1cbiAqIGBgYFxuICpcbiAqIEBzZWUgaHR0cHM6Ly93ZWJwYWNrLmpzLm9yZy9jb25maWd1cmF0aW9uL2Rldi1zZXJ2ZXIvI2RldnNlcnZlcnByb3h5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UHJveHlSb3V0ZXMoXG4gIHByb3h5OiBQcm94eUNvbmZpZ0FycmF5IHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nW10ge1xuICBpZiAoIXByb3h5KSByZXR1cm4gW107XG5cbiAgcmV0dXJuIHByb3h5XG4gICAgLmZpbHRlcihcbiAgICAgIChpdGVtKTogaXRlbSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICAgICAgICB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAhPT0gbnVsbCxcbiAgICApXG4gICAgLmZsYXRNYXAoaXRlbSA9PiB7XG4gICAgICAvLyB3ZWJwYWNrLWRldi1zZXJ2ZXIgcHJveHkgc3VwcG9ydHMgYm90aCAnY29udGV4dCcgYW5kICdwYXRoJyBwcm9wZXJ0aWVzXG4gICAgICAvLyBhbmQgZWFjaCBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nc1xuICAgICAgY29uc3QgY29udGV4dCA9IGl0ZW0uY29udGV4dCA/PyBpdGVtLnBhdGg7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250ZXh0KSkgcmV0dXJuIGNvbnRleHQgYXMgc3RyaW5nW107XG4gICAgICBpZiAodHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSByZXR1cm4gW2NvbnRleHRdO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxTQUFTQSxrQkFBa0JBLENBQ2hDQyxLQUFtQyxFQUN6QjtFQUNWLElBQUksQ0FBQ0EsS0FBSyxFQUFFLE9BQU8sRUFBRTtFQUVyQixPQUFPQSxLQUFLLENBQ1RDLE1BQU0sQ0FDSkMsSUFBSSxJQUNILE9BQU9BLElBQUksS0FBSyxRQUFRLElBQUlBLElBQUksS0FBSyxJQUN6QyxDQUFDLENBQ0FDLE9BQU8sQ0FBQ0QsSUFBSSxJQUFJO0lBQ2Y7SUFDQTtJQUNBLE1BQU1FLE9BQU8sR0FBR0YsSUFBSSxDQUFDRSxPQUFPLElBQUlGLElBQUksQ0FBQ0csSUFBSTtJQUN6QyxJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0gsT0FBTyxDQUFDLEVBQUUsT0FBT0EsT0FBTztJQUMxQyxJQUFJLE9BQU9BLE9BQU8sS0FBSyxRQUFRLEVBQUUsT0FBTyxDQUFDQSxPQUFPLENBQUM7SUFDakQsT0FBTyxFQUFFO0VBQ1gsQ0FBQyxDQUFDO0FBQ04iLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts route patterns from webpack-dev-server proxy configuration.
|
|
3
|
+
*
|
|
4
|
+
* Handles the webpack-dev-server proxy array format:
|
|
5
|
+
* ```
|
|
6
|
+
* proxy: [
|
|
7
|
+
* { context: ['/api'], target: 'http://localhost:3000' },
|
|
8
|
+
* { context: '/ws', target: 'http://localhost:3001' },
|
|
9
|
+
* { path: '/legacy', target: 'http://localhost:3002' },
|
|
10
|
+
* ]
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* @see https://webpack.js.org/configuration/dev-server/#devserverproxy
|
|
14
|
+
*/
|
|
15
|
+
export function extractProxyRoutes(proxy) {
|
|
16
|
+
if (!proxy) return [];
|
|
17
|
+
return proxy.filter(item => typeof item === 'object' && item !== null).flatMap(item => {
|
|
18
|
+
// webpack-dev-server proxy supports both 'context' and 'path' properties
|
|
19
|
+
// and each can be a string or an array of strings
|
|
20
|
+
const context = item.context ?? item.path;
|
|
21
|
+
if (Array.isArray(context)) return context;
|
|
22
|
+
if (typeof context === 'string') return [context];
|
|
23
|
+
return [];
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleHRyYWN0UHJveHlSb3V0ZXMiLCJwcm94eSIsImZpbHRlciIsIml0ZW0iLCJmbGF0TWFwIiwiY29udGV4dCIsInBhdGgiLCJBcnJheSIsImlzQXJyYXkiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2NyaXB0cy9wcm94eVV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJveHlDb25maWdBcnJheSB9IGZyb20gJ3dlYnBhY2stZGV2LXNlcnZlcic7XG5cbi8qKlxuICogRXh0cmFjdHMgcm91dGUgcGF0dGVybnMgZnJvbSB3ZWJwYWNrLWRldi1zZXJ2ZXIgcHJveHkgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBIYW5kbGVzIHRoZSB3ZWJwYWNrLWRldi1zZXJ2ZXIgcHJveHkgYXJyYXkgZm9ybWF0OlxuICogYGBgXG4gKiBwcm94eTogW1xuICogICB7IGNvbnRleHQ6IFsnL2FwaSddLCB0YXJnZXQ6ICdodHRwOi8vbG9jYWxob3N0OjMwMDAnIH0sXG4gKiAgIHsgY29udGV4dDogJy93cycsIHRhcmdldDogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMScgfSxcbiAqICAgeyBwYXRoOiAnL2xlZ2FjeScsIHRhcmdldDogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMicgfSxcbiAqIF1cbiAqIGBgYFxuICpcbiAqIEBzZWUgaHR0cHM6Ly93ZWJwYWNrLmpzLm9yZy9jb25maWd1cmF0aW9uL2Rldi1zZXJ2ZXIvI2RldnNlcnZlcnByb3h5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UHJveHlSb3V0ZXMoXG4gIHByb3h5OiBQcm94eUNvbmZpZ0FycmF5IHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nW10ge1xuICBpZiAoIXByb3h5KSByZXR1cm4gW107XG5cbiAgcmV0dXJuIHByb3h5XG4gICAgLmZpbHRlcihcbiAgICAgIChpdGVtKTogaXRlbSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICAgICAgICB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAhPT0gbnVsbCxcbiAgICApXG4gICAgLmZsYXRNYXAoaXRlbSA9PiB7XG4gICAgICAvLyB3ZWJwYWNrLWRldi1zZXJ2ZXIgcHJveHkgc3VwcG9ydHMgYm90aCAnY29udGV4dCcgYW5kICdwYXRoJyBwcm9wZXJ0aWVzXG4gICAgICAvLyBhbmQgZWFjaCBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nc1xuICAgICAgY29uc3QgY29udGV4dCA9IGl0ZW0uY29udGV4dCA/PyBpdGVtLnBhdGg7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250ZXh0KSkgcmV0dXJuIGNvbnRleHQgYXMgc3RyaW5nW107XG4gICAgICBpZiAodHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSByZXR1cm4gW2NvbnRleHRdO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxTQUFTQSxrQkFBa0JBLENBQ2hDQyxLQUFtQyxFQUN6QjtFQUNWLElBQUksQ0FBQ0EsS0FBSyxFQUFFLE9BQU8sRUFBRTtFQUVyQixPQUFPQSxLQUFLLENBQ1RDLE1BQU0sQ0FDSkMsSUFBSSxJQUNILE9BQU9BLElBQUksS0FBSyxRQUFRLElBQUlBLElBQUksS0FBSyxJQUN6QyxDQUFDLENBQ0FDLE9BQU8sQ0FBQ0QsSUFBSSxJQUFJO0lBQ2Y7SUFDQTtJQUNBLE1BQU1FLE9BQU8sR0FBR0YsSUFBSSxDQUFDRSxPQUFPLElBQUlGLElBQUksQ0FBQ0csSUFBSTtJQUN6QyxJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0gsT0FBTyxDQUFDLEVBQUUsT0FBT0EsT0FBTztJQUMxQyxJQUFJLE9BQU9BLE9BQU8sS0FBSyxRQUFRLEVBQUUsT0FBTyxDQUFDQSxPQUFPLENBQUM7SUFDakQsT0FBTyxFQUFFO0VBQ1gsQ0FBQyxDQUFDO0FBQ04iLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -15,6 +15,7 @@ import WebpackDevServer from 'webpack-dev-server';
|
|
|
15
15
|
import 'cross-fetch/dist/node-polyfill.js';
|
|
16
16
|
import { createHybridRequire } from './createHybridRequire.js';
|
|
17
17
|
import { getWebpackConfig } from './getWebpackConfig.js';
|
|
18
|
+
import { extractProxyRoutes } from './proxyUtils.js';
|
|
18
19
|
import { getErrorStatus, renderErrorPage } from './ssrErrorHandler.js';
|
|
19
20
|
// run directly from node
|
|
20
21
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
@@ -171,7 +172,7 @@ export default async function startDevServer(entrypoint, env = {}) {
|
|
|
171
172
|
if (!devServer) {
|
|
172
173
|
throw new Error('webpack-dev-server is not defined');
|
|
173
174
|
}
|
|
174
|
-
const otherRoutes = [process.env.WEBPACK_PUBLIC_PATH, ...(webpackConfigs[0].devServer?.proxy
|
|
175
|
+
const otherRoutes = [process.env.WEBPACK_PUBLIC_PATH, ...extractProxyRoutes(webpackConfigs[0].devServer?.proxy)];
|
|
175
176
|
// serve SSR for non-WEBPACK_PUBLIC_PATH
|
|
176
177
|
devServer.app?.get(new RegExp(`^(?!${otherRoutes.join('|')})`), handleErrors(async function (req, res) {
|
|
177
178
|
if (req.url.endsWith('favicon.ico')) {
|
|
@@ -243,4 +244,4 @@ export default async function startDevServer(entrypoint, env = {}) {
|
|
|
243
244
|
});
|
|
244
245
|
runServer();
|
|
245
246
|
}
|
|
246
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRpc2tGcyIsImNyZWF0ZUZzRnJvbVZvbHVtZSIsIlZvbHVtZSIsInBhdGgiLCJzb3VyY2VNYXBTdXBwb3J0IiwidG1wIiwidWZzIiwicHJvbWlzaWZ5Iiwid2VicGFjayIsImxvZ2dpbmciLCJXZWJwYWNrRGV2U2VydmVyIiwiY3JlYXRlSHlicmlkUmVxdWlyZSIsImdldFdlYnBhY2tDb25maWciLCJnZXRFcnJvclN0YXR1cyIsInJlbmRlckVycm9yUGFnZSIsImltcG9ydCIsIm1ldGEiLCJtYWluIiwiZW50cnlwb2ludCIsInByb2Nlc3MiLCJhcmd2IiwiY29uc29sZSIsImxvZyIsImV4aXQiLCJzdGFydERldlNlcnZlciIsInNlcnZlckZpbGVDb250ZW50cyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2VydmVyRW50cnkiLCJlbnYiLCJ3ZWJwYWNrQ29uZmlnIiwiZ2V0TG9nZ2VyIiwidm9sdW1lIiwiZnMiLCJ1c2UiLCJmc1JlcXVpcmUiLCJyZWFkRmlsZSIsImhvdEVudHJ5IiwiZW50cnlQYXRoIiwiZ2VuZXJhdGVkRW50cnlwb2ludCIsImZpbGVTeW5jIiwicG9zdGZpeCIsIndyaXRlU3luYyIsImZkIiwiY3dkIiwid2VicGFja0NvbmZpZ3MiLCJlbnRyeXBhdGgiLCJuYW1lIiwibW9kZSIsInJlcGxhY2UiLCJCUk9XU0VSU0xJU1RfRU5WIiwidGFyZ2V0IiwiY29tcGlsZXIiLCJlcnJvciIsImluc3RhbGwiLCJob29rUmVxdWlyZSIsImdldFNlcnZlckJ1bmRsZSIsInNlcnZlclN0YXRzIiwic2VydmVySnNvbiIsInRvSnNvbiIsImFzc2V0cyIsImpvaW4iLCJvdXRwdXRQYXRoIiwiaGFuZGxlRXJyb3JzIiwiZm4iLCJyZXEiLCJyZXMiLCJfbmV4dCIsImV4cHJlc3NSZXMiLCJoZWFkZXJzU2VudCIsInN0YXR1c0NvZGUiLCJzdGF0dXMiLCJzZXRIZWFkZXIiLCJzZW5kIiwidXJsIiwic2hvd1N0YWNrIiwiYmFkZ2UiLCJoaW50IiwiaW5pdFJlbmRlciIsInJlbmRlciIsImFyZ3MiLCJwdXNoIiwiaW1wb3J0UmVuZGVyIiwic3RhdHMiLCJjbGllbnRTdGF0cyIsImNvbXBpbGF0aW9uIiwiZXJyb3JzIiwibGVuZ3RoIiwiQXJyYXkiLCJpc0FycmF5IiwiaW5mbyIsImNsaWVudE1hbmlmZXN0IiwidGhlbiIsImJ1ZiIsInRvU3RyaW5nIiwia2V5cyIsImNhY2hlIiwiZm9yRWFjaCIsImRlZmF1bHQiLCJiaW5kIiwidW5kZWZpbmVkIiwiaW5pdCIsImUiLCJkZXZTZXJ2ZXIiLCJkZXZNaWRkbGV3YXJlIiwib3V0cHV0RmlsZVN5c3RlbSIsInNldHVwTWlkZGxld2FyZXMiLCJtaWRkbGV3YXJlcyIsIkVycm9yIiwib3RoZXJSb3V0ZXMiLCJXRUJQQUNLX1BVQkxJQ19QQVRIIiwicHJveHkiLCJmaWx0ZXIiLCJmbGF0TWFwIiwiY29udGV4dCIsImFwcCIsImdldCIsIlJlZ0V4cCIsImVuZHNXaXRoIiwic29ja2V0Iiwib24iLCJjb2RlIiwicnVuU2VydmVyIiwic3RhcnQiLCJob29rcyIsImRvbmUiLCJ0YXAiLCJtdWx0aVN0YXRzIiwiZmluZGVyIiwiZmlsZVRleHQiLCJ0ZXh0Um93cyIsInNwbGl0IiwibWF0Y2giLCJzdGFjayIsIm1hdGNoQWxsIiwicm93IiwiTnVtYmVyIiwicGFyc2VJbnQiLCJjb2wiLCJiYXNlbmFtZSIsIndyaXRlRmlsZVN5bmMiLCJzdG9wU2VydmVyIiwic3RvcCIsIndhcm4iXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2NyaXB0cy9zdGFydERldnNlcnZlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5PYmplY3QuaGFzT3duID1cbiAgT2JqZWN0Lmhhc093biB8fFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG4gIH07XG5pbXBvcnQgdHlwZSB7IE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IGRpc2tGcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlIH0gZnJvbSAnaHR0cCc7XG5pbXBvcnQgeyBjcmVhdGVGc0Zyb21Wb2x1bWUsIFZvbHVtZSB9IGZyb20gJ21lbWZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHNvdXJjZU1hcFN1cHBvcnQgZnJvbSAnc291cmNlLW1hcC1zdXBwb3J0JztcbmltcG9ydCB0bXAgZnJvbSAndG1wJztcbmltcG9ydCB7IHVmcyB9IGZyb20gJ3VuaW9uZnMnO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgd2VicGFjaywgeyB0eXBlIENvbmZpZ3VyYXRpb24sIHR5cGUgTXVsdGlDb25maWd1cmF0aW9uIH0gZnJvbSAnd2VicGFjayc7XG5pbXBvcnQgbG9nZ2luZyBmcm9tICd3ZWJwYWNrL2xpYi9sb2dnaW5nL3J1bnRpbWUuanMnO1xuaW1wb3J0IFdlYnBhY2tEZXZTZXJ2ZXIgZnJvbSAnd2VicGFjay1kZXYtc2VydmVyJztcblxuaW1wb3J0ICdjcm9zcy1mZXRjaC9kaXN0L25vZGUtcG9seWZpbGwuanMnO1xuaW1wb3J0IHsgY3JlYXRlSHlicmlkUmVxdWlyZSB9IGZyb20gJy4vY3JlYXRlSHlicmlkUmVxdWlyZS5qcyc7XG5pbXBvcnQgeyBnZXRXZWJwYWNrQ29uZmlnIH0gZnJvbSAnLi9nZXRXZWJwYWNrQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldEVycm9yU3RhdHVzLCByZW5kZXJFcnJvclBhZ2UgfSBmcm9tICcuL3NzckVycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBCb3VuZFJlbmRlciB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyBydW4gZGlyZWN0bHkgZnJvbSBub2RlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtaWdub3JlXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBjb25zdCBlbnRyeXBvaW50ID0gcHJvY2Vzcy5hcmd2WzJdO1xuXG4gIGlmICghZW50cnlwb2ludCkge1xuICAgIGNvbnNvbGUubG9nKGBVc2FnZTogc3RhcnQtYW5hbnNpIDxlbnRyeXBvaW50LWZpbGU+YCk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIHN0YXJ0RGV2U2VydmVyKGVudHJ5cG9pbnQpO1xufVxuXG5sZXQgc2VydmVyRmlsZUNvbnRlbnRzOiBQcm9taXNlPHN0cmluZz4gPSBQcm9taXNlLnJlc29sdmUoJycpO1xubGV0IHNlcnZlckVudHJ5ID0gJyc7XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0RGV2U2VydmVyKFxuICBlbnRyeXBvaW50OiBzdHJpbmcsXG4gIGVudjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSxcbikge1xuICBjb25zdCB3ZWJwYWNrQ29uZmlnID0gYXdhaXQgZ2V0V2VicGFja0NvbmZpZygpO1xuXG4gIGNvbnN0IGxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdhbmFuc2ktZGV2c2VydmVyJyk7XG5cbiAgLy8gU2V0IHVwIGluIG1lbW9yeSBmaWxlc3lzdGVtXG4gIGNvbnN0IHZvbHVtZSA9IG5ldyBWb2x1bWUoKTtcbiAgY29uc3QgZnMgPSBjcmVhdGVGc0Zyb21Wb2x1bWUodm9sdW1lKTtcbiAgdWZzLnVzZShkaXNrRnMpLnVzZShmcyBhcyBhbnkpO1xuXG4gIGNvbnN0IGZzUmVxdWlyZSA9IGNyZWF0ZUh5YnJpZFJlcXVpcmUodWZzKTtcblxuICBjb25zdCByZWFkRmlsZSA9IHByb21pc2lmeSh1ZnMucmVhZEZpbGUpO1xuICAvLyBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBmaWxlIHNvIHdlIGNhbiBob3QgcmVsb2FkIGZyb20gdGhlIHJvb3Qgb2YgdGhlIGFwcGxpY2F0aW9uXG4gIGZ1bmN0aW9uIGhvdEVudHJ5KGVudHJ5UGF0aDogc3RyaW5nKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgLy8gQHRzLWlnbm9yZSBmb3Igc29tZSByZWFzb24gaXQncyBub3QgcGlja2luZyB1cCB0aGF0IG90aGVyIG9wdGlvbnMgYXJlIG9wdGlvbmFsXG4gICAgY29uc3QgZ2VuZXJhdGVkRW50cnlwb2ludCA9IHRtcC5maWxlU3luYyh7IHBvc3RmaXg6ICcuanMnIH0pO1xuICAgIGRpc2tGcy53cml0ZVN5bmMoXG4gICAgICBnZW5lcmF0ZWRFbnRyeXBvaW50LmZkLFxuICAgICAgYFxuICBpbXBvcnQgZW50cnkgZnJvbSBcIiR7cGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGVudHJ5UGF0aCl9XCI7XG5cbiAgaWYgKGltcG9ydC5tZXRhLndlYnBhY2tIb3QpIHtcbiAgICBpbXBvcnQubWV0YS53ZWJwYWNrSG90LmFjY2VwdCgpO1xuICB9XG5cbiAgZXhwb3J0IGRlZmF1bHQgZW50cnk7XG4gICAgYCxcbiAgICApO1xuICAgIHJldHVybiBnZW5lcmF0ZWRFbnRyeXBvaW50O1xuICB9XG5cbiAgY29uc3Qgd2VicGFja0NvbmZpZ3M6IENvbmZpZ3VyYXRpb25bXSA9IFtcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogaG90RW50cnkoZW50cnlwb2ludCkubmFtZSxcbiAgICAgICAgbmFtZTogJ2NsaWVudCcsXG4gICAgICB9LFxuICAgICAgeyBtb2RlOiAnZGV2ZWxvcG1lbnQnIH0sXG4gICAgKSxcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogZW50cnlwb2ludC5yZXBsYWNlKCcudHN4JywgJy5zZXJ2ZXIudHN4JyksXG4gICAgICAgIG5hbWU6ICdzZXJ2ZXInLFxuICAgICAgICBCUk9XU0VSU0xJU1RfRU5WOiAnY3VycmVudCBub2RlJyxcbiAgICAgIH0sXG4gICAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcsIHRhcmdldDogJ25vZGUnIH0sXG4gICAgKSxcbiAgXTtcblxuICAvLyBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyXG4gIGNvbnN0IGNvbXBpbGVyID0gd2VicGFjayh3ZWJwYWNrQ29uZmlncyBhcyB1bmtub3duIGFzIE11bHRpQ29uZmlndXJhdGlvbik7XG4gIGlmICghY29tcGlsZXIpIHtcbiAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyJyk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIHNvdXJjZU1hcFN1cHBvcnQuaW5zdGFsbCh7IGhvb2tSZXF1aXJlOiB0cnVlIH0pO1xuXG4gIGZ1bmN0aW9uIGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0czogd2VicGFjay5TdGF0cykge1xuICAgIGNvbnN0IHNlcnZlckpzb24gPSBzZXJ2ZXJTdGF0cy50b0pzb24oeyBhc3NldHM6IHRydWUgfSk7XG4gICAgcmV0dXJuIHBhdGguam9pbihzZXJ2ZXJKc29uLm91dHB1dFBhdGggPz8gJycsICdzZXJ2ZXIuanMnKTtcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVFcnJvcnM8XG4gICAgRiBleHRlbmRzIChcbiAgICAgIHJlcTogUmVxdWVzdCB8IEluY29taW5nTWVzc2FnZSxcbiAgICAgIHJlczogUmVzcG9uc2UgfCBTZXJ2ZXJSZXNwb25zZSxcbiAgICApID0+IFByb21pc2U8dm9pZD4sXG4gID4oZm46IEYpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgICAgX25leHQ6IE5leHRGdW5jdGlvbixcbiAgICApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmbihyZXEsIHJlcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoJ1NTUiByZW5kZXJpbmcgZXJyb3I6JywgZXJyb3IpO1xuXG4gICAgICAgIC8vIFJldHVybiBlcnJvciByZXNwb25zZSB3aXRoIHN0YXR1cyBmcm9tIGVycm9yIGlmIGF2YWlsYWJsZVxuICAgICAgICBjb25zdCBleHByZXNzUmVzID0gcmVzIGFzIGFueTtcbiAgICAgICAgaWYgKCFleHByZXNzUmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IGdldEVycm9yU3RhdHVzKGVycm9yKTtcbiAgICAgICAgICBleHByZXNzUmVzLnN0YXR1cyhzdGF0dXNDb2RlKTtcbiAgICAgICAgICBleHByZXNzUmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgIGV4cHJlc3NSZXMuc2VuZChcbiAgICAgICAgICAgIHJlbmRlckVycm9yUGFnZShlcnJvciwgcmVxLnVybCA/PyAnLycsIHN0YXR1c0NvZGUsIHtcbiAgICAgICAgICAgICAgc2hvd1N0YWNrOiB0cnVlLFxuICAgICAgICAgICAgICBiYWRnZTogJ0RFViBNT0RFJyxcbiAgICAgICAgICAgICAgaGludDogJ1RoZSBkZXYgc2VydmVyIGlzIHN0aWxsIHJ1bm5pbmcuIEZpeCB0aGUgZXJyb3IgYW5kIHJldHJ5LCBvciBjaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBkZXRhaWxzLicsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGxldCBpbml0UmVuZGVyOlxuICAgIHwgeyBhcmdzOiBQYXJhbWV0ZXJzPEJvdW5kUmVuZGVyPjsgcmVzb2x2ZTogKCkgPT4gdm9pZCB9W11cbiAgICB8IHVuZGVmaW5lZCA9IFtdO1xuICBsZXQgcmVuZGVyOiBCb3VuZFJlbmRlciA9ICguLi5hcmdzKSA9PlxuICAgIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgaW5pdFJlbmRlcj8ucHVzaCh7IGFyZ3MsIHJlc29sdmUgfSk7XG4gICAgfSk7XG5cbiAgZnVuY3Rpb24gaW1wb3J0UmVuZGVyKHN0YXRzOiB3ZWJwYWNrLlN0YXRzW10pIHtcbiAgICBjb25zdCBbY2xpZW50U3RhdHMsIHNlcnZlclN0YXRzXSA9IHN0YXRzO1xuICAgIGlmIChcbiAgICAgIGNsaWVudFN0YXRzPy5jb21waWxhdGlvbj8uZXJyb3JzPy5sZW5ndGggfHxcbiAgICAgIHNlcnZlclN0YXRzPy5jb21waWxhdGlvbj8uZXJyb3JzPy5sZW5ndGhcbiAgICApIHtcbiAgICAgIGxvZy5lcnJvcignRXJyb3JzIGZvciBjbGllbnQgYnVpbGQ6ICcgKyBjbGllbnRTdGF0cy5jb21waWxhdGlvbi5lcnJvcnMpO1xuICAgICAgbG9nLmVycm9yKCdFcnJvcnMgZm9yIHNlcnZlciBidWlsZDogJyArIHNlcnZlclN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyk7XG4gICAgICAvLyBmaXJzdCB0aW1lLCByYXRoZXIgdGhhbiByZS1yZW5kZXJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGluaXRSZW5kZXIpKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4gICAgICB9XG4gICAgICBsb2cuZXJyb3IoJ0Fib3ZlIGNvbXBpbGVyIGVycm9ycyBibG9ja2luZyByZWxvYWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmluZm8oJ0xhdW5jaGluZyBTU1InKTtcbiAgICB9XG5cbiAgICAvLyBBU1NFVFNcbiAgICBjb25zdCBjbGllbnRNYW5pZmVzdCA9IGNsaWVudFN0YXRzLnRvSnNvbigpO1xuXG4gICAgc2VydmVyRW50cnkgPSBnZXRTZXJ2ZXJCdW5kbGUoc2VydmVyU3RhdHMpO1xuICAgIHNlcnZlckZpbGVDb250ZW50cyA9IHJlYWRGaWxlKHNlcnZlckVudHJ5KS50aGVuKGJ1ZiA9PiBidWYudG9TdHJpbmcoKSk7XG4gICAgLy8gcmVsb2FkIG1vZHVsZXNcbiAgICBPYmplY3Qua2V5cyhmc1JlcXVpcmUuY2FjaGUpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGRlbGV0ZSBmc1JlcXVpcmUuY2FjaGVba2V5XTtcbiAgICB9KTtcbiAgICByZW5kZXIgPSAoZnNSZXF1aXJlKHNlcnZlckVudHJ5KSBhcyBhbnkpLmRlZmF1bHQuYmluZChcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsaWVudE1hbmlmZXN0LFxuICAgICk7XG4gICAgLy8gU0VSVkVSIFNJREUgRU5UUllQT0lOVFxuICAgIGlmIChBcnJheS5pc0FycmF5KGluaXRSZW5kZXIpKSB7XG4gICAgICBpbml0UmVuZGVyLmZvckVhY2goYXN5bmMgaW5pdCA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9nLmluZm8oJ1Jlc29sdmluZyBxdWV1ZWQgcmVxdWVzdHMnKTtcbiAgICAgICAgICBhd2FpdCByZW5kZXIoLi4uaW5pdC5hcmdzKTtcbiAgICAgICAgICBpbml0LnJlc29sdmUoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZy5lcnJvcignRXJyb3Igd2hlbiBhdHRlbXB0aW5nIHRvIHJlbmRlciBxdWV1ZWQgcmVxdWVzdHMnKTtcbiAgICAgICAgICBsb2cuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaW5pdFJlbmRlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZXZTZXJ2ZXIgPSBuZXcgV2VicGFja0RldlNlcnZlcihcbiAgICAvLyB3cml0ZSB0byBtZW1vcnkgZmlsZXN5c3RlbSBzbyB3ZSBjYW4gaW1wb3J0XG4gICAge1xuICAgICAgLi4ud2VicGFja0NvbmZpZ3NbMF0uZGV2U2VydmVyLFxuICAgICAgZGV2TWlkZGxld2FyZToge1xuICAgICAgICAuLi53ZWJwYWNrQ29uZmlnc1swXT8uZGV2U2VydmVyPy5kZXZNaWRkbGV3YXJlLFxuICAgICAgICBvdXRwdXRGaWxlU3lzdGVtOiB7XG4gICAgICAgICAgLi4uZnMsXG4gICAgICAgICAgam9pbjogcGF0aC5qb2luIGFzIGFueSxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICB9LFxuICAgICAgc2V0dXBNaWRkbGV3YXJlczogKG1pZGRsZXdhcmVzLCBkZXZTZXJ2ZXIpID0+IHtcbiAgICAgICAgaWYgKCFkZXZTZXJ2ZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dlYnBhY2stZGV2LXNlcnZlciBpcyBub3QgZGVmaW5lZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3RoZXJSb3V0ZXMgPSBbXG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0VCUEFDS19QVUJMSUNfUEFUSCxcbiAgICAgICAgICAuLi4od2VicGFja0NvbmZpZ3NbMF0uZGV2U2VydmVyPy5wcm94eVxuICAgICAgICAgICAgPy5maWx0ZXIocHJveHkgPT4gdHlwZW9mIHByb3h5ID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgID8uZmxhdE1hcChwcm94eSA9PiBwcm94eS5jb250ZXh0KSA/PyBbXSksXG4gICAgICAgIF07XG4gICAgICAgIC8vIHNlcnZlIFNTUiBmb3Igbm9uLVdFQlBBQ0tfUFVCTElDX1BBVEhcbiAgICAgICAgZGV2U2VydmVyLmFwcD8uZ2V0KFxuICAgICAgICAgIG5ldyBSZWdFeHAoYF4oPyEke290aGVyUm91dGVzLmpvaW4oJ3wnKX0pYCksXG4gICAgICAgICAgaGFuZGxlRXJyb3JzKGFzeW5jIGZ1bmN0aW9uIChyZXE6IGFueSwgcmVzOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChyZXEudXJsLmVuZHNXaXRoKCdmYXZpY29uLmljbycpKSB7XG4gICAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNDA0O1xuICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAgIHJlcy5zZW5kKCdub3QgZm91bmQnKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLnNvY2tldC5vbignZXJyb3InLCAoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgbG9nLmVycm9yKCdGYXRhbDonLCBlcnJvcik7XG4gICAgICAgICAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRUNPTk5SRVNFVCcpIHtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAnRUNPTk5SRVNFVCBpcyB1c3VhbGx5IGR1ZSB0byBicm93c2VyIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24nLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBhd2FpdCByZW5kZXIocmVxLCByZXMpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXI/LnNldHVwTWlkZGxld2FyZXMpIHtcbiAgICAgICAgICByZXR1cm4gd2VicGFja0NvbmZpZ3NbMF0uZGV2U2VydmVyLnNldHVwTWlkZGxld2FyZXMoXG4gICAgICAgICAgICBtaWRkbGV3YXJlcyxcbiAgICAgICAgICAgIGRldlNlcnZlcixcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1pZGRsZXdhcmVzO1xuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbXBpbGVyLFxuICApO1xuICBjb25zdCBydW5TZXJ2ZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgZGV2U2VydmVyLnN0YXJ0KCk7XG4gICAgZGV2U2VydmVyLmNvbXBpbGVyLmhvb2tzLmRvbmUudGFwKFxuICAgICAgJ0FuYW5zaSBTZXJ2ZXInLFxuICAgICAgKG11bHRpU3RhdHM6IHdlYnBhY2suTXVsdGlTdGF0cyB8IHdlYnBhY2suU3RhdHMpID0+IHtcbiAgICAgICAgaWYgKCFtdWx0aVN0YXRzKSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdzdGF0cyBub3Qgc2VuZCcpO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIU9iamVjdC5oYXNPd24obXVsdGlTdGF0cywgJ3N0YXRzJykpIHJldHVybjtcbiAgICAgICAgaWYgKChtdWx0aVN0YXRzIGFzIHdlYnBhY2suTXVsdGlTdGF0cykuc3RhdHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpbXBvcnRSZW5kZXIoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0cyk7XG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHNlcnZlIGVudHJ5cG9pbnQnKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbmRlciA9IG5ldyBSZWdFeHAoYCR7c2VydmVyRW50cnl9OihbXFxcXGRdKyk6KFtcXFxcZF0rKWAsICdnJyk7XG4gICAgICAgICAgICBzZXJ2ZXJGaWxlQ29udGVudHMudGhlbihmaWxlVGV4dCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHRleHRSb3dzID0gZmlsZVRleHQuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgICBsb2cuZXJyb3IoJz4+PiBTdGFjayBDb250ZXh0IFtzZXJ2ZSBlbnRyeXBvaW50XSA8PDwnKTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBlLnN0YWNrLm1hdGNoQWxsKGZpbmRlcikgPz8gW10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IE51bWJlci5wYXJzZUludChtYXRjaFsyXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHBhdGguYmFzZW5hbWUoc2VydmVyRW50cnkpICsgJyAnICsgcm93ICsgJzonICsgY29sKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93IC0gMl0pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgLSAxXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKEFycmF5KGNvbCkuam9pbignICcpICsgJ14nKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93XSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3JvdyArIDFdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93ICsgMl0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRpc2tGcy53cml0ZUZpbGVTeW5jKHNlcnZlckVudHJ5LCBmaWxlVGV4dCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdPbmx5IGNvbXBpbGVyIG9uZSBzdGF0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfTtcbiAgY29uc3Qgc3RvcFNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgICBsb2cuaW5mbygnU3RvcHBpbmcgc2VydmVyLi4uJyk7XG4gICAgYXdhaXQgZGV2U2VydmVyLnN0b3AoKTtcbiAgICBsb2cuaW5mbygnU2VydmVyIGNsb3NlZCcpO1xuICB9O1xuXG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsICgpID0+IHtcbiAgICBsb2cud2FybignUmVjZWl2ZWQgU0lHSU5ULCBkZXZzZXJ2ZXIgc2h1dHRpbmcgZG93bicpO1xuICAgIHN0b3BTZXJ2ZXIoKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9KTtcblxuICBydW5TZXJ2ZXIoKTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQUEsTUFBTSxDQUFDQyxNQUFNLEdBQ1hELE1BQU0sQ0FBQ0MsTUFBTSxJQUNiLDBCQUEyQixTQUFTQSxNQUFNQSxDQUFDQyxFQUFFLEVBQUVDLEdBQUcsRUFBRTtFQUNsRCxPQUFPSCxNQUFNLENBQUNJLFNBQVMsQ0FBQ0MsY0FBYyxDQUFDQyxJQUFJLENBQUNKLEVBQUUsRUFBRUMsR0FBRyxDQUFDO0FBQ3RELENBQUM7QUFFSCxPQUFPSSxNQUFNLE1BQU0sSUFBSTtBQUV2QixTQUFTQyxrQkFBa0IsRUFBRUMsTUFBTSxRQUFRLE9BQU87QUFDbEQsT0FBT0MsSUFBSSxNQUFNLE1BQU07QUFDdkIsT0FBT0MsZ0JBQWdCLE1BQU0sb0JBQW9CO0FBQ2pELE9BQU9DLEdBQUcsTUFBTSxLQUFLO0FBQ3JCLFNBQVNDLEdBQUcsUUFBUSxTQUFTO0FBQzdCLFNBQVNDLFNBQVMsUUFBUSxNQUFNO0FBQ2hDLE9BQU9DLE9BQU8sTUFBdUQsU0FBUztBQUM5RSxPQUFPQyxPQUFPLE1BQU0sZ0NBQWdDO0FBQ3BELE9BQU9DLGdCQUFnQixNQUFNLG9CQUFvQjtBQUVqRCxPQUFPLG1DQUFtQztBQUMxQyxTQUFTQyxtQkFBbUIsUUFBUSwwQkFBMEI7QUFDOUQsU0FBU0MsZ0JBQWdCLFFBQVEsdUJBQXVCO0FBQ3hELFNBQVNDLGNBQWMsRUFBRUMsZUFBZSxRQUFRLHNCQUFzQjtBQUd0RTtBQUNBO0FBQ0E7QUFDQSxJQUFJQyxNQUFNLENBQUNDLElBQUksQ0FBQ0MsSUFBSSxFQUFFO0VBQ3BCLE1BQU1DLFVBQVUsR0FBR0MsT0FBTyxDQUFDQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBRWxDLElBQUksQ0FBQ0YsVUFBVSxFQUFFO0lBQ2ZHLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDLHVDQUF1QyxDQUFDO0lBQ3BESCxPQUFPLENBQUNJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNsQjtFQUVBQyxjQUFjLENBQUNOLFVBQVUsQ0FBQztBQUM1QjtBQUVBLElBQUlPLGtCQUFtQyxHQUFHQyxPQUFPLENBQUNDLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDN0QsSUFBSUMsV0FBVyxHQUFHLEVBQUU7QUFFcEIsZUFBZSxlQUFlSixjQUFjQSxDQUMxQ04sVUFBa0IsRUFDbEJXLEdBQTRCLEdBQUcsQ0FBQyxDQUFDLEVBQ2pDO0VBQ0EsTUFBTUMsYUFBYSxHQUFHLE1BQU1sQixnQkFBZ0IsQ0FBQyxDQUFDO0VBRTlDLE1BQU1VLEdBQUcsR0FBR2IsT0FBTyxDQUFDc0IsU0FBUyxDQUFDLGtCQUFrQixDQUFDOztFQUVqRDtFQUNBLE1BQU1DLE1BQU0sR0FBRyxJQUFJOUIsTUFBTSxDQUFDLENBQUM7RUFDM0IsTUFBTStCLEVBQUUsR0FBR2hDLGtCQUFrQixDQUFDK0IsTUFBTSxDQUFDO0VBQ3JDMUIsR0FBRyxDQUFDNEIsR0FBRyxDQUFDbEMsTUFBTSxDQUFDLENBQUNrQyxHQUFHLENBQUNELEVBQVMsQ0FBQztFQUU5QixNQUFNRSxTQUFTLEdBQUd4QixtQkFBbUIsQ0FBQ0wsR0FBRyxDQUFDO0VBRTFDLE1BQU04QixRQUFRLEdBQUc3QixTQUFTLENBQUNELEdBQUcsQ0FBQzhCLFFBQVEsQ0FBQztFQUN4QztFQUNBLFNBQVNDLFFBQVFBLENBQUNDLFNBQWlCLEVBQUU7SUFDbkM7SUFDQTtJQUNBLE1BQU1DLG1CQUFtQixHQUFHbEMsR0FBRyxDQUFDbUMsUUFBUSxDQUFDO01BQUVDLE9BQU8sRUFBRTtJQUFNLENBQUMsQ0FBQztJQUM1RHpDLE1BQU0sQ0FBQzBDLFNBQVMsQ0FDZEgsbUJBQW1CLENBQUNJLEVBQUUsRUFDdEI7QUFDTix1QkFBdUJ4QyxJQUFJLENBQUN3QixPQUFPLENBQUNSLE9BQU8sQ0FBQ3lCLEdBQUcsQ0FBQyxDQUFDLEVBQUVOLFNBQVMsQ0FBQztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUNJLENBQUM7SUFDRCxPQUFPQyxtQkFBbUI7RUFDNUI7RUFFQSxNQUFNTSxjQUErQixHQUFHLENBQ3RDZixhQUFhLENBQ1g7SUFDRSxHQUFHRCxHQUFHO0lBQ05pQixTQUFTLEVBQUVULFFBQVEsQ0FBQ25CLFVBQVUsQ0FBQyxDQUFDNkIsSUFBSTtJQUNwQ0EsSUFBSSxFQUFFO0VBQ1IsQ0FBQyxFQUNEO0lBQUVDLElBQUksRUFBRTtFQUFjLENBQ3hCLENBQUMsRUFDRGxCLGFBQWEsQ0FDWDtJQUNFLEdBQUdELEdBQUc7SUFDTmlCLFNBQVMsRUFBRTVCLFVBQVUsQ0FBQytCLE9BQU8sQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDO0lBQ3BERixJQUFJLEVBQUUsUUFBUTtJQUNkRyxnQkFBZ0IsRUFBRTtFQUNwQixDQUFDLEVBQ0Q7SUFBRUYsSUFBSSxFQUFFLGFBQWE7SUFBRUcsTUFBTSxFQUFFO0VBQU8sQ0FDeEMsQ0FBQyxDQUNGOztFQUVEO0VBQ0EsTUFBTUMsUUFBUSxHQUFHNUMsT0FBTyxDQUFDcUMsY0FBK0MsQ0FBQztFQUN6RSxJQUFJLENBQUNPLFFBQVEsRUFBRTtJQUNiOUIsR0FBRyxDQUFDK0IsS0FBSyxDQUFDLDJDQUEyQyxDQUFDO0lBQ3REbEMsT0FBTyxDQUFDSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbEI7RUFFQW5CLGdCQUFnQixDQUFDa0QsT0FBTyxDQUFDO0lBQUVDLFdBQVcsRUFBRTtFQUFLLENBQUMsQ0FBQztFQUUvQyxTQUFTQyxlQUFlQSxDQUFDQyxXQUEwQixFQUFFO0lBQ25ELE1BQU1DLFVBQVUsR0FBR0QsV0FBVyxDQUFDRSxNQUFNLENBQUM7TUFBRUMsTUFBTSxFQUFFO0lBQUssQ0FBQyxDQUFDO0lBQ3ZELE9BQU96RCxJQUFJLENBQUMwRCxJQUFJLENBQUNILFVBQVUsQ0FBQ0ksVUFBVSxJQUFJLEVBQUUsRUFBRSxXQUFXLENBQUM7RUFDNUQ7RUFDQSxTQUFTQyxZQUFZQSxDQUtuQkMsRUFBSyxFQUFFO0lBQ1AsT0FBTyxnQkFDTEMsR0FBOEIsRUFDOUJDLEdBQThCLEVBQzlCQyxLQUFtQixFQUNuQjtNQUNBLElBQUk7UUFDRixPQUFPLE1BQU1ILEVBQUUsQ0FBQ0MsR0FBRyxFQUFFQyxHQUFHLENBQUM7TUFDM0IsQ0FBQyxDQUFDLE9BQU9iLEtBQWMsRUFBRTtRQUN2Qi9CLEdBQUcsQ0FBQytCLEtBQUssQ0FBQyxzQkFBc0IsRUFBRUEsS0FBSyxDQUFDOztRQUV4QztRQUNBLE1BQU1lLFVBQVUsR0FBR0YsR0FBVTtRQUM3QixJQUFJLENBQUNFLFVBQVUsQ0FBQ0MsV0FBVyxFQUFFO1VBQzNCLE1BQU1DLFVBQVUsR0FBR3pELGNBQWMsQ0FBQ3dDLEtBQUssQ0FBQztVQUN4Q2UsVUFBVSxDQUFDRyxNQUFNLENBQUNELFVBQVUsQ0FBQztVQUM3QkYsVUFBVSxDQUFDSSxTQUFTLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQztVQUNqREosVUFBVSxDQUFDSyxJQUFJLENBQ2IzRCxlQUFlLENBQUN1QyxLQUFLLEVBQUVZLEdBQUcsQ0FBQ1MsR0FBRyxJQUFJLEdBQUcsRUFBRUosVUFBVSxFQUFFO1lBQ2pESyxTQUFTLEVBQUUsSUFBSTtZQUNmQyxLQUFLLEVBQUUsVUFBVTtZQUNqQkMsSUFBSSxFQUFFO1VBQ1IsQ0FBQyxDQUNILENBQUM7UUFDSDtNQUNGO0lBQ0YsQ0FBQztFQUNIO0VBRUEsSUFBSUMsVUFFUyxHQUFHLEVBQUU7RUFDbEIsSUFBSUMsTUFBbUIsR0FBR0EsQ0FBQyxHQUFHQyxJQUFJLEtBQ2hDLElBQUl0RCxPQUFPLENBQUNDLE9BQU8sSUFBSTtJQUNyQm1ELFVBQVUsRUFBRUcsSUFBSSxDQUFDO01BQUVELElBQUk7TUFBRXJEO0lBQVEsQ0FBQyxDQUFDO0VBQ3JDLENBQUMsQ0FBQztFQUVKLFNBQVN1RCxZQUFZQSxDQUFDQyxLQUFzQixFQUFFO0lBQzVDLE1BQU0sQ0FBQ0MsV0FBVyxFQUFFM0IsV0FBVyxDQUFDLEdBQUcwQixLQUFLO0lBQ3hDLElBQ0VDLFdBQVcsRUFBRUMsV0FBVyxFQUFFQyxNQUFNLEVBQUVDLE1BQU0sSUFDeEM5QixXQUFXLEVBQUU0QixXQUFXLEVBQUVDLE1BQU0sRUFBRUMsTUFBTSxFQUN4QztNQUNBakUsR0FBRyxDQUFDK0IsS0FBSyxDQUFDLDJCQUEyQixHQUFHK0IsV0FBVyxDQUFDQyxXQUFXLENBQUNDLE1BQU0sQ0FBQztNQUN2RWhFLEdBQUcsQ0FBQytCLEtBQUssQ0FBQywyQkFBMkIsR0FBR0ksV0FBVyxDQUFDNEIsV0FBVyxDQUFDQyxNQUFNLENBQUM7TUFDdkU7TUFDQSxJQUFJRSxLQUFLLENBQUNDLE9BQU8sQ0FBQ1gsVUFBVSxDQUFDLEVBQUU7UUFDN0IzRCxPQUFPLENBQUNJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNsQjtNQUNBRCxHQUFHLENBQUMrQixLQUFLLENBQUMsdUNBQXVDLENBQUM7TUFDbEQ7SUFDRixDQUFDLE1BQU07TUFDTC9CLEdBQUcsQ0FBQ29FLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDM0I7O0lBRUE7SUFDQSxNQUFNQyxjQUFjLEdBQUdQLFdBQVcsQ0FBQ3pCLE1BQU0sQ0FBQyxDQUFDO0lBRTNDL0IsV0FBVyxHQUFHNEIsZUFBZSxDQUFDQyxXQUFXLENBQUM7SUFDMUNoQyxrQkFBa0IsR0FBR1csUUFBUSxDQUFDUixXQUFXLENBQUMsQ0FBQ2dFLElBQUksQ0FBQ0MsR0FBRyxJQUFJQSxHQUFHLENBQUNDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDdEU7SUFDQXJHLE1BQU0sQ0FBQ3NHLElBQUksQ0FBQzVELFNBQVMsQ0FBQzZELEtBQUssQ0FBQyxDQUFDQyxPQUFPLENBQUNyRyxHQUFHLElBQUk7TUFDMUMsT0FBT3VDLFNBQVMsQ0FBQzZELEtBQUssQ0FBQ3BHLEdBQUcsQ0FBQztJQUM3QixDQUFDLENBQUM7SUFDRm1GLE1BQU0sR0FBSTVDLFNBQVMsQ0FBQ1AsV0FBVyxDQUFDLENBQVNzRSxPQUFPLENBQUNDLElBQUksQ0FDbkRDLFNBQVMsRUFDVFQsY0FDRixDQUFDO0lBQ0Q7SUFDQSxJQUFJSCxLQUFLLENBQUNDLE9BQU8sQ0FBQ1gsVUFBVSxDQUFDLEVBQUU7TUFDN0JBLFVBQVUsQ0FBQ21CLE9BQU8sQ0FBQyxNQUFNSSxJQUFJLElBQUk7UUFDL0IsSUFBSTtVQUNGL0UsR0FBRyxDQUFDb0UsSUFBSSxDQUFDLDJCQUEyQixDQUFDO1VBQ3JDLE1BQU1YLE1BQU0sQ0FBQyxHQUFHc0IsSUFBSSxDQUFDckIsSUFBSSxDQUFDO1VBQzFCcUIsSUFBSSxDQUFDMUUsT0FBTyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLE9BQU8yRSxDQUFDLEVBQUU7VUFDVmhGLEdBQUcsQ0FBQytCLEtBQUssQ0FBQyxpREFBaUQsQ0FBQztVQUM1RC9CLEdBQUcsQ0FBQytCLEtBQUssQ0FBQ2lELENBQUMsQ0FBQztRQUNkO01BQ0YsQ0FBQyxDQUFDO01BQ0Z4QixVQUFVLEdBQUdzQixTQUFTO0lBQ3hCO0VBQ0Y7RUFFQSxNQUFNRyxTQUFTLEdBQUcsSUFBSTdGLGdCQUFnQjtFQUNwQztFQUNBO0lBQ0UsR0FBR21DLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQzBELFNBQVM7SUFDOUJDLGFBQWEsRUFBRTtNQUNiLEdBQUczRCxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUwRCxTQUFTLEVBQUVDLGFBQWE7TUFDOUNDLGdCQUFnQixFQUFFO1FBQ2hCLEdBQUd4RSxFQUFFO1FBQ0w0QixJQUFJLEVBQUUxRCxJQUFJLENBQUMwRDtNQUNiO0lBQ0YsQ0FBQztJQUNENkMsZ0JBQWdCLEVBQUVBLENBQUNDLFdBQVcsRUFBRUosU0FBUyxLQUFLO01BQzVDLElBQUksQ0FBQ0EsU0FBUyxFQUFFO1FBQ2QsTUFBTSxJQUFJSyxLQUFLLENBQUMsbUNBQW1DLENBQUM7TUFDdEQ7TUFFQSxNQUFNQyxXQUFXLEdBQUcsQ0FDbEIxRixPQUFPLENBQUNVLEdBQUcsQ0FBQ2lGLG1CQUFtQixFQUMvQixJQUFJakUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDMEQsU0FBUyxFQUFFUSxLQUFLLEVBQ2xDQyxNQUFNLENBQUNELEtBQUssSUFBSSxPQUFPQSxLQUFLLEtBQUssUUFBUSxDQUFDLEVBQzFDRSxPQUFPLENBQUNGLEtBQUssSUFBSUEsS0FBSyxDQUFDRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FDM0M7TUFDRDtNQUNBWCxTQUFTLENBQUNZLEdBQUcsRUFBRUMsR0FBRyxDQUNoQixJQUFJQyxNQUFNLENBQUMsT0FBT1IsV0FBVyxDQUFDaEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFDM0NFLFlBQVksQ0FBQyxnQkFBZ0JFLEdBQVEsRUFBRUMsR0FBUSxFQUFFO1FBQy9DLElBQUlELEdBQUcsQ0FBQ1MsR0FBRyxDQUFDNEMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1VBQ25DcEQsR0FBRyxDQUFDSSxVQUFVLEdBQUcsR0FBRztVQUNwQkosR0FBRyxDQUFDTSxTQUFTLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQztVQUMxQ04sR0FBRyxDQUFDTyxJQUFJLENBQUMsV0FBVyxDQUFDO1VBQ3JCO1FBQ0Y7UUFDQVAsR0FBRyxDQUFDcUQsTUFBTSxDQUFDQyxFQUFFLENBQUMsT0FBTyxFQUFHbkUsS0FBYyxJQUFLO1VBQ3pDL0IsR0FBRyxDQUFDK0IsS0FBSyxDQUFDLFFBQVEsRUFBRUEsS0FBSyxDQUFDO1VBQzFCLElBQUtBLEtBQUssQ0FBU29FLElBQUksS0FBSyxZQUFZLEVBQUU7WUFDeENuRyxHQUFHLENBQUMrQixLQUFLLENBQ1AsNkRBQ0YsQ0FBQztVQUNIO1FBQ0YsQ0FBQyxDQUFDO1FBRUYsTUFBTTBCLE1BQU0sQ0FBQ2QsR0FBRyxFQUFFQyxHQUFHLENBQUM7TUFDeEIsQ0FBQyxDQUNILENBQUM7TUFFRCxJQUFJckIsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDMEQsU0FBUyxFQUFFRyxnQkFBZ0IsRUFBRTtRQUNqRCxPQUFPN0QsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDMEQsU0FBUyxDQUFDRyxnQkFBZ0IsQ0FDakRDLFdBQVcsRUFDWEosU0FDRixDQUFDO01BQ0g7TUFFQSxPQUFPSSxXQUFXO0lBQ3BCO0VBQ0YsQ0FBQyxFQUNEdkQsUUFDRixDQUFDO0VBQ0QsTUFBTXNFLFNBQVMsR0FBRyxNQUFBQSxDQUFBLEtBQVk7SUFDNUIsTUFBTW5CLFNBQVMsQ0FBQ29CLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCcEIsU0FBUyxDQUFDbkQsUUFBUSxDQUFDd0UsS0FBSyxDQUFDQyxJQUFJLENBQUNDLEdBQUcsQ0FDL0IsZUFBZSxFQUNkQyxVQUE4QyxJQUFLO01BQ2xELElBQUksQ0FBQ0EsVUFBVSxFQUFFO1FBQ2Z6RyxHQUFHLENBQUMrQixLQUFLLENBQUMsZ0JBQWdCLENBQUM7UUFDM0JsQyxPQUFPLENBQUNJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNsQjtNQUVBLElBQUksQ0FBQzlCLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDcUksVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFO01BQ3pDLElBQUtBLFVBQVUsQ0FBd0I1QyxLQUFLLENBQUNJLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDdkQsSUFBSTtVQUNGTCxZQUFZLENBQUU2QyxVQUFVLENBQXdCNUMsS0FBSyxDQUFDO1FBQ3hELENBQUMsQ0FBQyxPQUFPbUIsQ0FBTSxFQUFFO1VBQ2ZoRixHQUFHLENBQUMrQixLQUFLLENBQUMsaUNBQWlDLENBQUM7VUFDNUMsTUFBTTJFLE1BQU0sR0FBRyxJQUFJWCxNQUFNLENBQUMsR0FBR3pGLFdBQVcsb0JBQW9CLEVBQUUsR0FBRyxDQUFDO1VBQ2xFSCxrQkFBa0IsQ0FBQ21FLElBQUksQ0FBQ3FDLFFBQVEsSUFBSTtZQUNsQyxNQUFNQyxRQUFRLEdBQUdELFFBQVEsQ0FBQ0UsS0FBSyxDQUFDLElBQUksQ0FBQztZQUNyQzdHLEdBQUcsQ0FBQytCLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQztZQUNyRCxLQUFLLE1BQU0rRSxLQUFLLElBQUk5QixDQUFDLENBQUMrQixLQUFLLENBQUNDLFFBQVEsQ0FBQ04sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFO2NBQ2xELE1BQU1PLEdBQUcsR0FBR0MsTUFBTSxDQUFDQyxRQUFRLENBQUNMLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztjQUNyQyxNQUFNTSxHQUFHLEdBQUdGLE1BQU0sQ0FBQ0MsUUFBUSxDQUFDTCxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Y0FDckM5RyxHQUFHLENBQUMrQixLQUFLLENBQUNsRCxJQUFJLENBQUN3SSxRQUFRLENBQUMvRyxXQUFXLENBQUMsR0FBRyxHQUFHLEdBQUcyRyxHQUFHLEdBQUcsR0FBRyxHQUFHRyxHQUFHLENBQUM7Y0FDN0RwSCxHQUFHLENBQUMrQixLQUFLLENBQUM2RSxRQUFRLENBQUNLLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztjQUM1QmpILEdBQUcsQ0FBQytCLEtBQUssQ0FBQzZFLFFBQVEsQ0FBQ0ssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO2NBQzVCakgsR0FBRyxDQUFDK0IsS0FBSyxDQUFDbUMsS0FBSyxDQUFDa0QsR0FBRyxDQUFDLENBQUM3RSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO2NBQ3JDdkMsR0FBRyxDQUFDK0IsS0FBSyxDQUFDNkUsUUFBUSxDQUFDSyxHQUFHLENBQUMsQ0FBQztjQUN4QmpILEdBQUcsQ0FBQytCLEtBQUssQ0FBQzZFLFFBQVEsQ0FBQ0ssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO2NBQzVCakgsR0FBRyxDQUFDK0IsS0FBSyxDQUFDNkUsUUFBUSxDQUFDSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDOUI7WUFDQXZJLE1BQU0sQ0FBQzRJLGFBQWEsQ0FBQ2hILFdBQVcsRUFBRXFHLFFBQVEsQ0FBQztVQUM3QyxDQUFDLENBQUM7VUFFRixNQUFNM0IsQ0FBQztRQUNUO01BQ0YsQ0FBQyxNQUFNO1FBQ0xoRixHQUFHLENBQUMrQixLQUFLLENBQUMsd0JBQXdCLENBQUM7TUFDckM7SUFDRixDQUNGLENBQUM7RUFDSCxDQUFDO0VBQ0QsTUFBTXdGLFVBQVUsR0FBRyxNQUFBQSxDQUFBLEtBQVk7SUFDN0J2SCxHQUFHLENBQUNvRSxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDOUIsTUFBTWEsU0FBUyxDQUFDdUMsSUFBSSxDQUFDLENBQUM7SUFDdEJ4SCxHQUFHLENBQUNvRSxJQUFJLENBQUMsZUFBZSxDQUFDO0VBQzNCLENBQUM7RUFFRHZFLE9BQU8sQ0FBQ3FHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTTtJQUN6QmxHLEdBQUcsQ0FBQ3lILElBQUksQ0FBQywwQ0FBMEMsQ0FBQztJQUNwREYsVUFBVSxDQUFDLENBQUM7SUFDWjFILE9BQU8sQ0FBQ0ksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2xCLENBQUMsQ0FBQztFQUVGbUcsU0FBUyxDQUFDLENBQUM7QUFDYiIsImlnbm9yZUxpc3QiOltdfQ==
|
|
247
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRpc2tGcyIsImNyZWF0ZUZzRnJvbVZvbHVtZSIsIlZvbHVtZSIsInBhdGgiLCJzb3VyY2VNYXBTdXBwb3J0IiwidG1wIiwidWZzIiwicHJvbWlzaWZ5Iiwid2VicGFjayIsImxvZ2dpbmciLCJXZWJwYWNrRGV2U2VydmVyIiwiY3JlYXRlSHlicmlkUmVxdWlyZSIsImdldFdlYnBhY2tDb25maWciLCJleHRyYWN0UHJveHlSb3V0ZXMiLCJnZXRFcnJvclN0YXR1cyIsInJlbmRlckVycm9yUGFnZSIsImltcG9ydCIsIm1ldGEiLCJtYWluIiwiZW50cnlwb2ludCIsInByb2Nlc3MiLCJhcmd2IiwiY29uc29sZSIsImxvZyIsImV4aXQiLCJzdGFydERldlNlcnZlciIsInNlcnZlckZpbGVDb250ZW50cyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2VydmVyRW50cnkiLCJlbnYiLCJ3ZWJwYWNrQ29uZmlnIiwiZ2V0TG9nZ2VyIiwidm9sdW1lIiwiZnMiLCJ1c2UiLCJmc1JlcXVpcmUiLCJyZWFkRmlsZSIsImhvdEVudHJ5IiwiZW50cnlQYXRoIiwiZ2VuZXJhdGVkRW50cnlwb2ludCIsImZpbGVTeW5jIiwicG9zdGZpeCIsIndyaXRlU3luYyIsImZkIiwiY3dkIiwid2VicGFja0NvbmZpZ3MiLCJlbnRyeXBhdGgiLCJuYW1lIiwibW9kZSIsInJlcGxhY2UiLCJCUk9XU0VSU0xJU1RfRU5WIiwidGFyZ2V0IiwiY29tcGlsZXIiLCJlcnJvciIsImluc3RhbGwiLCJob29rUmVxdWlyZSIsImdldFNlcnZlckJ1bmRsZSIsInNlcnZlclN0YXRzIiwic2VydmVySnNvbiIsInRvSnNvbiIsImFzc2V0cyIsImpvaW4iLCJvdXRwdXRQYXRoIiwiaGFuZGxlRXJyb3JzIiwiZm4iLCJyZXEiLCJyZXMiLCJfbmV4dCIsImV4cHJlc3NSZXMiLCJoZWFkZXJzU2VudCIsInN0YXR1c0NvZGUiLCJzdGF0dXMiLCJzZXRIZWFkZXIiLCJzZW5kIiwidXJsIiwic2hvd1N0YWNrIiwiYmFkZ2UiLCJoaW50IiwiaW5pdFJlbmRlciIsInJlbmRlciIsImFyZ3MiLCJwdXNoIiwiaW1wb3J0UmVuZGVyIiwic3RhdHMiLCJjbGllbnRTdGF0cyIsImNvbXBpbGF0aW9uIiwiZXJyb3JzIiwibGVuZ3RoIiwiQXJyYXkiLCJpc0FycmF5IiwiaW5mbyIsImNsaWVudE1hbmlmZXN0IiwidGhlbiIsImJ1ZiIsInRvU3RyaW5nIiwia2V5cyIsImNhY2hlIiwiZm9yRWFjaCIsImRlZmF1bHQiLCJiaW5kIiwidW5kZWZpbmVkIiwiaW5pdCIsImUiLCJkZXZTZXJ2ZXIiLCJkZXZNaWRkbGV3YXJlIiwib3V0cHV0RmlsZVN5c3RlbSIsInNldHVwTWlkZGxld2FyZXMiLCJtaWRkbGV3YXJlcyIsIkVycm9yIiwib3RoZXJSb3V0ZXMiLCJXRUJQQUNLX1BVQkxJQ19QQVRIIiwicHJveHkiLCJhcHAiLCJnZXQiLCJSZWdFeHAiLCJlbmRzV2l0aCIsInNvY2tldCIsIm9uIiwiY29kZSIsInJ1blNlcnZlciIsInN0YXJ0IiwiaG9va3MiLCJkb25lIiwidGFwIiwibXVsdGlTdGF0cyIsImZpbmRlciIsImZpbGVUZXh0IiwidGV4dFJvd3MiLCJzcGxpdCIsIm1hdGNoIiwic3RhY2siLCJtYXRjaEFsbCIsInJvdyIsIk51bWJlciIsInBhcnNlSW50IiwiY29sIiwiYmFzZW5hbWUiLCJ3cml0ZUZpbGVTeW5jIiwic3RvcFNlcnZlciIsInN0b3AiLCJ3YXJuIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NjcmlwdHMvc3RhcnREZXZzZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuT2JqZWN0Lmhhc093biA9XG4gIE9iamVjdC5oYXNPd24gfHxcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gaGFzT3duKGl0LCBrZXkpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xuICB9O1xuaW1wb3J0IHR5cGUgeyBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBkaXNrRnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgY3JlYXRlRnNGcm9tVm9sdW1lLCBWb2x1bWUgfSBmcm9tICdtZW1mcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBzb3VyY2VNYXBTdXBwb3J0IGZyb20gJ3NvdXJjZS1tYXAtc3VwcG9ydCc7XG5pbXBvcnQgdG1wIGZyb20gJ3RtcCc7XG5pbXBvcnQgeyB1ZnMgfSBmcm9tICd1bmlvbmZzJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHdlYnBhY2ssIHsgdHlwZSBDb25maWd1cmF0aW9uLCB0eXBlIE11bHRpQ29uZmlndXJhdGlvbiB9IGZyb20gJ3dlYnBhY2snO1xuaW1wb3J0IGxvZ2dpbmcgZnJvbSAnd2VicGFjay9saWIvbG9nZ2luZy9ydW50aW1lLmpzJztcbmltcG9ydCBXZWJwYWNrRGV2U2VydmVyIGZyb20gJ3dlYnBhY2stZGV2LXNlcnZlcic7XG5cbmltcG9ydCAnY3Jvc3MtZmV0Y2gvZGlzdC9ub2RlLXBvbHlmaWxsLmpzJztcbmltcG9ydCB7IGNyZWF0ZUh5YnJpZFJlcXVpcmUgfSBmcm9tICcuL2NyZWF0ZUh5YnJpZFJlcXVpcmUuanMnO1xuaW1wb3J0IHsgZ2V0V2VicGFja0NvbmZpZyB9IGZyb20gJy4vZ2V0V2VicGFja0NvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRyYWN0UHJveHlSb3V0ZXMgfSBmcm9tICcuL3Byb3h5VXRpbHMuanMnO1xuaW1wb3J0IHsgZ2V0RXJyb3JTdGF0dXMsIHJlbmRlckVycm9yUGFnZSB9IGZyb20gJy4vc3NyRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IEJvdW5kUmVuZGVyIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIHJ1biBkaXJlY3RseSBmcm9tIG5vZGVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1pZ25vcmVcbmlmIChpbXBvcnQubWV0YS5tYWluKSB7XG4gIGNvbnN0IGVudHJ5cG9pbnQgPSBwcm9jZXNzLmFyZ3ZbMl07XG5cbiAgaWYgKCFlbnRyeXBvaW50KSB7XG4gICAgY29uc29sZS5sb2coYFVzYWdlOiBzdGFydC1hbmFuc2kgPGVudHJ5cG9pbnQtZmlsZT5gKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9XG5cbiAgc3RhcnREZXZTZXJ2ZXIoZW50cnlwb2ludCk7XG59XG5cbmxldCBzZXJ2ZXJGaWxlQ29udGVudHM6IFByb21pc2U8c3RyaW5nPiA9IFByb21pc2UucmVzb2x2ZSgnJyk7XG5sZXQgc2VydmVyRW50cnkgPSAnJztcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gc3RhcnREZXZTZXJ2ZXIoXG4gIGVudHJ5cG9pbnQ6IHN0cmluZyxcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuKSB7XG4gIGNvbnN0IHdlYnBhY2tDb25maWcgPSBhd2FpdCBnZXRXZWJwYWNrQ29uZmlnKCk7XG5cbiAgY29uc3QgbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoJ2FuYW5zaS1kZXZzZXJ2ZXInKTtcblxuICAvLyBTZXQgdXAgaW4gbWVtb3J5IGZpbGVzeXN0ZW1cbiAgY29uc3Qgdm9sdW1lID0gbmV3IFZvbHVtZSgpO1xuICBjb25zdCBmcyA9IGNyZWF0ZUZzRnJvbVZvbHVtZSh2b2x1bWUpO1xuICB1ZnMudXNlKGRpc2tGcykudXNlKGZzIGFzIGFueSk7XG5cbiAgY29uc3QgZnNSZXF1aXJlID0gY3JlYXRlSHlicmlkUmVxdWlyZSh1ZnMpO1xuXG4gIGNvbnN0IHJlYWRGaWxlID0gcHJvbWlzaWZ5KHVmcy5yZWFkRmlsZSk7XG4gIC8vIEdlbmVyYXRlIGEgdGVtcG9yYXJ5IGZpbGUgc28gd2UgY2FuIGhvdCByZWxvYWQgZnJvbSB0aGUgcm9vdCBvZiB0aGUgYXBwbGljYXRpb25cbiAgZnVuY3Rpb24gaG90RW50cnkoZW50cnlQYXRoOiBzdHJpbmcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAvLyBAdHMtaWdub3JlIGZvciBzb21lIHJlYXNvbiBpdCdzIG5vdCBwaWNraW5nIHVwIHRoYXQgb3RoZXIgb3B0aW9ucyBhcmUgb3B0aW9uYWxcbiAgICBjb25zdCBnZW5lcmF0ZWRFbnRyeXBvaW50ID0gdG1wLmZpbGVTeW5jKHsgcG9zdGZpeDogJy5qcycgfSk7XG4gICAgZGlza0ZzLndyaXRlU3luYyhcbiAgICAgIGdlbmVyYXRlZEVudHJ5cG9pbnQuZmQsXG4gICAgICBgXG4gIGltcG9ydCBlbnRyeSBmcm9tIFwiJHtwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZW50cnlQYXRoKX1cIjtcblxuICBpZiAoaW1wb3J0Lm1ldGEud2VicGFja0hvdCkge1xuICAgIGltcG9ydC5tZXRhLndlYnBhY2tIb3QuYWNjZXB0KCk7XG4gIH1cblxuICBleHBvcnQgZGVmYXVsdCBlbnRyeTtcbiAgICBgLFxuICAgICk7XG4gICAgcmV0dXJuIGdlbmVyYXRlZEVudHJ5cG9pbnQ7XG4gIH1cblxuICBjb25zdCB3ZWJwYWNrQ29uZmlnczogQ29uZmlndXJhdGlvbltdID0gW1xuICAgIHdlYnBhY2tDb25maWcoXG4gICAgICB7XG4gICAgICAgIC4uLmVudixcbiAgICAgICAgZW50cnlwYXRoOiBob3RFbnRyeShlbnRyeXBvaW50KS5uYW1lLFxuICAgICAgICBuYW1lOiAnY2xpZW50JyxcbiAgICAgIH0sXG4gICAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcgfSxcbiAgICApLFxuICAgIHdlYnBhY2tDb25maWcoXG4gICAgICB7XG4gICAgICAgIC4uLmVudixcbiAgICAgICAgZW50cnlwYXRoOiBlbnRyeXBvaW50LnJlcGxhY2UoJy50c3gnLCAnLnNlcnZlci50c3gnKSxcbiAgICAgICAgbmFtZTogJ3NlcnZlcicsXG4gICAgICAgIEJST1dTRVJTTElTVF9FTlY6ICdjdXJyZW50IG5vZGUnLFxuICAgICAgfSxcbiAgICAgIHsgbW9kZTogJ2RldmVsb3BtZW50JywgdGFyZ2V0OiAnbm9kZScgfSxcbiAgICApLFxuICBdO1xuXG4gIC8vIGluaXRpYWxpemUgdGhlIHdlYnBhY2sgY29tcGlsZXJcbiAgY29uc3QgY29tcGlsZXIgPSB3ZWJwYWNrKHdlYnBhY2tDb25maWdzIGFzIHVua25vd24gYXMgTXVsdGlDb25maWd1cmF0aW9uKTtcbiAgaWYgKCFjb21waWxlcikge1xuICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHdlYnBhY2sgY29tcGlsZXInKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9XG5cbiAgc291cmNlTWFwU3VwcG9ydC5pbnN0YWxsKHsgaG9va1JlcXVpcmU6IHRydWUgfSk7XG5cbiAgZnVuY3Rpb24gZ2V0U2VydmVyQnVuZGxlKHNlcnZlclN0YXRzOiB3ZWJwYWNrLlN0YXRzKSB7XG4gICAgY29uc3Qgc2VydmVySnNvbiA9IHNlcnZlclN0YXRzLnRvSnNvbih7IGFzc2V0czogdHJ1ZSB9KTtcbiAgICByZXR1cm4gcGF0aC5qb2luKHNlcnZlckpzb24ub3V0cHV0UGF0aCA/PyAnJywgJ3NlcnZlci5qcycpO1xuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZUVycm9yczxcbiAgICBGIGV4dGVuZHMgKFxuICAgICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgICkgPT4gUHJvbWlzZTx2b2lkPixcbiAgPihmbjogRikge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiAoXG4gICAgICByZXE6IFJlcXVlc3QgfCBJbmNvbWluZ01lc3NhZ2UsXG4gICAgICByZXM6IFJlc3BvbnNlIHwgU2VydmVyUmVzcG9uc2UsXG4gICAgICBfbmV4dDogTmV4dEZ1bmN0aW9uLFxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKHJlcSwgcmVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcignU1NSIHJlbmRlcmluZyBlcnJvcjonLCBlcnJvcik7XG5cbiAgICAgICAgLy8gUmV0dXJuIGVycm9yIHJlc3BvbnNlIHdpdGggc3RhdHVzIGZyb20gZXJyb3IgaWYgYXZhaWxhYmxlXG4gICAgICAgIGNvbnN0IGV4cHJlc3NSZXMgPSByZXMgYXMgYW55O1xuICAgICAgICBpZiAoIWV4cHJlc3NSZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gZ2V0RXJyb3JTdGF0dXMoZXJyb3IpO1xuICAgICAgICAgIGV4cHJlc3NSZXMuc3RhdHVzKHN0YXR1c0NvZGUpO1xuICAgICAgICAgIGV4cHJlc3NSZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgZXhwcmVzc1Jlcy5zZW5kKFxuICAgICAgICAgICAgcmVuZGVyRXJyb3JQYWdlKGVycm9yLCByZXEudXJsID8/ICcvJywgc3RhdHVzQ29kZSwge1xuICAgICAgICAgICAgICBzaG93U3RhY2s6IHRydWUsXG4gICAgICAgICAgICAgIGJhZGdlOiAnREVWIE1PREUnLFxuICAgICAgICAgICAgICBoaW50OiAnVGhlIGRldiBzZXJ2ZXIgaXMgc3RpbGwgcnVubmluZy4gRml4IHRoZSBlcnJvciBhbmQgcmV0cnksIG9yIGNoZWNrIHRoZSBjb25zb2xlIGZvciBtb3JlIGRldGFpbHMuJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgbGV0IGluaXRSZW5kZXI6XG4gICAgfCB7IGFyZ3M6IFBhcmFtZXRlcnM8Qm91bmRSZW5kZXI+OyByZXNvbHZlOiAoKSA9PiB2b2lkIH1bXVxuICAgIHwgdW5kZWZpbmVkID0gW107XG4gIGxldCByZW5kZXI6IEJvdW5kUmVuZGVyID0gKC4uLmFyZ3MpID0+XG4gICAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBpbml0UmVuZGVyPy5wdXNoKHsgYXJncywgcmVzb2x2ZSB9KTtcbiAgICB9KTtcblxuICBmdW5jdGlvbiBpbXBvcnRSZW5kZXIoc3RhdHM6IHdlYnBhY2suU3RhdHNbXSkge1xuICAgIGNvbnN0IFtjbGllbnRTdGF0cywgc2VydmVyU3RhdHNdID0gc3RhdHM7XG4gICAgaWYgKFxuICAgICAgY2xpZW50U3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aCB8fFxuICAgICAgc2VydmVyU3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aFxuICAgICkge1xuICAgICAgbG9nLmVycm9yKCdFcnJvcnMgZm9yIGNsaWVudCBidWlsZDogJyArIGNsaWVudFN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyk7XG4gICAgICBsb2cuZXJyb3IoJ0Vycm9ycyBmb3Igc2VydmVyIGJ1aWxkOiAnICsgc2VydmVyU3RhdHMuY29tcGlsYXRpb24uZXJyb3JzKTtcbiAgICAgIC8vIGZpcnN0IHRpbWUsIHJhdGhlciB0aGFuIHJlLXJlbmRlclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcignQWJvdmUgY29tcGlsZXIgZXJyb3JzIGJsb2NraW5nIHJlbG9hZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbygnTGF1bmNoaW5nIFNTUicpO1xuICAgIH1cblxuICAgIC8vIEFTU0VUU1xuICAgIGNvbnN0IGNsaWVudE1hbmlmZXN0ID0gY2xpZW50U3RhdHMudG9Kc29uKCk7XG5cbiAgICBzZXJ2ZXJFbnRyeSA9IGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0cyk7XG4gICAgc2VydmVyRmlsZUNvbnRlbnRzID0gcmVhZEZpbGUoc2VydmVyRW50cnkpLnRoZW4oYnVmID0+IGJ1Zi50b1N0cmluZygpKTtcbiAgICAvLyByZWxvYWQgbW9kdWxlc1xuICAgIE9iamVjdC5rZXlzKGZzUmVxdWlyZS5jYWNoZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgZGVsZXRlIGZzUmVxdWlyZS5jYWNoZVtrZXldO1xuICAgIH0pO1xuICAgIHJlbmRlciA9IChmc1JlcXVpcmUoc2VydmVyRW50cnkpIGFzIGFueSkuZGVmYXVsdC5iaW5kKFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xpZW50TWFuaWZlc3QsXG4gICAgKTtcbiAgICAvLyBTRVJWRVIgU0lERSBFTlRSWVBPSU5UXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgIGluaXRSZW5kZXIuZm9yRWFjaChhc3luYyBpbml0ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2cuaW5mbygnUmVzb2x2aW5nIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGF3YWl0IHJlbmRlciguLi5pbml0LmFyZ3MpO1xuICAgICAgICAgIGluaXQucmVzb2x2ZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gcmVuZGVyIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGxvZy5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpbml0UmVuZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRldlNlcnZlciA9IG5ldyBXZWJwYWNrRGV2U2VydmVyKFxuICAgIC8vIHdyaXRlIHRvIG1lbW9yeSBmaWxlc3lzdGVtIHNvIHdlIGNhbiBpbXBvcnRcbiAgICB7XG4gICAgICAuLi53ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIsXG4gICAgICBkZXZNaWRkbGV3YXJlOiB7XG4gICAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdPy5kZXZTZXJ2ZXI/LmRldk1pZGRsZXdhcmUsXG4gICAgICAgIG91dHB1dEZpbGVTeXN0ZW06IHtcbiAgICAgICAgICAuLi5mcyxcbiAgICAgICAgICBqb2luOiBwYXRoLmpvaW4gYXMgYW55LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH0sXG4gICAgICBzZXR1cE1pZGRsZXdhcmVzOiAobWlkZGxld2FyZXMsIGRldlNlcnZlcikgPT4ge1xuICAgICAgICBpZiAoIWRldlNlcnZlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd2VicGFjay1kZXYtc2VydmVyIGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdGhlclJvdXRlcyA9IFtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19QQVRILFxuICAgICAgICAgIC4uLmV4dHJhY3RQcm94eVJvdXRlcyh3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXI/LnByb3h5KSxcbiAgICAgICAgXTtcbiAgICAgICAgLy8gc2VydmUgU1NSIGZvciBub24tV0VCUEFDS19QVUJMSUNfUEFUSFxuICAgICAgICBkZXZTZXJ2ZXIuYXBwPy5nZXQoXG4gICAgICAgICAgbmV3IFJlZ0V4cChgXig/ISR7b3RoZXJSb3V0ZXMuam9pbignfCcpfSlgKSxcbiAgICAgICAgICBoYW5kbGVFcnJvcnMoYXN5bmMgZnVuY3Rpb24gKHJlcTogYW55LCByZXM6IGFueSkge1xuICAgICAgICAgICAgaWYgKHJlcS51cmwuZW5kc1dpdGgoJ2Zhdmljb24uaWNvJykpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDQ7XG4gICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgcmVzLnNlbmQoJ25vdCBmb3VuZCcpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMuc29ja2V0Lm9uKCdlcnJvcicsIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICBsb2cuZXJyb3IoJ0ZhdGFsOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFQ09OTlJFU0VUJykge1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICdFQ09OTlJFU0VUIGlzIHVzdWFsbHkgZHVlIHRvIGJyb3dzZXIgY2xvc2luZyB0aGUgY29ubmVjdGlvbicsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHJlbmRlcihyZXEsIHJlcyk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHdlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcj8uc2V0dXBNaWRkbGV3YXJlcykge1xuICAgICAgICAgIHJldHVybiB3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIuc2V0dXBNaWRkbGV3YXJlcyhcbiAgICAgICAgICAgIG1pZGRsZXdhcmVzLFxuICAgICAgICAgICAgZGV2U2VydmVyLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWlkZGxld2FyZXM7XG4gICAgICB9LFxuICAgIH0sXG4gICAgY29tcGlsZXIsXG4gICk7XG4gIGNvbnN0IHJ1blNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RhcnQoKTtcbiAgICBkZXZTZXJ2ZXIuY29tcGlsZXIuaG9va3MuZG9uZS50YXAoXG4gICAgICAnQW5hbnNpIFNlcnZlcicsXG4gICAgICAobXVsdGlTdGF0czogd2VicGFjay5NdWx0aVN0YXRzIHwgd2VicGFjay5TdGF0cykgPT4ge1xuICAgICAgICBpZiAoIW11bHRpU3RhdHMpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ3N0YXRzIG5vdCBzZW5kJyk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghT2JqZWN0Lmhhc093bihtdWx0aVN0YXRzLCAnc3RhdHMnKSkgcmV0dXJuO1xuICAgICAgICBpZiAoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGltcG9ydFJlbmRlcigobXVsdGlTdGF0cyBhcyB3ZWJwYWNrLk11bHRpU3RhdHMpLnN0YXRzKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGxvYWQgc2VydmUgZW50cnlwb2ludCcpO1xuICAgICAgICAgICAgY29uc3QgZmluZGVyID0gbmV3IFJlZ0V4cChgJHtzZXJ2ZXJFbnRyeX06KFtcXFxcZF0rKTooW1xcXFxkXSspYCwgJ2cnKTtcbiAgICAgICAgICAgIHNlcnZlckZpbGVDb250ZW50cy50aGVuKGZpbGVUZXh0ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdGV4dFJvd3MgPSBmaWxlVGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICAgIGxvZy5lcnJvcignPj4+IFN0YWNrIENvbnRleHQgW3NlcnZlIGVudHJ5cG9pbnRdIDw8PCcpO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGUuc3RhY2subWF0Y2hBbGwoZmluZGVyKSA/PyBbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IE51bWJlci5wYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IocGF0aC5iYXNlbmFtZShzZXJ2ZXJFbnRyeSkgKyAnICcgKyByb3cgKyAnOicgKyBjb2wpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgLSAyXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3JvdyAtIDFdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoQXJyYXkoY29sKS5qb2luKCcgJykgKyAnXicpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3ddKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93ICsgMV0pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgKyAyXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGlza0ZzLndyaXRlRmlsZVN5bmMoc2VydmVyRW50cnksIGZpbGVUZXh0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ09ubHkgY29tcGlsZXIgb25lIHN0YXQnKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9O1xuICBjb25zdCBzdG9wU2VydmVyID0gYXN5bmMgKCkgPT4ge1xuICAgIGxvZy5pbmZvKCdTdG9wcGluZyBzZXJ2ZXIuLi4nKTtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RvcCgpO1xuICAgIGxvZy5pbmZvKCdTZXJ2ZXIgY2xvc2VkJyk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGxvZy53YXJuKCdSZWNlaXZlZCBTSUdJTlQsIGRldnNlcnZlciBzaHV0dGluZyBkb3duJyk7XG4gICAgc3RvcFNlcnZlcigpO1xuICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4gIH0pO1xuXG4gIHJ1blNlcnZlcigpO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBQSxNQUFNLENBQUNDLE1BQU0sR0FDWEQsTUFBTSxDQUFDQyxNQUFNLElBQ2IsMEJBQTJCLFNBQVNBLE1BQU1BLENBQUNDLEVBQUUsRUFBRUMsR0FBRyxFQUFFO0VBQ2xELE9BQU9ILE1BQU0sQ0FBQ0ksU0FBUyxDQUFDQyxjQUFjLENBQUNDLElBQUksQ0FBQ0osRUFBRSxFQUFFQyxHQUFHLENBQUM7QUFDdEQsQ0FBQztBQUVILE9BQU9JLE1BQU0sTUFBTSxJQUFJO0FBRXZCLFNBQVNDLGtCQUFrQixFQUFFQyxNQUFNLFFBQVEsT0FBTztBQUNsRCxPQUFPQyxJQUFJLE1BQU0sTUFBTTtBQUN2QixPQUFPQyxnQkFBZ0IsTUFBTSxvQkFBb0I7QUFDakQsT0FBT0MsR0FBRyxNQUFNLEtBQUs7QUFDckIsU0FBU0MsR0FBRyxRQUFRLFNBQVM7QUFDN0IsU0FBU0MsU0FBUyxRQUFRLE1BQU07QUFDaEMsT0FBT0MsT0FBTyxNQUF1RCxTQUFTO0FBQzlFLE9BQU9DLE9BQU8sTUFBTSxnQ0FBZ0M7QUFDcEQsT0FBT0MsZ0JBQWdCLE1BQU0sb0JBQW9CO0FBRWpELE9BQU8sbUNBQW1DO0FBQzFDLFNBQVNDLG1CQUFtQixRQUFRLDBCQUEwQjtBQUM5RCxTQUFTQyxnQkFBZ0IsUUFBUSx1QkFBdUI7QUFDeEQsU0FBU0Msa0JBQWtCLFFBQVEsaUJBQWlCO0FBQ3BELFNBQVNDLGNBQWMsRUFBRUMsZUFBZSxRQUFRLHNCQUFzQjtBQUd0RTtBQUNBO0FBQ0E7QUFDQSxJQUFJQyxNQUFNLENBQUNDLElBQUksQ0FBQ0MsSUFBSSxFQUFFO0VBQ3BCLE1BQU1DLFVBQVUsR0FBR0MsT0FBTyxDQUFDQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBRWxDLElBQUksQ0FBQ0YsVUFBVSxFQUFFO0lBQ2ZHLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDLHVDQUF1QyxDQUFDO0lBQ3BESCxPQUFPLENBQUNJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNsQjtFQUVBQyxjQUFjLENBQUNOLFVBQVUsQ0FBQztBQUM1QjtBQUVBLElBQUlPLGtCQUFtQyxHQUFHQyxPQUFPLENBQUNDLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDN0QsSUFBSUMsV0FBVyxHQUFHLEVBQUU7QUFFcEIsZUFBZSxlQUFlSixjQUFjQSxDQUMxQ04sVUFBa0IsRUFDbEJXLEdBQTRCLEdBQUcsQ0FBQyxDQUFDLEVBQ2pDO0VBQ0EsTUFBTUMsYUFBYSxHQUFHLE1BQU1uQixnQkFBZ0IsQ0FBQyxDQUFDO0VBRTlDLE1BQU1XLEdBQUcsR0FBR2QsT0FBTyxDQUFDdUIsU0FBUyxDQUFDLGtCQUFrQixDQUFDOztFQUVqRDtFQUNBLE1BQU1DLE1BQU0sR0FBRyxJQUFJL0IsTUFBTSxDQUFDLENBQUM7RUFDM0IsTUFBTWdDLEVBQUUsR0FBR2pDLGtCQUFrQixDQUFDZ0MsTUFBTSxDQUFDO0VBQ3JDM0IsR0FBRyxDQUFDNkIsR0FBRyxDQUFDbkMsTUFBTSxDQUFDLENBQUNtQyxHQUFHLENBQUNELEVBQVMsQ0FBQztFQUU5QixNQUFNRSxTQUFTLEdBQUd6QixtQkFBbUIsQ0FBQ0wsR0FBRyxDQUFDO0VBRTFDLE1BQU0rQixRQUFRLEdBQUc5QixTQUFTLENBQUNELEdBQUcsQ0FBQytCLFFBQVEsQ0FBQztFQUN4QztFQUNBLFNBQVNDLFFBQVFBLENBQUNDLFNBQWlCLEVBQUU7SUFDbkM7SUFDQTtJQUNBLE1BQU1DLG1CQUFtQixHQUFHbkMsR0FBRyxDQUFDb0MsUUFBUSxDQUFDO01BQUVDLE9BQU8sRUFBRTtJQUFNLENBQUMsQ0FBQztJQUM1RDFDLE1BQU0sQ0FBQzJDLFNBQVMsQ0FDZEgsbUJBQW1CLENBQUNJLEVBQUUsRUFDdEI7QUFDTix1QkFBdUJ6QyxJQUFJLENBQUN5QixPQUFPLENBQUNSLE9BQU8sQ0FBQ3lCLEdBQUcsQ0FBQyxDQUFDLEVBQUVOLFNBQVMsQ0FBQztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUNJLENBQUM7SUFDRCxPQUFPQyxtQkFBbUI7RUFDNUI7RUFFQSxNQUFNTSxjQUErQixHQUFHLENBQ3RDZixhQUFhLENBQ1g7SUFDRSxHQUFHRCxHQUFHO0lBQ05pQixTQUFTLEVBQUVULFFBQVEsQ0FBQ25CLFVBQVUsQ0FBQyxDQUFDNkIsSUFBSTtJQUNwQ0EsSUFBSSxFQUFFO0VBQ1IsQ0FBQyxFQUNEO0lBQUVDLElBQUksRUFBRTtFQUFjLENBQ3hCLENBQUMsRUFDRGxCLGFBQWEsQ0FDWDtJQUNFLEdBQUdELEdBQUc7SUFDTmlCLFNBQVMsRUFBRTVCLFVBQVUsQ0FBQytCLE9BQU8sQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDO0lBQ3BERixJQUFJLEVBQUUsUUFBUTtJQUNkRyxnQkFBZ0IsRUFBRTtFQUNwQixDQUFDLEVBQ0Q7SUFBRUYsSUFBSSxFQUFFLGFBQWE7SUFBRUcsTUFBTSxFQUFFO0VBQU8sQ0FDeEMsQ0FBQyxDQUNGOztFQUVEO0VBQ0EsTUFBTUMsUUFBUSxHQUFHN0MsT0FBTyxDQUFDc0MsY0FBK0MsQ0FBQztFQUN6RSxJQUFJLENBQUNPLFFBQVEsRUFBRTtJQUNiOUIsR0FBRyxDQUFDK0IsS0FBSyxDQUFDLDJDQUEyQyxDQUFDO0lBQ3REbEMsT0FBTyxDQUFDSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbEI7RUFFQXBCLGdCQUFnQixDQUFDbUQsT0FBTyxDQUFDO0lBQUVDLFdBQVcsRUFBRTtFQUFLLENBQUMsQ0FBQztFQUUvQyxTQUFTQyxlQUFlQSxDQUFDQyxXQUEwQixFQUFFO0lBQ25ELE1BQU1DLFVBQVUsR0FBR0QsV0FBVyxDQUFDRSxNQUFNLENBQUM7TUFBRUMsTUFBTSxFQUFFO0lBQUssQ0FBQyxDQUFDO0lBQ3ZELE9BQU8xRCxJQUFJLENBQUMyRCxJQUFJLENBQUNILFVBQVUsQ0FBQ0ksVUFBVSxJQUFJLEVBQUUsRUFBRSxXQUFXLENBQUM7RUFDNUQ7RUFDQSxTQUFTQyxZQUFZQSxDQUtuQkMsRUFBSyxFQUFFO0lBQ1AsT0FBTyxnQkFDTEMsR0FBOEIsRUFDOUJDLEdBQThCLEVBQzlCQyxLQUFtQixFQUNuQjtNQUNBLElBQUk7UUFDRixPQUFPLE1BQU1ILEVBQUUsQ0FBQ0MsR0FBRyxFQUFFQyxHQUFHLENBQUM7TUFDM0IsQ0FBQyxDQUFDLE9BQU9iLEtBQWMsRUFBRTtRQUN2Qi9CLEdBQUcsQ0FBQytCLEtBQUssQ0FBQyxzQkFBc0IsRUFBRUEsS0FBSyxDQUFDOztRQUV4QztRQUNBLE1BQU1lLFVBQVUsR0FBR0YsR0FBVTtRQUM3QixJQUFJLENBQUNFLFVBQVUsQ0FBQ0MsV0FBVyxFQUFFO1VBQzNCLE1BQU1DLFVBQVUsR0FBR3pELGNBQWMsQ0FBQ3dDLEtBQUssQ0FBQztVQUN4Q2UsVUFBVSxDQUFDRyxNQUFNLENBQUNELFVBQVUsQ0FBQztVQUM3QkYsVUFBVSxDQUFDSSxTQUFTLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQztVQUNqREosVUFBVSxDQUFDSyxJQUFJLENBQ2IzRCxlQUFlLENBQUN1QyxLQUFLLEVBQUVZLEdBQUcsQ0FBQ1MsR0FBRyxJQUFJLEdBQUcsRUFBRUosVUFBVSxFQUFFO1lBQ2pESyxTQUFTLEVBQUUsSUFBSTtZQUNmQyxLQUFLLEVBQUUsVUFBVTtZQUNqQkMsSUFBSSxFQUFFO1VBQ1IsQ0FBQyxDQUNILENBQUM7UUFDSDtNQUNGO0lBQ0YsQ0FBQztFQUNIO0VBRUEsSUFBSUMsVUFFUyxHQUFHLEVBQUU7RUFDbEIsSUFBSUMsTUFBbUIsR0FBR0EsQ0FBQyxHQUFHQyxJQUFJLEtBQ2hDLElBQUl0RCxPQUFPLENBQUNDLE9BQU8sSUFBSTtJQUNyQm1ELFVBQVUsRUFBRUcsSUFBSSxDQUFDO01BQUVELElBQUk7TUFBRXJEO0lBQVEsQ0FBQyxDQUFDO0VBQ3JDLENBQUMsQ0FBQztFQUVKLFNBQVN1RCxZQUFZQSxDQUFDQyxLQUFzQixFQUFFO0lBQzVDLE1BQU0sQ0FBQ0MsV0FBVyxFQUFFM0IsV0FBVyxDQUFDLEdBQUcwQixLQUFLO0lBQ3hDLElBQ0VDLFdBQVcsRUFBRUMsV0FBVyxFQUFFQyxNQUFNLEVBQUVDLE1BQU0sSUFDeEM5QixXQUFXLEVBQUU0QixXQUFXLEVBQUVDLE1BQU0sRUFBRUMsTUFBTSxFQUN4QztNQUNBakUsR0FBRyxDQUFDK0IsS0FBSyxDQUFDLDJCQUEyQixHQUFHK0IsV0FBVyxDQUFDQyxXQUFXLENBQUNDLE1BQU0sQ0FBQztNQUN2RWhFLEdBQUcsQ0FBQytCLEtBQUssQ0FBQywyQkFBMkIsR0FBR0ksV0FBVyxDQUFDNEIsV0FBVyxDQUFDQyxNQUFNLENBQUM7TUFDdkU7TUFDQSxJQUFJRSxLQUFLLENBQUNDLE9BQU8sQ0FBQ1gsVUFBVSxDQUFDLEVBQUU7UUFDN0IzRCxPQUFPLENBQUNJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNsQjtNQUNBRCxHQUFHLENBQUMrQixLQUFLLENBQUMsdUNBQXVDLENBQUM7TUFDbEQ7SUFDRixDQUFDLE1BQU07TUFDTC9CLEdBQUcsQ0FBQ29FLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDM0I7O0lBRUE7SUFDQSxNQUFNQyxjQUFjLEdBQUdQLFdBQVcsQ0FBQ3pCLE1BQU0sQ0FBQyxDQUFDO0lBRTNDL0IsV0FBVyxHQUFHNEIsZUFBZSxDQUFDQyxXQUFXLENBQUM7SUFDMUNoQyxrQkFBa0IsR0FBR1csUUFBUSxDQUFDUixXQUFXLENBQUMsQ0FBQ2dFLElBQUksQ0FBQ0MsR0FBRyxJQUFJQSxHQUFHLENBQUNDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDdEU7SUFDQXRHLE1BQU0sQ0FBQ3VHLElBQUksQ0FBQzVELFNBQVMsQ0FBQzZELEtBQUssQ0FBQyxDQUFDQyxPQUFPLENBQUN0RyxHQUFHLElBQUk7TUFDMUMsT0FBT3dDLFNBQVMsQ0FBQzZELEtBQUssQ0FBQ3JHLEdBQUcsQ0FBQztJQUM3QixDQUFDLENBQUM7SUFDRm9GLE1BQU0sR0FBSTVDLFNBQVMsQ0FBQ1AsV0FBVyxDQUFDLENBQVNzRSxPQUFPLENBQUNDLElBQUksQ0FDbkRDLFNBQVMsRUFDVFQsY0FDRixDQUFDO0lBQ0Q7SUFDQSxJQUFJSCxLQUFLLENBQUNDLE9BQU8sQ0FBQ1gsVUFBVSxDQUFDLEVBQUU7TUFDN0JBLFVBQVUsQ0FBQ21CLE9BQU8sQ0FBQyxNQUFNSSxJQUFJLElBQUk7UUFDL0IsSUFBSTtVQUNGL0UsR0FBRyxDQUFDb0UsSUFBSSxDQUFDLDJCQUEyQixDQUFDO1VBQ3JDLE1BQU1YLE1BQU0sQ0FBQyxHQUFHc0IsSUFBSSxDQUFDckIsSUFBSSxDQUFDO1VBQzFCcUIsSUFBSSxDQUFDMUUsT0FBTyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLE9BQU8yRSxDQUFDLEVBQUU7VUFDVmhGLEdBQUcsQ0FBQytCLEtBQUssQ0FBQyxpREFBaUQsQ0FBQztVQUM1RC9CLEdBQUcsQ0FBQytCLEtBQUssQ0FBQ2lELENBQUMsQ0FBQztRQUNkO01BQ0YsQ0FBQyxDQUFDO01BQ0Z4QixVQUFVLEdBQUdzQixTQUFTO0lBQ3hCO0VBQ0Y7RUFFQSxNQUFNRyxTQUFTLEdBQUcsSUFBSTlGLGdCQUFnQjtFQUNwQztFQUNBO0lBQ0UsR0FBR29DLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQzBELFNBQVM7SUFDOUJDLGFBQWEsRUFBRTtNQUNiLEdBQUczRCxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUwRCxTQUFTLEVBQUVDLGFBQWE7TUFDOUNDLGdCQUFnQixFQUFFO1FBQ2hCLEdBQUd4RSxFQUFFO1FBQ0w0QixJQUFJLEVBQUUzRCxJQUFJLENBQUMyRDtNQUNiO0lBQ0YsQ0FBQztJQUNENkMsZ0JBQWdCLEVBQUVBLENBQUNDLFdBQVcsRUFBRUosU0FBUyxLQUFLO01BQzVDLElBQUksQ0FBQ0EsU0FBUyxFQUFFO1FBQ2QsTUFBTSxJQUFJSyxLQUFLLENBQUMsbUNBQW1DLENBQUM7TUFDdEQ7TUFFQSxNQUFNQyxXQUFXLEdBQUcsQ0FDbEIxRixPQUFPLENBQUNVLEdBQUcsQ0FBQ2lGLG1CQUFtQixFQUMvQixHQUFHbEcsa0JBQWtCLENBQUNpQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMwRCxTQUFTLEVBQUVRLEtBQUssQ0FBQyxDQUMxRDtNQUNEO01BQ0FSLFNBQVMsQ0FBQ1MsR0FBRyxFQUFFQyxHQUFHLENBQ2hCLElBQUlDLE1BQU0sQ0FBQyxPQUFPTCxXQUFXLENBQUNoRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUMzQ0UsWUFBWSxDQUFDLGdCQUFnQkUsR0FBUSxFQUFFQyxHQUFRLEVBQUU7UUFDL0MsSUFBSUQsR0FBRyxDQUFDUyxHQUFHLENBQUN5QyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7VUFDbkNqRCxHQUFHLENBQUNJLFVBQVUsR0FBRyxHQUFHO1VBQ3BCSixHQUFHLENBQUNNLFNBQVMsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDO1VBQzFDTixHQUFHLENBQUNPLElBQUksQ0FBQyxXQUFXLENBQUM7VUFDckI7UUFDRjtRQUNBUCxHQUFHLENBQUNrRCxNQUFNLENBQUNDLEVBQUUsQ0FBQyxPQUFPLEVBQUdoRSxLQUFjLElBQUs7VUFDekMvQixHQUFHLENBQUMrQixLQUFLLENBQUMsUUFBUSxFQUFFQSxLQUFLLENBQUM7VUFDMUIsSUFBS0EsS0FBSyxDQUFTaUUsSUFBSSxLQUFLLFlBQVksRUFBRTtZQUN4Q2hHLEdBQUcsQ0FBQytCLEtBQUssQ0FDUCw2REFDRixDQUFDO1VBQ0g7UUFDRixDQUFDLENBQUM7UUFFRixNQUFNMEIsTUFBTSxDQUFDZCxHQUFHLEVBQUVDLEdBQUcsQ0FBQztNQUN4QixDQUFDLENBQ0gsQ0FBQztNQUVELElBQUlyQixjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMwRCxTQUFTLEVBQUVHLGdCQUFnQixFQUFFO1FBQ2pELE9BQU83RCxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMwRCxTQUFTLENBQUNHLGdCQUFnQixDQUNqREMsV0FBVyxFQUNYSixTQUNGLENBQUM7TUFDSDtNQUVBLE9BQU9JLFdBQVc7SUFDcEI7RUFDRixDQUFDLEVBQ0R2RCxRQUNGLENBQUM7RUFDRCxNQUFNbUUsU0FBUyxHQUFHLE1BQUFBLENBQUEsS0FBWTtJQUM1QixNQUFNaEIsU0FBUyxDQUFDaUIsS0FBSyxDQUFDLENBQUM7SUFDdkJqQixTQUFTLENBQUNuRCxRQUFRLENBQUNxRSxLQUFLLENBQUNDLElBQUksQ0FBQ0MsR0FBRyxDQUMvQixlQUFlLEVBQ2RDLFVBQThDLElBQUs7TUFDbEQsSUFBSSxDQUFDQSxVQUFVLEVBQUU7UUFDZnRHLEdBQUcsQ0FBQytCLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztRQUMzQmxDLE9BQU8sQ0FBQ0ksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ2xCO01BRUEsSUFBSSxDQUFDL0IsTUFBTSxDQUFDQyxNQUFNLENBQUNtSSxVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUU7TUFDekMsSUFBS0EsVUFBVSxDQUF3QnpDLEtBQUssQ0FBQ0ksTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN2RCxJQUFJO1VBQ0ZMLFlBQVksQ0FBRTBDLFVBQVUsQ0FBd0J6QyxLQUFLLENBQUM7UUFDeEQsQ0FBQyxDQUFDLE9BQU9tQixDQUFNLEVBQUU7VUFDZmhGLEdBQUcsQ0FBQytCLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQztVQUM1QyxNQUFNd0UsTUFBTSxHQUFHLElBQUlYLE1BQU0sQ0FBQyxHQUFHdEYsV0FBVyxvQkFBb0IsRUFBRSxHQUFHLENBQUM7VUFDbEVILGtCQUFrQixDQUFDbUUsSUFBSSxDQUFDa0MsUUFBUSxJQUFJO1lBQ2xDLE1BQU1DLFFBQVEsR0FBR0QsUUFBUSxDQUFDRSxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ3JDMUcsR0FBRyxDQUFDK0IsS0FBSyxDQUFDLDBDQUEwQyxDQUFDO1lBQ3JELEtBQUssTUFBTTRFLEtBQUssSUFBSTNCLENBQUMsQ0FBQzRCLEtBQUssQ0FBQ0MsUUFBUSxDQUFDTixNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7Y0FDbEQsTUFBTU8sR0FBRyxHQUFHQyxNQUFNLENBQUNDLFFBQVEsQ0FBQ0wsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2NBQ3JDLE1BQU1NLEdBQUcsR0FBR0YsTUFBTSxDQUFDQyxRQUFRLENBQUNMLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztjQUNyQzNHLEdBQUcsQ0FBQytCLEtBQUssQ0FBQ25ELElBQUksQ0FBQ3NJLFFBQVEsQ0FBQzVHLFdBQVcsQ0FBQyxHQUFHLEdBQUcsR0FBR3dHLEdBQUcsR0FBRyxHQUFHLEdBQUdHLEdBQUcsQ0FBQztjQUM3RGpILEdBQUcsQ0FBQytCLEtBQUssQ0FBQzBFLFFBQVEsQ0FBQ0ssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO2NBQzVCOUcsR0FBRyxDQUFDK0IsS0FBSyxDQUFDMEUsUUFBUSxDQUFDSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7Y0FDNUI5RyxHQUFHLENBQUMrQixLQUFLLENBQUNtQyxLQUFLLENBQUMrQyxHQUFHLENBQUMsQ0FBQzFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Y0FDckN2QyxHQUFHLENBQUMrQixLQUFLLENBQUMwRSxRQUFRLENBQUNLLEdBQUcsQ0FBQyxDQUFDO2NBQ3hCOUcsR0FBRyxDQUFDK0IsS0FBSyxDQUFDMEUsUUFBUSxDQUFDSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7Y0FDNUI5RyxHQUFHLENBQUMrQixLQUFLLENBQUMwRSxRQUFRLENBQUNLLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM5QjtZQUNBckksTUFBTSxDQUFDMEksYUFBYSxDQUFDN0csV0FBVyxFQUFFa0csUUFBUSxDQUFDO1VBQzdDLENBQUMsQ0FBQztVQUVGLE1BQU14QixDQUFDO1FBQ1Q7TUFDRixDQUFDLE1BQU07UUFDTGhGLEdBQUcsQ0FBQytCLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQztNQUNyQztJQUNGLENBQ0YsQ0FBQztFQUNILENBQUM7RUFDRCxNQUFNcUYsVUFBVSxHQUFHLE1BQUFBLENBQUEsS0FBWTtJQUM3QnBILEdBQUcsQ0FBQ29FLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUM5QixNQUFNYSxTQUFTLENBQUNvQyxJQUFJLENBQUMsQ0FBQztJQUN0QnJILEdBQUcsQ0FBQ29FLElBQUksQ0FBQyxlQUFlLENBQUM7RUFDM0IsQ0FBQztFQUVEdkUsT0FBTyxDQUFDa0csRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNO0lBQ3pCL0YsR0FBRyxDQUFDc0gsSUFBSSxDQUFDLDBDQUEwQyxDQUFDO0lBQ3BERixVQUFVLENBQUMsQ0FBQztJQUNadkgsT0FBTyxDQUFDSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbEIsQ0FBQyxDQUFDO0VBRUZnRyxTQUFTLENBQUMsQ0FBQztBQUNiIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startDevserver.d.ts","sourceRoot":"","sources":["../../src/scripts/startDevserver.ts"],"names":[],"mappings":";AAmBA,OAAO,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"startDevserver.d.ts","sourceRoot":"","sources":["../../src/scripts/startDevserver.ts"],"names":[],"mappings":";AAmBA,OAAO,mCAAmC,CAAC;AAwB3C,wBAA8B,cAAc,CAC1C,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,iBA0QlC"}
|
|
@@ -15,6 +15,7 @@ import WebpackDevServer from 'webpack-dev-server';
|
|
|
15
15
|
import 'cross-fetch/dist/node-polyfill.js';
|
|
16
16
|
import { createHybridRequire } from './createHybridRequire.js';
|
|
17
17
|
import { getWebpackConfig } from './getWebpackConfig.js';
|
|
18
|
+
import { extractProxyRoutes } from './proxyUtils.js';
|
|
18
19
|
import { getErrorStatus, renderErrorPage } from './ssrErrorHandler.js';
|
|
19
20
|
// run directly from node
|
|
20
21
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
@@ -171,7 +172,7 @@ export default async function startDevServer(entrypoint, env = {}) {
|
|
|
171
172
|
if (!devServer) {
|
|
172
173
|
throw new Error('webpack-dev-server is not defined');
|
|
173
174
|
}
|
|
174
|
-
const otherRoutes = [process.env.WEBPACK_PUBLIC_PATH, ...(webpackConfigs[0].devServer?.proxy
|
|
175
|
+
const otherRoutes = [process.env.WEBPACK_PUBLIC_PATH, ...extractProxyRoutes(webpackConfigs[0].devServer?.proxy)];
|
|
175
176
|
// serve SSR for non-WEBPACK_PUBLIC_PATH
|
|
176
177
|
devServer.app?.get(new RegExp(`^(?!${otherRoutes.join('|')})`), handleErrors(async function (req, res) {
|
|
177
178
|
if (req.url.endsWith('favicon.ico')) {
|
|
@@ -243,4 +244,4 @@ export default async function startDevServer(entrypoint, env = {}) {
|
|
|
243
244
|
});
|
|
244
245
|
runServer();
|
|
245
246
|
}
|
|
246
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRpc2tGcyIsImNyZWF0ZUZzRnJvbVZvbHVtZSIsIlZvbHVtZSIsInBhdGgiLCJzb3VyY2VNYXBTdXBwb3J0IiwidG1wIiwidWZzIiwicHJvbWlzaWZ5Iiwid2VicGFjayIsImxvZ2dpbmciLCJXZWJwYWNrRGV2U2VydmVyIiwiY3JlYXRlSHlicmlkUmVxdWlyZSIsImdldFdlYnBhY2tDb25maWciLCJnZXRFcnJvclN0YXR1cyIsInJlbmRlckVycm9yUGFnZSIsImltcG9ydCIsIm1ldGEiLCJtYWluIiwiZW50cnlwb2ludCIsInByb2Nlc3MiLCJhcmd2IiwiY29uc29sZSIsImxvZyIsImV4aXQiLCJzdGFydERldlNlcnZlciIsInNlcnZlckZpbGVDb250ZW50cyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2VydmVyRW50cnkiLCJlbnYiLCJ3ZWJwYWNrQ29uZmlnIiwiZ2V0TG9nZ2VyIiwidm9sdW1lIiwiZnMiLCJ1c2UiLCJmc1JlcXVpcmUiLCJyZWFkRmlsZSIsImhvdEVudHJ5IiwiZW50cnlQYXRoIiwiZ2VuZXJhdGVkRW50cnlwb2ludCIsImZpbGVTeW5jIiwicG9zdGZpeCIsIndyaXRlU3luYyIsImZkIiwiY3dkIiwid2VicGFja0NvbmZpZ3MiLCJlbnRyeXBhdGgiLCJuYW1lIiwibW9kZSIsInJlcGxhY2UiLCJCUk9XU0VSU0xJU1RfRU5WIiwidGFyZ2V0IiwiY29tcGlsZXIiLCJlcnJvciIsImluc3RhbGwiLCJob29rUmVxdWlyZSIsImdldFNlcnZlckJ1bmRsZSIsInNlcnZlclN0YXRzIiwic2VydmVySnNvbiIsInRvSnNvbiIsImFzc2V0cyIsImpvaW4iLCJvdXRwdXRQYXRoIiwiaGFuZGxlRXJyb3JzIiwiZm4iLCJyZXEiLCJyZXMiLCJfbmV4dCIsImV4cHJlc3NSZXMiLCJoZWFkZXJzU2VudCIsInN0YXR1c0NvZGUiLCJzdGF0dXMiLCJzZXRIZWFkZXIiLCJzZW5kIiwidXJsIiwic2hvd1N0YWNrIiwiYmFkZ2UiLCJoaW50IiwiaW5pdFJlbmRlciIsInJlbmRlciIsImFyZ3MiLCJwdXNoIiwiaW1wb3J0UmVuZGVyIiwic3RhdHMiLCJjbGllbnRTdGF0cyIsImNvbXBpbGF0aW9uIiwiZXJyb3JzIiwibGVuZ3RoIiwiQXJyYXkiLCJpc0FycmF5IiwiaW5mbyIsImNsaWVudE1hbmlmZXN0IiwidGhlbiIsImJ1ZiIsInRvU3RyaW5nIiwia2V5cyIsImNhY2hlIiwiZm9yRWFjaCIsImRlZmF1bHQiLCJiaW5kIiwidW5kZWZpbmVkIiwiaW5pdCIsImUiLCJkZXZTZXJ2ZXIiLCJkZXZNaWRkbGV3YXJlIiwib3V0cHV0RmlsZVN5c3RlbSIsInNldHVwTWlkZGxld2FyZXMiLCJtaWRkbGV3YXJlcyIsIkVycm9yIiwib3RoZXJSb3V0ZXMiLCJXRUJQQUNLX1BVQkxJQ19QQVRIIiwicHJveHkiLCJmaWx0ZXIiLCJmbGF0TWFwIiwiY29udGV4dCIsImFwcCIsImdldCIsIlJlZ0V4cCIsImVuZHNXaXRoIiwic29ja2V0Iiwib24iLCJjb2RlIiwicnVuU2VydmVyIiwic3RhcnQiLCJob29rcyIsImRvbmUiLCJ0YXAiLCJtdWx0aVN0YXRzIiwiZmluZGVyIiwiZmlsZVRleHQiLCJ0ZXh0Um93cyIsInNwbGl0IiwibWF0Y2giLCJzdGFjayIsIm1hdGNoQWxsIiwicm93IiwiTnVtYmVyIiwicGFyc2VJbnQiLCJjb2wiLCJiYXNlbmFtZSIsIndyaXRlRmlsZVN5bmMiLCJzdG9wU2VydmVyIiwic3RvcCIsIndhcm4iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9zdGFydERldnNlcnZlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5PYmplY3QuaGFzT3duID1cbiAgT2JqZWN0Lmhhc093biB8fFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG4gIH07XG5pbXBvcnQgdHlwZSB7IE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IGRpc2tGcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlIH0gZnJvbSAnaHR0cCc7XG5pbXBvcnQgeyBjcmVhdGVGc0Zyb21Wb2x1bWUsIFZvbHVtZSB9IGZyb20gJ21lbWZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHNvdXJjZU1hcFN1cHBvcnQgZnJvbSAnc291cmNlLW1hcC1zdXBwb3J0JztcbmltcG9ydCB0bXAgZnJvbSAndG1wJztcbmltcG9ydCB7IHVmcyB9IGZyb20gJ3VuaW9uZnMnO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgd2VicGFjaywgeyB0eXBlIENvbmZpZ3VyYXRpb24sIHR5cGUgTXVsdGlDb25maWd1cmF0aW9uIH0gZnJvbSAnd2VicGFjayc7XG5pbXBvcnQgbG9nZ2luZyBmcm9tICd3ZWJwYWNrL2xpYi9sb2dnaW5nL3J1bnRpbWUuanMnO1xuaW1wb3J0IFdlYnBhY2tEZXZTZXJ2ZXIgZnJvbSAnd2VicGFjay1kZXYtc2VydmVyJztcblxuaW1wb3J0ICdjcm9zcy1mZXRjaC9kaXN0L25vZGUtcG9seWZpbGwuanMnO1xuaW1wb3J0IHsgY3JlYXRlSHlicmlkUmVxdWlyZSB9IGZyb20gJy4vY3JlYXRlSHlicmlkUmVxdWlyZS5qcyc7XG5pbXBvcnQgeyBnZXRXZWJwYWNrQ29uZmlnIH0gZnJvbSAnLi9nZXRXZWJwYWNrQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldEVycm9yU3RhdHVzLCByZW5kZXJFcnJvclBhZ2UgfSBmcm9tICcuL3NzckVycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBCb3VuZFJlbmRlciB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyBydW4gZGlyZWN0bHkgZnJvbSBub2RlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtaWdub3JlXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBjb25zdCBlbnRyeXBvaW50ID0gcHJvY2Vzcy5hcmd2WzJdO1xuXG4gIGlmICghZW50cnlwb2ludCkge1xuICAgIGNvbnNvbGUubG9nKGBVc2FnZTogc3RhcnQtYW5hbnNpIDxlbnRyeXBvaW50LWZpbGU+YCk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIHN0YXJ0RGV2U2VydmVyKGVudHJ5cG9pbnQpO1xufVxuXG5sZXQgc2VydmVyRmlsZUNvbnRlbnRzOiBQcm9taXNlPHN0cmluZz4gPSBQcm9taXNlLnJlc29sdmUoJycpO1xubGV0IHNlcnZlckVudHJ5ID0gJyc7XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0RGV2U2VydmVyKFxuICBlbnRyeXBvaW50OiBzdHJpbmcsXG4gIGVudjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSxcbikge1xuICBjb25zdCB3ZWJwYWNrQ29uZmlnID0gYXdhaXQgZ2V0V2VicGFja0NvbmZpZygpO1xuXG4gIGNvbnN0IGxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdhbmFuc2ktZGV2c2VydmVyJyk7XG5cbiAgLy8gU2V0IHVwIGluIG1lbW9yeSBmaWxlc3lzdGVtXG4gIGNvbnN0IHZvbHVtZSA9IG5ldyBWb2x1bWUoKTtcbiAgY29uc3QgZnMgPSBjcmVhdGVGc0Zyb21Wb2x1bWUodm9sdW1lKTtcbiAgdWZzLnVzZShkaXNrRnMpLnVzZShmcyBhcyBhbnkpO1xuXG4gIGNvbnN0IGZzUmVxdWlyZSA9IGNyZWF0ZUh5YnJpZFJlcXVpcmUodWZzKTtcblxuICBjb25zdCByZWFkRmlsZSA9IHByb21pc2lmeSh1ZnMucmVhZEZpbGUpO1xuICAvLyBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBmaWxlIHNvIHdlIGNhbiBob3QgcmVsb2FkIGZyb20gdGhlIHJvb3Qgb2YgdGhlIGFwcGxpY2F0aW9uXG4gIGZ1bmN0aW9uIGhvdEVudHJ5KGVudHJ5UGF0aDogc3RyaW5nKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgLy8gQHRzLWlnbm9yZSBmb3Igc29tZSByZWFzb24gaXQncyBub3QgcGlja2luZyB1cCB0aGF0IG90aGVyIG9wdGlvbnMgYXJlIG9wdGlvbmFsXG4gICAgY29uc3QgZ2VuZXJhdGVkRW50cnlwb2ludCA9IHRtcC5maWxlU3luYyh7IHBvc3RmaXg6ICcuanMnIH0pO1xuICAgIGRpc2tGcy53cml0ZVN5bmMoXG4gICAgICBnZW5lcmF0ZWRFbnRyeXBvaW50LmZkLFxuICAgICAgYFxuICBpbXBvcnQgZW50cnkgZnJvbSBcIiR7cGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGVudHJ5UGF0aCl9XCI7XG5cbiAgaWYgKGltcG9ydC5tZXRhLndlYnBhY2tIb3QpIHtcbiAgICBpbXBvcnQubWV0YS53ZWJwYWNrSG90LmFjY2VwdCgpO1xuICB9XG5cbiAgZXhwb3J0IGRlZmF1bHQgZW50cnk7XG4gICAgYCxcbiAgICApO1xuICAgIHJldHVybiBnZW5lcmF0ZWRFbnRyeXBvaW50O1xuICB9XG5cbiAgY29uc3Qgd2VicGFja0NvbmZpZ3M6IENvbmZpZ3VyYXRpb25bXSA9IFtcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogaG90RW50cnkoZW50cnlwb2ludCkubmFtZSxcbiAgICAgICAgbmFtZTogJ2NsaWVudCcsXG4gICAgICB9LFxuICAgICAgeyBtb2RlOiAnZGV2ZWxvcG1lbnQnIH0sXG4gICAgKSxcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogZW50cnlwb2ludC5yZXBsYWNlKCcudHN4JywgJy5zZXJ2ZXIudHN4JyksXG4gICAgICAgIG5hbWU6ICdzZXJ2ZXInLFxuICAgICAgICBCUk9XU0VSU0xJU1RfRU5WOiAnY3VycmVudCBub2RlJyxcbiAgICAgIH0sXG4gICAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcsIHRhcmdldDogJ25vZGUnIH0sXG4gICAgKSxcbiAgXTtcblxuICAvLyBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyXG4gIGNvbnN0IGNvbXBpbGVyID0gd2VicGFjayh3ZWJwYWNrQ29uZmlncyBhcyB1bmtub3duIGFzIE11bHRpQ29uZmlndXJhdGlvbik7XG4gIGlmICghY29tcGlsZXIpIHtcbiAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyJyk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIHNvdXJjZU1hcFN1cHBvcnQuaW5zdGFsbCh7IGhvb2tSZXF1aXJlOiB0cnVlIH0pO1xuXG4gIGZ1bmN0aW9uIGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0czogd2VicGFjay5TdGF0cykge1xuICAgIGNvbnN0IHNlcnZlckpzb24gPSBzZXJ2ZXJTdGF0cy50b0pzb24oeyBhc3NldHM6IHRydWUgfSk7XG4gICAgcmV0dXJuIHBhdGguam9pbihzZXJ2ZXJKc29uLm91dHB1dFBhdGggPz8gJycsICdzZXJ2ZXIuanMnKTtcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVFcnJvcnM8XG4gICAgRiBleHRlbmRzIChcbiAgICAgIHJlcTogUmVxdWVzdCB8IEluY29taW5nTWVzc2FnZSxcbiAgICAgIHJlczogUmVzcG9uc2UgfCBTZXJ2ZXJSZXNwb25zZSxcbiAgICApID0+IFByb21pc2U8dm9pZD4sXG4gID4oZm46IEYpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgICAgX25leHQ6IE5leHRGdW5jdGlvbixcbiAgICApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmbihyZXEsIHJlcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoJ1NTUiByZW5kZXJpbmcgZXJyb3I6JywgZXJyb3IpO1xuXG4gICAgICAgIC8vIFJldHVybiBlcnJvciByZXNwb25zZSB3aXRoIHN0YXR1cyBmcm9tIGVycm9yIGlmIGF2YWlsYWJsZVxuICAgICAgICBjb25zdCBleHByZXNzUmVzID0gcmVzIGFzIGFueTtcbiAgICAgICAgaWYgKCFleHByZXNzUmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IGdldEVycm9yU3RhdHVzKGVycm9yKTtcbiAgICAgICAgICBleHByZXNzUmVzLnN0YXR1cyhzdGF0dXNDb2RlKTtcbiAgICAgICAgICBleHByZXNzUmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgIGV4cHJlc3NSZXMuc2VuZChcbiAgICAgICAgICAgIHJlbmRlckVycm9yUGFnZShlcnJvciwgcmVxLnVybCA/PyAnLycsIHN0YXR1c0NvZGUsIHtcbiAgICAgICAgICAgICAgc2hvd1N0YWNrOiB0cnVlLFxuICAgICAgICAgICAgICBiYWRnZTogJ0RFViBNT0RFJyxcbiAgICAgICAgICAgICAgaGludDogJ1RoZSBkZXYgc2VydmVyIGlzIHN0aWxsIHJ1bm5pbmcuIEZpeCB0aGUgZXJyb3IgYW5kIHJldHJ5LCBvciBjaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBkZXRhaWxzLicsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGxldCBpbml0UmVuZGVyOlxuICAgIHwgeyBhcmdzOiBQYXJhbWV0ZXJzPEJvdW5kUmVuZGVyPjsgcmVzb2x2ZTogKCkgPT4gdm9pZCB9W11cbiAgICB8IHVuZGVmaW5lZCA9IFtdO1xuICBsZXQgcmVuZGVyOiBCb3VuZFJlbmRlciA9ICguLi5hcmdzKSA9PlxuICAgIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgaW5pdFJlbmRlcj8ucHVzaCh7IGFyZ3MsIHJlc29sdmUgfSk7XG4gICAgfSk7XG5cbiAgZnVuY3Rpb24gaW1wb3J0UmVuZGVyKHN0YXRzOiB3ZWJwYWNrLlN0YXRzW10pIHtcbiAgICBjb25zdCBbY2xpZW50U3RhdHMsIHNlcnZlclN0YXRzXSA9IHN0YXRzO1xuICAgIGlmIChcbiAgICAgIGNsaWVudFN0YXRzPy5jb21waWxhdGlvbj8uZXJyb3JzPy5sZW5ndGggfHxcbiAgICAgIHNlcnZlclN0YXRzPy5jb21waWxhdGlvbj8uZXJyb3JzPy5sZW5ndGhcbiAgICApIHtcbiAgICAgIGxvZy5lcnJvcignRXJyb3JzIGZvciBjbGllbnQgYnVpbGQ6ICcgKyBjbGllbnRTdGF0cy5jb21waWxhdGlvbi5lcnJvcnMpO1xuICAgICAgbG9nLmVycm9yKCdFcnJvcnMgZm9yIHNlcnZlciBidWlsZDogJyArIHNlcnZlclN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyk7XG4gICAgICAvLyBmaXJzdCB0aW1lLCByYXRoZXIgdGhhbiByZS1yZW5kZXJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGluaXRSZW5kZXIpKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4gICAgICB9XG4gICAgICBsb2cuZXJyb3IoJ0Fib3ZlIGNvbXBpbGVyIGVycm9ycyBibG9ja2luZyByZWxvYWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmluZm8oJ0xhdW5jaGluZyBTU1InKTtcbiAgICB9XG5cbiAgICAvLyBBU1NFVFNcbiAgICBjb25zdCBjbGllbnRNYW5pZmVzdCA9IGNsaWVudFN0YXRzLnRvSnNvbigpO1xuXG4gICAgc2VydmVyRW50cnkgPSBnZXRTZXJ2ZXJCdW5kbGUoc2VydmVyU3RhdHMpO1xuICAgIHNlcnZlckZpbGVDb250ZW50cyA9IHJlYWRGaWxlKHNlcnZlckVudHJ5KS50aGVuKGJ1ZiA9PiBidWYudG9TdHJpbmcoKSk7XG4gICAgLy8gcmVsb2FkIG1vZHVsZXNcbiAgICBPYmplY3Qua2V5cyhmc1JlcXVpcmUuY2FjaGUpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGRlbGV0ZSBmc1JlcXVpcmUuY2FjaGVba2V5XTtcbiAgICB9KTtcbiAgICByZW5kZXIgPSAoZnNSZXF1aXJlKHNlcnZlckVudHJ5KSBhcyBhbnkpLmRlZmF1bHQuYmluZChcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsaWVudE1hbmlmZXN0LFxuICAgICk7XG4gICAgLy8gU0VSVkVSIFNJREUgRU5UUllQT0lOVFxuICAgIGlmIChBcnJheS5pc0FycmF5KGluaXRSZW5kZXIpKSB7XG4gICAgICBpbml0UmVuZGVyLmZvckVhY2goYXN5bmMgaW5pdCA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9nLmluZm8oJ1Jlc29sdmluZyBxdWV1ZWQgcmVxdWVzdHMnKTtcbiAgICAgICAgICBhd2FpdCByZW5kZXIoLi4uaW5pdC5hcmdzKTtcbiAgICAgICAgICBpbml0LnJlc29sdmUoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZy5lcnJvcignRXJyb3Igd2hlbiBhdHRlbXB0aW5nIHRvIHJlbmRlciBxdWV1ZWQgcmVxdWVzdHMnKTtcbiAgICAgICAgICBsb2cuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaW5pdFJlbmRlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZXZTZXJ2ZXIgPSBuZXcgV2VicGFja0RldlNlcnZlcihcbiAgICAvLyB3cml0ZSB0byBtZW1vcnkgZmlsZXN5c3RlbSBzbyB3ZSBjYW4gaW1wb3J0XG4gICAge1xuICAgICAgLi4ud2VicGFja0NvbmZpZ3NbMF0uZGV2U2VydmVyLFxuICAgICAgZGV2TWlkZGxld2FyZToge1xuICAgICAgICAuLi53ZWJwYWNrQ29uZmlnc1swXT8uZGV2U2VydmVyPy5kZXZNaWRkbGV3YXJlLFxuICAgICAgICBvdXRwdXRGaWxlU3lzdGVtOiB7XG4gICAgICAgICAgLi4uZnMsXG4gICAgICAgICAgam9pbjogcGF0aC5qb2luIGFzIGFueSxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICB9LFxuICAgICAgc2V0dXBNaWRkbGV3YXJlczogKG1pZGRsZXdhcmVzLCBkZXZTZXJ2ZXIpID0+IHtcbiAgICAgICAgaWYgKCFkZXZTZXJ2ZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dlYnBhY2stZGV2LXNlcnZlciBpcyBub3QgZGVmaW5lZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3RoZXJSb3V0ZXMgPSBbXG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0VCUEFDS19QVUJMSUNfUEFUSCxcbiAgICAgICAgICAuLi4od2VicGFja0NvbmZpZ3NbMF0uZGV2U2VydmVyPy5wcm94eVxuICAgICAgICAgICAgPy5maWx0ZXIocHJveHkgPT4gdHlwZW9mIHByb3h5ID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgID8uZmxhdE1hcChwcm94eSA9PiBwcm94eS5jb250ZXh0KSA/PyBbXSksXG4gICAgICAgIF07XG4gICAgICAgIC8vIHNlcnZlIFNTUiBmb3Igbm9uLVdFQlBBQ0tfUFVCTElDX1BBVEhcbiAgICAgICAgZGV2U2VydmVyLmFwcD8uZ2V0KFxuICAgICAgICAgIG5ldyBSZWdFeHAoYF4oPyEke290aGVyUm91dGVzLmpvaW4oJ3wnKX0pYCksXG4gICAgICAgICAgaGFuZGxlRXJyb3JzKGFzeW5jIGZ1bmN0aW9uIChyZXE6IGFueSwgcmVzOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChyZXEudXJsLmVuZHNXaXRoKCdmYXZpY29uLmljbycpKSB7XG4gICAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNDA0O1xuICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAgIHJlcy5zZW5kKCdub3QgZm91bmQnKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLnNvY2tldC5vbignZXJyb3InLCAoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgbG9nLmVycm9yKCdGYXRhbDonLCBlcnJvcik7XG4gICAgICAgICAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRUNPTk5SRVNFVCcpIHtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAnRUNPTk5SRVNFVCBpcyB1c3VhbGx5IGR1ZSB0byBicm93c2VyIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24nLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBhd2FpdCByZW5kZXIocmVxLCByZXMpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXI/LnNldHVwTWlkZGxld2FyZXMpIHtcbiAgICAgICAgICByZXR1cm4gd2VicGFja0NvbmZpZ3NbMF0uZGV2U2VydmVyLnNldHVwTWlkZGxld2FyZXMoXG4gICAgICAgICAgICBtaWRkbGV3YXJlcyxcbiAgICAgICAgICAgIGRldlNlcnZlcixcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1pZGRsZXdhcmVzO1xuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbXBpbGVyLFxuICApO1xuICBjb25zdCBydW5TZXJ2ZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgZGV2U2VydmVyLnN0YXJ0KCk7XG4gICAgZGV2U2VydmVyLmNvbXBpbGVyLmhvb2tzLmRvbmUudGFwKFxuICAgICAgJ0FuYW5zaSBTZXJ2ZXInLFxuICAgICAgKG11bHRpU3RhdHM6IHdlYnBhY2suTXVsdGlTdGF0cyB8IHdlYnBhY2suU3RhdHMpID0+IHtcbiAgICAgICAgaWYgKCFtdWx0aVN0YXRzKSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdzdGF0cyBub3Qgc2VuZCcpO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIU9iamVjdC5oYXNPd24obXVsdGlTdGF0cywgJ3N0YXRzJykpIHJldHVybjtcbiAgICAgICAgaWYgKChtdWx0aVN0YXRzIGFzIHdlYnBhY2suTXVsdGlTdGF0cykuc3RhdHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpbXBvcnRSZW5kZXIoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0cyk7XG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHNlcnZlIGVudHJ5cG9pbnQnKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbmRlciA9IG5ldyBSZWdFeHAoYCR7c2VydmVyRW50cnl9OihbXFxcXGRdKyk6KFtcXFxcZF0rKWAsICdnJyk7XG4gICAgICAgICAgICBzZXJ2ZXJGaWxlQ29udGVudHMudGhlbihmaWxlVGV4dCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHRleHRSb3dzID0gZmlsZVRleHQuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgICBsb2cuZXJyb3IoJz4+PiBTdGFjayBDb250ZXh0IFtzZXJ2ZSBlbnRyeXBvaW50XSA8PDwnKTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBlLnN0YWNrLm1hdGNoQWxsKGZpbmRlcikgPz8gW10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IE51bWJlci5wYXJzZUludChtYXRjaFsyXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHBhdGguYmFzZW5hbWUoc2VydmVyRW50cnkpICsgJyAnICsgcm93ICsgJzonICsgY29sKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93IC0gMl0pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgLSAxXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKEFycmF5KGNvbCkuam9pbignICcpICsgJ14nKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93XSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3JvdyArIDFdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93ICsgMl0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRpc2tGcy53cml0ZUZpbGVTeW5jKHNlcnZlckVudHJ5LCBmaWxlVGV4dCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdPbmx5IGNvbXBpbGVyIG9uZSBzdGF0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfTtcbiAgY29uc3Qgc3RvcFNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgICBsb2cuaW5mbygnU3RvcHBpbmcgc2VydmVyLi4uJyk7XG4gICAgYXdhaXQgZGV2U2VydmVyLnN0b3AoKTtcbiAgICBsb2cuaW5mbygnU2VydmVyIGNsb3NlZCcpO1xuICB9O1xuXG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsICgpID0+IHtcbiAgICBsb2cud2FybignUmVjZWl2ZWQgU0lHSU5ULCBkZXZzZXJ2ZXIgc2h1dHRpbmcgZG93bicpO1xuICAgIHN0b3BTZXJ2ZXIoKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9KTtcblxuICBydW5TZXJ2ZXIoKTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQUEs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
|
|
247
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRpc2tGcyIsImNyZWF0ZUZzRnJvbVZvbHVtZSIsIlZvbHVtZSIsInBhdGgiLCJzb3VyY2VNYXBTdXBwb3J0IiwidG1wIiwidWZzIiwicHJvbWlzaWZ5Iiwid2VicGFjayIsImxvZ2dpbmciLCJXZWJwYWNrRGV2U2VydmVyIiwiY3JlYXRlSHlicmlkUmVxdWlyZSIsImdldFdlYnBhY2tDb25maWciLCJleHRyYWN0UHJveHlSb3V0ZXMiLCJnZXRFcnJvclN0YXR1cyIsInJlbmRlckVycm9yUGFnZSIsImltcG9ydCIsIm1ldGEiLCJtYWluIiwiZW50cnlwb2ludCIsInByb2Nlc3MiLCJhcmd2IiwiY29uc29sZSIsImxvZyIsImV4aXQiLCJzdGFydERldlNlcnZlciIsInNlcnZlckZpbGVDb250ZW50cyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2VydmVyRW50cnkiLCJlbnYiLCJ3ZWJwYWNrQ29uZmlnIiwiZ2V0TG9nZ2VyIiwidm9sdW1lIiwiZnMiLCJ1c2UiLCJmc1JlcXVpcmUiLCJyZWFkRmlsZSIsImhvdEVudHJ5IiwiZW50cnlQYXRoIiwiZ2VuZXJhdGVkRW50cnlwb2ludCIsImZpbGVTeW5jIiwicG9zdGZpeCIsIndyaXRlU3luYyIsImZkIiwiY3dkIiwid2VicGFja0NvbmZpZ3MiLCJlbnRyeXBhdGgiLCJuYW1lIiwibW9kZSIsInJlcGxhY2UiLCJCUk9XU0VSU0xJU1RfRU5WIiwidGFyZ2V0IiwiY29tcGlsZXIiLCJlcnJvciIsImluc3RhbGwiLCJob29rUmVxdWlyZSIsImdldFNlcnZlckJ1bmRsZSIsInNlcnZlclN0YXRzIiwic2VydmVySnNvbiIsInRvSnNvbiIsImFzc2V0cyIsImpvaW4iLCJvdXRwdXRQYXRoIiwiaGFuZGxlRXJyb3JzIiwiZm4iLCJyZXEiLCJyZXMiLCJfbmV4dCIsImV4cHJlc3NSZXMiLCJoZWFkZXJzU2VudCIsInN0YXR1c0NvZGUiLCJzdGF0dXMiLCJzZXRIZWFkZXIiLCJzZW5kIiwidXJsIiwic2hvd1N0YWNrIiwiYmFkZ2UiLCJoaW50IiwiaW5pdFJlbmRlciIsInJlbmRlciIsImFyZ3MiLCJwdXNoIiwiaW1wb3J0UmVuZGVyIiwic3RhdHMiLCJjbGllbnRTdGF0cyIsImNvbXBpbGF0aW9uIiwiZXJyb3JzIiwibGVuZ3RoIiwiQXJyYXkiLCJpc0FycmF5IiwiaW5mbyIsImNsaWVudE1hbmlmZXN0IiwidGhlbiIsImJ1ZiIsInRvU3RyaW5nIiwia2V5cyIsImNhY2hlIiwiZm9yRWFjaCIsImRlZmF1bHQiLCJiaW5kIiwidW5kZWZpbmVkIiwiaW5pdCIsImUiLCJkZXZTZXJ2ZXIiLCJkZXZNaWRkbGV3YXJlIiwib3V0cHV0RmlsZVN5c3RlbSIsInNldHVwTWlkZGxld2FyZXMiLCJtaWRkbGV3YXJlcyIsIkVycm9yIiwib3RoZXJSb3V0ZXMiLCJXRUJQQUNLX1BVQkxJQ19QQVRIIiwicHJveHkiLCJhcHAiLCJnZXQiLCJSZWdFeHAiLCJlbmRzV2l0aCIsInNvY2tldCIsIm9uIiwiY29kZSIsInJ1blNlcnZlciIsInN0YXJ0IiwiaG9va3MiLCJkb25lIiwidGFwIiwibXVsdGlTdGF0cyIsImZpbmRlciIsImZpbGVUZXh0IiwidGV4dFJvd3MiLCJzcGxpdCIsIm1hdGNoIiwic3RhY2siLCJtYXRjaEFsbCIsInJvdyIsIk51bWJlciIsInBhcnNlSW50IiwiY29sIiwiYmFzZW5hbWUiLCJ3cml0ZUZpbGVTeW5jIiwic3RvcFNlcnZlciIsInN0b3AiLCJ3YXJuIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvc3RhcnREZXZzZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuT2JqZWN0Lmhhc093biA9XG4gIE9iamVjdC5oYXNPd24gfHxcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gaGFzT3duKGl0LCBrZXkpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xuICB9O1xuaW1wb3J0IHR5cGUgeyBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBkaXNrRnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgY3JlYXRlRnNGcm9tVm9sdW1lLCBWb2x1bWUgfSBmcm9tICdtZW1mcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBzb3VyY2VNYXBTdXBwb3J0IGZyb20gJ3NvdXJjZS1tYXAtc3VwcG9ydCc7XG5pbXBvcnQgdG1wIGZyb20gJ3RtcCc7XG5pbXBvcnQgeyB1ZnMgfSBmcm9tICd1bmlvbmZzJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHdlYnBhY2ssIHsgdHlwZSBDb25maWd1cmF0aW9uLCB0eXBlIE11bHRpQ29uZmlndXJhdGlvbiB9IGZyb20gJ3dlYnBhY2snO1xuaW1wb3J0IGxvZ2dpbmcgZnJvbSAnd2VicGFjay9saWIvbG9nZ2luZy9ydW50aW1lLmpzJztcbmltcG9ydCBXZWJwYWNrRGV2U2VydmVyIGZyb20gJ3dlYnBhY2stZGV2LXNlcnZlcic7XG5cbmltcG9ydCAnY3Jvc3MtZmV0Y2gvZGlzdC9ub2RlLXBvbHlmaWxsLmpzJztcbmltcG9ydCB7IGNyZWF0ZUh5YnJpZFJlcXVpcmUgfSBmcm9tICcuL2NyZWF0ZUh5YnJpZFJlcXVpcmUuanMnO1xuaW1wb3J0IHsgZ2V0V2VicGFja0NvbmZpZyB9IGZyb20gJy4vZ2V0V2VicGFja0NvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRyYWN0UHJveHlSb3V0ZXMgfSBmcm9tICcuL3Byb3h5VXRpbHMuanMnO1xuaW1wb3J0IHsgZ2V0RXJyb3JTdGF0dXMsIHJlbmRlckVycm9yUGFnZSB9IGZyb20gJy4vc3NyRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IEJvdW5kUmVuZGVyIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIHJ1biBkaXJlY3RseSBmcm9tIG5vZGVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1pZ25vcmVcbmlmIChpbXBvcnQubWV0YS5tYWluKSB7XG4gIGNvbnN0IGVudHJ5cG9pbnQgPSBwcm9jZXNzLmFyZ3ZbMl07XG5cbiAgaWYgKCFlbnRyeXBvaW50KSB7XG4gICAgY29uc29sZS5sb2coYFVzYWdlOiBzdGFydC1hbmFuc2kgPGVudHJ5cG9pbnQtZmlsZT5gKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9XG5cbiAgc3RhcnREZXZTZXJ2ZXIoZW50cnlwb2ludCk7XG59XG5cbmxldCBzZXJ2ZXJGaWxlQ29udGVudHM6IFByb21pc2U8c3RyaW5nPiA9IFByb21pc2UucmVzb2x2ZSgnJyk7XG5sZXQgc2VydmVyRW50cnkgPSAnJztcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gc3RhcnREZXZTZXJ2ZXIoXG4gIGVudHJ5cG9pbnQ6IHN0cmluZyxcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuKSB7XG4gIGNvbnN0IHdlYnBhY2tDb25maWcgPSBhd2FpdCBnZXRXZWJwYWNrQ29uZmlnKCk7XG5cbiAgY29uc3QgbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoJ2FuYW5zaS1kZXZzZXJ2ZXInKTtcblxuICAvLyBTZXQgdXAgaW4gbWVtb3J5IGZpbGVzeXN0ZW1cbiAgY29uc3Qgdm9sdW1lID0gbmV3IFZvbHVtZSgpO1xuICBjb25zdCBmcyA9IGNyZWF0ZUZzRnJvbVZvbHVtZSh2b2x1bWUpO1xuICB1ZnMudXNlKGRpc2tGcykudXNlKGZzIGFzIGFueSk7XG5cbiAgY29uc3QgZnNSZXF1aXJlID0gY3JlYXRlSHlicmlkUmVxdWlyZSh1ZnMpO1xuXG4gIGNvbnN0IHJlYWRGaWxlID0gcHJvbWlzaWZ5KHVmcy5yZWFkRmlsZSk7XG4gIC8vIEdlbmVyYXRlIGEgdGVtcG9yYXJ5IGZpbGUgc28gd2UgY2FuIGhvdCByZWxvYWQgZnJvbSB0aGUgcm9vdCBvZiB0aGUgYXBwbGljYXRpb25cbiAgZnVuY3Rpb24gaG90RW50cnkoZW50cnlQYXRoOiBzdHJpbmcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAvLyBAdHMtaWdub3JlIGZvciBzb21lIHJlYXNvbiBpdCdzIG5vdCBwaWNraW5nIHVwIHRoYXQgb3RoZXIgb3B0aW9ucyBhcmUgb3B0aW9uYWxcbiAgICBjb25zdCBnZW5lcmF0ZWRFbnRyeXBvaW50ID0gdG1wLmZpbGVTeW5jKHsgcG9zdGZpeDogJy5qcycgfSk7XG4gICAgZGlza0ZzLndyaXRlU3luYyhcbiAgICAgIGdlbmVyYXRlZEVudHJ5cG9pbnQuZmQsXG4gICAgICBgXG4gIGltcG9ydCBlbnRyeSBmcm9tIFwiJHtwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZW50cnlQYXRoKX1cIjtcblxuICBpZiAoaW1wb3J0Lm1ldGEud2VicGFja0hvdCkge1xuICAgIGltcG9ydC5tZXRhLndlYnBhY2tIb3QuYWNjZXB0KCk7XG4gIH1cblxuICBleHBvcnQgZGVmYXVsdCBlbnRyeTtcbiAgICBgLFxuICAgICk7XG4gICAgcmV0dXJuIGdlbmVyYXRlZEVudHJ5cG9pbnQ7XG4gIH1cblxuICBjb25zdCB3ZWJwYWNrQ29uZmlnczogQ29uZmlndXJhdGlvbltdID0gW1xuICAgIHdlYnBhY2tDb25maWcoXG4gICAgICB7XG4gICAgICAgIC4uLmVudixcbiAgICAgICAgZW50cnlwYXRoOiBob3RFbnRyeShlbnRyeXBvaW50KS5uYW1lLFxuICAgICAgICBuYW1lOiAnY2xpZW50JyxcbiAgICAgIH0sXG4gICAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcgfSxcbiAgICApLFxuICAgIHdlYnBhY2tDb25maWcoXG4gICAgICB7XG4gICAgICAgIC4uLmVudixcbiAgICAgICAgZW50cnlwYXRoOiBlbnRyeXBvaW50LnJlcGxhY2UoJy50c3gnLCAnLnNlcnZlci50c3gnKSxcbiAgICAgICAgbmFtZTogJ3NlcnZlcicsXG4gICAgICAgIEJST1dTRVJTTElTVF9FTlY6ICdjdXJyZW50IG5vZGUnLFxuICAgICAgfSxcbiAgICAgIHsgbW9kZTogJ2RldmVsb3BtZW50JywgdGFyZ2V0OiAnbm9kZScgfSxcbiAgICApLFxuICBdO1xuXG4gIC8vIGluaXRpYWxpemUgdGhlIHdlYnBhY2sgY29tcGlsZXJcbiAgY29uc3QgY29tcGlsZXIgPSB3ZWJwYWNrKHdlYnBhY2tDb25maWdzIGFzIHVua25vd24gYXMgTXVsdGlDb25maWd1cmF0aW9uKTtcbiAgaWYgKCFjb21waWxlcikge1xuICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHdlYnBhY2sgY29tcGlsZXInKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9XG5cbiAgc291cmNlTWFwU3VwcG9ydC5pbnN0YWxsKHsgaG9va1JlcXVpcmU6IHRydWUgfSk7XG5cbiAgZnVuY3Rpb24gZ2V0U2VydmVyQnVuZGxlKHNlcnZlclN0YXRzOiB3ZWJwYWNrLlN0YXRzKSB7XG4gICAgY29uc3Qgc2VydmVySnNvbiA9IHNlcnZlclN0YXRzLnRvSnNvbih7IGFzc2V0czogdHJ1ZSB9KTtcbiAgICByZXR1cm4gcGF0aC5qb2luKHNlcnZlckpzb24ub3V0cHV0UGF0aCA/PyAnJywgJ3NlcnZlci5qcycpO1xuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZUVycm9yczxcbiAgICBGIGV4dGVuZHMgKFxuICAgICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgICkgPT4gUHJvbWlzZTx2b2lkPixcbiAgPihmbjogRikge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiAoXG4gICAgICByZXE6IFJlcXVlc3QgfCBJbmNvbWluZ01lc3NhZ2UsXG4gICAgICByZXM6IFJlc3BvbnNlIHwgU2VydmVyUmVzcG9uc2UsXG4gICAgICBfbmV4dDogTmV4dEZ1bmN0aW9uLFxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKHJlcSwgcmVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcignU1NSIHJlbmRlcmluZyBlcnJvcjonLCBlcnJvcik7XG5cbiAgICAgICAgLy8gUmV0dXJuIGVycm9yIHJlc3BvbnNlIHdpdGggc3RhdHVzIGZyb20gZXJyb3IgaWYgYXZhaWxhYmxlXG4gICAgICAgIGNvbnN0IGV4cHJlc3NSZXMgPSByZXMgYXMgYW55O1xuICAgICAgICBpZiAoIWV4cHJlc3NSZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gZ2V0RXJyb3JTdGF0dXMoZXJyb3IpO1xuICAgICAgICAgIGV4cHJlc3NSZXMuc3RhdHVzKHN0YXR1c0NvZGUpO1xuICAgICAgICAgIGV4cHJlc3NSZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgZXhwcmVzc1Jlcy5zZW5kKFxuICAgICAgICAgICAgcmVuZGVyRXJyb3JQYWdlKGVycm9yLCByZXEudXJsID8/ICcvJywgc3RhdHVzQ29kZSwge1xuICAgICAgICAgICAgICBzaG93U3RhY2s6IHRydWUsXG4gICAgICAgICAgICAgIGJhZGdlOiAnREVWIE1PREUnLFxuICAgICAgICAgICAgICBoaW50OiAnVGhlIGRldiBzZXJ2ZXIgaXMgc3RpbGwgcnVubmluZy4gRml4IHRoZSBlcnJvciBhbmQgcmV0cnksIG9yIGNoZWNrIHRoZSBjb25zb2xlIGZvciBtb3JlIGRldGFpbHMuJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgbGV0IGluaXRSZW5kZXI6XG4gICAgfCB7IGFyZ3M6IFBhcmFtZXRlcnM8Qm91bmRSZW5kZXI+OyByZXNvbHZlOiAoKSA9PiB2b2lkIH1bXVxuICAgIHwgdW5kZWZpbmVkID0gW107XG4gIGxldCByZW5kZXI6IEJvdW5kUmVuZGVyID0gKC4uLmFyZ3MpID0+XG4gICAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBpbml0UmVuZGVyPy5wdXNoKHsgYXJncywgcmVzb2x2ZSB9KTtcbiAgICB9KTtcblxuICBmdW5jdGlvbiBpbXBvcnRSZW5kZXIoc3RhdHM6IHdlYnBhY2suU3RhdHNbXSkge1xuICAgIGNvbnN0IFtjbGllbnRTdGF0cywgc2VydmVyU3RhdHNdID0gc3RhdHM7XG4gICAgaWYgKFxuICAgICAgY2xpZW50U3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aCB8fFxuICAgICAgc2VydmVyU3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aFxuICAgICkge1xuICAgICAgbG9nLmVycm9yKCdFcnJvcnMgZm9yIGNsaWVudCBidWlsZDogJyArIGNsaWVudFN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyk7XG4gICAgICBsb2cuZXJyb3IoJ0Vycm9ycyBmb3Igc2VydmVyIGJ1aWxkOiAnICsgc2VydmVyU3RhdHMuY29tcGlsYXRpb24uZXJyb3JzKTtcbiAgICAgIC8vIGZpcnN0IHRpbWUsIHJhdGhlciB0aGFuIHJlLXJlbmRlclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcignQWJvdmUgY29tcGlsZXIgZXJyb3JzIGJsb2NraW5nIHJlbG9hZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbygnTGF1bmNoaW5nIFNTUicpO1xuICAgIH1cblxuICAgIC8vIEFTU0VUU1xuICAgIGNvbnN0IGNsaWVudE1hbmlmZXN0ID0gY2xpZW50U3RhdHMudG9Kc29uKCk7XG5cbiAgICBzZXJ2ZXJFbnRyeSA9IGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0cyk7XG4gICAgc2VydmVyRmlsZUNvbnRlbnRzID0gcmVhZEZpbGUoc2VydmVyRW50cnkpLnRoZW4oYnVmID0+IGJ1Zi50b1N0cmluZygpKTtcbiAgICAvLyByZWxvYWQgbW9kdWxlc1xuICAgIE9iamVjdC5rZXlzKGZzUmVxdWlyZS5jYWNoZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgZGVsZXRlIGZzUmVxdWlyZS5jYWNoZVtrZXldO1xuICAgIH0pO1xuICAgIHJlbmRlciA9IChmc1JlcXVpcmUoc2VydmVyRW50cnkpIGFzIGFueSkuZGVmYXVsdC5iaW5kKFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xpZW50TWFuaWZlc3QsXG4gICAgKTtcbiAgICAvLyBTRVJWRVIgU0lERSBFTlRSWVBPSU5UXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgIGluaXRSZW5kZXIuZm9yRWFjaChhc3luYyBpbml0ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2cuaW5mbygnUmVzb2x2aW5nIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGF3YWl0IHJlbmRlciguLi5pbml0LmFyZ3MpO1xuICAgICAgICAgIGluaXQucmVzb2x2ZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gcmVuZGVyIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGxvZy5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpbml0UmVuZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRldlNlcnZlciA9IG5ldyBXZWJwYWNrRGV2U2VydmVyKFxuICAgIC8vIHdyaXRlIHRvIG1lbW9yeSBmaWxlc3lzdGVtIHNvIHdlIGNhbiBpbXBvcnRcbiAgICB7XG4gICAgICAuLi53ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIsXG4gICAgICBkZXZNaWRkbGV3YXJlOiB7XG4gICAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdPy5kZXZTZXJ2ZXI/LmRldk1pZGRsZXdhcmUsXG4gICAgICAgIG91dHB1dEZpbGVTeXN0ZW06IHtcbiAgICAgICAgICAuLi5mcyxcbiAgICAgICAgICBqb2luOiBwYXRoLmpvaW4gYXMgYW55LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH0sXG4gICAgICBzZXR1cE1pZGRsZXdhcmVzOiAobWlkZGxld2FyZXMsIGRldlNlcnZlcikgPT4ge1xuICAgICAgICBpZiAoIWRldlNlcnZlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd2VicGFjay1kZXYtc2VydmVyIGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdGhlclJvdXRlcyA9IFtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19QQVRILFxuICAgICAgICAgIC4uLmV4dHJhY3RQcm94eVJvdXRlcyh3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXI/LnByb3h5KSxcbiAgICAgICAgXTtcbiAgICAgICAgLy8gc2VydmUgU1NSIGZvciBub24tV0VCUEFDS19QVUJMSUNfUEFUSFxuICAgICAgICBkZXZTZXJ2ZXIuYXBwPy5nZXQoXG4gICAgICAgICAgbmV3IFJlZ0V4cChgXig/ISR7b3RoZXJSb3V0ZXMuam9pbignfCcpfSlgKSxcbiAgICAgICAgICBoYW5kbGVFcnJvcnMoYXN5bmMgZnVuY3Rpb24gKHJlcTogYW55LCByZXM6IGFueSkge1xuICAgICAgICAgICAgaWYgKHJlcS51cmwuZW5kc1dpdGgoJ2Zhdmljb24uaWNvJykpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDQ7XG4gICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgcmVzLnNlbmQoJ25vdCBmb3VuZCcpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMuc29ja2V0Lm9uKCdlcnJvcicsIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICBsb2cuZXJyb3IoJ0ZhdGFsOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFQ09OTlJFU0VUJykge1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICdFQ09OTlJFU0VUIGlzIHVzdWFsbHkgZHVlIHRvIGJyb3dzZXIgY2xvc2luZyB0aGUgY29ubmVjdGlvbicsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHJlbmRlcihyZXEsIHJlcyk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHdlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcj8uc2V0dXBNaWRkbGV3YXJlcykge1xuICAgICAgICAgIHJldHVybiB3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIuc2V0dXBNaWRkbGV3YXJlcyhcbiAgICAgICAgICAgIG1pZGRsZXdhcmVzLFxuICAgICAgICAgICAgZGV2U2VydmVyLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWlkZGxld2FyZXM7XG4gICAgICB9LFxuICAgIH0sXG4gICAgY29tcGlsZXIsXG4gICk7XG4gIGNvbnN0IHJ1blNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RhcnQoKTtcbiAgICBkZXZTZXJ2ZXIuY29tcGlsZXIuaG9va3MuZG9uZS50YXAoXG4gICAgICAnQW5hbnNpIFNlcnZlcicsXG4gICAgICAobXVsdGlTdGF0czogd2VicGFjay5NdWx0aVN0YXRzIHwgd2VicGFjay5TdGF0cykgPT4ge1xuICAgICAgICBpZiAoIW11bHRpU3RhdHMpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ3N0YXRzIG5vdCBzZW5kJyk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghT2JqZWN0Lmhhc093bihtdWx0aVN0YXRzLCAnc3RhdHMnKSkgcmV0dXJuO1xuICAgICAgICBpZiAoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGltcG9ydFJlbmRlcigobXVsdGlTdGF0cyBhcyB3ZWJwYWNrLk11bHRpU3RhdHMpLnN0YXRzKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGxvYWQgc2VydmUgZW50cnlwb2ludCcpO1xuICAgICAgICAgICAgY29uc3QgZmluZGVyID0gbmV3IFJlZ0V4cChgJHtzZXJ2ZXJFbnRyeX06KFtcXFxcZF0rKTooW1xcXFxkXSspYCwgJ2cnKTtcbiAgICAgICAgICAgIHNlcnZlckZpbGVDb250ZW50cy50aGVuKGZpbGVUZXh0ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdGV4dFJvd3MgPSBmaWxlVGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICAgIGxvZy5lcnJvcignPj4+IFN0YWNrIENvbnRleHQgW3NlcnZlIGVudHJ5cG9pbnRdIDw8PCcpO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGUuc3RhY2subWF0Y2hBbGwoZmluZGVyKSA/PyBbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IE51bWJlci5wYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IocGF0aC5iYXNlbmFtZShzZXJ2ZXJFbnRyeSkgKyAnICcgKyByb3cgKyAnOicgKyBjb2wpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgLSAyXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3JvdyAtIDFdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoQXJyYXkoY29sKS5qb2luKCcgJykgKyAnXicpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3ddKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93ICsgMV0pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgKyAyXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGlza0ZzLndyaXRlRmlsZVN5bmMoc2VydmVyRW50cnksIGZpbGVUZXh0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ09ubHkgY29tcGlsZXIgb25lIHN0YXQnKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9O1xuICBjb25zdCBzdG9wU2VydmVyID0gYXN5bmMgKCkgPT4ge1xuICAgIGxvZy5pbmZvKCdTdG9wcGluZyBzZXJ2ZXIuLi4nKTtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RvcCgpO1xuICAgIGxvZy5pbmZvKCdTZXJ2ZXIgY2xvc2VkJyk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGxvZy53YXJuKCdSZWNlaXZlZCBTSUdJTlQsIGRldnNlcnZlciBzaHV0dGluZyBkb3duJyk7XG4gICAgc3RvcFNlcnZlcigpO1xuICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4gIH0pO1xuXG4gIHJ1blNlcnZlcigpO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBQSxNQUFNLENBQUNDLE1BQU0sR0FDWEQsTUFBTSxDQUFDQyxNQUFNLElBQ2IsMEJB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anansi/core",
|
|
3
|
-
"version": "0.22.
|
|
3
|
+
"version": "0.22.4",
|
|
4
4
|
"description": "React 19 Framework",
|
|
5
5
|
"homepage": "https://github.com/ntucker/anansi/tree/master/packages/core#readme",
|
|
6
6
|
"repository": {
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
"@types/compression": "1.8.1",
|
|
83
83
|
"@types/express": "^4.17.17",
|
|
84
84
|
"@types/node": "^24.0.0",
|
|
85
|
-
"@types/react": "19.2.
|
|
85
|
+
"@types/react": "19.2.8",
|
|
86
86
|
"@types/react-dom": "19.2.3",
|
|
87
87
|
"@types/source-map-support": "0.5.10",
|
|
88
88
|
"@types/tmp": "0.2.6",
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { extractProxyRoutes } from '../proxyUtils';
|
|
2
|
+
|
|
3
|
+
describe('extractProxyRoutes', () => {
|
|
4
|
+
it('should return empty array for undefined proxy', () => {
|
|
5
|
+
expect(extractProxyRoutes(undefined)).toEqual([]);
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
it('should return empty array for empty proxy array', () => {
|
|
9
|
+
expect(extractProxyRoutes([])).toEqual([]);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('should extract context as array of strings', () => {
|
|
13
|
+
const proxy = [{ context: ['/api'], target: 'http://localhost:3000' }];
|
|
14
|
+
expect(extractProxyRoutes(proxy)).toEqual(['/api']);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('should extract multiple contexts from array', () => {
|
|
18
|
+
const proxy = [
|
|
19
|
+
{ context: ['/api', '/graphql'], target: 'http://localhost:3000' },
|
|
20
|
+
];
|
|
21
|
+
expect(extractProxyRoutes(proxy)).toEqual(['/api', '/graphql']);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('should extract context as single string', () => {
|
|
25
|
+
const proxy = [{ context: '/api', target: 'http://localhost:3000' }];
|
|
26
|
+
expect(extractProxyRoutes(proxy)).toEqual(['/api']);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('should extract path property (legacy format)', () => {
|
|
30
|
+
const proxy = [{ path: '/legacy', target: 'http://localhost:3000' }];
|
|
31
|
+
expect(extractProxyRoutes(proxy)).toEqual(['/legacy']);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('should extract path as array', () => {
|
|
35
|
+
const proxy = [
|
|
36
|
+
{ path: ['/legacy', '/old-api'], target: 'http://localhost:3000' },
|
|
37
|
+
];
|
|
38
|
+
expect(extractProxyRoutes(proxy)).toEqual(['/legacy', '/old-api']);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('should prefer context over path', () => {
|
|
42
|
+
const proxy = [
|
|
43
|
+
{ context: '/api', path: '/legacy', target: 'http://localhost:3000' },
|
|
44
|
+
];
|
|
45
|
+
expect(extractProxyRoutes(proxy)).toEqual(['/api']);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should handle multiple proxy entries', () => {
|
|
49
|
+
const proxy = [
|
|
50
|
+
{ context: ['/api'], target: 'http://localhost:3000' },
|
|
51
|
+
{ context: '/ws', target: 'http://localhost:3001' },
|
|
52
|
+
{ path: '/legacy', target: 'http://localhost:3002' },
|
|
53
|
+
];
|
|
54
|
+
expect(extractProxyRoutes(proxy)).toEqual(['/api', '/ws', '/legacy']);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('should skip function entries', () => {
|
|
58
|
+
const proxy = [
|
|
59
|
+
{ context: ['/api'], target: 'http://localhost:3000' },
|
|
60
|
+
() => ({ context: '/dynamic', target: 'http://localhost:3001' }),
|
|
61
|
+
];
|
|
62
|
+
// Functions are filtered out since we can't statically analyze them
|
|
63
|
+
expect(extractProxyRoutes(proxy as any)).toEqual(['/api']);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('should skip entries without context or path', () => {
|
|
67
|
+
const proxy = [
|
|
68
|
+
{ context: ['/api'], target: 'http://localhost:3000' },
|
|
69
|
+
{ target: 'http://localhost:3001', router: {} }, // router-based proxy without context
|
|
70
|
+
];
|
|
71
|
+
expect(extractProxyRoutes(proxy)).toEqual(['/api']);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('should handle null entries gracefully', () => {
|
|
75
|
+
const proxy = [
|
|
76
|
+
{ context: ['/api'], target: 'http://localhost:3000' },
|
|
77
|
+
null as any,
|
|
78
|
+
];
|
|
79
|
+
expect(extractProxyRoutes(proxy)).toEqual(['/api']);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('should handle mixed context types across entries', () => {
|
|
83
|
+
const proxy = [
|
|
84
|
+
{ context: ['/api', '/graphql'], target: 'http://localhost:3000' },
|
|
85
|
+
{ context: '/ws', target: 'http://localhost:3001' },
|
|
86
|
+
];
|
|
87
|
+
expect(extractProxyRoutes(proxy)).toEqual(['/api', '/graphql', '/ws']);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ProxyConfigArray } from 'webpack-dev-server';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Extracts route patterns from webpack-dev-server proxy configuration.
|
|
5
|
+
*
|
|
6
|
+
* Handles the webpack-dev-server proxy array format:
|
|
7
|
+
* ```
|
|
8
|
+
* proxy: [
|
|
9
|
+
* { context: ['/api'], target: 'http://localhost:3000' },
|
|
10
|
+
* { context: '/ws', target: 'http://localhost:3001' },
|
|
11
|
+
* { path: '/legacy', target: 'http://localhost:3002' },
|
|
12
|
+
* ]
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* @see https://webpack.js.org/configuration/dev-server/#devserverproxy
|
|
16
|
+
*/
|
|
17
|
+
export function extractProxyRoutes(
|
|
18
|
+
proxy: ProxyConfigArray | undefined,
|
|
19
|
+
): string[] {
|
|
20
|
+
if (!proxy) return [];
|
|
21
|
+
|
|
22
|
+
return proxy
|
|
23
|
+
.filter(
|
|
24
|
+
(item): item is Record<string, unknown> =>
|
|
25
|
+
typeof item === 'object' && item !== null,
|
|
26
|
+
)
|
|
27
|
+
.flatMap(item => {
|
|
28
|
+
// webpack-dev-server proxy supports both 'context' and 'path' properties
|
|
29
|
+
// and each can be a string or an array of strings
|
|
30
|
+
const context = item.context ?? item.path;
|
|
31
|
+
if (Array.isArray(context)) return context as string[];
|
|
32
|
+
if (typeof context === 'string') return [context];
|
|
33
|
+
return [];
|
|
34
|
+
});
|
|
35
|
+
}
|
|
@@ -20,6 +20,7 @@ import WebpackDevServer from 'webpack-dev-server';
|
|
|
20
20
|
import 'cross-fetch/dist/node-polyfill.js';
|
|
21
21
|
import { createHybridRequire } from './createHybridRequire.js';
|
|
22
22
|
import { getWebpackConfig } from './getWebpackConfig.js';
|
|
23
|
+
import { extractProxyRoutes } from './proxyUtils.js';
|
|
23
24
|
import { getErrorStatus, renderErrorPage } from './ssrErrorHandler.js';
|
|
24
25
|
import { BoundRender } from './types.js';
|
|
25
26
|
|
|
@@ -216,9 +217,7 @@ export default async function startDevServer(
|
|
|
216
217
|
|
|
217
218
|
const otherRoutes = [
|
|
218
219
|
process.env.WEBPACK_PUBLIC_PATH,
|
|
219
|
-
...(webpackConfigs[0].devServer?.proxy
|
|
220
|
-
?.filter(proxy => typeof proxy === 'object')
|
|
221
|
-
?.flatMap(proxy => proxy.context) ?? []),
|
|
220
|
+
...extractProxyRoutes(webpackConfigs[0].devServer?.proxy),
|
|
222
221
|
];
|
|
223
222
|
// serve SSR for non-WEBPACK_PUBLIC_PATH
|
|
224
223
|
devServer.app?.get(
|