inspector-ng 0.0.14 → 0.0.16

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
@@ -53,7 +53,7 @@ Place `<inspector-overlay>` in your root template (e.g. `app.component.html`). I
53
53
 
54
54
  ### Step 3: Open the command palette
55
55
 
56
- That's it. Press **`Ctrl/Cmd + Shift + P`** in your browser to open the Inspector command palette. No further configuration is required.
56
+ That's it. Press **`Alt + P`** in your browser to open the Inspector command palette. No further configuration is required.
57
57
 
58
58
  ## Configuration
59
59
 
@@ -73,11 +73,11 @@ export const appConfig: ApplicationConfig = {
73
73
  };
74
74
  ```
75
75
 
76
- Use the compact Save action in the command palette to capture the current JSON-serializable NgRx root state immediately. `Ctrl/Cmd+Shift+P` opens the fuzzy checkpoint finder. Rename and delete remain explicit buttons on each record.
76
+ Use the compact Save action in the command palette to capture the current JSON-serializable NgRx root state immediately. `Alt+P` opens the fuzzy checkpoint finder. Rename and delete remain explicit buttons on each record.
77
77
 
78
78
  Records are stored per origin in IndexedDB database `inspector-ng`, object store `checkpoints`. This needs no browser permission prompt and does not map to a visible or fixed OS path. Nothing is evicted automatically. Existing `inspector-checkpoints-v1` localStorage records are deliberately ignored.
79
79
 
80
- A checkpoint contains the root Store value and current route. Restore dispatches `[Inspector Checkpoints] Restore`, then navigates through Angular Router to the saved route, so NgRx Store DevTools records the state change normally. It does not restore action history, component-local state, HTTP activity, or backend state. Native Redux DevTools Import/Export files remain separate and cannot be searched from the Inspector command bar.
80
+ A checkpoint contains the root Store value and current route. Restore dispatches `[Inspector Checkpoints] Restore`, navigates through Angular Router, then dispatches the restore again after a short settle delay, so route initialization cannot overwrite the checkpoint. NgRx Store DevTools records both state changes normally. It does not restore action history, component-local state, HTTP activity, or backend state. Native Redux DevTools Import/Export files remain separate and cannot be searched from the Inspector command bar.
81
81
 
82
82
  ### Inputs
83
83
 
@@ -101,7 +101,9 @@ A checkpoint contains the root Store value and current route. Restore dispatches
101
101
 
102
102
  | Key | Action |
103
103
  |---|---|
104
- | `Ctrl/Cmd + Shift + P` | Open the Inspector command palette when configured |
104
+ | `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 |
106
+ | `Ctrl/Cmd + click` | Select the minimum common parent of the current selection and clicked element |
105
107
  | `Esc` | Clear selections, guides, and transient overlays |
106
108
 
107
109
  ## Features
@@ -109,6 +111,7 @@ A checkpoint contains the root Store value and current route. Restore dispatches
109
111
  - **Element Inspection** — Click any element to see its bounding box, padding, margin, font size, line height, color, and more.
110
112
  - **Typography Overlay** — Annotate all visible text blocks with their computed typography styles.
111
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.
112
115
  - **Gap Detection** — Detects and displays flex/grid gap values.
113
116
  - **State Persistence** — Optionally saves and restores state across page reloads.
114
117
  - **SSR-Safe** — Uses `isPlatformBrowser` to avoid running on the server.
@@ -10,6 +10,7 @@ const RESTORE_CHECKPOINT = '[Inspector Checkpoints] Restore';
10
10
  const DATABASE_NAME = 'inspector-ng';
11
11
  const DATABASE_VERSION = 1;
12
12
  const STORE_NAME = 'checkpoints';
13
+ const RESTORE_SETTLE_DELAY_MS = 100;
13
14
  export const INSPECTOR_CHECKPOINT_REPOSITORY = new InjectionToken('INSPECTOR_CHECKPOINT_REPOSITORY');
14
15
  export function inspectorCheckpointMetaReducer(reducer) {
15
16
  return (state, action) => {
@@ -177,12 +178,14 @@ export class InspectorCheckpointService {
177
178
  if (!checkpoint)
178
179
  throw new Error('Checkpoint not found. It may have been deleted in another tab.');
179
180
  const state = cloneJson(checkpoint.state, `“${checkpoint.name}” could not be decoded. Delete it and save a new checkpoint.`);
180
- this.store.dispatch({ type: RESTORE_CHECKPOINT, state });
181
+ this.restoreState(state);
181
182
  if (this.router &&
182
183
  this.router.url !== checkpoint.route &&
183
184
  !await this.router.navigateByUrl(checkpoint.route)) {
184
185
  throw new Error(`The state was restored, but navigation to “${checkpoint.route}” was cancelled.`);
185
186
  }
187
+ await delay(RESTORE_SETTLE_DELAY_MS);
188
+ this.restoreState(state);
186
189
  const recentlyUsedCheckpoint = {
187
190
  ...checkpoint,
188
191
  lastUsedAt: new Date().toISOString(),
@@ -248,6 +251,9 @@ export class InspectorCheckpointService {
248
251
  clearError() {
249
252
  this.error.set(null);
250
253
  }
254
+ restoreState(state) {
255
+ this.store?.dispatch({ type: RESTORE_CHECKPOINT, state });
256
+ }
251
257
  currentRoute() {
252
258
  if (!isPlatformBrowser(this.platformId))
253
259
  return '/';
@@ -292,6 +298,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
292
298
  type: Inject,
293
299
  args: [PLATFORM_ID]
294
300
  }] }] });
