inspector-ng 0.0.16 → 0.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,9 +11,11 @@ Inspired by [ibelick](https://github.com/ibelick)'s original design.
11
11
  ## Installation
12
12
 
13
13
  ```bash
14
- npm install inspector-ng@0.0.13 @ngrx/store@^17.2.0
14
+ npm install inspector-ng@latest @ngrx/store
15
15
  ```
16
16
 
17
+ Use the `@ngrx/store` major that matches your application's Angular major (e.g. `@ngrx/store@^20` for Angular 20).
18
+
17
19
  For a complete new-project walkthrough with copy-paste Store, Router, Redux DevTools, state, local-package, and troubleshooting examples, see the [setup guide](https://github.com/destx0/inspector/blob/main/SETUP_GUIDE.md).
18
20
 
19
21
  ## Getting Started
@@ -102,7 +104,9 @@ A checkpoint contains the root Store value and current route. Restore dispatches
102
104
  | Key | Action |
103
105
  |---|---|
104
106
  | `Alt + P` | Open the Inspector command palette when configured |
105
- | `Alt` (hold) | Measure the pixel distance between the selected and hovered elements in Select mode |
107
+ | `Alt + I` | Toggle Inspect mode |
108
+ | `Alt + S` | Save a checkpoint when checkpoint support is installed |
109
+ | `Alt` (hold) | Measure the pixel distance between the selected and hovered elements in Inspect mode |
106
110
  | `Ctrl/Cmd + click` | Select the minimum common parent of the current selection and clicked element |
107
111
  | `Esc` | Clear selections, guides, and transient overlays |
108
112
 
@@ -110,8 +114,8 @@ A checkpoint contains the root Store value and current route. Restore dispatches
110
114
 
111
115
  - **Element Inspection** — Click any element to see its bounding box, padding, margin, font size, line height, color, and more.
112
116
  - **Typography Overlay** — Annotate all visible text blocks with their computed typography styles.
113
- - **Alignment Guides** — Place draggable vertical/horizontal guides with snap-to behavior.
114
- - **Distance Measurement** — Hold `Alt` in Select mode to measure between separate elements or from a nested element to its parent boundaries.
117
+ - **Alignment Guides** — Place draggable vertical/horizontal guides with snap-to behavior and live distances between adjacent guides.
118
+ - **Distance Measurement** — Hold `Alt` in Inspect mode to measure between separate elements or from a nested element to all four boundaries of any ancestor, regardless of nesting depth.
115
119
  - **Gap Detection** — Detects and displays flex/grid gap values.
116
120
  - **State Persistence** — Optionally saves and restores state across page reloads.
117
121
  - **SSR-Safe** — Uses `isPlatformBrowser` to avoid running on the server.
@@ -119,14 +123,17 @@ A checkpoint contains the root Store value and current route. Restore dispatches
119
123
 
120
124
  ## Compatibility
121
125
 
122
- | Dependency | Version |
126
+ The library is Angular-version agnostic. It requires any Angular between 17 and 22 and works across the full supported range:
127
+
128
+ | Dependency | Version range |
123
129
  |---|---|
124
- | `@angular/core` | `^17.3.0` |
125
- | `@angular/common` | `^17.3.0` |
126
- | `@angular/router` | `^17.3.0` |
127
- | `@ngrx/store` | `^17.2.0` (peer dependency used only for checkpoints) |
130
+ | `@angular/core` | `>=17.0.0 <23` |
131
+ | `@angular/common` | `>=17.0.0 <23` |
132
+ | `@angular/router` | `>=17.0.0 <23` |
133
+ | `@ngrx/store` | `>=17.0.0 <22` (peer dependency used only for checkpoints) |
134
+ | `rxjs` | `^7.8.0` |
128
135
 
129
- Built as a standalone component with signal-based reactivity and `OnPush` change detection.
136
+ Install the `@ngrx/store` major that matches your application's Angular major. Built as a standalone component with signal-based reactivity and `OnPush` change detection.
130
137
 
131
138
  ## License
132
139
 
@@ -165,6 +165,34 @@ export class InspectorCheckpointService {
165
165
  this.busy.set(false);
166
166
  }
167
167
  }
168
+ async importCheckpoint(value) {
169
+ this.error.set(null);
170
+ if (!isCheckpointRecord(value)) {
171
+ this.error.set('The selected file is not a valid inspector-ng checkpoint. Expected a version 1 checkpoint JSON file.');
172
+ return null;
173
+ }
174
+ this.busy.set(true);
175
+ try {
176
+ const persisted = await this.repository.list();
177
+ const checkpoint = {
178
+ ...value,
179
+ id: createCheckpointId(),
180
+ name: nextAutomaticName(value.name, persisted.map(({ name }) => name)),
181
+ createdAt: new Date().toISOString(),
182
+ lastUsedAt: undefined,
183
+ };
184
+ await this.repository.put(checkpoint);
185
+ this.checkpoints.set([checkpoint, ...persisted].sort(recentActivityFirst));
186
+ return checkpoint;
187
+ }
188
+ catch (error) {
189
+ this.error.set(this.storageMessage(error, 'The checkpoint could not be imported.'));
190
+ return null;
191
+ }
192
+ finally {
193
+ this.busy.set(false);
194
+ }
195
+ }
168
196
  async restore(id) {
169
197
  this.error.set(null);
170
198
  if (!this.store) {
@@ -204,6 +232,32 @@ export class InspectorCheckpointService {
204
232
  this.busy.set(false);
205
233
  }
206
234
  }
235
+ async navigateToRoute(route) {
236
+ this.error.set(null);
237
+ if (!this.router) {
238
+ this.error.set('The Angular Router is unavailable, so the Inspector cannot navigate.');
239
+ return false;
240
+ }
241
+ this.busy.set(true);
242
+ try {
243
+ if (this.router.url !== route && !await this.router.navigateByUrl(route)) {
244
+ throw new Error(`Navigation to “${route}” was cancelled.`);
245
+ }
246
+ return true;
247
+ }
248
+ catch (error) {
249
+ this.error.set(this.messageFor(error, 'The route could not be opened.'));
250
+ return false;
251
+ }
252
+ finally {
253
+ this.busy.set(false);
254
+ }
255
+ }
256
+ resolveRoute(query) {
257
+ if (!isPlatformBrowser(this.platformId))
258
+ return null;
259
+ return resolveRouteQuery(query, this.currentPathname());
260
+ }
207
261
  async rename(id, name) {
208
262
  this.error.set(null);
209
263
  const nextName = name.trim();
@@ -326,6 +380,25 @@ export function nextAutomaticName(route, names) {
326
380
  return candidate;
327
381
  }
328
382
  }
383
+ export function resolveRouteQuery(query, basePathname) {
384
+ const raw = query.trim();
385
+ if (!raw)
386
+ return null;
387
+ if (raw.startsWith('/'))
388
+ return raw;
389
+ if (raw === '.' || raw === '..' || raw.startsWith('./') || raw.startsWith('../')) {
390
+ const base = basePathname.startsWith('/') ? basePathname : `/${basePathname}`;
391
+ // Resolve against the current route as a directory: "./x" appends to it
392
+ // and "../x" moves up one route level, like Angular's relative navigation.
393
+ const directory = base.endsWith('/') ? base : `${base}/`;
394
+ const url = new URL(raw, `http://inspector.local${directory}`);
395
+ const pathname = url.pathname.length > 1 && url.pathname.endsWith('/')
396
+ ? url.pathname.slice(0, -1)
397
+ : url.pathname;
398
+ return `${pathname}${url.search}${url.hash}`;
399
+ }
400
+ return null;
401
+ }
329
402
  function cloneJson(value, failureMessage = 'The NgRx root state is not JSON-serializable. Remove circular or unsupported values and try again.') {
330
403
  try {
331
404
  const serialized = JSON.stringify(value);
@@ -368,4 +441,4 @@ function isCheckpointRecord(value) {
368
441
  (checkpoint.lastUsedAt === undefined || typeof checkpoint.lastUsedAt === 'string') &&
369
442
  'state' in checkpoint;
370
443
  }
371
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnNwZWN0b3Itbmcvc3JjL2xpYi9jaGVja3BvaW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsTUFBTSxFQUNOLFVBQVUsRUFDVixjQUFjLEVBQ2QsUUFBUSxFQUNSLFdBQVcsRUFDWCx3QkFBd0IsRUFDeEIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBR0wsYUFBYSxFQUNiLEtBQUssR0FDTixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7OztBQWlCNUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUM3RCxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUM7QUFDckMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDO0FBQ2pDLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBRXBDLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUMxQyxJQUFJLGNBQWMsQ0FBZ0MsaUNBQWlDLENBQUMsQ0FBQztBQUV2RixNQUFNLFVBQVUsOEJBQThCLENBQzVDLE9BQXlCO0lBRXpCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDdkIsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGtCQUFrQixFQUFFLENBQUM7WUFDdkMsT0FBUSxNQUFrQyxDQUFDLEtBQVUsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FB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TSxVQUFVLG1CQUFtQixDQUNqQyxDQUE0QixFQUM1QixDQUE0QjtJQUU1QixPQUFPLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxLQUFjO0lBQ3hDLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3RELE1BQU0sVUFBVSxHQUFHLEtBQTJDLENBQUM7SUFDL0QsT0FBTyxVQUFVLENBQUMsT0FBTyxLQUFLLENBQUM7UUFDN0IsT0FBTyxVQUFVLENBQUMsRUFBRSxLQUFLLFFBQVE7UUFDakMsT0FBTyxVQUFVLENBQUMsSUFBSSxLQUFLLFFBQVE7UUFDbkMsT0FBTyxVQUFVLENBQUMsS0FBSyxLQUFLLFFBQVE7UUFDcEMsT0FBTyxVQUFVLENBQUMsU0FBUyxLQUFLLFFBQVE7UUFDeEMsQ0FBQyxVQUFVLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxPQUFPLFVBQVUsQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDO1FBQ2xGLE9BQU8sSUFBSSxVQUFVLENBQUM7QUFDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudmlyb25tZW50UHJvdmlkZXJzLFxuICBJbmplY3QsXG4gIEluamVjdGFibGUsXG4gIEluamVjdGlvblRva2VuLFxuICBPcHRpb25hbCxcbiAgUExBVEZPUk1fSUQsXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1xuICBBY3Rpb24sXG4gIEFjdGlvblJlZHVjZXIsXG4gIE1FVEFfUkVEVUNFUlMsXG4gIFN0b3JlLFxufSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgdGFrZSB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQge1xuICB2ZXJzaW9uOiAxO1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHJvdXRlOiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xuICBsYXN0VXNlZEF0Pzogc3RyaW5nO1xuICBzdGF0ZTogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIFJlc3RvcmVDaGVja3BvaW50QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHtcbiAgdHlwZTogdHlwZW9mIFJFU1RPUkVfQ0hFQ0tQT0lOVDtcbiAgc3RhdGU6IHVua25vd247XG59XG5cbmNvbnN0IFJFU1RPUkVfQ0hFQ0tQT0lOVCA9ICdbSW5zcGVjdG9yIENoZWNrcG9pbnRzXSBSZXN0b3JlJztcbmNvbnN0IERBVEFCQVNFX05BTUUgPSAnaW5zcGVjdG9yLW5nJztcbmNvbnN0IERBVEFCQVNFX1ZFUlNJT04gPSAxO1xuY29uc3QgU1RPUkVfTkFNRSA9ICdjaGVja3BvaW50cyc7XG5jb25zdCBSRVNUT1JFX1NFVFRMRV9ERUxBWV9NUyA9IDEwMDtcblxuZXhwb3J0IGNvbnN0IElOU1BFQ1RPUl9DSEVDS1BPSU5UX1JFUE9TSVRPUlkgPVxuICBuZXcgSW5qZWN0aW9uVG9rZW48SW5zcGVjdG9yQ2hlY2twb2ludFJlcG9zaXRvcnk+KCdJTlNQRUNUT1JfQ0hFQ0tQT0lOVF9SRVBPU0lUT1JZJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNwZWN0b3JDaGVja3BvaW50TWV0YVJlZHVjZXI8VD4oXG4gIHJlZHVjZXI6IEFjdGlvblJlZHVjZXI8VD4sXG4pOiBBY3Rpb25SZWR1Y2VyPFQ+IHtcbiAgcmV0dXJuIChzdGF0ZSwgYWN0aW9uKSA9PiB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBSRVNUT1JFX0NIRUNLUE9JTlQpIHtcbiAgICAgIHJldHVybiAoYWN0aW9uIGFzIFJlc3RvcmVDaGVja3BvaW50QWN0aW9uKS5zdGF0ZSBhcyBUO1xuICAgIH1cbiAgICByZXR1cm4gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKTtcbiAgfTtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEluc3BlY3RvckNoZWNrcG9pbnRSZXBvc2l0b3J5IHtcbiAgYWJzdHJhY3QgbGlzdCgpOiBQcm9taXNlPEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmRbXT47XG4gIGFic3RyYWN0IHB1dChjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkKTogUHJvbWlzZTx2b2lkPjtcbiAgYWJzdHJhY3QgZGVsZXRlKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSW5kZXhlZERiQ2hlY2twb2ludFJlcG9zaXRvcnkgZXh0ZW5kcyBJbnNwZWN0b3JDaGVja3BvaW50UmVwb3NpdG9yeSB7XG4gIHByaXZhdGUgZGF0YWJhc2VQcm9taXNlOiBQcm9taXNlPElEQkRhdGFiYXNlPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm1JZDogb2JqZWN0KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkW10+IHtcbiAgICBjb25zdCBkYXRhYmFzZSA9IGF3YWl0IHRoaXMuZGF0YWJhc2UoKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCB0aGlzLnJlcXVlc3Q8dW5rbm93bltdPihcbiAgICAgIGRhdGFiYXNlLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsICdyZWFkb25seScpLm9iamVjdFN0b3JlKFNUT1JFX05BTUUpLmdldEFsbCgpLFxuICAgICk7XG4gICAgcmV0dXJuIHZhbHVlc1xuICAgICAgLmZpbHRlcihpc0NoZWNrcG9pbnRSZWNvcmQpXG4gICAgICAuc29ydChyZWNlbnRBY3Rpdml0eUZpcnN0KTtcbiAgfVxuXG4gIGFzeW5jIHB1dChjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGF0YWJhc2UgPSBhd2FpdCB0aGlzLmRhdGFiYXNlKCk7XG4gICAgYXdhaXQgdGhpcy50cmFuc2FjdGlvbkNvbXBsZXRlKGRhdGFiYXNlLCAncmVhZHdyaXRlJywgKHN0b3JlKSA9PiBzdG9yZS5wdXQoY2hlY2twb2ludCkpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkYXRhYmFzZSA9IGF3YWl0IHRoaXMuZGF0YWJhc2UoKTtcbiAgICBhd2FpdCB0aGlzLnRyYW5zYWN0aW9uQ29tcGxldGUoZGF0YWJhc2UsICdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLmRlbGV0ZShpZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBkYXRhYmFzZSgpOiBQcm9taXNlPElEQkRhdGFiYXNlPiB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpIHx8IHR5cGVvZiBpbmRleGVkREIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdDaGVja3BvaW50cyBhcmUgb25seSBhdmFpbGFibGUgaW4gYSBicm93c2VyIHdpdGggSW5kZXhlZERCLicpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YWJhc2VQcm9taXNlKSByZXR1cm4gdGhpcy5kYXRhYmFzZVByb21pc2U7XG5cbiAgICBsZXQgcmVqZWN0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBkYXRhYmFzZVByb21pc2UgPSBuZXcgUHJvbWlzZTxJREJEYXRhYmFzZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKERBVEFCQVNFX05BTUUsIERBVEFCQVNFX1ZFUlNJT04pO1xuICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGFiYXNlID0gcmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgIGlmIChkYXRhYmFzZS5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFNUT1JFX05BTUUpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHN0b3JlID0gZGF0YWJhc2UuY3JlYXRlT2JqZWN0U3RvcmUoU1RPUkVfTkFNRSwgeyBrZXlQYXRoOiAnaWQnIH0pO1xuICAgICAgICBzdG9yZS5jcmVhdGVJbmRleCgnY3JlYXRlZEF0JywgJ2NyZWF0ZWRBdCcpO1xuICAgICAgfTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgICAgICByZXF1ZXN0LnJlc3VsdC5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0LnJlc3VsdC5vbnZlcnNpb25jaGFuZ2UgPSAoKSA9PiByZXF1ZXN0LnJlc3VsdC5jbG9zZSgpO1xuICAgICAgICByZXNvbHZlKHJlcXVlc3QucmVzdWx0KTtcbiAgICAgIH07XG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIHJlamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgcmVqZWN0KHJlcXVlc3QuZXJyb3IgPz8gbmV3IEVycm9yKCdJbmRleGVkREIgY291bGQgbm90IGJlIG9wZW5lZC4nKSk7XG4gICAgICB9O1xuICAgICAgcmVxdWVzdC5vbmJsb2NrZWQgPSAoKSA9PiB7XG4gICAgICAgIHJlamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignSW5kZXhlZERCIGlzIGJsb2NrZWQgYnkgYW5vdGhlciBvcGVuIHRhYi4nKSk7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMuZGF0YWJhc2VQcm9taXNlID0gZGF0YWJhc2VQcm9taXNlO1xuICAgIHZvaWQgZGF0YWJhc2VQcm9taXNlLmNhdGNoKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRhdGFiYXNlUHJvbWlzZSA9PT0gZGF0YWJhc2VQcm9taXNlKSB7XG4gICAgICAgIHRoaXMuZGF0YWJhc2VQcm9taXNlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YWJhc2VQcm9taXNlO1xuICB9XG5cbiAgcHJpdmF0ZSByZXF1ZXN0PFQ+KHJlcXVlc3Q6IElEQlJlcXVlc3Q8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKHJlcXVlc3QucmVzdWx0KTtcbiAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yID8/IG5ldyBFcnJvcignSW5kZXhlZERCIHJlcXVlc3QgZmFpbGVkLicpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNhY3Rpb25Db21wbGV0ZShcbiAgICBkYXRhYmFzZTogSURCRGF0YWJhc2UsXG4gICAgbW9kZTogSURCVHJhbnNhY3Rpb25Nb2RlLFxuICAgIG9wZXJhdGlvbjogKHN0b3JlOiBJREJPYmplY3RTdG9yZSkgPT4gSURCUmVxdWVzdCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZGF0YWJhc2UudHJhbnNhY3Rpb24oU1RPUkVfTkFNRSwgbW9kZSk7XG4gICAgICB0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gKCkgPT4gcmVzb2x2ZSgpO1xuICAgICAgdHJhbnNhY3Rpb24ub25lcnJvciA9ICgpID0+IHJlamVjdCh0cmFuc2FjdGlvbi5lcnJvciA/PyBuZXcgRXJyb3IoJ0luZGV4ZWREQiB0cmFuc2FjdGlvbiBmYWlsZWQuJykpO1xuICAgICAgdHJhbnNhY3Rpb24ub25hYm9ydCA9ICgpID0+IHJlamVjdCh0cmFuc2FjdGlvbi5lcnJvciA/PyBuZXcgRXJyb3IoJ0luZGV4ZWREQiB0cmFuc2FjdGlvbiB3YXMgYWJvcnRlZC4nKSk7XG4gICAgICBvcGVyYXRpb24odHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoU1RPUkVfTkFNRSkpO1xuICAgIH0pO1xuICB9XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBJbnNwZWN0b3JDaGVja3BvaW50U2VydmljZSB7XG4gIHJlYWRvbmx5IGNoZWNrcG9pbnRzID0gc2lnbmFsPEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmRbXT4oW10pO1xuICByZWFkb25seSBsb2FkaW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgYnVzeSA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGVycm9yID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoSU5TUEVDVE9SX0NIRUNLUE9JTlRfUkVQT1NJVE9SWSlcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlcG9zaXRvcnk6IEluc3BlY3RvckNoZWNrcG9pbnRSZXBvc2l0b3J5LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoU3RvcmUpIHByaXZhdGUgcmVhZG9ubHkgc3RvcmU6IFN0b3JlIHwgbnVsbCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFJvdXRlcikgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlciB8IG51bGwsXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSByZWFkb25seSBwbGF0Zm9ybUlkOiBvYmplY3QsXG4gICkge31cblxuICBhc3luYyBsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY2hlY2twb2ludHMuc2V0KChhd2FpdCB0aGlzLnJlcG9zaXRvcnkubGlzdCgpKS5zb3J0KHJlY2VudEFjdGl2aXR5Rmlyc3QpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5lcnJvci5zZXQodGhpcy5tZXNzYWdlRm9yKGVycm9yLCAnU2F2ZWQgY2hlY2twb2ludHMgY291bGQgbm90IGJlIGxvYWRlZC4gVHJ5IHJlbG9hZGluZyB0aGUgcGFnZS4nKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNhdmUoKTogUHJvbWlzZTxJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkIHwgbnVsbD4ge1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuICAgIGlmICghdGhpcy5zdG9yZSkge1xuICAgICAgdGhpcy5lcnJvci5zZXQodGhpcy5taXNzaW5nU3RvcmVNZXNzYWdlKCkpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5idXN5LnNldCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5zdG9yZS5waXBlKHRha2UoMSkpKTtcbiAgICAgIGNvbnN0IHN0YXRlID0gY2xvbmVKc29uKGN1cnJlbnRTdGF0ZSk7XG4gICAgICBjb25zdCBwZXJzaXN0ZWQgPSBhd2FpdCB0aGlzLnJlcG9zaXRvcnkubGlzdCgpO1xuICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLmN1cnJlbnRSb3V0ZSgpO1xuICAgICAgY29uc3QgcGF0aG5hbWUgPSB0aGlzLmN1cnJlbnRQYXRobmFtZSgpO1xuICAgICAgY29uc3QgY2hlY2twb2ludDogSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCA9IHtcbiAgICAgICAgdmVyc2lvbjogMSxcbiAgICAgICAgaWQ6IGNyZWF0ZUNoZWNrcG9pbnRJZCgpLFxuICAgICAgICBuYW1lOiBuZXh0QXV0b21hdGljTmFtZShwYXRobmFtZSwgcGVyc2lzdGVkLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpKSxcbiAgICAgICAgcm91dGUsXG4gICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBzdGF0ZSxcbiAgICAgIH07XG4gICAgICBhd2FpdCB0aGlzLnJlcG9zaXRvcnkucHV0KGNoZWNrcG9pbnQpO1xuICAgICAgdGhpcy5jaGVja3BvaW50cy5zZXQoW2NoZWNrcG9pbnQsIC4uLnBlcnNpc3RlZF0uc29ydChyZWNlbnRBY3Rpdml0eUZpcnN0KSk7XG4gICAgICByZXR1cm4gY2hlY2twb2ludDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5lcnJvci5zZXQodGhpcy5zdG9yYWdlTWVzc2FnZShlcnJvciwgJ1RoZSBjaGVja3BvaW50IGNvdWxkIG5vdCBiZSBzYXZlZC4nKSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5idXN5LnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVzdG9yZShpZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gICAgaWYgKCF0aGlzLnN0b3JlKSB7XG4gICAgICB0aGlzLmVycm9yLnNldCh0aGlzLm1pc3NpbmdTdG9yZU1lc3NhZ2UoKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuYnVzeS5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNoZWNrcG9pbnRzID0gYXdhaXQgdGhpcy5yZXBvc2l0b3J5Lmxpc3QoKTtcbiAgICAgIGNvbnN0IGNoZWNrcG9pbnQgPSBjaGVja3BvaW50cy5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSBpZCk7XG4gICAgICBpZiAoIWNoZWNrcG9pbnQpIHRocm93IG5ldyBFcnJvcignQ2hlY2twb2ludCBub3QgZm91bmQuIEl0IG1heSBoYXZlIGJlZW4gZGVsZXRlZCBpbiBhbm90aGVyIHRhYi4nKTtcbiAgICAgIGNvbnN0IHN0YXRlID0gY2xvbmVKc29uKFxuICAgICAgICBjaGVja3BvaW50LnN0YXRlLFxuICAgICAgICBg4oCcJHtjaGVja3BvaW50Lm5hbWV94oCdIGNvdWxkIG5vdCBiZSBkZWNvZGVkLiBEZWxldGUgaXQgYW5kIHNhdmUgYSBuZXcgY2hlY2twb2ludC5gLFxuICAgICAgKTtcbiAgICAgIHRoaXMucmVzdG9yZVN0YXRlKHN0YXRlKTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5yb3V0ZXIgJiZcbiAgICAgICAgdGhpcy5yb3V0ZXIudXJsICE9PSBjaGVja3BvaW50LnJvdXRlICYmXG4gICAgICAgICFhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGNoZWNrcG9pbnQucm91dGUpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc3RhdGUgd2FzIHJlc3RvcmVkLCBidXQgbmF2aWdhdGlvbiB0byDigJwke2NoZWNrcG9pbnQucm91dGV94oCdIHdhcyBjYW5jZWxsZWQuYCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBkZWxheShSRVNUT1JFX1NFVFRMRV9ERUxBWV9NUyk7XG4gICAgICB0aGlzLnJlc3RvcmVTdGF0ZShzdGF0ZSk7XG4gICAgICBjb25zdCByZWNlbnRseVVzZWRDaGVja3BvaW50ID0ge1xuICAgICAgICAuLi5jaGVja3BvaW50LFxuICAgICAgICBsYXN0VXNlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9O1xuICAgICAgYXdhaXQgdGhpcy5yZXBvc2l0b3J5LnB1dChyZWNlbnRseVVzZWRDaGVja3BvaW50KTtcbiAgICAgIHRoaXMuY2hlY2twb2ludHMuc2V0KFxuICAgICAgICBjaGVja3BvaW50c1xuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGlkID8gcmVjZW50bHlVc2VkQ2hlY2twb2ludCA6IGl0ZW0pXG4gICAgICAgICAgLnNvcnQocmVjZW50QWN0aXZpdHlGaXJzdCksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMubWVzc2FnZUZvcihlcnJvciwgJ1RoZSBjaGVja3BvaW50IGNvdWxkIG5vdCBiZSByZXN0b3JlZC4gRGVsZXRlIGl0IGFuZCBzYXZlIGEgbmV3IG9uZS4nKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlbmFtZShpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcbiAgICBjb25zdCBuZXh0TmFtZSA9IG5hbWUudHJpbSgpO1xuICAgIGlmICghbmV4dE5hbWUpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KCdQbGVhc2UgZW50ZXIgYSBjaGVja3BvaW50IG5hbWUuJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5idXN5LnNldCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2hlY2twb2ludHMgPSBhd2FpdCB0aGlzLnJlcG9zaXRvcnkubGlzdCgpO1xuICAgICAgaWYgKGNoZWNrcG9pbnRzLnNvbWUoKGl0ZW0pID0+IGl0ZW0uaWQgIT09IGlkICYmIGl0ZW0ubmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBuZXh0TmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgY2hlY2twb2ludCBuYW1lZCDigJwke25leHROYW1lfeKAnSBhbHJlYWR5IGV4aXN0cy4gQ2hvb3NlIGEgZGlmZmVyZW50IG5hbWUuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjaGVja3BvaW50ID0gY2hlY2twb2ludHMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgaWYgKCFjaGVja3BvaW50KSB0aHJvdyBuZXcgRXJyb3IoJ0NoZWNrcG9pbnQgbm90IGZvdW5kLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgaW4gYW5vdGhlciB0YWIuJyk7XG4gICAgICBhd2FpdCB0aGlzLnJlcG9zaXRvcnkucHV0KHsgLi4uY2hlY2twb2ludCwgbmFtZTogbmV4dE5hbWUgfSk7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRzLnNldChcbiAgICAgICAgY2hlY2twb2ludHMubWFwKChpdGVtKSA9PiBpdGVtLmlkID09PSBpZCA/IHsgLi4uaXRlbSwgbmFtZTogbmV4dE5hbWUgfSA6IGl0ZW0pLnNvcnQocmVjZW50QWN0aXZpdHlGaXJzdCksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMuc3RvcmFnZU1lc3NhZ2UoZXJyb3IsICdUaGUgY2hlY2twb2ludCBjb3VsZCBub3QgYmUgcmVuYW1lZC4nKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gICAgdGhpcy5idXN5LnNldCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5yZXBvc2l0b3J5LmRlbGV0ZShpZCk7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRzLnNldCh0aGlzLmNoZWNrcG9pbnRzKCkuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlkICE9PSBpZCkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMuc3RvcmFnZU1lc3NhZ2UoZXJyb3IsICdUaGUgY2hlY2twb2ludCBjb3VsZCBub3QgYmUgZGVsZXRlZC4nKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyRXJyb3IoKTogdm9pZCB7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVTdGF0ZShzdGF0ZTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuc3RvcmU/LmRpc3BhdGNoKHsgdHlwZTogUkVTVE9SRV9DSEVDS1BPSU5ULCBzdGF0ZSB9IGFzIFJlc3RvcmVDaGVja3BvaW50QWN0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgY3VycmVudFJvdXRlKCk6IHN0cmluZyB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gJy8nO1xuICAgIHJldHVybiBgJHt0aGlzLmN1cnJlbnRQYXRobmFtZSgpfSR7d2luZG93LmxvY2F0aW9uLnNlYXJjaH0ke3dpbmRvdy5sb2NhdGlvbi5oYXNofWA7XG4gIH1cblxuICBwcml2YXRlIGN1cnJlbnRQYXRobmFtZSgpOiBzdHJpbmcge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuICcvJztcbiAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lIHx8ICcvJztcbiAgfVxuXG4gIHByaXZhdGUgbWlzc2luZ1N0b3JlTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnVGhlIE5nUnggcm9vdCBzdG9yZSBpcyB1bmF2YWlsYWJsZS4gQ2hlY2sgdGhhdCBwcm92aWRlSW5zcGVjdG9yQ2hlY2twb2ludHMoKSBpcyByZWdpc3RlcmVkIGFmdGVyIHByb3ZpZGVTdG9yZSgpLic7XG4gIH1cblxuICBwcml2YXRlIHN0b3JhZ2VNZXNzYWdlKGVycm9yOiB1bmtub3duLCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoaXNRdW90YUVycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuICdCcm93c2VyIHN0b3JhZ2UgaXMgZnVsbC4gRGVsZXRlIG9sZCBjaGVja3BvaW50cywgdGhlbiB0cnkgc2F2aW5nIGFnYWluLic7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VGb3IoZXJyb3IsIGZhbGxiYWNrKTtcbiAgfVxuXG4gIHByaXZhdGUgbWVzc2FnZUZvcihlcnJvcjogdW5rbm93biwgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZSA/IGVycm9yLm1lc3NhZ2UgOiBmYWxsYmFjaztcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWxheShtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlSW5zcGVjdG9yQ2hlY2twb2ludHMoKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICByZXR1cm4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcbiAgICBJbmRleGVkRGJDaGVja3BvaW50UmVwb3NpdG9yeSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBJTlNQRUNUT1JfQ0hFQ0tQT0lOVF9SRVBPU0lUT1JZLFxuICAgICAgdXNlRXhpc3Rpbmc6IEluZGV4ZWREYkNoZWNrcG9pbnRSZXBvc2l0b3J5LFxuICAgIH0sXG4gICAgSW5zcGVjdG9yQ2hlY2twb2ludFNlcnZpY2UsXG4gICAge1xuICAgICAgcHJvdmlkZTogTUVUQV9SRURVQ0VSUyxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlVmFsdWU6IGluc3BlY3RvckNoZWNrcG9pbnRNZXRhUmVkdWNlcixcbiAgICB9LFxuICBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5leHRBdXRvbWF0aWNOYW1lKHJvdXRlOiBzdHJpbmcsIG5hbWVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHVzZWQgPSBuZXcgU2V0KG5hbWVzLm1hcCgobmFtZSkgPT4gbmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSk7XG4gIGlmICghdXNlZC5oYXMocm91dGUudG9Mb2NhbGVMb3dlckNhc2UoKSkpIHJldHVybiByb3V0ZTtcbiAgZm9yIChsZXQgc3VmZml4ID0gMjsgOyBzdWZmaXggKz0gMSkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGAke3JvdXRlfSAke3N1ZmZpeH1gO1xuICAgIGlmICghdXNlZC5oYXMoY2FuZGlkYXRlLnRvTG9jYWxlTG93ZXJDYXNlKCkpKSByZXR1cm4gY2FuZGlkYXRlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb25lSnNvbihcbiAgdmFsdWU6IHVua25vd24sXG4gIGZhaWx1cmVNZXNzYWdlID0gJ1RoZSBOZ1J4IHJvb3Qgc3RhdGUgaXMgbm90IEpTT04tc2VyaWFsaXphYmxlLiBSZW1vdmUgY2lyY3VsYXIgb3IgdW5zdXBwb3J0ZWQgdmFsdWVzIGFuZCB0cnkgYWdhaW4uJyxcbik6IHVua25vd24ge1xuICB0cnkge1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgaWYgKHNlcmlhbGl6ZWQgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc2VyaWFsaXplZCkgYXMgdW5rbm93bjtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGZhaWx1cmVNZXNzYWdlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDaGVja3BvaW50SWQoKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjcnlwdG8ucmFuZG9tVVVJRCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICB9XG4gIHJldHVybiBgY2hlY2twb2ludC0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOSl9YDtcbn1cblxuZnVuY3Rpb24gaXNRdW90YUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJiAoXG4gICAgZXJyb3IubmFtZSA9PT0gJ1F1b3RhRXhjZWVkZWRFcnJvcicgfHwgZXJyb3IubmFtZSA9PT0gJ05TX0VSUk9SX0RPTV9RVU9UQV9SRUFDSEVEJ1xuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2twb2ludEFjdGl2aXR5QXQoY2hlY2twb2ludDogSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCk6IHN0cmluZyB7XG4gIHJldHVybiBjaGVja3BvaW50Lmxhc3RVc2VkQXQgJiYgY2hlY2twb2ludC5sYXN0VXNlZEF0ID4gY2hlY2twb2ludC5jcmVhdGVkQXRcbiAgICA/IGNoZWNrcG9pbnQubGFzdFVzZWRBdFxuICAgIDogY2hlY2twb2ludC5jcmVhdGVkQXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNlbnRBY3Rpdml0eUZpcnN0KFxuICBhOiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkLFxuICBiOiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkLFxuKTogbnVtYmVyIHtcbiAgcmV0dXJuIGNoZWNrcG9pbnRBY3Rpdml0eUF0KGIpLmxvY2FsZUNvbXBhcmUoY2hlY2twb2ludEFjdGl2aXR5QXQoYSkpIHx8XG4gICAgYi5jcmVhdGVkQXQubG9jYWxlQ29tcGFyZShhLmNyZWF0ZWRBdCkgfHxcbiAgICBiLmlkLmxvY2FsZUNvbXBhcmUoYS5pZCk7XG59XG5cbmZ1bmN0aW9uIGlzQ2hlY2twb2ludFJlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgY2hlY2twb2ludCA9IHZhbHVlIGFzIFBhcnRpYWw8SW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZD47XG4gIHJldHVybiBjaGVja3BvaW50LnZlcnNpb24gPT09IDEgJiZcbiAgICB0eXBlb2YgY2hlY2twb2ludC5pZCA9PT0gJ3N0cmluZycgJiZcbiAgICB0eXBlb2YgY2hlY2twb2ludC5uYW1lID09PSAnc3RyaW5nJyAmJlxuICAgIHR5cGVvZiBjaGVja3BvaW50LnJvdXRlID09PSAnc3RyaW5nJyAmJlxuICAgIHR5cGVvZiBjaGVja3BvaW50LmNyZWF0ZWRBdCA9PT0gJ3N0cmluZycgJiZcbiAgICAoY2hlY2twb2ludC5sYXN0VXNlZEF0ID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGNoZWNrcG9pbnQubGFzdFVzZWRBdCA9PT0gJ3N0cmluZycpICYmXG4gICAgJ3N0YXRlJyBpbiBjaGVja3BvaW50O1xufVxuIl19
444
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnNwZWN0b3Itbmcvc3JjL2xpYi9jaGVja3BvaW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsTUFBTSxFQUNOLFVBQVUsRUFDVixjQUFjLEVBQ2QsUUFBUSxFQUNSLFdBQVcsRUFDWCx3QkFBd0IsRUFDeEIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBR0wsYUFBYSxFQUNiLEtBQUssR0FDTixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7OztBQWlCNUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUM3RCxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUM7QUFDckMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDO0FBQ2pDLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBRXBDLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUMxQyxJQUFJLGNBQWMsQ0FBZ0MsaUNBQWlDLENBQUMsQ0FBQztBQUV2RixNQUFNLFVBQVUsOEJBQThCLENBQzVDLE9BQXlCO0lBRXpCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDdkIsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGtCQUFrQixFQUFFLENBQUM7WUFDdkMsT0FBUSxNQUFrQyxDQUFDLEtBQVUsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FB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Q0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsU0FBUztRQUMxRSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVU7UUFDdkIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7QUFDM0IsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsQ0FBNEIsRUFDNUIsQ0FBNEI7SUFFNUIsT0FBTyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN0QyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsS0FBYztJQUN4QyxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN0RCxNQUFNLFVBQVUsR0FBRyxLQUEyQyxDQUFDO0lBQy9ELE9BQU8sVUFBVSxDQUFDLE9BQU8sS0FBSyxDQUFDO1FBQzdCLE9BQU8sVUFBVSxDQUFDLEVBQUUsS0FBSyxRQUFRO1FBQ2pDLE9BQU8sVUFBVSxDQUFDLElBQUksS0FBSyxRQUFRO1FBQ25DLE9BQU8sVUFBVSxDQUFDLEtBQUssS0FBSyxRQUFRO1FBQ3BDLE9BQU8sVUFBVSxDQUFDLFNBQVMsS0FBSyxRQUFRO1FBQ3hDLENBQUMsVUFBVSxDQUFDLFVBQVUsS0FBSyxTQUFTLElBQUksT0FBTyxVQUFVLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQztRQUNsRixPQUFPLElBQUksVUFBVSxDQUFDO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgSW5qZWN0LFxuICBJbmplY3RhYmxlLFxuICBJbmplY3Rpb25Ub2tlbixcbiAgT3B0aW9uYWwsXG4gIFBMQVRGT1JNX0lELFxuICBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgQWN0aW9uLFxuICBBY3Rpb25SZWR1Y2VyLFxuICBNRVRBX1JFRFVDRVJTLFxuICBTdG9yZSxcbn0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIHRha2UgfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IGludGVyZmFjZSBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkIHtcbiAgdmVyc2lvbjogMTtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICByb3V0ZTogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgbGFzdFVzZWRBdD86IHN0cmluZztcbiAgc3RhdGU6IHVua25vd247XG59XG5cbmludGVyZmFjZSBSZXN0b3JlQ2hlY2twb2ludEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7XG4gIHR5cGU6IHR5cGVvZiBSRVNUT1JFX0NIRUNLUE9JTlQ7XG4gIHN0YXRlOiB1bmtub3duO1xufVxuXG5jb25zdCBSRVNUT1JFX0NIRUNLUE9JTlQgPSAnW0luc3BlY3RvciBDaGVja3BvaW50c10gUmVzdG9yZSc7XG5jb25zdCBEQVRBQkFTRV9OQU1FID0gJ2luc3BlY3Rvci1uZyc7XG5jb25zdCBEQVRBQkFTRV9WRVJTSU9OID0gMTtcbmNvbnN0IFNUT1JFX05BTUUgPSAnY2hlY2twb2ludHMnO1xuY29uc3QgUkVTVE9SRV9TRVRUTEVfREVMQVlfTVMgPSAxMDA7XG5cbmV4cG9ydCBjb25zdCBJTlNQRUNUT1JfQ0hFQ0tQT0lOVF9SRVBPU0lUT1JZID1cbiAgbmV3IEluamVjdGlvblRva2VuPEluc3BlY3RvckNoZWNrcG9pbnRSZXBvc2l0b3J5PignSU5TUEVDVE9SX0NIRUNLUE9JTlRfUkVQT1NJVE9SWScpO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5zcGVjdG9yQ2hlY2twb2ludE1ldGFSZWR1Y2VyPFQ+KFxuICByZWR1Y2VyOiBBY3Rpb25SZWR1Y2VyPFQ+LFxuKTogQWN0aW9uUmVkdWNlcjxUPiB7XG4gIHJldHVybiAoc3RhdGUsIGFjdGlvbikgPT4ge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gUkVTVE9SRV9DSEVDS1BPSU5UKSB7XG4gICAgICByZXR1cm4gKGFjdGlvbiBhcyBSZXN0b3JlQ2hlY2twb2ludEFjdGlvbikuc3RhdGUgYXMgVDtcbiAgICB9XG4gICAgcmV0dXJuIHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7XG4gIH07XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJbnNwZWN0b3JDaGVja3BvaW50UmVwb3NpdG9yeSB7XG4gIGFic3RyYWN0IGxpc3QoKTogUHJvbWlzZTxJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkW10+O1xuICBhYnN0cmFjdCBwdXQoY2hlY2twb2ludDogSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCk6IFByb21pc2U8dm9pZD47XG4gIGFic3RyYWN0IGRlbGV0ZShpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEluZGV4ZWREYkNoZWNrcG9pbnRSZXBvc2l0b3J5IGV4dGVuZHMgSW5zcGVjdG9yQ2hlY2twb2ludFJlcG9zaXRvcnkge1xuICBwcml2YXRlIGRhdGFiYXNlUHJvbWlzZTogUHJvbWlzZTxJREJEYXRhYmFzZT4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQ6IG9iamVjdCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBhc3luYyBsaXN0KCk6IFByb21pc2U8SW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZFtdPiB7XG4gICAgY29uc3QgZGF0YWJhc2UgPSBhd2FpdCB0aGlzLmRhdGFiYXNlKCk7XG4gICAgY29uc3QgdmFsdWVzID0gYXdhaXQgdGhpcy5yZXF1ZXN0PHVua25vd25bXT4oXG4gICAgICBkYXRhYmFzZS50cmFuc2FjdGlvbihTVE9SRV9OQU1FLCAncmVhZG9ubHknKS5vYmplY3RTdG9yZShTVE9SRV9OQU1FKS5nZXRBbGwoKSxcbiAgICApO1xuICAgIHJldHVybiB2YWx1ZXNcbiAgICAgIC5maWx0ZXIoaXNDaGVja3BvaW50UmVjb3JkKVxuICAgICAgLnNvcnQocmVjZW50QWN0aXZpdHlGaXJzdCk7XG4gIH1cblxuICBhc3luYyBwdXQoY2hlY2twb2ludDogSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRhdGFiYXNlID0gYXdhaXQgdGhpcy5kYXRhYmFzZSgpO1xuICAgIGF3YWl0IHRoaXMudHJhbnNhY3Rpb25Db21wbGV0ZShkYXRhYmFzZSwgJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4gc3RvcmUucHV0KGNoZWNrcG9pbnQpKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGF0YWJhc2UgPSBhd2FpdCB0aGlzLmRhdGFiYXNlKCk7XG4gICAgYXdhaXQgdGhpcy50cmFuc2FjdGlvbkNvbXBsZXRlKGRhdGFiYXNlLCAncmVhZHdyaXRlJywgKHN0b3JlKSA9PiBzdG9yZS5kZWxldGUoaWQpKTtcbiAgfVxuXG4gIHByaXZhdGUgZGF0YWJhc2UoKTogUHJvbWlzZTxJREJEYXRhYmFzZT4ge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSB8fCB0eXBlb2YgaW5kZXhlZERCID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignQ2hlY2twb2ludHMgYXJlIG9ubHkgYXZhaWxhYmxlIGluIGEgYnJvd3NlciB3aXRoIEluZGV4ZWREQi4nKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGFiYXNlUHJvbWlzZSkgcmV0dXJuIHRoaXMuZGF0YWJhc2VQcm9taXNlO1xuXG4gICAgbGV0IHJlamVjdGVkID0gZmFsc2U7XG4gICAgY29uc3QgZGF0YWJhc2VQcm9taXNlID0gbmV3IFByb21pc2U8SURCRGF0YWJhc2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihEQVRBQkFTRV9OQU1FLCBEQVRBQkFTRV9WRVJTSU9OKTtcbiAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhYmFzZSA9IHJlcXVlc3QucmVzdWx0O1xuICAgICAgICBpZiAoZGF0YWJhc2Uub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhTVE9SRV9OQU1FKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzdG9yZSA9IGRhdGFiYXNlLmNyZWF0ZU9iamVjdFN0b3JlKFNUT1JFX05BTUUsIHsga2V5UGF0aDogJ2lkJyB9KTtcbiAgICAgICAgc3RvcmUuY3JlYXRlSW5kZXgoJ2NyZWF0ZWRBdCcsICdjcmVhdGVkQXQnKTtcbiAgICAgIH07XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgICAgcmVxdWVzdC5yZXN1bHQuY2xvc2UoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdC5yZXN1bHQub252ZXJzaW9uY2hhbmdlID0gKCkgPT4gcmVxdWVzdC5yZXN1bHQuY2xvc2UoKTtcbiAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7XG4gICAgICB9O1xuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICByZWplY3RlZCA9IHRydWU7XG4gICAgICAgIHJlamVjdChyZXF1ZXN0LmVycm9yID8/IG5ldyBFcnJvcignSW5kZXhlZERCIGNvdWxkIG5vdCBiZSBvcGVuZWQuJykpO1xuICAgICAgfTtcbiAgICAgIHJlcXVlc3Qub25ibG9ja2VkID0gKCkgPT4ge1xuICAgICAgICByZWplY3RlZCA9IHRydWU7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0luZGV4ZWREQiBpcyBibG9ja2VkIGJ5IGFub3RoZXIgb3BlbiB0YWIuJykpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLmRhdGFiYXNlUHJvbWlzZSA9IGRhdGFiYXNlUHJvbWlzZTtcbiAgICB2b2lkIGRhdGFiYXNlUHJvbWlzZS5jYXRjaCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kYXRhYmFzZVByb21pc2UgPT09IGRhdGFiYXNlUHJvbWlzZSkge1xuICAgICAgICB0aGlzLmRhdGFiYXNlUHJvbWlzZSA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRhdGFiYXNlUHJvbWlzZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWVzdDxUPihyZXF1ZXN0OiBJREJSZXF1ZXN0PFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7XG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QocmVxdWVzdC5lcnJvciA/PyBuZXcgRXJyb3IoJ0luZGV4ZWREQiByZXF1ZXN0IGZhaWxlZC4nKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zYWN0aW9uQ29tcGxldGUoXG4gICAgZGF0YWJhc2U6IElEQkRhdGFiYXNlLFxuICAgIG1vZGU6IElEQlRyYW5zYWN0aW9uTW9kZSxcbiAgICBvcGVyYXRpb246IChzdG9yZTogSURCT2JqZWN0U3RvcmUpID0+IElEQlJlcXVlc3QsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRhdGFiYXNlLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsIG1vZGUpO1xuICAgICAgdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgIHRyYW5zYWN0aW9uLm9uZXJyb3IgPSAoKSA9PiByZWplY3QodHJhbnNhY3Rpb24uZXJyb3IgPz8gbmV3IEVycm9yKCdJbmRleGVkREIgdHJhbnNhY3Rpb24gZmFpbGVkLicpKTtcbiAgICAgIHRyYW5zYWN0aW9uLm9uYWJvcnQgPSAoKSA9PiByZWplY3QodHJhbnNhY3Rpb24uZXJyb3IgPz8gbmV3IEVycm9yKCdJbmRleGVkREIgdHJhbnNhY3Rpb24gd2FzIGFib3J0ZWQuJykpO1xuICAgICAgb3BlcmF0aW9uKHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKFNUT1JFX05BTUUpKTtcbiAgICB9KTtcbiAgfVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSW5zcGVjdG9yQ2hlY2twb2ludFNlcnZpY2Uge1xuICByZWFkb25seSBjaGVja3BvaW50cyA9IHNpZ25hbDxJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkW10+KFtdKTtcbiAgcmVhZG9ubHkgbG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGJ1c3kgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBlcnJvciA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KElOU1BFQ1RPUl9DSEVDS1BPSU5UX1JFUE9TSVRPUlkpXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXBvc2l0b3J5OiBJbnNwZWN0b3JDaGVja3BvaW50UmVwb3NpdG9yeSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFN0b3JlKSBwcml2YXRlIHJlYWRvbmx5IHN0b3JlOiBTdG9yZSB8IG51bGwsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChSb3V0ZXIpIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIgfCBudWxsLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm1JZDogb2JqZWN0LFxuICApIHt9XG5cbiAgYXN5bmMgbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRzLnNldCgoYXdhaXQgdGhpcy5yZXBvc2l0b3J5Lmxpc3QoKSkuc29ydChyZWNlbnRBY3Rpdml0eUZpcnN0KSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMubWVzc2FnZUZvcihlcnJvciwgJ1NhdmVkIGNoZWNrcG9pbnRzIGNvdWxkIG5vdCBiZSBsb2FkZWQuIFRyeSByZWxvYWRpbmcgdGhlIHBhZ2UuJykpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzYXZlKCk6IFByb21pc2U8SW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCB8IG51bGw+IHtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcbiAgICBpZiAoIXRoaXMuc3RvcmUpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMubWlzc2luZ1N0b3JlTWVzc2FnZSgpKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuYnVzeS5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuc3RvcmUucGlwZSh0YWtlKDEpKSk7XG4gICAgICBjb25zdCBzdGF0ZSA9IGNsb25lSnNvbihjdXJyZW50U3RhdGUpO1xuICAgICAgY29uc3QgcGVyc2lzdGVkID0gYXdhaXQgdGhpcy5yZXBvc2l0b3J5Lmxpc3QoKTtcbiAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5jdXJyZW50Um91dGUoKTtcbiAgICAgIGNvbnN0IHBhdGhuYW1lID0gdGhpcy5jdXJyZW50UGF0aG5hbWUoKTtcbiAgICAgIGNvbnN0IGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQgPSB7XG4gICAgICAgIHZlcnNpb246IDEsXG4gICAgICAgIGlkOiBjcmVhdGVDaGVja3BvaW50SWQoKSxcbiAgICAgICAgbmFtZTogbmV4dEF1dG9tYXRpY05hbWUocGF0aG5hbWUsIHBlcnNpc3RlZC5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKSksXG4gICAgICAgIHJvdXRlLFxuICAgICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc3RhdGUsXG4gICAgICB9O1xuICAgICAgYXdhaXQgdGhpcy5yZXBvc2l0b3J5LnB1dChjaGVja3BvaW50KTtcbiAgICAgIHRoaXMuY2hlY2twb2ludHMuc2V0KFtjaGVja3BvaW50LCAuLi5wZXJzaXN0ZWRdLnNvcnQocmVjZW50QWN0aXZpdHlGaXJzdCkpO1xuICAgICAgcmV0dXJuIGNoZWNrcG9pbnQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMuc3RvcmFnZU1lc3NhZ2UoZXJyb3IsICdUaGUgY2hlY2twb2ludCBjb3VsZCBub3QgYmUgc2F2ZWQuJykpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGltcG9ydENoZWNrcG9pbnQodmFsdWU6IHVua25vd24pOiBQcm9taXNlPEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQgfCBudWxsPiB7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gICAgaWYgKCFpc0NoZWNrcG9pbnRSZWNvcmQodmFsdWUpKSB7XG4gICAgICB0aGlzLmVycm9yLnNldCgnVGhlIHNlbGVjdGVkIGZpbGUgaXMgbm90IGEgdmFsaWQgaW5zcGVjdG9yLW5nIGNoZWNrcG9pbnQuIEV4cGVjdGVkIGEgdmVyc2lvbiAxIGNoZWNrcG9pbnQgSlNPTiBmaWxlLicpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5idXN5LnNldCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGVyc2lzdGVkID0gYXdhaXQgdGhpcy5yZXBvc2l0b3J5Lmxpc3QoKTtcbiAgICAgIGNvbnN0IGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQgPSB7XG4gICAgICAgIC4uLnZhbHVlLFxuICAgICAgICBpZDogY3JlYXRlQ2hlY2twb2ludElkKCksXG4gICAgICAgIG5hbWU6IG5leHRBdXRvbWF0aWNOYW1lKHZhbHVlLm5hbWUsIHBlcnNpc3RlZC5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKSksXG4gICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBsYXN0VXNlZEF0OiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgYXdhaXQgdGhpcy5yZXBvc2l0b3J5LnB1dChjaGVja3BvaW50KTtcbiAgICAgIHRoaXMuY2hlY2twb2ludHMuc2V0KFtjaGVja3BvaW50LCAuLi5wZXJzaXN0ZWRdLnNvcnQocmVjZW50QWN0aXZpdHlGaXJzdCkpO1xuICAgICAgcmV0dXJuIGNoZWNrcG9pbnQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMuc3RvcmFnZU1lc3NhZ2UoZXJyb3IsICdUaGUgY2hlY2twb2ludCBjb3VsZCBub3QgYmUgaW1wb3J0ZWQuJykpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlc3RvcmUoaWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuICAgIGlmICghdGhpcy5zdG9yZSkge1xuICAgICAgdGhpcy5lcnJvci5zZXQodGhpcy5taXNzaW5nU3RvcmVNZXNzYWdlKCkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmJ1c3kuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjaGVja3BvaW50cyA9IGF3YWl0IHRoaXMucmVwb3NpdG9yeS5saXN0KCk7XG4gICAgICBjb25zdCBjaGVja3BvaW50ID0gY2hlY2twb2ludHMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgaWYgKCFjaGVja3BvaW50KSB0aHJvdyBuZXcgRXJyb3IoJ0NoZWNrcG9pbnQgbm90IGZvdW5kLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgaW4gYW5vdGhlciB0YWIuJyk7XG4gICAgICBjb25zdCBzdGF0ZSA9IGNsb25lSnNvbihcbiAgICAgICAgY2hlY2twb2ludC5zdGF0ZSxcbiAgICAgICAgYOKAnCR7Y2hlY2twb2ludC5uYW1lfeKAnSBjb3VsZCBub3QgYmUgZGVjb2RlZC4gRGVsZXRlIGl0IGFuZCBzYXZlIGEgbmV3IGNoZWNrcG9pbnQuYCxcbiAgICAgICk7XG4gICAgICB0aGlzLnJlc3RvcmVTdGF0ZShzdGF0ZSk7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucm91dGVyICYmXG4gICAgICAgIHRoaXMucm91dGVyLnVybCAhPT0gY2hlY2twb2ludC5yb3V0ZSAmJlxuICAgICAgICAhYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChjaGVja3BvaW50LnJvdXRlKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHN0YXRlIHdhcyByZXN0b3JlZCwgYnV0IG5hdmlnYXRpb24gdG8g4oCcJHtjaGVja3BvaW50LnJvdXRlfeKAnSB3YXMgY2FuY2VsbGVkLmApO1xuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoUkVTVE9SRV9TRVRUTEVfREVMQVlfTVMpO1xuICAgICAgdGhpcy5yZXN0b3JlU3RhdGUoc3RhdGUpO1xuICAgICAgY29uc3QgcmVjZW50bHlVc2VkQ2hlY2twb2ludCA9IHtcbiAgICAgICAgLi4uY2hlY2twb2ludCxcbiAgICAgICAgbGFzdFVzZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMucmVwb3NpdG9yeS5wdXQocmVjZW50bHlVc2VkQ2hlY2twb2ludCk7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRzLnNldChcbiAgICAgICAgY2hlY2twb2ludHNcbiAgICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLmlkID09PSBpZCA/IHJlY2VudGx5VXNlZENoZWNrcG9pbnQgOiBpdGVtKVxuICAgICAgICAgIC5zb3J0KHJlY2VudEFjdGl2aXR5Rmlyc3QpLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmVycm9yLnNldCh0aGlzLm1lc3NhZ2VGb3IoZXJyb3IsICdUaGUgY2hlY2twb2ludCBjb3VsZCBub3QgYmUgcmVzdG9yZWQuIERlbGV0ZSBpdCBhbmQgc2F2ZSBhIG5ldyBvbmUuJykpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmJ1c3kuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBuYXZpZ2F0ZVRvUm91dGUocm91dGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuICAgIGlmICghdGhpcy5yb3V0ZXIpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KCdUaGUgQW5ndWxhciBSb3V0ZXIgaXMgdW5hdmFpbGFibGUsIHNvIHRoZSBJbnNwZWN0b3IgY2Fubm90IG5hdmlnYXRlLicpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmJ1c3kuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5yb3V0ZXIudXJsICE9PSByb3V0ZSAmJiAhYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChyb3V0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOYXZpZ2F0aW9uIHRvIOKAnCR7cm91dGV94oCdIHdhcyBjYW5jZWxsZWQuYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5lcnJvci5zZXQodGhpcy5tZXNzYWdlRm9yKGVycm9yLCAnVGhlIHJvdXRlIGNvdWxkIG5vdCBiZSBvcGVuZWQuJykpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmJ1c3kuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICByZXNvbHZlUm91dGUocXVlcnk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHJlc29sdmVSb3V0ZVF1ZXJ5KHF1ZXJ5LCB0aGlzLmN1cnJlbnRQYXRobmFtZSgpKTtcbiAgfVxuXG4gIGFzeW5jIHJlbmFtZShpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcbiAgICBjb25zdCBuZXh0TmFtZSA9IG5hbWUudHJpbSgpO1xuICAgIGlmICghbmV4dE5hbWUpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KCdQbGVhc2UgZW50ZXIgYSBjaGVja3BvaW50IG5hbWUuJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5idXN5LnNldCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2hlY2twb2ludHMgPSBhd2FpdCB0aGlzLnJlcG9zaXRvcnkubGlzdCgpO1xuICAgICAgaWYgKGNoZWNrcG9pbnRzLnNvbWUoKGl0ZW0pID0+IGl0ZW0uaWQgIT09IGlkICYmIGl0ZW0ubmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBuZXh0TmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgY2hlY2twb2ludCBuYW1lZCDigJwke25leHROYW1lfeKAnSBhbHJlYWR5IGV4aXN0cy4gQ2hvb3NlIGEgZGlmZmVyZW50IG5hbWUuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjaGVja3BvaW50ID0gY2hlY2twb2ludHMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgaWYgKCFjaGVja3BvaW50KSB0aHJvdyBuZXcgRXJyb3IoJ0NoZWNrcG9pbnQgbm90IGZvdW5kLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgaW4gYW5vdGhlciB0YWIuJyk7XG4gICAgICBhd2FpdCB0aGlzLnJlcG9zaXRvcnkucHV0KHsgLi4uY2hlY2twb2ludCwgbmFtZTogbmV4dE5hbWUgfSk7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRzLnNldChcbiAgICAgICAgY2hlY2twb2ludHMubWFwKChpdGVtKSA9PiBpdGVtLmlkID09PSBpZCA/IHsgLi4uaXRlbSwgbmFtZTogbmV4dE5hbWUgfSA6IGl0ZW0pLnNvcnQocmVjZW50QWN0aXZpdHlGaXJzdCksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMuc3RvcmFnZU1lc3NhZ2UoZXJyb3IsICdUaGUgY2hlY2twb2ludCBjb3VsZCBub3QgYmUgcmVuYW1lZC4nKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gICAgdGhpcy5idXN5LnNldCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5yZXBvc2l0b3J5LmRlbGV0ZShpZCk7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRzLnNldCh0aGlzLmNoZWNrcG9pbnRzKCkuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlkICE9PSBpZCkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMuc3RvcmFnZU1lc3NhZ2UoZXJyb3IsICdUaGUgY2hlY2twb2ludCBjb3VsZCBub3QgYmUgZGVsZXRlZC4nKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyRXJyb3IoKTogdm9pZCB7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVTdGF0ZShzdGF0ZTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuc3RvcmU/LmRpc3BhdGNoKHsgdHlwZTogUkVTVE9SRV9DSEVDS1BPSU5ULCBzdGF0ZSB9IGFzIFJlc3RvcmVDaGVja3BvaW50QWN0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgY3VycmVudFJvdXRlKCk6IHN0cmluZyB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gJy8nO1xuICAgIHJldHVybiBgJHt0aGlzLmN1cnJlbnRQYXRobmFtZSgpfSR7d2luZG93LmxvY2F0aW9uLnNlYXJjaH0ke3dpbmRvdy5sb2NhdGlvbi5oYXNofWA7XG4gIH1cblxuICBwcml2YXRlIGN1cnJlbnRQYXRobmFtZSgpOiBzdHJpbmcge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuICcvJztcbiAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lIHx8ICcvJztcbiAgfVxuXG4gIHByaXZhdGUgbWlzc2luZ1N0b3JlTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnVGhlIE5nUnggcm9vdCBzdG9yZSBpcyB1bmF2YWlsYWJsZS4gQ2hlY2sgdGhhdCBwcm92aWRlSW5zcGVjdG9yQ2hlY2twb2ludHMoKSBpcyByZWdpc3RlcmVkIGFmdGVyIHByb3ZpZGVTdG9yZSgpLic7XG4gIH1cblxuICBwcml2YXRlIHN0b3JhZ2VNZXNzYWdlKGVycm9yOiB1bmtub3duLCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoaXNRdW90YUVycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuICdCcm93c2VyIHN0b3JhZ2UgaXMgZnVsbC4gRGVsZXRlIG9sZCBjaGVja3BvaW50cywgdGhlbiB0cnkgc2F2aW5nIGFnYWluLic7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VGb3IoZXJyb3IsIGZhbGxiYWNrKTtcbiAgfVxuXG4gIHByaXZhdGUgbWVzc2FnZUZvcihlcnJvcjogdW5rbm93biwgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZSA/IGVycm9yLm1lc3NhZ2UgOiBmYWxsYmFjaztcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWxheShtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlSW5zcGVjdG9yQ2hlY2twb2ludHMoKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICByZXR1cm4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcbiAgICBJbmRleGVkRGJDaGVja3BvaW50UmVwb3NpdG9yeSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBJTlNQRUNUT1JfQ0hFQ0tQT0lOVF9SRVBPU0lUT1JZLFxuICAgICAgdXNlRXhpc3Rpbmc6IEluZGV4ZWREYkNoZWNrcG9pbnRSZXBvc2l0b3J5LFxuICAgIH0sXG4gICAgSW5zcGVjdG9yQ2hlY2twb2ludFNlcnZpY2UsXG4gICAge1xuICAgICAgcHJvdmlkZTogTUVUQV9SRURVQ0VSUyxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlVmFsdWU6IGluc3BlY3RvckNoZWNrcG9pbnRNZXRhUmVkdWNlcixcbiAgICB9LFxuICBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5leHRBdXRvbWF0aWNOYW1lKHJvdXRlOiBzdHJpbmcsIG5hbWVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHVzZWQgPSBuZXcgU2V0KG5hbWVzLm1hcCgobmFtZSkgPT4gbmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSk7XG4gIGlmICghdXNlZC5oYXMocm91dGUudG9Mb2NhbGVMb3dlckNhc2UoKSkpIHJldHVybiByb3V0ZTtcbiAgZm9yIChsZXQgc3VmZml4ID0gMjsgOyBzdWZmaXggKz0gMSkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGAke3JvdXRlfSAke3N1ZmZpeH1gO1xuICAgIGlmICghdXNlZC5oYXMoY2FuZGlkYXRlLnRvTG9jYWxlTG93ZXJDYXNlKCkpKSByZXR1cm4gY2FuZGlkYXRlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUm91dGVRdWVyeShxdWVyeTogc3RyaW5nLCBiYXNlUGF0aG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCByYXcgPSBxdWVyeS50cmltKCk7XG4gIGlmICghcmF3KSByZXR1cm4gbnVsbDtcbiAgaWYgKHJhdy5zdGFydHNXaXRoKCcvJykpIHJldHVybiByYXc7XG4gIGlmIChyYXcgPT09ICcuJyB8fCByYXcgPT09ICcuLicgfHwgcmF3LnN0YXJ0c1dpdGgoJy4vJykgfHwgcmF3LnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgY29uc3QgYmFzZSA9IGJhc2VQYXRobmFtZS5zdGFydHNXaXRoKCcvJykgPyBiYXNlUGF0aG5hbWUgOiBgLyR7YmFzZVBhdGhuYW1lfWA7XG4gICAgLy8gUmVzb2x2ZSBhZ2FpbnN0IHRoZSBjdXJyZW50IHJvdXRlIGFzIGEgZGlyZWN0b3J5OiBcIi4veFwiIGFwcGVuZHMgdG8gaXRcbiAgICAvLyBhbmQgXCIuLi94XCIgbW92ZXMgdXAgb25lIHJvdXRlIGxldmVsLCBsaWtlIEFuZ3VsYXIncyByZWxhdGl2ZSBuYXZpZ2F0aW9uLlxuICAgIGNvbnN0IGRpcmVjdG9yeSA9IGJhc2UuZW5kc1dpdGgoJy8nKSA/IGJhc2UgOiBgJHtiYXNlfS9gO1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmF3LCBgaHR0cDovL2luc3BlY3Rvci5sb2NhbCR7ZGlyZWN0b3J5fWApO1xuICAgIGNvbnN0IHBhdGhuYW1lID0gdXJsLnBhdGhuYW1lLmxlbmd0aCA+IDEgJiYgdXJsLnBhdGhuYW1lLmVuZHNXaXRoKCcvJylcbiAgICAgID8gdXJsLnBhdGhuYW1lLnNsaWNlKDAsIC0xKVxuICAgICAgOiB1cmwucGF0aG5hbWU7XG4gICAgcmV0dXJuIGAke3BhdGhuYW1lfSR7dXJsLnNlYXJjaH0ke3VybC5oYXNofWA7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGNsb25lSnNvbihcbiAgdmFsdWU6IHVua25vd24sXG4gIGZhaWx1cmVNZXNzYWdlID0gJ1RoZSBOZ1J4IHJvb3Qgc3RhdGUgaXMgbm90IEpTT04tc2VyaWFsaXphYmxlLiBSZW1vdmUgY2lyY3VsYXIgb3IgdW5zdXBwb3J0ZWQgdmFsdWVzIGFuZCB0cnkgYWdhaW4uJyxcbik6IHVua25vd24ge1xuICB0cnkge1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgaWYgKHNlcmlhbGl6ZWQgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc2VyaWFsaXplZCkgYXMgdW5rbm93bjtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGZhaWx1cmVNZXNzYWdlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDaGVja3BvaW50SWQoKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjcnlwdG8ucmFuZG9tVVVJRCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICB9XG4gIHJldHVybiBgY2hlY2twb2ludC0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOSl9YDtcbn1cblxuZnVuY3Rpb24gaXNRdW90YUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJiAoXG4gICAgZXJyb3IubmFtZSA9PT0gJ1F1b3RhRXhjZWVkZWRFcnJvcicgfHwgZXJyb3IubmFtZSA9PT0gJ05TX0VSUk9SX0RPTV9RVU9UQV9SRUFDSEVEJ1xuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2twb2ludEFjdGl2aXR5QXQoY2hlY2twb2ludDogSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCk6IHN0cmluZyB7XG4gIHJldHVybiBjaGVja3BvaW50Lmxhc3RVc2VkQXQgJiYgY2hlY2twb2ludC5sYXN0VXNlZEF0ID4gY2hlY2twb2ludC5jcmVhdGVkQXRcbiAgICA/IGNoZWNrcG9pbnQubGFzdFVzZWRBdFxuICAgIDogY2hlY2twb2ludC5jcmVhdGVkQXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNlbnRBY3Rpdml0eUZpcnN0KFxuICBhOiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkLFxuICBiOiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkLFxuKTogbnVtYmVyIHtcbiAgcmV0dXJuIGNoZWNrcG9pbnRBY3Rpdml0eUF0KGIpLmxvY2FsZUNvbXBhcmUoY2hlY2twb2ludEFjdGl2aXR5QXQoYSkpIHx8XG4gICAgYi5jcmVhdGVkQXQubG9jYWxlQ29tcGFyZShhLmNyZWF0ZWRBdCkgfHxcbiAgICBiLmlkLmxvY2FsZUNvbXBhcmUoYS5pZCk7XG59XG5cbmZ1bmN0aW9uIGlzQ2hlY2twb2ludFJlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgY2hlY2twb2ludCA9IHZhbHVlIGFzIFBhcnRpYWw8SW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZD47XG4gIHJldHVybiBjaGVja3BvaW50LnZlcnNpb24gPT09IDEgJiZcbiAgICB0eXBlb2YgY2hlY2twb2ludC5pZCA9PT0gJ3N0cmluZycgJiZcbiAgICB0eXBlb2YgY2hlY2twb2ludC5uYW1lID09PSAnc3RyaW5nJyAmJlxuICAgIHR5cGVvZiBjaGVja3BvaW50LnJvdXRlID09PSAnc3RyaW5nJyAmJlxuICAgIHR5cGVvZiBjaGVja3BvaW50LmNyZWF0ZWRBdCA9PT0gJ3N0cmluZycgJiZcbiAgICAoY2hlY2twb2ludC5sYXN0VXNlZEF0ID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGNoZWNrcG9pbnQubGFzdFVzZWRBdCA9PT0gJ3N0cmluZycpICYmXG4gICAgJ3N0YXRlJyBpbiBjaGVja3BvaW50O1xufVxuIl19
@@ -1,5 +1,5 @@
1
1
  import { clamp, getViewportSize } from './geometry';
2
- export const getDistanceOverlay = (rectA, rectB) => {
2
+ export const getDistanceOverlay = (rectA, rectB, relation) => {
3
3
  const rightA = rectA.left + rectA.width;
4
4
  const bottomA = rectA.top + rectA.height;
5
5
  const rightB = rectB.left + rectB.width;
@@ -8,6 +8,8 @@ export const getDistanceOverlay = (rectA, rectB) => {
8
8
  const centerAY = rectA.top + rectA.height / 2;
9
9
  let horizontal = null;
10
10
  let vertical = null;
11
+ let horizontalDistances = [];
12
+ let verticalDistances = [];
11
13
  const connectors = [];
12
14
  const separatedX = rightA <= rectB.left || rightB <= rectA.left;
13
15
  const separatedY = bottomA <= rectB.top || bottomB <= rectA.top;
@@ -17,6 +19,7 @@ export const getDistanceOverlay = (rectA, rectB) => {
17
19
  const x2 = aIsLeft ? rectB.left : rectA.left;
18
20
  const y = centerAY;
19
21
  horizontal = { x1, x2, y, value: Math.abs(x2 - x1) };
22
+ horizontalDistances = [horizontal];
20
23
  const edgeBX = aIsLeft ? rectB.left : rightB;
21
24
  if (y < rectB.top) {
22
25
  connectors.push({ x1: edgeBX, y1: y, x2: edgeBX, y2: rectB.top });
@@ -31,6 +34,7 @@ export const getDistanceOverlay = (rectA, rectB) => {
31
34
  const y2 = aIsTop ? rectB.top : rectA.top;
32
35
  const x = centerAX;
33
36
  vertical = { y1, y2, x, value: Math.abs(y2 - y1) };
37
+ verticalDistances = [vertical];
34
38
  const edgeBY = aIsTop ? rectB.top : bottomB;
35
39
  if (x < rectB.left) {
36
40
  connectors.push({ x1: x, y1: edgeBY, x2: rectB.left, y2: edgeBY });
@@ -40,46 +44,54 @@ export const getDistanceOverlay = (rectA, rectB) => {
40
44
  }
41
45
  }
42
46
  if (!separatedX && !separatedY) {
43
- const nestedRects = getNestedRects(rectA, rectB);
47
+ const nestedRects = getNestedRects(rectA, rectB, relation);
44
48
  if (nestedRects) {
45
49
  const { inner, outer } = nestedRects;
46
50
  const innerRight = inner.left + inner.width;
47
51
  const innerBottom = inner.top + inner.height;
48
52
  const outerRight = outer.left + outer.width;
49
53
  const outerBottom = outer.top + outer.height;
50
- const horizontalBoundary = nearestPositiveBoundary(inner.left - outer.left, outerRight - innerRight);
51
- const verticalBoundary = nearestPositiveBoundary(inner.top - outer.top, outerBottom - innerBottom);
54
+ const horizontalY = inner.top + inner.height / 2;
55
+ const verticalX = inner.left + inner.width / 2;
56
+ const startHorizontal = {
57
+ x1: outer.left,
58
+ x2: inner.left,
59
+ y: horizontalY,
60
+ value: inner.left - outer.left,
61
+ };
62
+ const endHorizontal = {
63
+ x1: innerRight,
64
+ x2: outerRight,
65
+ y: horizontalY,
66
+ value: outerRight - innerRight,
67
+ };
68
+ const startVertical = {
69
+ y1: outer.top,
70
+ y2: inner.top,
71
+ x: verticalX,
72
+ value: inner.top - outer.top,
73
+ };
74
+ const endVertical = {
75
+ y1: innerBottom,
76
+ y2: outerBottom,
77
+ x: verticalX,
78
+ value: outerBottom - innerBottom,
79
+ };
80
+ horizontalDistances = [startHorizontal, endHorizontal].filter(({ value }) => value > 0.5);
81
+ verticalDistances = [startVertical, endVertical].filter(({ value }) => value > 0.5);
82
+ const horizontalBoundary = nearestPositiveBoundary(startHorizontal.value, endHorizontal.value);
83
+ const verticalBoundary = nearestPositiveBoundary(startVertical.value, endVertical.value);
52
84
  if (horizontalBoundary === 'start') {
53
- horizontal = {
54
- x1: outer.left,
55
- x2: inner.left,
56
- y: inner.top + inner.height / 2,
57
- value: inner.left - outer.left,
58
- };
85
+ horizontal = startHorizontal;
59
86
  }
60
87
  else if (horizontalBoundary === 'end') {
61
- horizontal = {
62
- x1: innerRight,
63
- x2: outerRight,
64
- y: inner.top + inner.height / 2,
65
- value: outerRight - innerRight,
66
- };
88
+ horizontal = endHorizontal;
67
89
  }
68
90
  if (verticalBoundary === 'start') {
69
- vertical = {
70
- y1: outer.top,
71
- y2: inner.top,
72
- x: inner.left + inner.width / 2,
73
- value: inner.top - outer.top,
74
- };
91
+ vertical = startVertical;
75
92
  }
76
93
  else if (verticalBoundary === 'end') {
77
- vertical = {
78
- y1: innerBottom,
79
- y2: outerBottom,
80
- x: inner.left + inner.width / 2,
81
- value: outerBottom - innerBottom,
82
- };
94
+ vertical = endVertical;
83
95
  }
84
96
  }
85
97
  }
@@ -89,6 +101,8 @@ export const getDistanceOverlay = (rectA, rectB) => {
89
101
  rectB,
90
102
  horizontal,
91
103
  vertical,
104
+ horizontalDistances,
105
+ verticalDistances,
92
106
  connectors: connectors
93
107
  .map((segment) => ({
94
108
  x1: clamp(segment.x1, 0, viewport.width),
@@ -100,7 +114,11 @@ export const getDistanceOverlay = (rectA, rectB) => {
100
114
  Math.abs(segment.y1 - segment.y2) > 0.5),
101
115
  };
102
116
  };
103
- const getNestedRects = (rectA, rectB) => {
117
+ const getNestedRects = (rectA, rectB, relation) => {
118
+ if (relation === 'a-inside-b')
119
+ return { inner: rectA, outer: rectB };
120
+ if (relation === 'b-inside-a')
121
+ return { inner: rectB, outer: rectA };
104
122
  if (containsRect(rectA, rectB))
105
123
  return { inner: rectB, outer: rectA };
106
124
  if (containsRect(rectB, rectA))
@@ -120,4 +138,4 @@ const nearestPositiveBoundary = (startDistance, endDistance) => {
120
138
  return 'start';
121
139
  return startDistance <= endDistance ? 'start' : 'end';
122
140
  };
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaW5zcGVjdG9yLW5nL3NyYy9saWIvZGlzdGFuY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR3BELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsS0FBVyxFQUFFLEtBQVcsRUFBbUIsRUFBRTtJQUM5RSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDeEMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUN4QyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDekMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUM5QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRTlDLElBQUksVUFBVSxHQUFrQyxJQUFJLENBQUM7SUFDckQsSUFBSSxRQUFRLEdBQWdDLElBQUksQ0FBQztJQUNqRCxNQUFNLFVBQVUsR0FBa0MsRUFBRSxDQUFDO0lBRXJELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQ2hFLE1BQU0sVUFBVSxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFD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QUM7QUFFdkQsTUFBTSx1QkFBdUIsR0FBRyxDQUM5QixhQUFxQixFQUNyQixXQUFtQixFQUNLLEVBQUU7SUFDMUIsTUFBTSxlQUFlLEdBQUcsYUFBYSxHQUFHLEdBQUcsQ0FBQztJQUM1QyxNQUFNLGFBQWEsR0FBRyxXQUFXLEdBQUcsR0FBRyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxlQUFlO1FBQUUsT0FBTyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFELElBQUksQ0FBQyxhQUFhO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDbkMsT0FBTyxhQUFhLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN4RCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjbGFtcCwgZ2V0Vmlld3BvcnRTaXplIH0gZnJvbSAnLi9nZW9tZXRyeSc7XG5pbXBvcnQgeyBEaXN0YW5jZU92ZXJsYXksIFJlY3QgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGdldERpc3RhbmNlT3ZlcmxheSA9IChyZWN0QTogUmVjdCwgcmVjdEI6IFJlY3QpOiBEaXN0YW5jZU92ZXJsYXkgPT4ge1xuICBjb25zdCByaWdodEEgPSByZWN0QS5sZWZ0ICsgcmVjdEEud2lkdGg7XG4gIGNvbnN0IGJvdHRvbUEgPSByZWN0QS50b3AgKyByZWN0QS5oZWlnaHQ7XG4gIGNvbnN0IHJpZ2h0QiA9IHJlY3RCLmxlZnQgKyByZWN0Qi53aWR0aDtcbiAgY29uc3QgYm90dG9tQiA9IHJlY3RCLnRvcCArIHJlY3RCLmhlaWdodDtcbiAgY29uc3QgY2VudGVyQVggPSByZWN0QS5sZWZ0ICsgcmVjdEEud2lkdGggLyAyO1xuICBjb25zdCBjZW50ZXJBWSA9IHJlY3RBLnRvcCArIHJlY3RBLmhlaWdodCAvIDI7XG5cbiAgbGV0IGhvcml6b250YWw6IERpc3RhbmNlT3ZlcmxheVsnaG9yaXpvbnRhbCddID0gbnVsbDtcbiAgbGV0IHZlcnRpY2FsOiBEaXN0YW5jZU92ZXJsYXlbJ3ZlcnRpY2FsJ10gPSBudWxsO1xuICBjb25zdCBjb25uZWN0b3JzOiBEaXN0YW5jZU92ZXJsYXlbJ2Nvbm5lY3RvcnMnXSA9IFtdO1xuXG4gIGNvbnN0IHNlcGFyYXRlZFggPSByaWdodEEgPD0gcmVjdEIubGVmdCB8fCByaWdodEIgPD0gcmVjdEEubGVmdDtcbiAgY29uc3Qgc2VwYXJhdGVkWSA9IGJvdHRvbUEgPD0gcmVjdEIudG9wIHx8IGJvdHRvbUIgPD0gcmVjdEEudG9wO1xuXG4gIGlmIChzZXBhcmF0ZWRYKSB7XG4gICAgY29uc3QgYUlzTGVmdCA9IHJpZ2h0QSA8PSByZWN0Qi5sZWZ0O1xuICAgIGNvbnN0IHgxID0gYUlzTGVmdCA/IHJpZ2h0QSA6IHJpZ2h0QjtcbiAgICBjb25zdCB4MiA9IGFJc0xlZnQgPyByZWN0Qi5sZWZ0IDogcmVjdEEubGVmdDtcbiAgICBjb25zdCB5ID0gY2VudGVyQVk7XG4gICAgaG9yaXpvbnRhbCA9IHsgeDEsIHgyLCB5LCB2YWx1ZTogTWF0aC5hYnMoeDIgLSB4MSkgfTtcblxuICAgIGNvbnN0IGVkZ2VCWCA9IGFJc0xlZnQgPyByZWN0Qi5sZWZ0IDogcmlnaHRCO1xuICAgIGlmICh5IDwgcmVjdEIudG9wKSB7XG4gICAgICBjb25uZWN0b3JzLnB1c2goeyB4MTogZWRnZUJYLCB5MTogeSwgeDI6IGVkZ2VCWCwgeTI6IHJlY3RCLnRvcCB9KTtcbiAgICB9IGVsc2UgaWYgKHkgPiBib3R0b21CKSB7XG4gICAgICBjb25uZWN0b3JzLnB1c2goeyB4MTogZWRnZUJYLCB5MTogeSwgeDI6IGVkZ2VCWCwgeTI6IGJvdHRvbUIgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNlcGFyYXRlZFkpIHtcbiAgICBjb25zdCBhSXNUb3AgPSBib3R0b21BIDw9IHJlY3RCLnRvcDtcbiAgICBjb25zdCB5MSA9IGFJc1RvcCA/IGJvdHRvbUEgOiBib3R0b21CO1xuICAgIGNvbnN0IHkyID0gYUlzVG9wID8gcmVjdEIudG9wIDogcmVjdEEudG9wO1xuICAgIGNvbnN0IHggPSBjZW50ZXJBWDtcbiAgICB2ZXJ0aWNhbCA9IHsgeTEsIHkyLCB4LCB2YWx1ZTogTWF0aC5hYnMoeTIgLSB5MSkgfTtcblxuICAgIGNvbnN0IGVkZ2VCWSA9IGFJc1RvcCA/IHJlY3RCLnRvcCA6IGJvdHRvbUI7XG4gICAgaWYgKHggPCByZWN0Qi5sZWZ0KSB7XG4gICAgICBjb25uZWN0b3JzLnB1c2goeyB4MTogeCwgeTE6IGVkZ2VCWSwgeDI6IHJlY3RCLmxlZnQsIHkyOiBlZGdlQlkgfSk7XG4gICAgfSBlbHNlIGlmICh4ID4gcmlnaHRCKSB7XG4gICAgICBjb25uZWN0b3JzLnB1c2goeyB4MTogeCwgeTE6IGVkZ2VCWSwgeDI6IHJpZ2h0QiwgeTI6IGVkZ2VCWSB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXNlcGFyYXRlZFggJiYgIXNlcGFyYXRlZFkpIHtcbiAgICBjb25zdCBuZXN0ZWRSZWN0cyA9IGdldE5lc3RlZFJlY3RzKHJlY3RBLCByZWN0Qik7XG4gICAgaWYgKG5lc3RlZFJlY3RzKSB7XG4gICAgICBjb25zdCB7IGlubmVyLCBvdXRlciB9ID0gbmVzdGVkUmVjdHM7XG4gICAgICBjb25zdCBpbm5lclJpZ2h0ID0gaW5uZXIubGVmdCArIGlubmVyLndpZHRoO1xuICAgICAgY29uc3QgaW5uZXJCb3R0b20gPSBpbm5lci50b3AgKyBpbm5lci5oZWlnaHQ7XG4gICAgICBjb25zdCBvdXRlclJpZ2h0ID0gb3V0ZXIubGVmdCArIG91dGVyLndpZHRoO1xuICAgICAgY29uc3Qgb3V0ZXJCb3R0b20gPSBvdXRlci50b3AgKyBvdXRlci5oZWlnaHQ7XG4gICAgICBjb25zdCBob3Jpem9udGFsQm91bmRhcnkgPSBuZWFyZXN0UG9zaXRpdmVCb3VuZGFyeShcbiAgICAgICAgaW5uZXIubGVmdCAtIG91dGVyLmxlZnQsXG4gICAgICAgIG91dGVyUmlnaHQgLSBpbm5lclJpZ2h0LFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHZlcnRpY2FsQm91bmRhcnkgPSBuZWFyZXN0UG9zaXRpdmVCb3VuZGFyeShcbiAgICAgICAgaW5uZXIudG9wIC0gb3V0ZXIudG9wLFxuICAgICAgICBvdXRlckJvdHRvbSAtIGlubmVyQm90dG9tLFxuICAgICAgKTtcblxuICAgICAgaWYgKGhvcml6b250YWxCb3VuZGFyeSA9PT0gJ3N0YXJ0Jykge1xuICAgICAgICBob3Jpem9udGFsID0ge1xuICAgICAgICAgIHgxOiBvdXRlci5sZWZ0LFxuICAgICAgICAgIHgyOiBpbm5lci5sZWZ0LFxuICAgICAgICAgIHk6IGlubmVyLnRvcCArIGlubmVyLmhlaWdodCAvIDIsXG4gICAgICAgICAgdmFsdWU6IGlubmVyLmxlZnQgLSBvdXRlci5sZWZ0LFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChob3Jpem9udGFsQm91bmRhcnkgPT09ICdlbmQnKSB7XG4gICAgICAgIGhvcml6b250YWwgPSB7XG4gICAgICAgICAgeDE6IGlubmVyUmlnaHQsXG4gICAgICAgICAgeDI6IG91dGVyUmlnaHQsXG4gICAgICAgICAgeTogaW5uZXIudG9wICsgaW5uZXIuaGVpZ2h0IC8gMixcbiAgICAgICAgICB2YWx1ZTogb3V0ZXJSaWdodCAtIGlubmVyUmlnaHQsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICh2ZXJ0aWNhbEJvdW5kYXJ5ID09PSAnc3RhcnQnKSB7XG4gICAgICAgIHZlcnRpY2FsID0ge1xuICAgICAgICAgIHkxOiBvdXRlci50b3AsXG4gICAgICAgICAgeTI6IGlubmVyLnRvcCxcbiAgICAgICAgICB4OiBpbm5lci5sZWZ0ICsgaW5uZXIud2lkdGggLyAyLFxuICAgICAgICAgIHZhbHVlOiBpbm5lci50b3AgLSBvdXRlci50b3AsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHZlcnRpY2FsQm91bmRhcnkgPT09ICdlbmQnKSB7XG4gICAgICAgIHZlcnRpY2FsID0ge1xuICAgICAgICAgIHkxOiBpbm5lckJvdHRvbSxcbiAgICAgICAgICB5Mjogb3V0ZXJCb3R0b20sXG4gICAgICAgICAgeDogaW5uZXIubGVmdCArIGlubmVyLndpZHRoIC8gMixcbiAgICAgICAgICB2YWx1ZTogb3V0ZXJCb3R0b20gLSBpbm5lckJvdHRvbSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB2aWV3cG9ydCA9IGdldFZpZXdwb3J0U2l6ZSgpO1xuXG4gIHJldHVybiB7XG4gICAgcmVjdEEsXG4gICAgcmVjdEIsXG4gICAgaG9yaXpvbnRhbCxcbiAgICB2ZXJ0aWNhbCxcbiAgICBjb25uZWN0b3JzOiBjb25uZWN0b3JzXG4gICAgICAubWFwKChzZWdtZW50KSA9PiAoe1xuICAgICAgICB4MTogY2xhbXAoc2VnbWVudC54MSwgMCwgdmlld3BvcnQud2lkdGgpLFxuICAgICAgICB5MTogY2xhbXAoc2VnbWVudC55MSwgMCwgdmlld3BvcnQuaGVpZ2h0KSxcbiAgICAgICAgeDI6IGNsYW1wKHNlZ21lbnQueDIsIDAsIHZpZXdwb3J0LndpZHRoKSxcbiAgICAgICAgeTI6IGNsYW1wKHNlZ21lbnQueTIsIDAsIHZpZXdwb3J0LmhlaWdodCksXG4gICAgICB9KSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChzZWdtZW50KSA9PlxuICAgICAgICAgIE1hdGguYWJzKHNlZ21lbnQueDEgLSBzZWdtZW50LngyKSA+IDAuNSB8fFxuICAgICAgICAgIE1hdGguYWJzKHNlZ21lbnQueTEgLSBzZWdtZW50LnkyKSA+IDAuNSxcbiAgICAgICksXG4gIH07XG59O1xuXG5jb25zdCBnZXROZXN0ZWRSZWN0cyA9IChcbiAgcmVjdEE6IFJlY3QsXG4gIHJlY3RCOiBSZWN0LFxuKTogeyBpbm5lcjogUmVjdDsgb3V0ZXI6IFJlY3QgfSB8IG51bGwgPT4ge1xuICBpZiAoY29udGFpbnNSZWN0KHJlY3RBLCByZWN0QikpIHJldHVybiB7IGlubmVyOiByZWN0Qiwgb3V0ZXI6IHJlY3RBIH07XG4gIGlmIChjb250YWluc1JlY3QocmVjdEIsIHJlY3RBKSkgcmV0dXJuIHsgaW5uZXI6IHJlY3RBLCBvdXRlcjogcmVjdEIgfTtcbiAgcmV0dXJuIG51bGw7XG59O1xuXG5jb25zdCBjb250YWluc1JlY3QgPSAob3V0ZXI6IFJlY3QsIGlubmVyOiBSZWN0KTogYm9vbGVhbiA9PlxuICBpbm5lci5sZWZ0ID49IG91dGVyLmxlZnQgJiZcbiAgaW5uZXIudG9wID49IG91dGVyLnRvcCAmJlxuICBpbm5lci5sZWZ0ICsgaW5uZXIud2lkdGggPD0gb3V0ZXIubGVmdCArIG91dGVyLndpZHRoICYmXG4gIGlubmVyLnRvcCArIGlubmVyLmhlaWdodCA8PSBvdXRlci50b3AgKyBvdXRlci5oZWlnaHQ7XG5cbmNvbnN0IG5lYXJlc3RQb3NpdGl2ZUJvdW5kYXJ5ID0gKFxuICBzdGFydERpc3RhbmNlOiBudW1iZXIsXG4gIGVuZERpc3RhbmNlOiBudW1iZXIsXG4pOiAnc3RhcnQnIHwgJ2VuZCcgfCBudWxsID0+IHtcbiAgY29uc3Qgc3RhcnRJc1Bvc2l0aXZlID0gc3RhcnREaXN0YW5jZSA+IDAuNTtcbiAgY29uc3QgZW5kSXNQb3NpdGl2ZSA9IGVuZERpc3RhbmNlID4gMC41O1xuICBpZiAoIXN0YXJ0SXNQb3NpdGl2ZSkgcmV0dXJuIGVuZElzUG9zaXRpdmUgPyAnZW5kJyA6IG51bGw7XG4gIGlmICghZW5kSXNQb3NpdGl2ZSkgcmV0dXJuICdzdGFydCc7XG4gIHJldHVybiBzdGFydERpc3RhbmNlIDw9IGVuZERpc3RhbmNlID8gJ3N0YXJ0JyA6ICdlbmQnO1xufTtcbiJdfQ==
141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaW5zcGVjdG9yLW5nL3NyYy9saWIvZGlzdGFuY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR3BELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQ2hDLEtBQVcsRUFDWCxLQUFXLEVBQ1gsUUFBMkIsRUFDVixFQUFFO0lBQ25CLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUN4QyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDekMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3hDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUN6QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFOUMsSUFBSSxVQUFVLEdBQWtDLElBQUksQ0FBQztJQUNyRCxJQUFJLFFBQVEsR0FBZ0MsSUFBSSxDQUFDO0lBQ2pELElBQUksbUJBQW1CLEdBQTJDLEVBQUUsQ0FBQztJQUNyRSxJQUFJLGlCQUFpQixHQUF5QyxFQUFFLENBQUM7SUFDakUsTUFBTSxVQUFVLEdBQWtDLEVBQUUsQ0FBQztJQUVyRCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQztJ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RCxJQUFJLENBQUMsYUFBYTtRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQ25DLE9BQU8sYUFBYSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDeEQsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2xhbXAsIGdldFZpZXdwb3J0U2l6ZSB9IGZyb20gJy4vZ2VvbWV0cnknO1xuaW1wb3J0IHsgRGlzdGFuY2VPdmVybGF5LCBEaXN0YW5jZVJlbGF0aW9uLCBSZWN0IH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBnZXREaXN0YW5jZU92ZXJsYXkgPSAoXG4gIHJlY3RBOiBSZWN0LFxuICByZWN0QjogUmVjdCxcbiAgcmVsYXRpb24/OiBEaXN0YW5jZVJlbGF0aW9uLFxuKTogRGlzdGFuY2VPdmVybGF5ID0+IHtcbiAgY29uc3QgcmlnaHRBID0gcmVjdEEubGVmdCArIHJlY3RBLndpZHRoO1xuICBjb25zdCBib3R0b21BID0gcmVjdEEudG9wICsgcmVjdEEuaGVpZ2h0O1xuICBjb25zdCByaWdodEIgPSByZWN0Qi5sZWZ0ICsgcmVjdEIud2lkdGg7XG4gIGNvbnN0IGJvdHRvbUIgPSByZWN0Qi50b3AgKyByZWN0Qi5oZWlnaHQ7XG4gIGNvbnN0IGNlbnRlckFYID0gcmVjdEEubGVmdCArIHJlY3RBLndpZHRoIC8gMjtcbiAgY29uc3QgY2VudGVyQVkgPSByZWN0QS50b3AgKyByZWN0QS5oZWlnaHQgLyAyO1xuXG4gIGxldCBob3Jpem9udGFsOiBEaXN0YW5jZU92ZXJsYXlbJ2hvcml6b250YWwnXSA9IG51bGw7XG4gIGxldCB2ZXJ0aWNhbDogRGlzdGFuY2VPdmVybGF5Wyd2ZXJ0aWNhbCddID0gbnVsbDtcbiAgbGV0IGhvcml6b250YWxEaXN0YW5jZXM6IERpc3RhbmNlT3ZlcmxheVsnaG9yaXpvbnRhbERpc3RhbmNlcyddID0gW107XG4gIGxldCB2ZXJ0aWNhbERpc3RhbmNlczogRGlzdGFuY2VPdmVybGF5Wyd2ZXJ0aWNhbERpc3RhbmNlcyddID0gW107XG4gIGNvbnN0IGNvbm5lY3RvcnM6IERpc3RhbmNlT3ZlcmxheVsnY29ubmVjdG9ycyddID0gW107XG5cbiAgY29uc3Qgc2VwYXJhdGVkWCA9IHJpZ2h0QSA8PSByZWN0Qi5sZWZ0IHx8IHJpZ2h0QiA8PSByZWN0QS5sZWZ0O1xuICBjb25zdCBzZXBhcmF0ZWRZID0gYm90dG9tQSA8PSByZWN0Qi50b3AgfHwgYm90dG9tQiA8PSByZWN0QS50b3A7XG5cbiAgaWYgKHNlcGFyYXRlZFgpIHtcbiAgICBjb25zdCBhSXNMZWZ0ID0gcmlnaHRBIDw9IHJlY3RCLmxlZnQ7XG4gICAgY29uc3QgeDEgPSBhSXNMZWZ0ID8gcmlnaHRBIDogcmlnaHRCO1xuICAgIGNvbnN0IHgyID0gYUlzTGVmdCA/IHJlY3RCLmxlZnQgOiByZWN0QS5sZWZ0O1xuICAgIGNvbnN0IHkgPSBjZW50ZXJBWTtcbiAgICBob3Jpem9udGFsID0geyB4MSwgeDIsIHksIHZhbHVlOiBNYXRoLmFicyh4MiAtIHgxKSB9O1xuICAgIGhvcml6b250YWxEaXN0YW5jZXMgPSBbaG9yaXpvbnRhbF07XG5cbiAgICBjb25zdCBlZGdlQlggPSBhSXNMZWZ0ID8gcmVjdEIubGVmdCA6IHJpZ2h0QjtcbiAgICBpZiAoeSA8IHJlY3RCLnRvcCkge1xuICAgICAgY29ubmVjdG9ycy5wdXNoKHsgeDE6IGVkZ2VCWCwgeTE6IHksIHgyOiBlZGdlQlgsIHkyOiByZWN0Qi50b3AgfSk7XG4gICAgfSBlbHNlIGlmICh5ID4gYm90dG9tQikge1xuICAgICAgY29ubmVjdG9ycy5wdXNoKHsgeDE6IGVkZ2VCWCwgeTE6IHksIHgyOiBlZGdlQlgsIHkyOiBib3R0b21CIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzZXBhcmF0ZWRZKSB7XG4gICAgY29uc3QgYUlzVG9wID0gYm90dG9tQSA8PSByZWN0Qi50b3A7XG4gICAgY29uc3QgeTEgPSBhSXNUb3AgPyBib3R0b21BIDogYm90dG9tQjtcbiAgICBjb25zdCB5MiA9IGFJc1RvcCA/IHJlY3RCLnRvcCA6IHJlY3RBLnRvcDtcbiAgICBjb25zdCB4ID0gY2VudGVyQVg7XG4gICAgdmVydGljYWwgPSB7IHkxLCB5MiwgeCwgdmFsdWU6IE1hdGguYWJzKHkyIC0geTEpIH07XG4gICAgdmVydGljYWxEaXN0YW5jZXMgPSBbdmVydGljYWxdO1xuXG4gICAgY29uc3QgZWRnZUJZID0gYUlzVG9wID8gcmVjdEIudG9wIDogYm90dG9tQjtcbiAgICBpZiAoeCA8IHJlY3RCLmxlZnQpIHtcbiAgICAgIGNvbm5lY3RvcnMucHVzaCh7IHgxOiB4LCB5MTogZWRnZUJZLCB4MjogcmVjdEIubGVmdCwgeTI6IGVkZ2VCWSB9KTtcbiAgICB9IGVsc2UgaWYgKHggPiByaWdodEIpIHtcbiAgICAgIGNvbm5lY3RvcnMucHVzaCh7IHgxOiB4LCB5MTogZWRnZUJZLCB4MjogcmlnaHRCLCB5MjogZWRnZUJZIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmICghc2VwYXJhdGVkWCAmJiAhc2VwYXJhdGVkWSkge1xuICAgIGNvbnN0IG5lc3RlZFJlY3RzID0gZ2V0TmVzdGVkUmVjdHMocmVjdEEsIHJlY3RCLCByZWxhdGlvbik7XG4gICAgaWYgKG5lc3RlZFJlY3RzKSB7XG4gICAgICBjb25zdCB7IGlubmVyLCBvdXRlciB9ID0gbmVzdGVkUmVjdHM7XG4gICAgICBjb25zdCBpbm5lclJpZ2h0ID0gaW5uZXIubGVmdCArIGlubmVyLndpZHRoO1xuICAgICAgY29uc3QgaW5uZXJCb3R0b20gPSBpbm5lci50b3AgKyBpbm5lci5oZWlnaHQ7XG4gICAgICBjb25zdCBvdXRlclJpZ2h0ID0gb3V0ZXIubGVmdCArIG91dGVyLndpZHRoO1xuICAgICAgY29uc3Qgb3V0ZXJCb3R0b20gPSBvdXRlci50b3AgKyBvdXRlci5oZWlnaHQ7XG4gICAgICBjb25zdCBob3Jpem9udGFsWSA9IGlubmVyLnRvcCArIGlubmVyLmhlaWdodCAvIDI7XG4gICAgICBjb25zdCB2ZXJ0aWNhbFggPSBpbm5lci5sZWZ0ICsgaW5uZXIud2lkdGggLyAyO1xuICAgICAgY29uc3Qgc3RhcnRIb3Jpem9udGFsID0ge1xuICAgICAgICB4MTogb3V0ZXIubGVmdCxcbiAgICAgICAgeDI6IGlubmVyLmxlZnQsXG4gICAgICAgIHk6IGhvcml6b250YWxZLFxuICAgICAgICB2YWx1ZTogaW5uZXIubGVmdCAtIG91dGVyLmxlZnQsXG4gICAgICB9O1xuICAgICAgY29uc3QgZW5kSG9yaXpvbnRhbCA9IHtcbiAgICAgICAgeDE6IGlubmVyUmlnaHQsXG4gICAgICAgIHgyOiBvdXRlclJpZ2h0LFxuICAgICAgICB5OiBob3Jpem9udGFsWSxcbiAgICAgICAgdmFsdWU6IG91dGVyUmlnaHQgLSBpbm5lclJpZ2h0LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0YXJ0VmVydGljYWwgPSB7XG4gICAgICAgIHkxOiBvdXRlci50b3AsXG4gICAgICAgIHkyOiBpbm5lci50b3AsXG4gICAgICAgIHg6IHZlcnRpY2FsWCxcbiAgICAgICAgdmFsdWU6IGlubmVyLnRvcCAtIG91dGVyLnRvcCxcbiAgICAgIH07XG4gICAgICBjb25zdCBlbmRWZXJ0aWNhbCA9IHtcbiAgICAgICAgeTE6IGlubmVyQm90dG9tLFxuICAgICAgICB5Mjogb3V0ZXJCb3R0b20sXG4gICAgICAgIHg6IHZlcnRpY2FsWCxcbiAgICAgICAgdmFsdWU6IG91dGVyQm90dG9tIC0gaW5uZXJCb3R0b20sXG4gICAgICB9O1xuXG4gICAgICBob3Jpem9udGFsRGlzdGFuY2VzID0gW3N0YXJ0SG9yaXpvbnRhbCwgZW5kSG9yaXpvbnRhbF0uZmlsdGVyKFxuICAgICAgICAoeyB2YWx1ZSB9KSA9PiB2YWx1ZSA+IDAuNSxcbiAgICAgICk7XG4gICAgICB2ZXJ0aWNhbERpc3RhbmNlcyA9IFtzdGFydFZlcnRpY2FsLCBlbmRWZXJ0aWNhbF0uZmlsdGVyKFxuICAgICAgICAoeyB2YWx1ZSB9KSA9PiB2YWx1ZSA+IDAuNSxcbiAgICAgICk7XG4gICAgICBjb25zdCBob3Jpem9udGFsQm91bmRhcnkgPSBuZWFyZXN0UG9zaXRpdmVCb3VuZGFyeShcbiAgICAgICAgc3RhcnRIb3Jpem9udGFsLnZhbHVlLFxuICAgICAgICBlbmRIb3Jpem9udGFsLnZhbHVlLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHZlcnRpY2FsQm91bmRhcnkgPSBuZWFyZXN0UG9zaXRpdmVCb3VuZGFyeShcbiAgICAgICAgc3RhcnRWZXJ0aWNhbC52YWx1ZSxcbiAgICAgICAgZW5kVmVydGljYWwudmFsdWUsXG4gICAgICApO1xuXG4gICAgICBpZiAoaG9yaXpvbnRhbEJvdW5kYXJ5ID09PSAnc3RhcnQnKSB7XG4gICAgICAgIGhvcml6b250YWwgPSBzdGFydEhvcml6b250YWw7XG4gICAgICB9IGVsc2UgaWYgKGhvcml6b250YWxCb3VuZGFyeSA9PT0gJ2VuZCcpIHtcbiAgICAgICAgaG9yaXpvbnRhbCA9IGVuZEhvcml6b250YWw7XG4gICAgICB9XG5cbiAgICAgIGlmICh2ZXJ0aWNhbEJvdW5kYXJ5ID09PSAnc3RhcnQnKSB7XG4gICAgICAgIHZlcnRpY2FsID0gc3RhcnRWZXJ0aWNhbDtcbiAgICAgIH0gZWxzZSBpZiAodmVydGljYWxCb3VuZGFyeSA9PT0gJ2VuZCcpIHtcbiAgICAgICAgdmVydGljYWwgPSBlbmRWZXJ0aWNhbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB2aWV3cG9ydCA9IGdldFZpZXdwb3J0U2l6ZSgpO1xuXG4gIHJldHVybiB7XG4gICAgcmVjdEEsXG4gICAgcmVjdEIsXG4gICAgaG9yaXpvbnRhbCxcbiAgICB2ZXJ0aWNhbCxcbiAgICBob3Jpem9udGFsRGlzdGFuY2VzLFxuICAgIHZlcnRpY2FsRGlzdGFuY2VzLFxuICAgIGNvbm5lY3RvcnM6IGNvbm5lY3RvcnNcbiAgICAgIC5tYXAoKHNlZ21lbnQpID0+ICh7XG4gICAgICAgIHgxOiBjbGFtcChzZWdtZW50LngxLCAwLCB2aWV3cG9ydC53aWR0aCksXG4gICAgICAgIHkxOiBjbGFtcChzZWdtZW50LnkxLCAwLCB2aWV3cG9ydC5oZWlnaHQpLFxuICAgICAgICB4MjogY2xhbXAoc2VnbWVudC54MiwgMCwgdmlld3BvcnQud2lkdGgpLFxuICAgICAgICB5MjogY2xhbXAoc2VnbWVudC55MiwgMCwgdmlld3BvcnQuaGVpZ2h0KSxcbiAgICAgIH0pKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHNlZ21lbnQpID0+XG4gICAgICAgICAgTWF0aC5hYnMoc2VnbWVudC54MSAtIHNlZ21lbnQueDIpID4gMC41IHx8XG4gICAgICAgICAgTWF0aC5hYnMoc2VnbWVudC55MSAtIHNlZ21lbnQueTIpID4gMC41LFxuICAgICAgKSxcbiAgfTtcbn07XG5cbmNvbnN0IGdldE5lc3RlZFJlY3RzID0gKFxuICByZWN0QTogUmVjdCxcbiAgcmVjdEI6IFJlY3QsXG4gIHJlbGF0aW9uPzogRGlzdGFuY2VSZWxhdGlvbixcbik6IHsgaW5uZXI6IFJlY3Q7IG91dGVyOiBSZWN0IH0gfCBudWxsID0+IHtcbiAgaWYgKHJlbGF0aW9uID09PSAnYS1pbnNpZGUtYicpIHJldHVybiB7IGlubmVyOiByZWN0QSwgb3V0ZXI6IHJlY3RCIH07XG4gIGlmIChyZWxhdGlvbiA9PT0gJ2ItaW5zaWRlLWEnKSByZXR1cm4geyBpbm5lcjogcmVjdEIsIG91dGVyOiByZWN0QSB9O1xuICBpZiAoY29udGFpbnNSZWN0KHJlY3RBLCByZWN0QikpIHJldHVybiB7IGlubmVyOiByZWN0Qiwgb3V0ZXI6IHJlY3RBIH07XG4gIGlmIChjb250YWluc1JlY3QocmVjdEIsIHJlY3RBKSkgcmV0dXJuIHsgaW5uZXI6IHJlY3RBLCBvdXRlcjogcmVjdEIgfTtcbiAgcmV0dXJuIG51bGw7XG59O1xuXG5jb25zdCBjb250YWluc1JlY3QgPSAob3V0ZXI6IFJlY3QsIGlubmVyOiBSZWN0KTogYm9vbGVhbiA9PlxuICBpbm5lci5sZWZ0ID49IG91dGVyLmxlZnQgJiZcbiAgaW5uZXIudG9wID49IG91dGVyLnRvcCAmJlxuICBpbm5lci5sZWZ0ICsgaW5uZXIud2lkdGggPD0gb3V0ZXIubGVmdCArIG91dGVyLndpZHRoICYmXG4gIGlubmVyLnRvcCArIGlubmVyLmhlaWdodCA8PSBvdXRlci50b3AgKyBvdXRlci5oZWlnaHQ7XG5cbmNvbnN0IG5lYXJlc3RQb3NpdGl2ZUJvdW5kYXJ5ID0gKFxuICBzdGFydERpc3RhbmNlOiBudW1iZXIsXG4gIGVuZERpc3RhbmNlOiBudW1iZXIsXG4pOiAnc3RhcnQnIHwgJ2VuZCcgfCBudWxsID0+IHtcbiAgY29uc3Qgc3RhcnRJc1Bvc2l0aXZlID0gc3RhcnREaXN0YW5jZSA+IDAuNTtcbiAgY29uc3QgZW5kSXNQb3NpdGl2ZSA9IGVuZERpc3RhbmNlID4gMC41O1xuICBpZiAoIXN0YXJ0SXNQb3NpdGl2ZSkgcmV0dXJuIGVuZElzUG9zaXRpdmUgPyAnZW5kJyA6IG51bGw7XG4gIGlmICghZW5kSXNQb3NpdGl2ZSkgcmV0dXJuICdzdGFydCc7XG4gIHJldHVybiBzdGFydERpc3RhbmNlIDw9IGVuZERpc3RhbmNlID8gJ3N0YXJ0JyA6ICdlbmQnO1xufTtcbiJdfQ==