301
+ function delay(milliseconds) {
302
+ return new Promise((resolve) => setTimeout(resolve, milliseconds));
303
+ }
295
304
  export function provideInspectorCheckpoints() {
296
305
  return makeEnvironmentProviders([
297
306
  IndexedDbCheckpointRepository,
@@ -359,4 +368,4 @@ function isCheckpointRecord(value) {
359
368
  (checkpoint.lastUsedAt === undefined || typeof checkpoint.lastUsedAt === 'string') &&
360
369
  'state' in checkpoint;
361
370
  }
362
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnNwZWN0b3Itbmcvc3JjL2xpYi9jaGVja3BvaW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsTUFBTSxFQUNOLFVBQVUsRUFDVixjQUFjLEVBQ2QsUUFBUSxFQUNSLFdBQVcsRUFDWCx3QkFBd0IsRUFDeEIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBR0wsYUFBYSxFQUNiLEtBQUssR0FDTixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7OztBQWlCNUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUM3RCxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUM7QUFDckMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDO0FBRWpDLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUMxQyxJQUFJLGNBQWMsQ0FBZ0MsaUNBQWlDLENBQUMsQ0FBQztBQUV2RixNQUFNLFVBQVUsOEJBQThCLENBQzVDLE9BQXlCO0lBRXpCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDdkIsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGtCQUFrQixFQUFFLENBQUM7WUFDdkMsT0FBUSxNQUFrQyxDQUFDLEtBQVUsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLE9BQWdCLDZCQUE2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UTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3RELE1BQU0sVUFBVSxHQUFHLEtBQTJDLENBQUM7SUFDL0QsT0FBTyxVQUFVLENBQUMsT0FBTyxLQUFLLENBQUM7UUFDN0IsT0FBTyxVQUFVLENBQUMsRUFBRSxLQUFLLFFBQVE7UUFDakMsT0FBTyxVQUFVLENBQUMsSUFBSSxLQUFLLFFBQVE7UUFDbkMsT0FBTyxVQUFVLENBQUMsS0FBSyxLQUFLLFFBQVE7UUFDcEMsT0FBTyxVQUFVLENBQUMsU0FBUyxLQUFLLFFBQVE7UUFDeEMsQ0FBQyxVQUFVLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxPQUFPLFVBQVUsQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDO1FBQ2xGLE9BQU8sSUFBSSxVQUFVLENBQUM7QUFDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudmlyb25tZW50UHJvdmlkZXJzLFxuICBJbmplY3QsXG4gIEluamVjdGFibGUsXG4gIEluamVjdGlvblRva2VuLFxuICBPcHRpb25hbCxcbiAgUExBVEZPUk1fSUQsXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1xuICBBY3Rpb24sXG4gIEFjdGlvblJlZHVjZXIsXG4gIE1FVEFfUkVEVUNFUlMsXG4gIFN0b3JlLFxufSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgdGFrZSB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQge1xuICB2ZXJzaW9uOiAxO1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHJvdXRlOiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xuICBsYXN0VXNlZEF0Pzogc3RyaW5nO1xuICBzdGF0ZTogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIFJlc3RvcmVDaGVja3BvaW50QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHtcbiAgdHlwZTogdHlwZW9mIFJFU1RPUkVfQ0hFQ0tQT0lOVDtcbiAgc3RhdGU6IHVua25vd247XG59XG5cbmNvbnN0IFJFU1RPUkVfQ0hFQ0tQT0lOVCA9ICdbSW5zcGVjdG9yIENoZWNrcG9pbnRzXSBSZXN0b3JlJztcbmNvbnN0IERBVEFCQVNFX05BTUUgPSAnaW5zcGVjdG9yLW5nJztcbmNvbnN0IERBVEFCQVNFX1ZFUlNJT04gPSAxO1xuY29uc3QgU1RPUkVfTkFNRSA9ICdjaGVja3BvaW50cyc7XG5cbmV4cG9ydCBjb25zdCBJTlNQRUNUT1JfQ0hFQ0tQT0lOVF9SRVBPU0lUT1JZID1cbiAgbmV3IEluamVjdGlvblRva2VuPEluc3BlY3RvckNoZWNrcG9pbnRSZXBvc2l0b3J5PignSU5TUEVDVE9SX0NIRUNLUE9JTlRfUkVQT1NJVE9SWScpO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5zcGVjdG9yQ2hlY2twb2ludE1ldGFSZWR1Y2VyPFQ+KFxuICByZWR1Y2VyOiBBY3Rpb25SZWR1Y2VyPFQ+LFxuKTogQWN0aW9uUmVkdWNlcjxUPiB7XG4gIHJldHVybiAoc3RhdGUsIGFjdGlvbikgPT4ge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gUkVTVE9SRV9DSEVDS1BPSU5UKSB7XG4gICAgICByZXR1cm4gKGFjdGlvbiBhcyBSZXN0b3JlQ2hlY2twb2ludEFjdGlvbikuc3RhdGUgYXMgVDtcbiAgICB9XG4gICAgcmV0dXJuIHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7XG4gIH07XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJbnNwZWN0b3JDaGVja3BvaW50UmVwb3NpdG9yeSB7XG4gIGFic3RyYWN0IGxpc3QoKTogUHJvbWlzZTxJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkW10+O1xuICBhYnN0cmFjdCBwdXQoY2hlY2twb2ludDogSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCk6IFByb21pc2U8dm9pZD47XG4gIGFic3RyYWN0IGRlbGV0ZShpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEluZGV4ZWREYkNoZWNrcG9pbnRSZXBvc2l0b3J5IGV4dGVuZHMgSW5zcGVjdG9yQ2hlY2twb2ludFJlcG9zaXRvcnkge1xuICBwcml2YXRlIGRhdGFiYXNlUHJvbWlzZTogUHJvbWlzZTxJREJEYXRhYmFzZT4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQ6IG9iamVjdCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBhc3luYyBsaXN0KCk6IFByb21pc2U8SW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZFtdPiB7XG4gICAgY29uc3QgZGF0YWJhc2UgPSBhd2FpdCB0aGlzLmRhdGFiYXNlKCk7XG4gICAgY29uc3QgdmFsdWVzID0gYXdhaXQgdGhpcy5yZXF1ZXN0PHVua25vd25bXT4oXG4gICAgICBkYXRhYmFzZS50cmFuc2FjdGlvbihTVE9SRV9OQU1FLCAncmVhZG9ubHknKS5vYmplY3RTdG9yZShTVE9SRV9OQU1FKS5nZXRBbGwoKSxcbiAgICApO1xuICAgIHJldHVybiB2YWx1ZXNcbiAgICAgIC5maWx0ZXIoaXNDaGVja3BvaW50UmVjb3JkKVxuICAgICAgLnNvcnQocmVjZW50QWN0aXZpdHlGaXJzdCk7XG4gIH1cblxuICBhc3luYyBwdXQoY2hlY2twb2ludDogSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRhdGFiYXNlID0gYXdhaXQgdGhpcy5kYXRhYmFzZSgpO1xuICAgIGF3YWl0IHRoaXMudHJhbnNhY3Rpb25Db21wbGV0ZShkYXRhYmFzZSwgJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4gc3RvcmUucHV0KGNoZWNrcG9pbnQpKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGF0YWJhc2UgPSBhd2FpdCB0aGlzLmRhdGFiYXNlKCk7XG4gICAgYXdhaXQgdGhpcy50cmFuc2FjdGlvbkNvbXBsZXRlKGRhdGFiYXNlLCAncmVhZHdyaXRlJywgKHN0b3JlKSA9PiBzdG9yZS5kZWxldGUoaWQpKTtcbiAgfVxuXG4gIHByaXZhdGUgZGF0YWJhc2UoKTogUHJvbWlzZTxJREJEYXRhYmFzZT4ge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSB8fCB0eXBlb2YgaW5kZXhlZERCID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignQ2hlY2twb2ludHMgYXJlIG9ubHkgYXZhaWxhYmxlIGluIGEgYnJvd3NlciB3aXRoIEluZGV4ZWREQi4nKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGFiYXNlUHJvbWlzZSkgcmV0dXJuIHRoaXMuZGF0YWJhc2VQcm9taXNlO1xuXG4gICAgbGV0IHJlamVjdGVkID0gZmFsc2U7XG4gICAgY29uc3QgZGF0YWJhc2VQcm9taXNlID0gbmV3IFByb21pc2U8SURCRGF0YWJhc2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihEQVRBQkFTRV9OQU1FLCBEQVRBQkFTRV9WRVJTSU9OKTtcbiAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhYmFzZSA9IHJlcXVlc3QucmVzdWx0O1xuICAgICAgICBpZiAoZGF0YWJhc2Uub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhTVE9SRV9OQU1FKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzdG9yZSA9IGRhdGFiYXNlLmNyZWF0ZU9iamVjdFN0b3JlKFNUT1JFX05BTUUsIHsga2V5UGF0aDogJ2lkJyB9KTtcbiAgICAgICAgc3RvcmUuY3JlYXRlSW5kZXgoJ2NyZWF0ZWRBdCcsICdjcmVhdGVkQXQnKTtcbiAgICAgIH07XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgICAgcmVxdWVzdC5yZXN1bHQuY2xvc2UoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdC5yZXN1bHQub252ZXJzaW9uY2hhbmdlID0gKCkgPT4gcmVxdWVzdC5yZXN1bHQuY2xvc2UoKTtcbiAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7XG4gICAgICB9O1xuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICByZWplY3RlZCA9IHRydWU7XG4gICAgICAgIHJlamVjdChyZXF1ZXN0LmVycm9yID8/IG5ldyBFcnJvcignSW5kZXhlZERCIGNvdWxkIG5vdCBiZSBvcGVuZWQuJykpO1xuICAgICAgfTtcbiAgICAgIHJlcXVlc3Qub25ibG9ja2VkID0gKCkgPT4ge1xuICAgICAgICByZWplY3RlZCA9IHRydWU7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0luZGV4ZWREQiBpcyBibG9ja2VkIGJ5IGFub3RoZXIgb3BlbiB0YWIuJykpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLmRhdGFiYXNlUHJvbWlzZSA9IGRhdGFiYXNlUHJvbWlzZTtcbiAgICB2b2lkIGRhdGFiYXNlUHJvbWlzZS5jYXRjaCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kYXRhYmFzZVByb21pc2UgPT09IGRhdGFiYXNlUHJvbWlzZSkge1xuICAgICAgICB0aGlzLmRhdGFiYXNlUHJvbWlzZSA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRhdGFiYXNlUHJvbWlzZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWVzdDxUPihyZXF1ZXN0OiBJREJSZXF1ZXN0PFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7XG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QocmVxdWVzdC5lcnJvciA/PyBuZXcgRXJyb3IoJ0luZGV4ZWREQiByZXF1ZXN0IGZhaWxlZC4nKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zYWN0aW9uQ29tcGxldGUoXG4gICAgZGF0YWJhc2U6IElEQkRhdGFiYXNlLFxuICAgIG1vZGU6IElEQlRyYW5zYWN0aW9uTW9kZSxcbiAgICBvcGVyYXRpb246IChzdG9yZTogSURCT2JqZWN0U3RvcmUpID0+IElEQlJlcXVlc3QsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRhdGFiYXNlLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsIG1vZGUpO1xuICAgICAgdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgIHRyYW5zYWN0aW9uLm9uZXJyb3IgPSAoKSA9PiByZWplY3QodHJhbnNhY3Rpb24uZXJyb3IgPz8gbmV3IEVycm9yKCdJbmRleGVkREIgdHJhbnNhY3Rpb24gZmFpbGVkLicpKTtcbiAgICAgIHRyYW5zYWN0aW9uLm9uYWJvcnQgPSAoKSA9PiByZWplY3QodHJhbnNhY3Rpb24uZXJyb3IgPz8gbmV3IEVycm9yKCdJbmRleGVkREIgdHJhbnNhY3Rpb24gd2FzIGFib3J0ZWQuJykpO1xuICAgICAgb3BlcmF0aW9uKHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKFNUT1JFX05BTUUpKTtcbiAgICB9KTtcbiAgfVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSW5zcGVjdG9yQ2hlY2twb2ludFNlcnZpY2Uge1xuICByZWFkb25seSBjaGVja3BvaW50cyA9IHNpZ25hbDxJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkW10+KFtdKTtcbiAgcmVhZG9ubHkgbG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGJ1c3kgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBlcnJvciA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KElOU1BFQ1RPUl9DSEVDS1BPSU5UX1JFUE9TSVRPUlkpXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXBvc2l0b3J5OiBJbnNwZWN0b3JDaGVja3BvaW50UmVwb3NpdG9yeSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFN0b3JlKSBwcml2YXRlIHJlYWRvbmx5IHN0b3JlOiBTdG9yZSB8IG51bGwsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChSb3V0ZXIpIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIgfCBudWxsLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm1JZDogb2JqZWN0LFxuICApIHt9XG5cbiAgYXN5bmMgbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRzLnNldCgoYXdhaXQgdGhpcy5yZXBvc2l0b3J5Lmxpc3QoKSkuc29ydChyZWNlbnRBY3Rpdml0eUZpcnN0KSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMubWVzc2FnZUZvcihlcnJvciwgJ1NhdmVkIGNoZWNrcG9pbnRzIGNvdWxkIG5vdCBiZSBsb2FkZWQuIFRyeSByZWxvYWRpbmcgdGhlIHBhZ2UuJykpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzYXZlKCk6IFByb21pc2U8SW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCB8IG51bGw+IHtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcbiAgICBpZiAoIXRoaXMuc3RvcmUpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMubWlzc2luZ1N0b3JlTWVzc2FnZSgpKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuYnVzeS5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuc3RvcmUucGlwZSh0YWtlKDEpKSk7XG4gICAgICBjb25zdCBzdGF0ZSA9IGNsb25lSnNvbihjdXJyZW50U3RhdGUpO1xuICAgICAgY29uc3QgcGVyc2lzdGVkID0gYXdhaXQgdGhpcy5yZXBvc2l0b3J5Lmxpc3QoKTtcbiAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5jdXJyZW50Um91dGUoKTtcbiAgICAgIGNvbnN0IHBhdGhuYW1lID0gdGhpcy5jdXJyZW50UGF0aG5hbWUoKTtcbiAgICAgIGNvbnN0IGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQgPSB7XG4gICAgICAgIHZlcnNpb246IDEsXG4gICAgICAgIGlkOiBjcmVhdGVDaGVja3BvaW50SWQoKSxcbiAgICAgICAgbmFtZTogbmV4dEF1dG9tYXRpY05hbWUocGF0aG5hbWUsIHBlcnNpc3RlZC5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKSksXG4gICAgICAgIHJvdXRlLFxuICAgICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc3RhdGUsXG4gICAgICB9O1xuICAgICAgYXdhaXQgdGhpcy5yZXBvc2l0b3J5LnB1dChjaGVja3BvaW50KTtcbiAgICAgIHRoaXMuY2hlY2twb2ludHMuc2V0KFtjaGVja3BvaW50LCAuLi5wZXJzaXN0ZWRdLnNvcnQocmVjZW50QWN0aXZpdHlGaXJzdCkpO1xuICAgICAgcmV0dXJuIGNoZWNrcG9pbnQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMuc3RvcmFnZU1lc3NhZ2UoZXJyb3IsICdUaGUgY2hlY2twb2ludCBjb3VsZCBub3QgYmUgc2F2ZWQuJykpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlc3RvcmUoaWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuICAgIGlmICghdGhpcy5zdG9yZSkge1xuICAgICAgdGhpcy5lcnJvci5zZXQodGhpcy5taXNzaW5nU3RvcmVNZXNzYWdlKCkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmJ1c3kuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjaGVja3BvaW50cyA9IGF3YWl0IHRoaXMucmVwb3NpdG9yeS5saXN0KCk7XG4gICAgICBjb25zdCBjaGVja3BvaW50ID0gY2hlY2twb2ludHMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgaWYgKCFjaGVja3BvaW50KSB0aHJvdyBuZXcgRXJyb3IoJ0NoZWNrcG9pbnQgbm90IGZvdW5kLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgaW4gYW5vdGhlciB0YWIuJyk7XG4gICAgICBjb25zdCBzdGF0ZSA9IGNsb25lSnNvbihcbiAgICAgICAgY2hlY2twb2ludC5zdGF0ZSxcbiAgICAgICAgYOKAnCR7Y2hlY2twb2ludC5uYW1lfeKAnSBjb3VsZCBub3QgYmUgZGVjb2RlZC4gRGVsZXRlIGl0IGFuZCBzYXZlIGEgbmV3IGNoZWNrcG9pbnQuYCxcbiAgICAgICk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHsgdHlwZTogUkVTVE9SRV9DSEVDS1BPSU5ULCBzdGF0ZSB9IGFzIFJlc3RvcmVDaGVja3BvaW50QWN0aW9uKTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5yb3V0ZXIgJiZcbiAgICAgICAgdGhpcy5yb3V0ZXIudXJsICE9PSBjaGVja3BvaW50LnJvdXRlICYmXG4gICAgICAgICFhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGNoZWNrcG9pbnQucm91dGUpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc3RhdGUgd2FzIHJlc3RvcmVkLCBidXQgbmF2aWdhdGlvbiB0byDigJwke2NoZWNrcG9pbnQucm91dGV94oCdIHdhcyBjYW5jZWxsZWQuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWNlbnRseVVzZWRDaGVja3BvaW50ID0ge1xuICAgICAgICAuLi5jaGVja3BvaW50LFxuICAgICAgICBsYXN0VXNlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9O1xuICAgICAgYXdhaXQgdGhpcy5yZXBvc2l0b3J5LnB1dChyZWNlbnRseVVzZWRDaGVja3BvaW50KTtcbiAgICAgIHRoaXMuY2hlY2twb2ludHMuc2V0KFxuICAgICAgICBjaGVja3BvaW50c1xuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGlkID8gcmVjZW50bHlVc2VkQ2hlY2twb2ludCA6IGl0ZW0pXG4gICAgICAgICAgLnNvcnQocmVjZW50QWN0aXZpdHlGaXJzdCksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMubWVzc2FnZUZvcihlcnJvciwgJ1RoZSBjaGVja3BvaW50IGNvdWxkIG5vdCBiZSByZXN0b3JlZC4gRGVsZXRlIGl0IGFuZCBzYXZlIGEgbmV3IG9uZS4nKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlbmFtZShpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcbiAgICBjb25zdCBuZXh0TmFtZSA9IG5hbWUudHJpbSgpO1xuICAgIGlmICghbmV4dE5hbWUpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KCdQbGVhc2UgZW50ZXIgYSBjaGVja3BvaW50IG5hbWUuJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5idXN5LnNldCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2hlY2twb2ludHMgPSBhd2FpdCB0aGlzLnJlcG9zaXRvcnkubGlzdCgpO1xuICAgICAgaWYgKGNoZWNrcG9pbnRzLnNvbWUoKGl0ZW0pID0+IGl0ZW0uaWQgIT09IGlkICYmIGl0ZW0ubmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBuZXh0TmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgY2hlY2twb2ludCBuYW1lZCDigJwke25leHROYW1lfeKAnSBhbHJlYWR5IGV4aXN0cy4gQ2hvb3NlIGEgZGlmZmVyZW50IG5hbWUuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjaGVja3BvaW50ID0gY2hlY2twb2ludHMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgaWYgKCFjaGVja3BvaW50KSB0aHJvdyBuZXcgRXJyb3IoJ0NoZWNrcG9pbnQgbm90IGZvdW5kLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgaW4gYW5vdGhlciB0YWIuJyk7XG4gICAgICBhd2FpdCB0aGlzLnJlcG9zaXRvcnkucHV0KHsgLi4uY2hlY2twb2ludCwgbmFtZTogbmV4dE5hbWUgfSk7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRzLnNldChcbiAgICAgICAgY2hlY2twb2ludHMubWFwKChpdGVtKSA9PiBpdGVtLmlkID09PSBpZCA/IHsgLi4uaXRlbSwgbmFtZTogbmV4dE5hbWUgfSA6IGl0ZW0pLnNvcnQocmVjZW50QWN0aXZpdHlGaXJzdCksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMuc3RvcmFnZU1lc3NhZ2UoZXJyb3IsICdUaGUgY2hlY2twb2ludCBjb3VsZCBub3QgYmUgcmVuYW1lZC4nKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gICAgdGhpcy5idXN5LnNldCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5yZXBvc2l0b3J5LmRlbGV0ZShpZCk7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRzLnNldCh0aGlzLmNoZWNrcG9pbnRzKCkuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlkICE9PSBpZCkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMuc3RvcmFnZU1lc3NhZ2UoZXJyb3IsICdUaGUgY2hlY2twb2ludCBjb3VsZCBub3QgYmUgZGVsZXRlZC4nKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyRXJyb3IoKTogdm9pZCB7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGN1cnJlbnRSb3V0ZSgpOiBzdHJpbmcge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuICcvJztcbiAgICByZXR1cm4gYCR7dGhpcy5jdXJyZW50UGF0aG5hbWUoKX0ke3dpbmRvdy5sb2NhdGlvbi5zZWFyY2h9JHt3aW5kb3cubG9jYXRpb24uaGFzaH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBjdXJyZW50UGF0aG5hbWUoKTogc3RyaW5nIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiAnLyc7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSB8fCAnLyc7XG4gIH1cblxuICBwcml2YXRlIG1pc3NpbmdTdG9yZU1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ1RoZSBOZ1J4IHJvb3Qgc3RvcmUgaXMgdW5hdmFpbGFibGUuIENoZWNrIHRoYXQgcHJvdmlkZUluc3BlY3RvckNoZWNrcG9pbnRzKCkgaXMgcmVnaXN0ZXJlZCBhZnRlciBwcm92aWRlU3RvcmUoKS4nO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9yYWdlTWVzc2FnZShlcnJvcjogdW5rbm93biwgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGlzUXVvdGFFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiAnQnJvd3NlciBzdG9yYWdlIGlzIGZ1bGwuIERlbGV0ZSBvbGQgY2hlY2twb2ludHMsIHRoZW4gdHJ5IHNhdmluZyBhZ2Fpbi4nO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlRm9yKGVycm9yLCBmYWxsYmFjayk7XG4gIH1cblxuICBwcml2YXRlIG1lc3NhZ2VGb3IoZXJyb3I6IHVua25vd24sIGZhbGxiYWNrOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UgPyBlcnJvci5tZXNzYWdlIDogZmFsbGJhY2s7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVJbnNwZWN0b3JDaGVja3BvaW50cygpOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIEluZGV4ZWREYkNoZWNrcG9pbnRSZXBvc2l0b3J5LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IElOU1BFQ1RPUl9DSEVDS1BPSU5UX1JFUE9TSVRPUlksXG4gICAgICB1c2VFeGlzdGluZzogSW5kZXhlZERiQ2hlY2twb2ludFJlcG9zaXRvcnksXG4gICAgfSxcbiAgICBJbnNwZWN0b3JDaGVja3BvaW50U2VydmljZSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBNRVRBX1JFRFVDRVJTLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICB1c2VWYWx1ZTogaW5zcGVjdG9yQ2hlY2twb2ludE1ldGFSZWR1Y2VyLFxuICAgIH0sXG4gIF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV4dEF1dG9tYXRpY05hbWUocm91dGU6IHN0cmluZywgbmFtZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdXNlZCA9IG5ldyBTZXQobmFtZXMubWFwKChuYW1lKSA9PiBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkpKTtcbiAgaWYgKCF1c2VkLmhhcyhyb3V0ZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSkgcmV0dXJuIHJvdXRlO1xuICBmb3IgKGxldCBzdWZmaXggPSAyOyA7IHN1ZmZpeCArPSAxKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gYCR7cm91dGV9ICR7c3VmZml4fWA7XG4gICAgaWYgKCF1c2VkLmhhcyhjYW5kaWRhdGUudG9Mb2NhbGVMb3dlckNhc2UoKSkpIHJldHVybiBjYW5kaWRhdGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvbmVKc29uKFxuICB2YWx1ZTogdW5rbm93bixcbiAgZmFpbHVyZU1lc3NhZ2UgPSAnVGhlIE5nUnggcm9vdCBzdGF0ZSBpcyBub3QgSlNPTi1zZXJpYWxpemFibGUuIFJlbW92ZSBjaXJjdWxhciBvciB1bnN1cHBvcnRlZCB2YWx1ZXMgYW5kIHRyeSBhZ2Fpbi4nLFxuKTogdW5rbm93biB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICBpZiAoc2VyaWFsaXplZCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzZXJpYWxpemVkKSBhcyB1bmtub3duO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZmFpbHVyZU1lc3NhZ2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNoZWNrcG9pbnRJZCgpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNyeXB0by5yYW5kb21VVUlEID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XG4gIH1cbiAgcmV0dXJuIGBjaGVja3BvaW50LSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA5KX1gO1xufVxuXG5mdW5jdGlvbiBpc1F1b3RhRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uICYmIChcbiAgICBlcnJvci5uYW1lID09PSAnUXVvdGFFeGNlZWRlZEVycm9yJyB8fCBlcnJvci5uYW1lID09PSAnTlNfRVJST1JfRE9NX1FVT1RBX1JFQUNIRUQnXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja3BvaW50QWN0aXZpdHlBdChjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNoZWNrcG9pbnQubGFzdFVzZWRBdCAmJiBjaGVja3BvaW50Lmxhc3RVc2VkQXQgPiBjaGVja3BvaW50LmNyZWF0ZWRBdFxuICAgID8gY2hlY2twb2ludC5sYXN0VXNlZEF0XG4gICAgOiBjaGVja3BvaW50LmNyZWF0ZWRBdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY2VudEFjdGl2aXR5Rmlyc3QoXG4gIGE6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQsXG4gIGI6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQsXG4pOiBudW1iZXIge1xuICByZXR1cm4gY2hlY2twb2ludEFjdGl2aXR5QXQoYikubG9jYWxlQ29tcGFyZShjaGVja3BvaW50QWN0aXZpdHlBdChhKSkgfHxcbiAgICBiLmNyZWF0ZWRBdC5sb2NhbGVDb21wYXJlKGEuY3JlYXRlZEF0KSB8fFxuICAgIGIuaWQubG9jYWxlQ29tcGFyZShhLmlkKTtcbn1cblxuZnVuY3Rpb24gaXNDaGVja3BvaW50UmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBjaGVja3BvaW50ID0gdmFsdWUgYXMgUGFydGlhbDxJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkPjtcbiAgcmV0dXJuIGNoZWNrcG9pbnQudmVyc2lvbiA9PT0gMSAmJlxuICAgIHR5cGVvZiBjaGVja3BvaW50LmlkID09PSAnc3RyaW5nJyAmJlxuICAgIHR5cGVvZiBjaGVja3BvaW50Lm5hbWUgPT09ICdzdHJpbmcnICYmXG4gICAgdHlwZW9mIGNoZWNrcG9pbnQucm91dGUgPT09ICdzdHJpbmcnICYmXG4gICAgdHlwZW9mIGNoZWNrcG9pbnQuY3JlYXRlZEF0ID09PSAnc3RyaW5nJyAmJlxuICAgIChjaGVja3BvaW50Lmxhc3RVc2VkQXQgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgY2hlY2twb2ludC5sYXN0VXNlZEF0ID09PSAnc3RyaW5nJykgJiZcbiAgICAnc3RhdGUnIGluIGNoZWNrcG9pbnQ7XG59XG4iXX0=
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
@@ -39,6 +39,50 @@ export const getDistanceOverlay = (rectA, rectB) => {
39
39
  connectors.push({ x1: x, y1: edgeBY, x2: rightB, y2: edgeBY });
40
40
  }
41
41
  }
42
+ if (!separatedX && !separatedY) {
43
+ const nestedRects = getNestedRects(rectA, rectB);
44
+ if (nestedRects) {
45
+ const { inner, outer } = nestedRects;
46
+ const innerRight = inner.left + inner.width;
47
+ const innerBottom = inner.top + inner.height;
48
+ const outerRight = outer.left + outer.width;
49
+ 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);
52
+ 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
+ };
59
+ }
60
+ else if (horizontalBoundary === 'end') {
61
+ horizontal = {
62
+ x1: innerRight,
63
+ x2: outerRight,
64
+ y: inner.top + inner.height / 2,
65
+ value: outerRight - innerRight,
66
+ };
67
+ }
68
+ 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
+ };
75
+ }
76
+ else if (verticalBoundary === 'end') {
77
+ vertical = {
78
+ y1: innerBottom,
79
+ y2: outerBottom,
80
+ x: inner.left + inner.width / 2,
81
+ value: outerBottom - innerBottom,
82
+ };
83
+ }
84
+ }
85
+ }
42
86
  const viewport = getViewportSize();
43
87
  return {
44
88
  rectA,
@@ -56,4 +100,24 @@ export const getDistanceOverlay = (rectA, rectB) => {
56
100
  Math.abs(segment.y1 - segment.y2) > 0.5),
57
101
  };
58
102
  };
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaW5zcGVjdG9yLW5nL3NyYy9saWIvZGlzdGFuY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR3BELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsS0FBVyxFQUFFLEtBQVcsRUFBbUIsRUFBRTtJQUM5RSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDeEMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUN4QyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDekMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUM5QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRTlDLElBQUksVUFBVSxHQUFrQyxJQUFJLENBQUM7SUFDckQsSUFBSSxRQUFRLEdBQWdDLElBQUksQ0FBQztJQUNqRCxNQUFNLFVBQVUsR0FBa0MsRUFBRSxDQUFDO0lBRXJELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQ2hFLE1BQU0sVUFBVSxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDO0lBRWhFLElBQUksVUFBVSxFQUFFLENBQUM7UUFDZixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQztRQUNyQyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3JDLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUM3QyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDbkIsVUFBVSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFFckQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDN0MsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2xCLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDcEUsQ0FBQzthQUFNLElBQUksQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDO1lBQ3ZCLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNsRSxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksVUFBVSxFQUFFLENBQUM7UUFDZixNQUFNLE1BQU0sR0FBRyxPQUFPLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUNwQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3RDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUMxQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDbkIsUUFBUSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFFbkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDNUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25CLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDckUsQ0FBQzthQUFNLElBQUksQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDO1lBQ3RCLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNqRSxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLGVBQWUsRUFBRSxDQUFDO0lBRW5DLE9BQU87UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLFVBQVU7UUFDVixRQUFRO1FBQ1IsVUFBVSxFQUFFLFVBQVU7YUFDbkIsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2pCLEVBQUUsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUN4QyxFQUFFLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDekMsRUFBRSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3hDLEVBQUUsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQztTQUMxQyxDQUFDLENBQUM7YUFDRixNQUFNLENBQ0wsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRztZQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FDMUM7S0FDSixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2xhbXAsIGdldFZpZXdwb3J0U2l6ZSB9IGZyb20gJy4vZ2VvbWV0cnknO1xuaW1wb3J0IHsgRGlzdGFuY2VPdmVybGF5LCBSZWN0IH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBnZXREaXN0YW5jZU92ZXJsYXkgPSAocmVjdEE6IFJlY3QsIHJlY3RCOiBSZWN0KTogRGlzdGFuY2VPdmVybGF5ID0+IHtcbiAgY29uc3QgcmlnaHRBID0gcmVjdEEubGVmdCArIHJlY3RBLndpZHRoO1xuICBjb25zdCBib3R0b21BID0gcmVjdEEudG9wICsgcmVjdEEuaGVpZ2h0O1xuICBjb25zdCByaWdodEIgPSByZWN0Qi5sZWZ0ICsgcmVjdEIud2lkdGg7XG4gIGNvbnN0IGJvdHRvbUIgPSByZWN0Qi50b3AgKyByZWN0Qi5oZWlnaHQ7XG4gIGNvbnN0IGNlbnRlckFYID0gcmVjdEEubGVmdCArIHJlY3RBLndpZHRoIC8gMjtcbiAgY29uc3QgY2VudGVyQVkgPSByZWN0QS50b3AgKyByZWN0QS5oZWlnaHQgLyAyO1xuXG4gIGxldCBob3Jpem9udGFsOiBEaXN0YW5jZU92ZXJsYXlbJ2hvcml6b250YWwnXSA9IG51bGw7XG4gIGxldCB2ZXJ0aWNhbDogRGlzdGFuY2VPdmVybGF5Wyd2ZXJ0aWNhbCddID0gbnVsbDtcbiAgY29uc3QgY29ubmVjdG9yczogRGlzdGFuY2VPdmVybGF5Wydjb25uZWN0b3JzJ10gPSBbXTtcblxuICBjb25zdCBzZXBhcmF0ZWRYID0gcmlnaHRBIDw9IHJlY3RCLmxlZnQgfHwgcmlnaHRCIDw9IHJlY3RBLmxlZnQ7XG4gIGNvbnN0IHNlcGFyYXRlZFkgPSBib3R0b21BIDw9IHJlY3RCLnRvcCB8fCBib3R0b21CIDw9IHJlY3RBLnRvcDtcblxuICBpZiAoc2VwYXJhdGVkWCkge1xuICAgIGNvbnN0IGFJc0xlZnQgPSByaWdodEEgPD0gcmVjdEIubGVmdDtcbiAgICBjb25zdCB4MSA9IGFJc0xlZnQgPyByaWdodEEgOiByaWdodEI7XG4gICAgY29uc3QgeDIgPSBhSXNMZWZ0ID8gcmVjdEIubGVmdCA6IHJlY3RBLmxlZnQ7XG4gICAgY29uc3QgeSA9IGNlbnRlckFZO1xuICAgIGhvcml6b250YWwgPSB7IHgxLCB4MiwgeSwgdmFsdWU6IE1hdGguYWJzKHgyIC0geDEpIH07XG5cbiAgICBjb25zdCBlZGdlQlggPSBhSXNMZWZ0ID8gcmVjdEIubGVmdCA6IHJpZ2h0QjtcbiAgICBpZiAoeSA8IHJlY3RCLnRvcCkge1xuICAgICAgY29ubmVjdG9ycy5wdXNoKHsgeDE6IGVkZ2VCWCwgeTE6IHksIHgyOiBlZGdlQlgsIHkyOiByZWN0Qi50b3AgfSk7XG4gICAgfSBlbHNlIGlmICh5ID4gYm90dG9tQikge1xuICAgICAgY29ubmVjdG9ycy5wdXNoKHsgeDE6IGVkZ2VCWCwgeTE6IHksIHgyOiBlZGdlQlgsIHkyOiBib3R0b21CIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzZXBhcmF0ZWRZKSB7XG4gICAgY29uc3QgYUlzVG9wID0gYm90dG9tQSA8PSByZWN0Qi50b3A7XG4gICAgY29uc3QgeTEgPSBhSXNUb3AgPyBib3R0b21BIDogYm90dG9tQjtcbiAgICBjb25zdCB5MiA9IGFJc1RvcCA/IHJlY3RCLnRvcCA6IHJlY3RBLnRvcDtcbiAgICBjb25zdCB4ID0gY2VudGVyQVg7XG4gICAgdmVydGljYWwgPSB7IHkxLCB5MiwgeCwgdmFsdWU6IE1hdGguYWJzKHkyIC0geTEpIH07XG5cbiAgICBjb25zdCBlZGdlQlkgPSBhSXNUb3AgPyByZWN0Qi50b3AgOiBib3R0b21CO1xuICAgIGlmICh4IDwgcmVjdEIubGVmdCkge1xuICAgICAgY29ubmVjdG9ycy5wdXNoKHsgeDE6IHgsIHkxOiBlZGdlQlksIHgyOiByZWN0Qi5sZWZ0LCB5MjogZWRnZUJZIH0pO1xuICAgIH0gZWxzZSBpZiAoeCA+IHJpZ2h0Qikge1xuICAgICAgY29ubmVjdG9ycy5wdXNoKHsgeDE6IHgsIHkxOiBlZGdlQlksIHgyOiByaWdodEIsIHkyOiBlZGdlQlkgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgdmlld3BvcnQgPSBnZXRWaWV3cG9ydFNpemUoKTtcblxuICByZXR1cm4ge1xuICAgIHJlY3RBLFxuICAgIHJlY3RCLFxuICAgIGhvcml6b250YWwsXG4gICAgdmVydGljYWwsXG4gICAgY29ubmVjdG9yczogY29ubmVjdG9yc1xuICAgICAgLm1hcCgoc2VnbWVudCkgPT4gKHtcbiAgICAgICAgeDE6IGNsYW1wKHNlZ21lbnQueDEsIDAsIHZpZXdwb3J0LndpZHRoKSxcbiAgICAgICAgeTE6IGNsYW1wKHNlZ21lbnQueTEsIDAsIHZpZXdwb3J0LmhlaWdodCksXG4gICAgICAgIHgyOiBjbGFtcChzZWdtZW50LngyLCAwLCB2aWV3cG9ydC53aWR0aCksXG4gICAgICAgIHkyOiBjbGFtcChzZWdtZW50LnkyLCAwLCB2aWV3cG9ydC5oZWlnaHQpLFxuICAgICAgfSkpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoc2VnbWVudCkgPT5cbiAgICAgICAgICBNYXRoLmFicyhzZWdtZW50LngxIC0gc2VnbWVudC54MikgPiAwLjUgfHxcbiAgICAgICAgICBNYXRoLmFicyhzZWdtZW50LnkxIC0gc2VnbWVudC55MikgPiAwLjUsXG4gICAgICApLFxuICB9O1xufTtcbiJdfQ==
103
+ const getNestedRects = (rectA, rectB) => {
104
+ if (containsRect(rectA, rectB))
105
+ return { inner: rectB, outer: rectA };
106
+ if (containsRect(rectB, rectA))
107
+ return { inner: rectA, outer: rectB };
108
+ return null;
109
+ };
110
+ const containsRect = (outer, inner) => inner.left >= outer.left &&
111
+ inner.top >= outer.top &&
112
+ inner.left + inner.width <= outer.left + outer.width &&
113
+ inner.top + inner.height <= outer.top + outer.height;
114
+ const nearestPositiveBoundary = (startDistance, endDistance) => {
115
+ const startIsPositive = startDistance > 0.5;
116
+ const endIsPositive = endDistance > 0.5;
117
+ if (!startIsPositive)
118
+ return endIsPositive ? 'end' : null;
119
+ if (!endIsPositive)
120
+ return 'start';
121
+ return startDistance <= endDistance ? 'start' : 'end';
122
+ };
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaW5zcGVjdG9yLW5nL3NyYy9saWIvZGlzdGFuY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR3BELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsS0FBVyxFQUFFLEtBQVcsRUFBbUIsRUFBRTtJQUM5RSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDeEMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUN4QyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDekMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUM5QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRTlDLElBQUksVUFBVSxHQUFrQyxJQUFJLENBQUM7SUFDckQsSUFBSSxRQUFRLEdBQWdDLElBQUksQ0FBQztJQUNqRCxNQUFNLFVBQVUsR0FBa0MsRUFBRSxDQUFDO0lBRXJELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQ2hFLE1BQU0sVUFBVSxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFD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QUM7QUFFdkQsTUFBTSx1QkFBdUIsR0FBRyxDQUM5QixhQUFxQixFQUNyQixXQUFtQixFQUNLLEVBQUU7SUFDMUIsTUFBTSxlQUFlLEdBQUcsYUFBYSxHQUFHLEdBQUcsQ0FBQztJQUM1QyxNQUFNLGFBQWEsR0FBRyxXQUFXLEdBQUcsR0FBRyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxlQUFlO1FBQUUsT0FBTyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFELElBQUksQ0FBQyxhQUFhO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDbkMsT0FBTyxhQUFhLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN4RCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjbGFtcCwgZ2V0Vmlld3BvcnRTaXplIH0gZnJvbSAnLi9nZW9tZXRyeSc7XG5pbXBvcnQgeyBEaXN0YW5jZU92ZXJsYXksIFJlY3QgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGdldERpc3RhbmNlT3ZlcmxheSA9IChyZWN0QTogUmVjdCwgcmVjdEI6IFJlY3QpOiBEaXN0YW5jZU92ZXJsYXkgPT4ge1xuICBjb25zdCByaWdodEEgPSByZWN0QS5sZWZ0ICsgcmVjdEEud2lkdGg7XG4gIGNvbnN0IGJvdHRvbUEgPSByZWN0QS50b3AgKyByZWN0QS5oZWlnaHQ7XG4gIGNvbnN0IHJpZ2h0QiA9IHJlY3RCLmxlZnQgKyByZWN0Qi53aWR0aDtcbiAgY29uc3QgYm90dG9tQiA9IHJlY3RCLnRvcCArIHJlY3RCLmhlaWdodDtcbiAgY29uc3QgY2VudGVyQVggPSByZWN0QS5sZWZ0ICsgcmVjdEEud2lkdGggLyAyO1xuICBjb25zdCBjZW50ZXJBWSA9IHJlY3RBLnRvcCArIHJlY3RBLmhlaWdodCAvIDI7XG5cbiAgbGV0IGhvcml6b250YWw6IERpc3RhbmNlT3ZlcmxheVsnaG9yaXpvbnRhbCddID0gbnVsbDtcbiAgbGV0IHZlcnRpY2FsOiBEaXN0YW5jZU92ZXJsYXlbJ3ZlcnRpY2FsJ10gPSBudWxsO1xuICBjb25zdCBjb25uZWN0b3JzOiBEaXN0YW5jZU92ZXJsYXlbJ2Nvbm5lY3RvcnMnXSA9IFtdO1xuXG4gIGNvbnN0IHNlcGFyYXRlZFggPSByaWdodEEgPD0gcmVjdEIubGVmdCB8fCByaWdodEIgPD0gcmVjdEEubGVmdDtcbiAgY29uc3Qgc2VwYXJhdGVkWSA9IGJvdHRvbUEgPD0gcmVjdEIudG9wIHx8IGJvdHRvbUIgPD0gcmVjdEEudG9wO1xuXG4gIGlmIChzZXBhcmF0ZWRYKSB7XG4gICAgY29uc3QgYUlzTGVmdCA9IHJpZ2h0QSA8PSByZWN0Qi5sZWZ0O1xuICAgIGNvbnN0IHgxID0gYUlzTGVmdCA/IHJpZ2h0QSA6IHJpZ2h0QjtcbiAgICBjb25zdCB4MiA9IGFJc0xlZnQgPyByZWN0Qi5sZWZ0IDogcmVjdEEubGVmdDtcbiAgICBjb25zdCB5ID0gY2VudGVyQVk7XG4gICAgaG9yaXpvbnRhbCA9IHsgeDEsIHgyLCB5LCB2YWx1ZTogTWF0aC5hYnMoeDIgLSB4MSkgfTtcblxuICAgIGNvbnN0IGVkZ2VCWCA9IGFJc0xlZnQgPyByZWN0Qi5sZWZ0IDogcmlnaHRCO1xuICAgIGlmICh5IDwgcmVjdEIudG9wKSB7XG4gICAgICBjb25uZWN0b3JzLnB1c2goeyB4MTogZWRnZUJYLCB5MTogeSwgeDI6IGVkZ2VCWCwgeTI6IHJlY3RCLnRvcCB9KTtcbiAgICB9IGVsc2UgaWYgKHkgPiBib3R0b21CKSB7XG4gICAgICBjb25uZWN0b3JzLnB1c2goeyB4MTogZWRnZUJYLCB5MTogeSwgeDI6IGVkZ2VCWCwgeTI6IGJvdHRvbUIgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNlcGFyYXRlZFkpIHtcbiAgICBjb25zdCBhSXNUb3AgPSBib3R0b21BIDw9IHJlY3RCLnRvcDtcbiAgICBjb25zdCB5MSA9IGFJc1RvcCA/IGJvdHRvbUEgOiBib3R0b21CO1xuICAgIGNvbnN0IHkyID0gYUlzVG9wID8gcmVjdEIudG9wIDogcmVjdEEudG9wO1xuICAgIGNvbnN0IHggPSBjZW50ZXJBWDtcbiAgICB2ZXJ0aWNhbCA9IHsgeTEsIHkyLCB4LCB2YWx1ZTogTWF0aC5hYnMoeTIgLSB5MSkgfTtcblxuICAgIGNvbnN0IGVkZ2VCWSA9IGFJc1RvcCA/IHJlY3RCLnRvcCA6IGJvdHRvbUI7XG4gICAgaWYgKHggPCByZWN0Qi5sZWZ0KSB7XG4gICAgICBjb25uZWN0b3JzLnB1c2goeyB4MTogeCwgeTE6IGVkZ2VCWSwgeDI6IHJlY3RCLmxlZnQsIHkyOiBlZGdlQlkgfSk7XG4gICAgfSBlbHNlIGlmICh4ID4gcmlnaHRCKSB7XG4gICAgICBjb25uZWN0b3JzLnB1c2goeyB4MTogeCwgeTE6IGVkZ2VCWSwgeDI6IHJpZ2h0QiwgeTI6IGVkZ2VCWSB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXNlcGFyYXRlZFggJiYgIXNlcGFyYXRlZFkpIHtcbiAgICBjb25zdCBuZXN0ZWRSZWN0cyA9IGdldE5lc3RlZFJlY3RzKHJlY3RBLCByZWN0Qik7XG4gICAgaWYgKG5lc3RlZFJlY3RzKSB7XG4gICAgICBjb25zdCB7IGlubmVyLCBvdXRlciB9ID0gbmVzdGVkUmVjdHM7XG4gICAgICBjb25zdCBpbm5lclJpZ2h0ID0gaW5uZXIubGVmdCArIGlubmVyLndpZHRoO1xuICAgICAgY29uc3QgaW5uZXJCb3R0b20gPSBpbm5lci50b3AgKyBpbm5lci5oZWlnaHQ7XG4gICAgICBjb25zdCBvdXRlclJpZ2h0ID0gb3V0ZXIubGVmdCArIG91dGVyLndpZHRoO1xuICAgICAgY29uc3Qgb3V0ZXJCb3R0b20gPSBvdXRlci50b3AgKyBvdXRlci5oZWlnaHQ7XG4gICAgICBjb25zdCBob3Jpem9udGFsQm91bmRhcnkgPSBuZWFyZXN0UG9zaXRpdmVCb3VuZGFyeShcbiAgICAgICAgaW5uZXIubGVmdCAtIG91dGVyLmxlZnQsXG4gICAgICAgIG91dGVyUmlnaHQgLSBpbm5lclJpZ2h0LFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHZlcnRpY2FsQm91bmRhcnkgPSBuZWFyZXN0UG9zaXRpdmVCb3VuZGFyeShcbiAgICAgICAgaW5uZXIudG9wIC0gb3V0ZXIudG9wLFxuICAgICAgICBvdXRlckJvdHRvbSAtIGlubmVyQm90dG9tLFxuICAgICAgKTtcblxuICAgICAgaWYgKGhvcml6b250YWxCb3VuZGFyeSA9PT0gJ3N0YXJ0Jykge1xuICAgICAgICBob3Jpem9udGFsID0ge1xuICAgICAgICAgIHgxOiBvdXRlci5sZWZ0LFxuICAgICAgICAgIHgyOiBpbm5lci5sZWZ0LFxuICAgICAgICAgIHk6IGlubmVyLnRvcCArIGlubmVyLmhlaWdodCAvIDIsXG4gICAgICAgICAgdmFsdWU6IGlubmVyLmxlZnQgLSBvdXRlci5sZWZ0LFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChob3Jpem9udGFsQm91bmRhcnkgPT09ICdlbmQnKSB7XG4gICAgICAgIGhvcml6b250YWwgPSB7XG4gICAgICAgICAgeDE6IGlubmVyUmlnaHQsXG4gICAgICAgICAgeDI6IG91dGVyUmlnaHQsXG4gICAgICAgICAgeTogaW5uZXIudG9wICsgaW5uZXIuaGVpZ2h0IC8gMixcbiAgICAgICAgICB2YWx1ZTogb3V0ZXJSaWdodCAtIGlubmVyUmlnaHQsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICh2ZXJ0aWNhbEJvdW5kYXJ5ID09PSAnc3RhcnQnKSB7XG4gICAgICAgIHZlcnRpY2FsID0ge1xuICAgICAgICAgIHkxOiBvdXRlci50b3AsXG4gICAgICAgICAgeTI6IGlubmVyLnRvcCxcbiAgICAgICAgICB4OiBpbm5lci5sZWZ0ICsgaW5uZXIud2lkdGggLyAyLFxuICAgICAgICAgIHZhbHVlOiBpbm5lci50b3AgLSBvdXRlci50b3AsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHZlcnRpY2FsQm91bmRhcnkgPT09ICdlbmQnKSB7XG4gICAgICAgIHZlcnRpY2FsID0ge1xuICAgICAgICAgIHkxOiBpbm5lckJvdHRvbSxcbiAgICAgICAgICB5Mjogb3V0ZXJCb3R0b20sXG4gICAgICAgICAgeDogaW5uZXIubGVmdCArIGlubmVyLndpZHRoIC8gMixcbiAgICAgICAgICB2YWx1ZTogb3V0ZXJCb3R0b20gLSBpbm5lckJvdHRvbSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB2aWV3cG9ydCA9IGdldFZpZXdwb3J0U2l6ZSgpO1xuXG4gIHJldHVybiB7XG4gICAgcmVjdEEsXG4gICAgcmVjdEIsXG4gICAgaG9yaXpvbnRhbCxcbiAgICB2ZXJ0aWNhbCxcbiAgICBjb25uZWN0b3JzOiBjb25uZWN0b3JzXG4gICAgICAubWFwKChzZWdtZW50KSA9PiAoe1xuICAgICAgICB4MTogY2xhbXAoc2VnbWVudC54MSwgMCwgdmlld3BvcnQud2lkdGgpLFxuICAgICAgICB5MTogY2xhbXAoc2VnbWVudC55MSwgMCwgdmlld3BvcnQuaGVpZ2h0KSxcbiAgICAgICAgeDI6IGNsYW1wKHNlZ21lbnQueDIsIDAsIHZpZXdwb3J0LndpZHRoKSxcbiAgICAgICAgeTI6IGNsYW1wKHNlZ21lbnQueTIsIDAsIHZpZXdwb3J0LmhlaWdodCksXG4gICAgICB9KSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChzZWdtZW50KSA9PlxuICAgICAgICAgIE1hdGguYWJzKHNlZ21lbnQueDEgLSBzZWdtZW50LngyKSA+IDAuNSB8fFxuICAgICAgICAgIE1hdGguYWJzKHNlZ21lbnQueTEgLSBzZWdtZW50LnkyKSA+IDAuNSxcbiAgICAgICksXG4gIH07XG59O1xuXG5jb25zdCBnZXROZXN0ZWRSZWN0cyA9IChcbiAgcmVjdEE6IFJlY3QsXG4gIHJlY3RCOiBSZWN0LFxuKTogeyBpbm5lcjogUmVjdDsgb3V0ZXI6IFJlY3QgfSB8IG51bGwgPT4ge1xuICBpZiAoY29udGFpbnNSZWN0KHJlY3RBLCByZWN0QikpIHJldHVybiB7IGlubmVyOiByZWN0Qiwgb3V0ZXI6IHJlY3RBIH07XG4gIGlmIChjb250YWluc1JlY3QocmVjdEIsIHJlY3RBKSkgcmV0dXJuIHsgaW5uZXI6IHJlY3RBLCBvdXRlcjogcmVjdEIgfTtcbiAgcmV0dXJuIG51bGw7XG59O1xuXG5jb25zdCBjb250YWluc1JlY3QgPSAob3V0ZXI6IFJlY3QsIGlubmVyOiBSZWN0KTogYm9vbGVhbiA9PlxuICBpbm5lci5sZWZ0ID49IG91dGVyLmxlZnQgJiZcbiAgaW5uZXIudG9wID49IG91dGVyLnRvcCAmJlxuICBpbm5lci5sZWZ0ICsgaW5uZXIud2lkdGggPD0gb3V0ZXIubGVmdCArIG91dGVyLndpZHRoICYmXG4gIGlubmVyLnRvcCArIGlubmVyLmhlaWdodCA8PSBvdXRlci50b3AgKyBvdXRlci5oZWlnaHQ7XG5cbmNvbnN0IG5lYXJlc3RQb3NpdGl2ZUJvdW5kYXJ5ID0gKFxuICBzdGFydERpc3RhbmNlOiBudW1iZXIsXG4gIGVuZERpc3RhbmNlOiBudW1iZXIsXG4pOiAnc3RhcnQnIHwgJ2VuZCcgfCBudWxsID0+IHtcbiAgY29uc3Qgc3RhcnRJc1Bvc2l0aXZlID0gc3RhcnREaXN0YW5jZSA+IDAuNTtcbiAgY29uc3QgZW5kSXNQb3NpdGl2ZSA9IGVuZERpc3RhbmNlID4gMC41O1xuICBpZiAoIXN0YXJ0SXNQb3NpdGl2ZSkgcmV0dXJuIGVuZElzUG9zaXRpdmUgPyAnZW5kJyA6IG51bGw7XG4gIGlmICghZW5kSXNQb3NpdGl2ZSkgcmV0dXJuICdzdGFydCc7XG4gIHJldHVybiBzdGFydERpc3RhbmNlIDw9IGVuZERpc3RhbmNlID8gJ3N0YXJ0JyA6ICdlbmQnO1xufTtcbiJdfQ==