@ogidor/dashboard 1.0.5 → 1.0.6

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
@@ -14,7 +14,7 @@ Drop it into any project, feed it your own card content, and get a fully functio
14
14
  - **Structural Sync** — adding, removing, or editing a widget in any window immediately appears in all other open windows
15
15
  - **Persistent Layout** — layout is saved to `localStorage` and restored on reload
16
16
  - **Content-Agnostic Cards** — you own the card body; render any Angular component, chart, or HTML inside
17
- - **Themeable** — override colors and fonts via a theme input or CSS custom properties
17
+ - **Fully Themeable** — customise every colour (backgrounds, tabs, cards, buttons, handles, placeholders) and font via a `DashboardTheme` input or CSS custom properties
18
18
 
19
19
  ---
20
20
 
@@ -188,34 +188,105 @@ All fields are optional. Any omitted field falls back to its default.
188
188
 
189
189
  ```typescript
190
190
  export interface DashboardTheme {
191
- backgroundColor?: string; // wrapper background default: #000000
192
- panelColor?: string; // main panel background default: #1c1c1e
193
- widgetCardColor?: string; // card background default: #2c2c2e
194
- foreColor?: string; // text / labels default: #8e8e93
195
- accentColor?: string; // buttons, active states default: #0a84ff
196
- dangerColor?: string; // remove / close actions default: #ff453a
197
- fontFamily?: string; // applied globally default: system-ui stack
191
+ // ── Layout ──
192
+ backgroundColor?: string; // wrapper background default: #000000
193
+ panelColor?: string; // main panel background default: #1c1c1e
194
+ widgetCardColor?: string; // card background (global) default: #2c2c2e
195
+ foreColor?: string; // text / labels default: #8e8e93
196
+ accentColor?: string; // buttons, active states default: #0a84ff
197
+ dangerColor?: string; // remove / close actions default: #ff453a
198
+ fontFamily?: string; // applied globally default: system-ui stack
199
+
200
+ // ── Header / Tabs ──
201
+ tabsContainerColor?: string; // tabs pill background default: rgba(44,44,46,0.6)
202
+ tabActiveColor?: string; // active tab background default: #3a3a3c
203
+ tabActiveTextColor?: string; // active tab text default: #ffffff
204
+ tabHoverTextColor?: string; // hovered tab text default: #e5e5ea
205
+ addWidgetButtonTextColor?: string; // "Add Widget" button text default: #ffffff
206
+
207
+ // ── Pop-out window ──
208
+ popoutTitleColor?: string; // pop-out window title text default: #ffffff
209
+
210
+ // ── Widget card ──
211
+ widgetTitleColor?: string; // card title text default: #ffffff
212
+ dragHandleColor?: string; // drag-handle dot icon default: rgba(255,255,255,0.2)
213
+ widgetBorderColor?: string; // card border default: rgba(255,255,255,0.07)
214
+ widgetButtonBgColor?: string; // edit/remove button background default: rgba(255,255,255,0.07)
215
+ widgetButtonColor?: string; // edit/remove button icon default: rgba(255,255,255,0.5)
216
+
217
+ // ── Grid ──
218
+ placeholderColor?: string; // drag/resize ghost overlay default: #0a84ff (accentColor)
219
+ resizeHandleColor?: string; // resize handle icon default: rgba(255,255,255,0.25)
198
220
  }
199
221
  ```
200
222
 
223
+ > **Tip:** you can also override individual widget card colors without touching the theme — set `cardColor` on any `Widget` object and it takes priority over `widgetCardColor`.
224
+
201
225
  ---
202
226
 
203
227
  ## CSS Custom Properties
204
228
 
205
- You can also theme the dashboard entirely via CSS in your global stylesheet:
229
+ You can theme the dashboard entirely via CSS in your global stylesheet instead of (or alongside) the `theme` input. Every `DashboardTheme` property maps 1-to-1 to a CSS custom property:
206
230
 
207
231
  ```css
208
232
  app-dashboard {
209
- --dash-bg: #0d0d0d;
210
- --dash-panel-bg: #161616;
211
- --dash-card-bg: #1f1f1f;
212
- --dash-fore-color: #a0a0a0;
213
- --dash-accent-color: #6c63ff;
214
- --dash-danger-color: #e84545;
215
- --dash-font-family: 'Inter', sans-serif;
233
+ /* Layout */
234
+ --dash-bg: #0d0d0d;
235
+ --dash-panel-bg: #161616;
236
+ --dash-card-bg: #1f1f1f;
237
+ --dash-fore-color: #a0a0a0;
238
+ --dash-accent-color: #6c63ff;
239
+ --dash-danger-color: #e84545;
240
+ --dash-font-family: 'Inter', sans-serif;
241
+
242
+ /* Header / Tabs */
243
+ --dash-tabs-container-color: rgba(30,30,32,0.7);
244
+ --dash-tab-active-color: #2a2a2e;
245
+ --dash-tab-active-text: #ffffff;
246
+ --dash-tab-hover-text: #d0d0d5;
247
+ --dash-add-widget-text: #ffffff;
248
+
249
+ /* Pop-out window */
250
+ --dash-popout-title-color: #ffffff;
251
+
252
+ /* Widget card */
253
+ --dash-widget-title-color: #ffffff;
254
+ --dash-drag-handle-color: rgba(255,255,255,0.2);
255
+ --dash-widget-border-color: rgba(255,255,255,0.07);
256
+ --dash-widget-btn-bg: rgba(255,255,255,0.07);
257
+ --dash-widget-btn-color: rgba(255,255,255,0.5);
258
+
259
+ /* Grid */
260
+ --dash-placeholder-color: #6c63ff;
261
+ --dash-resize-handle-color: rgba(255,255,255,0.25);
216
262
  }
217
263
  ```
218
264
 
265
+ ### CSS variable reference
266
+
267
+ | CSS Variable | `DashboardTheme` property | Default |
268
+ |---|---|---|
269
+ | `--dash-bg` | `backgroundColor` | `#000000` |
270
+ | `--dash-panel-bg` | `panelColor` | `#1c1c1e` |
271
+ | `--dash-card-bg` | `widgetCardColor` | `#2c2c2e` |
272
+ | `--dash-fore-color` | `foreColor` | `#8e8e93` |
273
+ | `--dash-accent-color` | `accentColor` | `#0a84ff` |
274
+ | `--dash-danger-color` | `dangerColor` | `#ff453a` |
275
+ | `--dash-font-family` | `fontFamily` | system-ui stack |
276
+ | `--dash-tabs-container-color` | `tabsContainerColor` | `rgba(44,44,46,0.6)` |
277
+ | `--dash-tab-active-color` | `tabActiveColor` | `#3a3a3c` |
278
+ | `--dash-tab-active-text` | `tabActiveTextColor` | `#ffffff` |
279
+ | `--dash-tab-hover-text` | `tabHoverTextColor` | `#e5e5ea` |
280
+ | `--dash-add-widget-text` | `addWidgetButtonTextColor` | `#ffffff` |
281
+ | `--dash-popout-title-color` | `popoutTitleColor` | `#ffffff` |
282
+ | `--dash-widget-title-color` | `widgetTitleColor` | `#ffffff` |
283
+ | `--dash-drag-handle-color` | `dragHandleColor` | `rgba(255,255,255,0.2)` |
284
+ | `--dash-widget-border-color` | `widgetBorderColor` | `rgba(255,255,255,0.07)` |
285
+ | `--dash-widget-btn-bg` | `widgetButtonBgColor` | `rgba(255,255,255,0.07)` |
286
+ | `--dash-widget-btn-color` | `widgetButtonColor` | `rgba(255,255,255,0.5)` |
287
+ | `--dash-placeholder-color` | `placeholderColor` | `#0a84ff` |
288
+ | `--dash-resize-handle-color` | `resizeHandleColor` | `rgba(255,255,255,0.25)` |
289
+
219
290
  ---
220
291
 
221
292
  ## Pop-out Windows
@@ -310,7 +381,13 @@ this.dash.stateService.loadLayout(JSON.parse(json));
310
381
  `,
311
382
  })
312
383
  export class AppComponent {
313
- theme: DashboardTheme = { accentColor: '#6c63ff' };
384
+ theme: DashboardTheme = {
385
+ accentColor: '#6c63ff',
386
+ placeholderColor: '#6c63ff',
387
+ tabActiveColor: '#2a2a38',
388
+ tabActiveTextColor: '#ffffff',
389
+ widgetTitleColor: '#f0f0f0',
390
+ };
314
391
  addOpen = false;
315
392
  editTarget: Widget | null = null;
316
393
 
package/app/models.d.ts CHANGED
@@ -50,4 +50,30 @@ export interface DashboardTheme {
50
50
  dangerColor?: string;
51
51
  /** Font family applied to the whole dashboard. Default: system-ui stack */
52
52
  fontFamily?: string;
53
+ /** Background of the tabs pill container. Default: `rgba(44,44,46,0.6)` */
54
+ tabsContainerColor?: string;
55
+ /** Background of the active/selected tab. Default: `#3a3a3c` */
56
+ tabActiveColor?: string;
57
+ /** Text color of the active tab. Default: `#ffffff` */
58
+ tabActiveTextColor?: string;
59
+ /** Text color of hovered (inactive) tabs. Default: `#e5e5ea` */
60
+ tabHoverTextColor?: string;
61
+ /** Text color of the "Add Widget" button. Default: `#ffffff` */
62
+ addWidgetButtonTextColor?: string;
63
+ /** Text color of the pop-out page title. Default: `#ffffff` */
64
+ popoutTitleColor?: string;
65
+ /** Text color of the widget card title. Default: `#ffffff` */
66
+ widgetTitleColor?: string;
67
+ /** Color of the drag-handle dots on a widget card. Default: `rgba(255,255,255,0.2)` */
68
+ dragHandleColor?: string;
69
+ /** Border color of widget cards. Default: `rgba(255,255,255,0.07)` */
70
+ widgetBorderColor?: string;
71
+ /** Background of the icon buttons (edit/remove) on widget hover. Default: `rgba(255,255,255,0.07)` */
72
+ widgetButtonBgColor?: string;
73
+ /** Default text color of icon buttons. Default: `rgba(255,255,255,0.5)` */
74
+ widgetButtonColor?: string;
75
+ /** Color of the drag/resize placeholder overlay. Default: same as accentColor */
76
+ placeholderColor?: string;
77
+ /** Color of the resize handle icon. Default: `rgba(255,255,255,0.25)` */
78
+ resizeHandleColor?: string;
53
79
  }
@@ -433,7 +433,7 @@ CustomGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", ve
433
433
  </div>
434
434
  </div>
435
435
  </div>
436
- `, isInline: true, styles: [":host{display:block;width:100%;height:100%}.grid-container{position:relative;width:100%;min-height:100%;transition:height .25s ease}.grid-placeholder{position:absolute;background:var(--dash-accent-color, #0a84ff);opacity:.12;border-radius:24px;border:2px dashed var(--dash-accent-color, #0a84ff);transition:left .15s ease,top .15s ease,width .15s ease,height .15s ease;pointer-events:none;z-index:0}.grid-item{position:absolute;display:flex;flex-direction:column;transition:left .25s ease,top .25s ease,width .25s ease,height .25s ease;border-radius:24px;overflow:hidden}.grid-item.is-dragging,.grid-item.is-resizing{transition:none!important;opacity:.88;overflow:visible;filter:drop-shadow(0 20px 40px rgba(0,0,0,.45))}.resize-handle{position:absolute;right:4px;bottom:4px;width:22px;height:22px;cursor:nwse-resize;display:flex;align-items:center;justify-content:center;color:#ffffff40;border-radius:6px;transition:color .2s,background .2s;z-index:20}.resize-handle:hover{color:var(--dash-accent-color, #0a84ff);background:rgba(255,255,255,.06)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
436
+ `, isInline: true, styles: [":host{display:block;width:100%;height:100%}.grid-container{position:relative;width:100%;min-height:100%;transition:height .25s ease}.grid-placeholder{position:absolute;background:var(--dash-placeholder-color, var(--dash-accent-color, #0a84ff));opacity:.12;border-radius:24px;border:2px dashed var(--dash-placeholder-color, var(--dash-accent-color, #0a84ff));transition:left .15s ease,top .15s ease,width .15s ease,height .15s ease;pointer-events:none;z-index:0}.grid-item{position:absolute;display:flex;flex-direction:column;transition:left .25s ease,top .25s ease,width .25s ease,height .25s ease;border-radius:24px;overflow:hidden}.grid-item.is-dragging,.grid-item.is-resizing{transition:none!important;opacity:.88;overflow:visible;filter:drop-shadow(0 20px 40px rgba(0,0,0,.45))}.resize-handle{position:absolute;right:4px;bottom:4px;width:22px;height:22px;cursor:nwse-resize;display:flex;align-items:center;justify-content:center;color:var(--dash-resize-handle-color, rgba(255,255,255,.25));border-radius:6px;transition:color .2s,background .2s;z-index:20}.resize-handle:hover{color:var(--dash-accent-color, #0a84ff);background:rgba(255,255,255,.06)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
437
437
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CustomGridComponent, decorators: [{
438
438
  type: Component,
439
439
  args: [{ selector: 'app-grid', template: `
@@ -482,7 +482,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
482
482
  </div>
483
483
  </div>
484
484
  </div>
485
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%}.grid-container{position:relative;width:100%;min-height:100%;transition:height .25s ease}.grid-placeholder{position:absolute;background:var(--dash-accent-color, #0a84ff);opacity:.12;border-radius:24px;border:2px dashed var(--dash-accent-color, #0a84ff);transition:left .15s ease,top .15s ease,width .15s ease,height .15s ease;pointer-events:none;z-index:0}.grid-item{position:absolute;display:flex;flex-direction:column;transition:left .25s ease,top .25s ease,width .25s ease,height .25s ease;border-radius:24px;overflow:hidden}.grid-item.is-dragging,.grid-item.is-resizing{transition:none!important;opacity:.88;overflow:visible;filter:drop-shadow(0 20px 40px rgba(0,0,0,.45))}.resize-handle{position:absolute;right:4px;bottom:4px;width:22px;height:22px;cursor:nwse-resize;display:flex;align-items:center;justify-content:center;color:#ffffff40;border-radius:6px;transition:color .2s,background .2s;z-index:20}.resize-handle:hover{color:var(--dash-accent-color, #0a84ff);background:rgba(255,255,255,.06)}\n"] }]
485
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%}.grid-container{position:relative;width:100%;min-height:100%;transition:height .25s ease}.grid-placeholder{position:absolute;background:var(--dash-placeholder-color, var(--dash-accent-color, #0a84ff));opacity:.12;border-radius:24px;border:2px dashed var(--dash-placeholder-color, var(--dash-accent-color, #0a84ff));transition:left .15s ease,top .15s ease,width .15s ease,height .15s ease;pointer-events:none;z-index:0}.grid-item{position:absolute;display:flex;flex-direction:column;transition:left .25s ease,top .25s ease,width .25s ease,height .25s ease;border-radius:24px;overflow:hidden}.grid-item.is-dragging,.grid-item.is-resizing{transition:none!important;opacity:.88;overflow:visible;filter:drop-shadow(0 20px 40px rgba(0,0,0,.45))}.resize-handle{position:absolute;right:4px;bottom:4px;width:22px;height:22px;cursor:nwse-resize;display:flex;align-items:center;justify-content:center;color:var(--dash-resize-handle-color, rgba(255,255,255,.25));border-radius:6px;transition:color .2s,background .2s;z-index:20}.resize-handle:hover{color:var(--dash-accent-color, #0a84ff);background:rgba(255,255,255,.06)}\n"] }]
486
486
  }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { widgets: [{
487
487
  type: Input
488
488
  }], columns: [{
@@ -506,4 +506,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
506
506
  type: ContentChild,
507
507
  args: [GridCellDirective, { read: TemplateRef }]
508
508
  }] } });
509
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcC9jdXN0b20tZ3JpZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFDdEMsU0FBUyxFQUNULFlBQVksRUFBRSxXQUFXLEVBQ3pCLFNBQVMsRUFBRSx1QkFBdUIsRUFDbkMsTUFBTSxlQUFlLENBQUM7OztBQUd2Qjs7Ozs7Ozs7R0FRRztBQUVILE1BQU0sT0FBTyxpQkFBaUI7SUFDNUIsWUFBbUIsV0FBNEM7UUFBNUMsZ0JBQVcsR0FBWCxXQUFXLENBQWlDO0lBQUcsQ0FBQzs7K0dBRHhELGlCQUFpQjttR0FBakIsaUJBQWlCOzRGQUFqQixpQkFBaUI7a0JBRDdCLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFOztBQW1CckMsTUFBTSxVQUFVO0lBRWQ7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQVcsRUFBRSxDQUFXO1FBQ3RDLE9BQU8sQ0FBQyxDQUNOLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbkIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNwQixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQW1CLEVBQUUsSUFBYztRQUN6RCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUs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OztHQThDVCxtQkE0RGdCLHVCQUF1QixDQUFDLE1BQU07NkhBR3RDLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFFdUMsYUFBYTtzQkFBMUQsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdZLFlBQVk7c0JBQW5FLFlBQVk7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsXG4gIFZpZXdDaGlsZCwgT25EZXN0cm95LCBPbkluaXQsIE5nWm9uZSwgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbnRlbnRDaGlsZCwgVGVtcGxhdGVSZWYsXG4gIERpcmVjdGl2ZSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdpZGdldCB9IGZyb20gJy4vbW9kZWxzJztcblxuLyoqXG4gKiBEaXJlY3RpdmUgYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgdGhhdCBzaG91bGQgYmUgc3RhbXBlZCBpbnNpZGUgZWFjaCBncmlkIGNlbGwuXG4gKiBVc2FnZTpcbiAqICAgPGFwcC1ncmlkIFt3aWRnZXRzXT1cIi4uLlwiPlxuICogICAgIDxuZy10ZW1wbGF0ZSBncmlkQ2VsbCBsZXQtd2lkZ2V0PVwid2lkZ2V0XCI+XG4gKiAgICAgICA8YXBwLXdpZGdldC1yZW5kZXJlciBbd2lkZ2V0XT1cIndpZGdldFwiIC4uLj48L2FwcC13aWRnZXQtcmVuZGVyZXI+XG4gKiAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgPC9hcHAtZ3JpZD5cbiAqL1xuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2dyaWRDZWxsXScgfSlcbmV4cG9ydCBjbGFzcyBHcmlkQ2VsbERpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8eyB3aWRnZXQ6IFdpZGdldCB9Pikge31cbn1cblxuLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gICBHUklEIEVOR0lORSDigJQgcHVyZSBkYXRhLCB6ZXJvIERPTVxuICAgSGFuZGxlcyBjb2xsaXNpb24gZGV0ZWN0aW9uLCByZXNvbHV0aW9uLCBhbmQgY29tcGFjdGlvbi5cbiAgIEluc3BpcmVkIGJ5IHJlYWN0LWdyaWQtbGF5b3V0IC8gZ3JpZHN0ZXIgYWxnb3JpdGhtcy5cbiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqL1xuXG5pbnRlcmZhY2UgR3JpZFJlY3Qge1xuICBpZDogc3RyaW5nO1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgY29sczogbnVtYmVyO1xuICByb3dzOiBudW1iZXI7XG59XG5cbmNsYXNzIEdyaWRFbmdpbmUge1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0d28gcmVjdHMgb3ZlcmxhcC5cbiAgICovXG4gIHN0YXRpYyBjb2xsaWRlcyhhOiBHcmlkUmVjdCwgYjogR3JpZFJlY3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIShcbiAgICAgIGEueCArIGEuY29scyA8PSBiLnggfHxcbiAgICAgIGIueCArIGIuY29scyA8PSBhLnggfHxcbiAgICAgIGEueSArIGEucm93cyA8PSBiLnkgfHxcbiAgICAgIGIueSArIGIucm93cyA8PSBhLnlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBBTEwgd2lkZ2V0cyB0aGF0IGNvbGxpZGUgd2l0aCBgcmVjdGAuXG4gICAqL1xuICBzdGF0aWMgZ2V0QWxsQ29sbGlzaW9ucyh3aWRnZXRzOiBHcmlkUmVjdFtdLCByZWN0OiBHcmlkUmVjdCk6IEdyaWRSZWN0W10ge1xuICAgIHJldHVybiB3aWRnZXRzLmZpbHRlcih3ID0+IHcuaWQgIT09IHJlY3QuaWQgJiYgR3JpZEVuZ2luZS5jb2xsaWRlcyh3LCByZWN0KSk7XG4gIH1cblxuICAvKipcbiAgICogU29ydCB3aWRnZXRzIHRvcC10by1ib3R0b20sIGxlZnQtdG8tcmlnaHQuXG4gICAqL1xuICBzdGF0aWMgc29ydEJ5UG9zaXRpb24od2lkZ2V0czogR3JpZFJlY3RbXSk6IEdyaWRSZWN0W10ge1xuICAgIHJldHVybiBbLi4ud2lkZ2V0c10uc29ydCgoYSwgYikgPT4gYS55IC0gYi55IHx8IGEueCAtIGIueCk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBhIHdpZGdldCB0byAoeCwgeSkgYW5kIHB1c2ggYW55IGNvbGxpZGluZyB3aWRnZXRzIGRvd253YXJkLlxuICAgKiBSZXR1cm5zIHRoZSBmdWxsIGxpc3Qgd2l0aCByZXNvbHZlZCBwb3NpdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgbW92ZVdpZGdldChcbiAgICBhbGxXaWRnZXRzOiBHcmlkUmVjdFtdLFxuICAgIHdpZGdldDogR3JpZFJlY3QsXG4gICAgbmV3WDogbnVtYmVyLFxuICAgIG5ld1k6IG51bWJlcixcbiAgICBjb2x1bW5zOiBudW1iZXJcbiAgKTogR3JpZFJlY3RbXSB7XG4gICAgY29uc3Qgd2lkZ2V0cyA9IGFsbFdpZGdldHMubWFwKHcgPT4gKHsgLi4udyB9KSk7XG4gICAgY29uc3QgbW92aW5nID0gd2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gd2lkZ2V0LmlkKTtcbiAgICBpZiAoIW1vdmluZykgcmV0dXJuIHdpZGdldHM7XG5cbiAgICBtb3ZpbmcueCA9IE1hdGgubWF4KDAsIE1hdGgubWluKG5ld1gsIGNvbHVtbnMgLSBtb3ZpbmcuY29scykpO1xuICAgIG1vdmluZy55ID0gTWF0aC5tYXgoMCwgbmV3WSk7XG5cbiAgICBjb25zdCBzb3J0ZWQgPSBHcmlkRW5naW5lLnNvcnRCeVBvc2l0aW9uKHdpZGdldHMpO1xuICAgIEdyaWRFbmdpbmUucmVzb2x2ZUNvbGxpc2lvbnMoc29ydGVkLCBtb3ZpbmcpO1xuICAgIHJldHVybiBHcmlkRW5naW5lLmNvbXBhY3Qoc29ydGVkLCBjb2x1bW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNpemUgYSB3aWRnZXQgYW5kIHB1c2ggY29sbGlkaW5nIHdpZGdldHMgZG93bi5cbiAgICovXG4gIHN0YXRpYyByZXNpemVXaWRnZXQoXG4gICAgYWxsV2lkZ2V0czogR3JpZFJlY3RbXSxcbiAgICB3aWRnZXQ6IEdyaWRSZWN0LFxuICAgIG5ld0NvbHM6IG51bWJlcixcbiAgICBuZXdSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uczogbnVtYmVyXG4gICk6IEdyaWRSZWN0W10ge1xuICAgIGNvbnN0IHdpZGdldHMgPSBhbGxXaWRnZXRzLm1hcCh3ID0+ICh7IC4uLncgfSkpO1xuICAgIGNvbnN0IHJlc2l6aW5nID0gd2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gd2lkZ2V0LmlkKTtcbiAgICBpZiAoIXJlc2l6aW5nKSByZXR1cm4gd2lkZ2V0cztcblxuICAgIHJlc2l6aW5nLmNvbHMgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihuZXdDb2xzLCBjb2x1bW5zIC0gcmVzaXppbmcueCkpO1xuICAgIHJlc2l6aW5nLnJvd3MgPSBNYXRoLm1heCgxLCBuZXdSb3dzKTtcblxuICAgIGNvbnN0IHNvcnRlZCA9IEdyaWRFbmdpbmUuc29ydEJ5UG9zaXRpb24od2lkZ2V0cyk7XG4gICAgR3JpZEVuZ2luZS5yZXNvbHZlQ29sbGlzaW9ucyhzb3J0ZWQsIHJlc2l6aW5nKTtcbiAgICByZXR1cm4gR3JpZEVuZ2luZS5jb21wYWN0KHNvcnRlZCwgY29sdW1ucyk7XG4gIH1cblxuICAvKipcbiAgICogUHVzaCBhbGwgd2lkZ2V0cyB0aGF0IGNvbGxpZGUgd2l0aCBgbW92ZWRXaWRnZXRgIGRvd253YXJkLCByZWN1cnNpdmVseS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlc29sdmVDb2xsaXNpb25zKHdpZGdldHM6IEdyaWRSZWN0W10sIG1vdmVkV2lkZ2V0OiBHcmlkUmVjdCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbGxpc2lvbnMgPSBHcmlkRW5naW5lLmdldEFsbENvbGxpc2lvbnMod2lkZ2V0cywgbW92ZWRXaWRnZXQpO1xuICAgIGZvciAoY29uc3QgY29sbGlkZXIgb2YgY29sbGlzaW9ucykge1xuICAgICAgY29sbGlkZXIueSA9IG1vdmVkV2lkZ2V0LnkgKyBtb3ZlZFdpZGdldC5yb3dzO1xuICAgICAgR3JpZEVuZ2luZS5yZXNvbHZlQ29sbGlzaW9ucyh3aWRnZXRzLCBjb2xsaWRlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhY3QgdGhlIGdyaWQ6IG1vdmUgZXZlcnkgd2lkZ2V0IGFzIGZhciB1cCBhcyBwb3NzaWJsZSB3aXRob3V0IG92ZXJsYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGNvbXBhY3Qod2lkZ2V0czogR3JpZFJlY3RbXSwgX2NvbHVtbnM6IG51bWJlcik6IEdyaWRSZWN0W10ge1xuICAgIGNvbnN0IHNvcnRlZCA9IEdyaWRFbmdpbmUuc29ydEJ5UG9zaXRpb24od2lkZ2V0cyk7XG4gICAgY29uc3QgcGxhY2VkOiBHcmlkUmVjdFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHdpZGdldCBvZiBzb3J0ZWQpIHtcbiAgICAgIHdpZGdldC55ID0gR3JpZEVuZ2luZS5maW5kQ29tcGFjdFkocGxhY2VkLCB3aWRnZXQpO1xuICAgICAgcGxhY2VkLnB1c2god2lkZ2V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGxhY2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIGhpZ2hlc3QgWSBwb3NpdGlvbiBhIHdpZGdldCBjYW4gb2NjdXB5IHdpdGhvdXQgb3ZlcmxhcHBpbmcgYW55IGFscmVhZHktcGxhY2VkIHdpZGdldC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZpbmRDb21wYWN0WShwbGFjZWQ6IEdyaWRSZWN0W10sIHdpZGdldDogR3JpZFJlY3QpOiBudW1iZXIge1xuICAgIGxldCB5ID0gMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgdGVzdDogR3JpZFJlY3QgPSB7IC4uLndpZGdldCwgeSB9O1xuICAgICAgY29uc3QgY29sbGlzaW9uID0gcGxhY2VkLmZpbmQocCA9PiBHcmlkRW5naW5lLmNvbGxpZGVzKHAsIHRlc3QpKTtcbiAgICAgIGlmICghY29sbGlzaW9uKSByZXR1cm4geTtcbiAgICAgIHkgPSBjb2xsaXNpb24ueSArIGNvbGxpc2lvbi5yb3dzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cyB0aGUgZ3JpZCBuZWVkcy5cbiAgICovXG4gIHN0YXRpYyBnZXRHcmlkSGVpZ2h0KHdpZGdldHM6IEdyaWRSZWN0W10pOiBudW1iZXIge1xuICAgIGlmICh3aWRnZXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGgubWF4KC4uLndpZGdldHMubWFwKHcgPT4gdy55ICsgdy5yb3dzKSk7XG4gIH1cbn1cblxuLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gICBDVVNUT00gR1JJRCBDT01QT05FTlRcbiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqL1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZ3JpZCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgI2dyaWRDb250YWluZXJcbiAgICAgIGNsYXNzPVwiZ3JpZC1jb250YWluZXJcIlxuICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJjb250YWluZXJIZWlnaHRcIlxuICAgID5cbiAgICAgIDwhLS0gUGxhY2Vob2xkZXIgcHJldmlldyAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJncmlkLXBsYWNlaG9sZGVyXCJcbiAgICAgICAgKm5nSWY9XCJwbGFjZWhvbGRlclwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInBsYWNlaG9sZGVyLmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cInBsYWNlaG9sZGVyLnRvcFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJwbGFjZWhvbGRlci53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwicGxhY2Vob2xkZXIuaGVpZ2h0XCJcbiAgICAgID48L2Rpdj5cblxuICAgICAgPCEtLSBXaWRnZXQgaXRlbXMgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCB3aWRnZXQgb2Ygd2lkZ2V0czsgdHJhY2tCeTogdHJhY2tCeUZuXCJcbiAgICAgICAgY2xhc3M9XCJncmlkLWl0ZW1cIlxuICAgICAgICBbY2xhc3MuaXMtZHJhZ2dpbmddPVwiZHJhZ2dpbmc/LmlkID09PSB3aWRnZXQuaWRcIlxuICAgICAgICBbY2xhc3MuaXMtcmVzaXppbmddPVwicmVzaXppbmc/LmlkID09PSB3aWRnZXQuaWRcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJnZXRJdGVtTGVmdCh3aWRnZXQpXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJnZXRJdGVtVG9wKHdpZGdldClcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiZ2V0SXRlbVdpZHRoKHdpZGdldClcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImdldEl0ZW1IZWlnaHQod2lkZ2V0KVwiXG4gICAgICAgIFtzdHlsZS56LWluZGV4XT1cIihkcmFnZ2luZz8uaWQgPT09IHdpZGdldC5pZCB8fCByZXNpemluZz8uaWQgPT09IHdpZGdldC5pZCkgPyAxMDAgOiAxXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJvbkRyYWdTdGFydCgkZXZlbnQsIHdpZGdldClcIlxuICAgICAgPlxuICAgICAgICA8IS0tIENvbnRlbnQgc3RhbXBlZCBmcm9tIHBhcmVudCB0ZW1wbGF0ZSwgY29udGV4dCBjYXJyaWVzIHRoZSB3aWRnZXQgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cImNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRlbXBsYXRlXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyB3aWRnZXQ6IHdpZGdldCB9XCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gUmVzaXplIGhhbmRsZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlc2l6ZS1oYW5kbGVcIiAobW91c2Vkb3duKT1cIm9uUmVzaXplU3RhcnQoJGV2ZW50LCB3aWRnZXQpXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTExIDF2MTBIMVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTEgNXY2SDVcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTExIDl2Mkg5XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgfVxuXG4gICAgLmdyaWQtY29udGFpbmVyIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgbWluLWhlaWdodDogMTAwJTtcbiAgICAgIHRyYW5zaXRpb246IGhlaWdodCAwLjI1cyBlYXNlO1xuICAgIH1cblxuICAgIC5ncmlkLXBsYWNlaG9sZGVyIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRhc2gtYWNjZW50LWNvbG9yLCAjMGE4NGZmKTtcbiAgICAgIG9wYWNpdHk6IDAuMTI7XG4gICAgICBib3JkZXItcmFkaXVzOiAyNHB4O1xuICAgICAgYm9yZGVyOiAycHggZGFzaGVkIHZhcigtLWRhc2gtYWNjZW50LWNvbG9yLCAjMGE4NGZmKTtcbiAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4xNXMgZWFzZSwgdG9wIDAuMTVzIGVhc2UsIHdpZHRoIDAuMTVzIGVhc2UsIGhlaWdodCAwLjE1cyBlYXNlO1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICB6LWluZGV4OiAwO1xuICAgIH1cblxuICAgIC5ncmlkLWl0ZW0ge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB0cmFuc2l0aW9uOiBsZWZ0IDAuMjVzIGVhc2UsIHRvcCAwLjI1cyBlYXNlLCB3aWR0aCAwLjI1cyBlYXNlLCBoZWlnaHQgMC4yNXMgZWFzZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDI0cHg7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIH1cblxuICAgIC5ncmlkLWl0ZW0uaXMtZHJhZ2dpbmcsXG4gICAgLmdyaWQtaXRlbS5pcy1yZXNpemluZyB7XG4gICAgICB0cmFuc2l0aW9uOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICBvcGFjaXR5OiAwLjg4O1xuICAgICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgICBmaWx0ZXI6IGRyb3Atc2hhZG93KDAgMjBweCA0MHB4IHJnYmEoMCwwLDAsMC40NSkpO1xuICAgIH1cblxuICAgIC8qIFJlc2l6ZSBIYW5kbGUgKi9cbiAgICAucmVzaXplLWhhbmRsZSB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICByaWdodDogNHB4O1xuICAgICAgYm90dG9tOiA0cHg7XG4gICAgICB3aWR0aDogMjJweDtcbiAgICAgIGhlaWdodDogMjJweDtcbiAgICAgIGN1cnNvcjogbndzZS1yZXNpemU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC4yNSk7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzLCBiYWNrZ3JvdW5kIDAuMnM7XG4gICAgICB6LWluZGV4OiAyMDtcbiAgICB9XG4gICAgLnJlc2l6ZS1oYW5kbGU6aG92ZXIge1xuICAgICAgY29sb3I6IHZhcigtLWRhc2gtYWNjZW50LWNvbG9yLCAjMGE4NGZmKTtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4wNik7XG4gICAgfVxuICBgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQ3VzdG9tR3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSB3aWRnZXRzOiBXaWRnZXRbXSA9IFtdO1xuICBASW5wdXQoKSBjb2x1bW5zOiBudW1iZXIgPSAxMjtcbiAgQElucHV0KCkgZ2FwOiBudW1iZXIgPSAxNjtcbiAgQElucHV0KCkgcm93SGVpZ2h0OiBudW1iZXIgPSA4MDtcbiAgQElucHV0KCkgbWluSXRlbUNvbHM6IG51bWJlciA9IDE7XG4gIEBJbnB1dCgpIG1pbkl0ZW1Sb3dzOiBudW1iZXIgPSAxO1xuXG4gIEBPdXRwdXQoKSBpdGVtQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8V2lkZ2V0PigpO1xuICBAT3V0cHV0KCkgbGF5b3V0Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8V2lkZ2V0W10+KCk7XG5cbiAgQFZpZXdDaGlsZCgnZ3JpZENvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIGdyaWRDb250YWluZXIhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICAvKiogVGhlIG5nLXRlbXBsYXRlIGRlY29yYXRlZCB3aXRoIGdyaWRDZWxsIGZyb20gdGhlIHBhcmVudCAqL1xuICBAQ29udGVudENoaWxkKEdyaWRDZWxsRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIGNlbGxUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPHsgd2lkZ2V0OiBXaWRnZXQgfT47XG5cbiAgcGxhY2Vob2xkZXI6IHsgbGVmdDogbnVtYmVyOyB0b3A6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBjb250YWluZXJIZWlnaHQgPSA0MDA7XG5cbiAgZHJhZ2dpbmc6IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG9mZnNldFg6IG51bWJlcjtcbiAgICBvZmZzZXRZOiBudW1iZXI7XG4gICAgY3VycmVudFBpeGVsWDogbnVtYmVyO1xuICAgIGN1cnJlbnRQaXhlbFk6IG51bWJlcjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIHJlc2l6aW5nOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBzdGFydE1vdXNlWDogbnVtYmVyO1xuICAgIHN0YXJ0TW91c2VZOiBudW1iZXI7XG4gICAgc3RhcnRDb2xzOiBudW1iZXI7XG4gICAgc3RhcnRSb3dzOiBudW1iZXI7XG4gICAgY3VycmVudFBpeGVsVzogbnVtYmVyO1xuICAgIGN1cnJlbnRQaXhlbEg6IG51bWJlcjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcHJldmlld1dpZGdldHM6IEdyaWRSZWN0W10gPSBbXTtcbiAgcHJpdmF0ZSBib3VuZE1vdXNlTW92ZSA9IHRoaXMub25Nb3VzZU1vdmUuYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSBib3VuZE1vdXNlVXAgPSB0aGlzLm9uTW91c2VVcC5iaW5kKHRoaXMpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgem9uZTogTmdab25lLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jb21wYWN0QW5kQXBwbHkoKTtcbiAgICB0aGlzLnVwZGF0ZUNvbnRhaW5lckhlaWdodCgpO1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5ib3VuZE1vdXNlTW92ZSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuYm91bmRNb3VzZVVwKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKF9jaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgdGhpcy51cGRhdGVDb250YWluZXJIZWlnaHQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmJvdW5kTW91c2VNb3ZlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuYm91bmRNb3VzZVVwKTtcbiAgfVxuXG4gIHRyYWNrQnlGbihfaW5kZXg6IG51bWJlciwgaXRlbTogV2lkZ2V0KSB7IHJldHVybiBpdGVtLmlkOyB9XG5cbiAgLy8g4pSA4pSAIEdlb21ldHJ5IOKUgOKUgFxuXG4gIHByaXZhdGUgZ2V0IGNlbGxXaWR0aCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvbnRhaW5lclcgPSB0aGlzLmdyaWRDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ/LmNsaWVudFdpZHRoID8/IDgwMDtcbiAgICByZXR1cm4gKGNvbnRhaW5lclcgLSAodGhpcy5jb2x1bW5zIC0gMSkgKiB0aGlzLmdhcCkgLyB0aGlzLmNvbHVtbnM7XG4gIH1cblxuICBwcml2YXRlIGNvbFRvUGl4ZWwoY29sOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBjb2wgKiAodGhpcy5jZWxsV2lkdGggKyB0aGlzLmdhcCk7XG4gIH1cblxuICBwcml2YXRlIHJvd1RvUGl4ZWwocm93OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiByb3cgKiAodGhpcy5yb3dIZWlnaHQgKyB0aGlzLmdhcCk7XG4gIH1cblxuICBwcml2YXRlIHBpeGVsVG9Db2wocHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQocHggLyAodGhpcy5jZWxsV2lkdGggKyB0aGlzLmdhcCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBwaXhlbFRvUm93KHB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHB4IC8gKHRoaXMucm93SGVpZ2h0ICsgdGhpcy5nYXApKTtcbiAgfVxuXG4gIHByaXZhdGUgY29sc1RvUGl4ZWxXaWR0aChjb2xzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBjb2xzICogdGhpcy5jZWxsV2lkdGggKyAoY29scyAtIDEpICogdGhpcy5nYXA7XG4gIH1cblxuICBwcml2YXRlIHJvd3NUb1BpeGVsSGVpZ2h0KHJvd3M6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHJvd3MgKiB0aGlzLnJvd0hlaWdodCArIChyb3dzIC0gMSkgKiB0aGlzLmdhcDtcbiAgfVxuXG4gIGdldEl0ZW1MZWZ0KHc6IFdpZGdldCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ2dpbmc/LmlkID09PSB3LmlkID8gdGhpcy5kcmFnZ2luZy5jdXJyZW50UGl4ZWxYIDogdGhpcy5jb2xUb1BpeGVsKHcueCk7XG4gIH1cblxuICBnZXRJdGVtVG9wKHc6IFdpZGdldCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ2dpbmc/LmlkID09PSB3LmlkID8gdGhpcy5kcmFnZ2luZy5jdXJyZW50UGl4ZWxZIDogdGhpcy5yb3dUb1BpeGVsKHcueSk7XG4gIH1cblxuICBnZXRJdGVtV2lkdGgodzogV2lkZ2V0KTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yZXNpemluZz8uaWQgPT09IHcuaWQgPyB0aGlzLnJlc2l6aW5nLmN1cnJlbnRQaXhlbFcgOiB0aGlzLmNvbHNUb1BpeGVsV2lkdGgody5jb2xzKTtcbiAgfVxuXG4gIGdldEl0ZW1IZWlnaHQodzogV2lkZ2V0KTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yZXNpemluZz8uaWQgPT09IHcuaWQgPyB0aGlzLnJlc2l6aW5nLmN1cnJlbnRQaXhlbEggOiB0aGlzLnJvd3NUb1BpeGVsSGVpZ2h0KHcucm93cyk7XG4gIH1cblxuICAvLyDilIDilIAgRHJhZyDilIDilIBcblxuICBvbkRyYWdTdGFydChldmVudDogTW91c2VFdmVudCwgd2lkZ2V0OiBXaWRnZXQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldC5jbG9zZXN0KCdidXR0b24sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBhLCAucmVzaXplLWhhbmRsZScpKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmdyaWRDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBpdGVtTGVmdCA9IHRoaXMuY29sVG9QaXhlbCh3aWRnZXQueCk7XG4gICAgY29uc3QgaXRlbVRvcCA9IHRoaXMucm93VG9QaXhlbCh3aWRnZXQueSk7XG5cbiAgICB0aGlzLmRyYWdnaW5nID0ge1xuICAgICAgaWQ6IHdpZGdldC5pZCxcbiAgICAgIG9mZnNldFg6IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQgLSBpdGVtTGVmdCxcbiAgICAgIG9mZnNldFk6IGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCAtIGl0ZW1Ub3AsXG4gICAgICBjdXJyZW50UGl4ZWxYOiBpdGVtTGVmdCxcbiAgICAgIGN1cnJlbnRQaXhlbFk6IGl0ZW1Ub3AsXG4gICAgfTtcbiAgICB0aGlzLnByZXZpZXdXaWRnZXRzID0gdGhpcy53aWRnZXRzLm1hcCh3ID0+ICh7IGlkOiB3LmlkLCB4OiB3LngsIHk6IHcueSwgY29sczogdy5jb2xzLCByb3dzOiB3LnJvd3MgfSkpO1xuICAgIHRoaXMucGxhY2Vob2xkZXIgPSB7XG4gICAgICBsZWZ0OiBpdGVtTGVmdCwgdG9wOiBpdGVtVG9wLFxuICAgICAgd2lkdGg6IHRoaXMuY29sc1RvUGl4ZWxXaWR0aCh3aWRnZXQuY29scyksXG4gICAgICBoZWlnaHQ6IHRoaXMucm93c1RvUGl4ZWxIZWlnaHQod2lkZ2V0LnJvd3MpLFxuICAgIH07XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvblJlc2l6ZVN0YXJ0KGV2ZW50OiBNb3VzZUV2ZW50LCB3aWRnZXQ6IFdpZGdldCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5yZXNpemluZyA9IHtcbiAgICAgIGlkOiB3aWRnZXQuaWQsXG4gICAgICBzdGFydE1vdXNlWDogZXZlbnQuY2xpZW50WCxcbiAgICAgIHN0YXJ0TW91c2VZOiBldmVudC5jbGllbnRZLFxuICAgICAgc3RhcnRDb2xzOiB3aWRnZXQuY29scyxcbiAgICAgIHN0YXJ0Um93czogd2lkZ2V0LnJvd3MsXG4gICAgICBjdXJyZW50UGl4ZWxXOiB0aGlzLmNvbHNUb1BpeGVsV2lkdGgod2lkZ2V0LmNvbHMpLFxuICAgICAgY3VycmVudFBpeGVsSDogdGhpcy5yb3dzVG9QaXhlbEhlaWdodCh3aWRnZXQucm93cyksXG4gICAgfTtcbiAgICB0aGlzLnByZXZpZXdXaWRnZXRzID0gdGhpcy53aWRnZXRzLm1hcCh3ID0+ICh7IGlkOiB3LmlkLCB4OiB3LngsIHk6IHcueSwgY29sczogdy5jb2xzLCByb3dzOiB3LnJvd3MgfSkpO1xuICAgIHRoaXMucGxhY2Vob2xkZXIgPSB7XG4gICAgICBsZWZ0OiB0aGlzLmNvbFRvUGl4ZWwod2lkZ2V0LngpLCB0b3A6IHRoaXMucm93VG9QaXhlbCh3aWRnZXQueSksXG4gICAgICB3aWR0aDogdGhpcy5jb2xzVG9QaXhlbFdpZHRoKHdpZGdldC5jb2xzKSxcbiAgICAgIGhlaWdodDogdGhpcy5yb3dzVG9QaXhlbEhlaWdodCh3aWRnZXQucm93cyksXG4gICAgfTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kcmFnZ2luZykgdGhpcy5oYW5kbGVEcmFnTW92ZShldmVudCk7XG4gICAgZWxzZSBpZiAodGhpcy5yZXNpemluZykgdGhpcy5oYW5kbGVSZXNpemVNb3ZlKGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgb25Nb3VzZVVwKF9ldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLmRyYWdnaW5nKSB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMuZmluYWxpemVEcmFnKCkpO1xuICAgIGVsc2UgaWYgKHRoaXMucmVzaXppbmcpIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5maW5hbGl6ZVJlc2l6ZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRHJhZ01vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5ncmlkQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd2lkZ2V0ID0gdGhpcy53aWRnZXRzLmZpbmQodyA9PiB3LmlkID09PSB0aGlzLmRyYWdnaW5nIS5pZCkhO1xuICAgIGlmICghd2lkZ2V0KSByZXR1cm47XG5cbiAgICBsZXQgcHggPSBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gdGhpcy5kcmFnZ2luZy5vZmZzZXRYO1xuICAgIGxldCBweSA9IGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCAtIHRoaXMuZHJhZ2dpbmcub2Zmc2V0WTtcbiAgICBweCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHB4LCByZWN0LndpZHRoIC0gdGhpcy5jb2xzVG9QaXhlbFdpZHRoKHdpZGdldC5jb2xzKSkpO1xuICAgIHB5ID0gTWF0aC5tYXgoMCwgcHkpO1xuXG4gICAgdGhpcy5kcmFnZ2luZy5jdXJyZW50UGl4ZWxYID0gcHg7XG4gICAgdGhpcy5kcmFnZ2luZy5jdXJyZW50UGl4ZWxZID0gcHk7XG5cbiAgICBjb25zdCB0YXJnZXRDb2wgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLnBpeGVsVG9Db2wocHgpLCB0aGlzLmNvbHVtbnMgLSB3aWRnZXQuY29scykpO1xuICAgIGNvbnN0IHRhcmdldFJvdyA9IE1hdGgubWF4KDAsIHRoaXMucGl4ZWxUb1JvdyhweSkpO1xuXG4gICAgY29uc3QgcmVzb2x2ZWQgPSBHcmlkRW5naW5lLm1vdmVXaWRnZXQoXG4gICAgICB0aGlzLnByZXZpZXdXaWRnZXRzLFxuICAgICAgeyBpZDogd2lkZ2V0LmlkLCB4OiB3aWRnZXQueCwgeTogd2lkZ2V0LnksIGNvbHM6IHdpZGdldC5jb2xzLCByb3dzOiB3aWRnZXQucm93cyB9LFxuICAgICAgdGFyZ2V0Q29sLCB0YXJnZXRSb3csIHRoaXMuY29sdW1uc1xuICAgICk7XG5cbiAgICB0aGlzLnBsYWNlaG9sZGVyID0ge1xuICAgICAgbGVmdDogdGhpcy5jb2xUb1BpeGVsKHRhcmdldENvbCksIHRvcDogdGhpcy5yb3dUb1BpeGVsKHRhcmdldFJvdyksXG4gICAgICB3aWR0aDogdGhpcy5jb2xzVG9QaXhlbFdpZHRoKHdpZGdldC5jb2xzKSxcbiAgICAgIGhlaWdodDogdGhpcy5yb3dzVG9QaXhlbEhlaWdodCh3aWRnZXQucm93cyksXG4gICAgfTtcblxuICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBydyBvZiByZXNvbHZlZCkge1xuICAgICAgICBpZiAocncuaWQgPT09IHdpZGdldC5pZCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHcgPSB0aGlzLndpZGdldHMuZmluZCh3dyA9PiB3dy5pZCA9PT0gcncuaWQpO1xuICAgICAgICBpZiAodykgeyB3LnggPSBydy54OyB3LnkgPSBydy55OyB9XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZUNvbnRhaW5lckhlaWdodCgpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmFsaXplRHJhZygpIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICBjb25zdCB3aWRnZXQgPSB0aGlzLndpZGdldHMuZmluZCh3ID0+IHcuaWQgPT09IHRoaXMuZHJhZ2dpbmchLmlkKSE7XG4gICAgY29uc3QgdGFyZ2V0Q29sID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5waXhlbFRvQ29sKHRoaXMuZHJhZ2dpbmcuY3VycmVudFBpeGVsWCksIHRoaXMuY29sdW1ucyAtIHdpZGdldC5jb2xzKSk7XG4gICAgY29uc3QgdGFyZ2V0Um93ID0gTWF0aC5tYXgoMCwgdGhpcy5waXhlbFRvUm93KHRoaXMuZHJhZ2dpbmcuY3VycmVudFBpeGVsWSkpO1xuXG4gICAgY29uc3QgcmVzb2x2ZWQgPSBHcmlkRW5naW5lLm1vdmVXaWRnZXQoXG4gICAgICB0aGlzLndpZGdldHMubWFwKHcgPT4gKHsgaWQ6IHcuaWQsIHg6IHcueCwgeTogdy55LCBjb2xzOiB3LmNvbHMsIHJvd3M6IHcucm93cyB9KSksXG4gICAgICB7IGlkOiB3aWRnZXQuaWQsIHg6IHdpZGdldC54LCB5OiB3aWRnZXQueSwgY29sczogd2lkZ2V0LmNvbHMsIHJvd3M6IHdpZGdldC5yb3dzIH0sXG4gICAgICB0YXJnZXRDb2wsIHRhcmdldFJvdywgdGhpcy5jb2x1bW5zXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IHJ3IG9mIHJlc29sdmVkKSB7XG4gICAgICBjb25zdCB3ID0gdGhpcy53aWRnZXRzLmZpbmQod3cgPT4gd3cuaWQgPT09IHJ3LmlkKTtcbiAgICAgIGlmICh3KSB7IHcueCA9IHJ3Lng7IHcueSA9IHJ3Lnk7IHcuY29scyA9IHJ3LmNvbHM7IHcucm93cyA9IHJ3LnJvd3M7IHRoaXMuaXRlbUNoYW5nZWQuZW1pdCh3KTsgfVxuICAgIH1cbiAgICB0aGlzLmRyYWdnaW5nID0gbnVsbDtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gbnVsbDtcbiAgICB0aGlzLnByZXZpZXdXaWRnZXRzID0gW107XG4gICAgdGhpcy51cGRhdGVDb250YWluZXJIZWlnaHQoKTtcbiAgICB0aGlzLmxheW91dENoYW5nZWQuZW1pdCh0aGlzLndpZGdldHMpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSZXNpemVNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLnJlc2l6aW5nKSByZXR1cm47XG4gICAgY29uc3Qgd2lkZ2V0ID0gdGhpcy53aWRnZXRzLmZpbmQodyA9PiB3LmlkID09PSB0aGlzLnJlc2l6aW5nIS5pZCkhO1xuICAgIGlmICghd2lkZ2V0KSByZXR1cm47XG5cbiAgICBjb25zdCBkeCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLnJlc2l6aW5nLnN0YXJ0TW91c2VYO1xuICAgIGNvbnN0IGR5ID0gZXZlbnQuY2xpZW50WSAtIHRoaXMucmVzaXppbmcuc3RhcnRNb3VzZVk7XG5cbiAgICBsZXQgbmV3Q29scyA9IE1hdGgubWF4KHRoaXMubWluSXRlbUNvbHMsIE1hdGgucm91bmQoKHRoaXMuY29sc1RvUGl4ZWxXaWR0aCh0aGlzLnJlc2l6aW5nLnN0YXJ0Q29scykgKyBkeCkgLyAodGhpcy5jZWxsV2lkdGggKyB0aGlzLmdhcCkpKTtcbiAgICBsZXQgbmV3Um93cyA9IE1hdGgubWF4KHRoaXMubWluSXRlbVJvd3MsIE1hdGgucm91bmQoKHRoaXMucm93c1RvUGl4ZWxIZWlnaHQodGhpcy5yZXNpemluZy5zdGFydFJvd3MpICsgZHkpIC8gKHRoaXMucm93SGVpZ2h0ICsgdGhpcy5nYXApKSk7XG4gICAgbmV3Q29scyA9IE1hdGgubWluKG5ld0NvbHMsIHRoaXMuY29sdW1ucyAtIHdpZGdldC54KTtcblxuICAgIHRoaXMucmVzaXppbmcuY3VycmVudFBpeGVsVyA9IHRoaXMuY29sc1RvUGl4ZWxXaWR0aChuZXdDb2xzKTtcbiAgICB0aGlzLnJlc2l6aW5nLmN1cnJlbnRQaXhlbEggPSB0aGlzLnJvd3NUb1BpeGVsSGVpZ2h0KG5ld1Jvd3MpO1xuXG4gICAgY29uc3QgcmVzb2x2ZWQgPSBHcmlkRW5naW5lLnJlc2l6ZVdpZGdldChcbiAgICAgIHRoaXMucHJldmlld1dpZGdldHMsXG4gICAgICB7IGlkOiB3aWRnZXQuaWQsIHg6IHdpZGdldC54LCB5OiB3aWRnZXQueSwgY29sczogd2lkZ2V0LmNvbHMsIHJvd3M6IHdpZGdldC5yb3dzIH0sXG4gICAgICBuZXdDb2xzLCBuZXdSb3dzLCB0aGlzLmNvbHVtbnNcbiAgICApO1xuXG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IHtcbiAgICAgIGxlZnQ6IHRoaXMuY29sVG9QaXhlbCh3aWRnZXQueCksIHRvcDogdGhpcy5yb3dUb1BpeGVsKHdpZGdldC55KSxcbiAgICAgIHdpZHRoOiB0aGlzLmNvbHNUb1BpeGVsV2lkdGgobmV3Q29scyksXG4gICAgICBoZWlnaHQ6IHRoaXMucm93c1RvUGl4ZWxIZWlnaHQobmV3Um93cyksXG4gICAgfTtcblxuICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBydyBvZiByZXNvbHZlZCkge1xuICAgICAgICBpZiAocncuaWQgPT09IHdpZGdldC5pZCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHcgPSB0aGlzLndpZGdldHMuZmluZCh3dyA9PiB3dy5pZCA9PT0gcncuaWQpO1xuICAgICAgICBpZiAodykgeyB3LnggPSBydy54OyB3LnkgPSBydy55OyB9XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZUNvbnRhaW5lckhlaWdodCgpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmFsaXplUmVzaXplKCkge1xuICAgIGlmICghdGhpcy5yZXNpemluZykgcmV0dXJuO1xuICAgIGNvbnN0IHdpZGdldCA9IHRoaXMud2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gdGhpcy5yZXNpemluZyEuaWQpITtcblxuICAgIGxldCBuZXdDb2xzID0gTWF0aC5tYXgodGhpcy5taW5JdGVtQ29scywgTWF0aC5yb3VuZCh0aGlzLnJlc2l6aW5nLmN1cnJlbnRQaXhlbFcgLyAodGhpcy5jZWxsV2lkdGggKyB0aGlzLmdhcCkpKTtcbiAgICBsZXQgbmV3Um93cyA9IE1hdGgubWF4KHRoaXMubWluSXRlbVJvd3MsIE1hdGgucm91bmQodGhpcy5yZXNpemluZy5jdXJyZW50UGl4ZWxIIC8gKHRoaXMucm93SGVpZ2h0ICsgdGhpcy5nYXApKSk7XG4gICAgbmV3Q29scyA9IE1hdGgubWluKG5ld0NvbHMsIHRoaXMuY29sdW1ucyAtIHdpZGdldC54KTtcblxuICAgIGNvbnN0IHJlc29sdmVkID0gR3JpZEVuZ2luZS5yZXNpemVXaWRnZXQoXG4gICAgICB0aGlzLndpZGdldHMubWFwKHcgPT4gKHsgaWQ6IHcuaWQsIHg6IHcueCwgeTogdy55LCBjb2xzOiB3LmNvbHMsIHJvd3M6IHcucm93cyB9KSksXG4gICAgICB7IGlkOiB3aWRnZXQuaWQsIHg6IHdpZGdldC54LCB5OiB3aWRnZXQueSwgY29sczogd2lkZ2V0LmNvbHMsIHJvd3M6IHdpZGdldC5yb3dzIH0sXG4gICAgICBuZXdDb2xzLCBuZXdSb3dzLCB0aGlzLmNvbHVtbnNcbiAgICApO1xuICAgIGZvciAoY29uc3Qgcncgb2YgcmVzb2x2ZWQpIHtcbiAgICAgIGNvbnN0IHcgPSB0aGlzLndpZGdldHMuZmluZCh3dyA9PiB3dy5pZCA9PT0gcncuaWQpO1xuICAgICAgaWYgKHcpIHsgdy54ID0gcncueDsgdy55ID0gcncueTsgdy5jb2xzID0gcncuY29sczsgdy5yb3dzID0gcncucm93czsgdGhpcy5pdGVtQ2hhbmdlZC5lbWl0KHcpOyB9XG4gICAgfVxuICAgIHRoaXMucmVzaXppbmcgPSBudWxsO1xuICAgIHRoaXMucGxhY2Vob2xkZXIgPSBudWxsO1xuICAgIHRoaXMucHJldmlld1dpZGdldHMgPSBbXTtcbiAgICB0aGlzLnVwZGF0ZUNvbnRhaW5lckhlaWdodCgpO1xuICAgIHRoaXMubGF5b3V0Q2hhbmdlZC5lbWl0KHRoaXMud2lkZ2V0cyk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyDilIDilIAgVXRpbGl0aWVzIOKUgOKUgFxuXG4gIHByaXZhdGUgY29tcGFjdEFuZEFwcGx5KCkge1xuICAgIGlmICghdGhpcy53aWRnZXRzPy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBjb21wYWN0ZWQgPSBHcmlkRW5naW5lLmNvbXBhY3QoXG4gICAgICB0aGlzLndpZGdldHMubWFwKHcgPT4gKHsgaWQ6IHcuaWQsIHg6IHcueCwgeTogdy55LCBjb2xzOiB3LmNvbHMsIHJvd3M6IHcucm93cyB9KSksXG4gICAgICB0aGlzLmNvbHVtbnNcbiAgICApO1xuICAgIGZvciAoY29uc3Qgcncgb2YgY29tcGFjdGVkKSB7XG4gICAgICBjb25zdCB3ID0gdGhpcy53aWRnZXRzLmZpbmQod3cgPT4gd3cuaWQgPT09IHJ3LmlkKTtcbiAgICAgIGlmICh3KSB7IHcueCA9IHJ3Lng7IHcueSA9IHJ3Lnk7IH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbnRhaW5lckhlaWdodCgpIHtcbiAgICBpZiAoIXRoaXMud2lkZ2V0cz8ubGVuZ3RoKSB7IHRoaXMuY29udGFpbmVySGVpZ2h0ID0gNDAwOyByZXR1cm47IH1cbiAgICBjb25zdCBtYXhSb3cgPSBHcmlkRW5naW5lLmdldEdyaWRIZWlnaHQoXG4gICAgICB0aGlzLndpZGdldHMubWFwKHcgPT4gKHsgaWQ6IHcuaWQsIHg6IHcueCwgeTogdy55LCBjb2xzOiB3LmNvbHMsIHJvd3M6IHcucm93cyB9KSlcbiAgICApO1xuICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdGhpcy5yb3dUb1BpeGVsKG1heFJvdykgKyB0aGlzLnJvd0hlaWdodCArIHRoaXMuZ2FwO1xuICB9XG59XG4iXX0=
509
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcC9jdXN0b20tZ3JpZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFDdEMsU0FBUyxFQUNULFlBQVksRUFBRSxXQUFXLEVBQ3pCLFNBQVMsRUFBRSx1QkFBdUIsRUFDbkMsTUFBTSxlQUFlLENBQUM7OztBQUd2Qjs7Ozs7Ozs7R0FRRztBQUVILE1BQU0sT0FBTyxpQkFBaUI7SUFDNUIsWUFBbUIsV0FBNEM7UUFBNUMsZ0JBQVcsR0FBWCxXQUFXLENBQWlDO0lBQUcsQ0FBQzs7K0dBRHhELGlCQUFpQjttR0FBakIsaUJBQWlCOzRGQUFqQixpQkFBaUI7a0JBRDdCLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFOztBQW1CckMsTUFBTSxVQUFVO0lBRWQ7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQVcsRUFBRSxDQUFXO1FBQ3RDLE9BQU8sQ0FBQyxDQUNOLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbkIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNwQixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQW1CLEVBQUUsSUFBYztRQUN6RCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUs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OztHQThDVCxtQkE0RGdCLHVCQUF1QixDQUFDLE1BQU07NkhBR3RDLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFFdUMsYUFBYTtzQkFBMUQsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdZLFlBQVk7c0JBQW5FLFlBQVk7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsXG4gIFZpZXdDaGlsZCwgT25EZXN0cm95LCBPbkluaXQsIE5nWm9uZSwgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbnRlbnRDaGlsZCwgVGVtcGxhdGVSZWYsXG4gIERpcmVjdGl2ZSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdpZGdldCB9IGZyb20gJy4vbW9kZWxzJztcblxuLyoqXG4gKiBEaXJlY3RpdmUgYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgdGhhdCBzaG91bGQgYmUgc3RhbXBlZCBpbnNpZGUgZWFjaCBncmlkIGNlbGwuXG4gKiBVc2FnZTpcbiAqICAgPGFwcC1ncmlkIFt3aWRnZXRzXT1cIi4uLlwiPlxuICogICAgIDxuZy10ZW1wbGF0ZSBncmlkQ2VsbCBsZXQtd2lkZ2V0PVwid2lkZ2V0XCI+XG4gKiAgICAgICA8YXBwLXdpZGdldC1yZW5kZXJlciBbd2lkZ2V0XT1cIndpZGdldFwiIC4uLj48L2FwcC13aWRnZXQtcmVuZGVyZXI+XG4gKiAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgPC9hcHAtZ3JpZD5cbiAqL1xuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2dyaWRDZWxsXScgfSlcbmV4cG9ydCBjbGFzcyBHcmlkQ2VsbERpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8eyB3aWRnZXQ6IFdpZGdldCB9Pikge31cbn1cblxuLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gICBHUklEIEVOR0lORSDigJQgcHVyZSBkYXRhLCB6ZXJvIERPTVxuICAgSGFuZGxlcyBjb2xsaXNpb24gZGV0ZWN0aW9uLCByZXNvbHV0aW9uLCBhbmQgY29tcGFjdGlvbi5cbiAgIEluc3BpcmVkIGJ5IHJlYWN0LWdyaWQtbGF5b3V0IC8gZ3JpZHN0ZXIgYWxnb3JpdGhtcy5cbiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqL1xuXG5pbnRlcmZhY2UgR3JpZFJlY3Qge1xuICBpZDogc3RyaW5nO1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgY29sczogbnVtYmVyO1xuICByb3dzOiBudW1iZXI7XG59XG5cbmNsYXNzIEdyaWRFbmdpbmUge1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0d28gcmVjdHMgb3ZlcmxhcC5cbiAgICovXG4gIHN0YXRpYyBjb2xsaWRlcyhhOiBHcmlkUmVjdCwgYjogR3JpZFJlY3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIShcbiAgICAgIGEueCArIGEuY29scyA8PSBiLnggfHxcbiAgICAgIGIueCArIGIuY29scyA8PSBhLnggfHxcbiAgICAgIGEueSArIGEucm93cyA8PSBiLnkgfHxcbiAgICAgIGIueSArIGIucm93cyA8PSBhLnlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBBTEwgd2lkZ2V0cyB0aGF0IGNvbGxpZGUgd2l0aCBgcmVjdGAuXG4gICAqL1xuICBzdGF0aWMgZ2V0QWxsQ29sbGlzaW9ucyh3aWRnZXRzOiBHcmlkUmVjdFtdLCByZWN0OiBHcmlkUmVjdCk6IEdyaWRSZWN0W10ge1xuICAgIHJldHVybiB3aWRnZXRzLmZpbHRlcih3ID0+IHcuaWQgIT09IHJlY3QuaWQgJiYgR3JpZEVuZ2luZS5jb2xsaWRlcyh3LCByZWN0KSk7XG4gIH1cblxuICAvKipcbiAgICogU29ydCB3aWRnZXRzIHRvcC10by1ib3R0b20sIGxlZnQtdG8tcmlnaHQuXG4gICAqL1xuICBzdGF0aWMgc29ydEJ5UG9zaXRpb24od2lkZ2V0czogR3JpZFJlY3RbXSk6IEdyaWRSZWN0W10ge1xuICAgIHJldHVybiBbLi4ud2lkZ2V0c10uc29ydCgoYSwgYikgPT4gYS55IC0gYi55IHx8IGEueCAtIGIueCk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBhIHdpZGdldCB0byAoeCwgeSkgYW5kIHB1c2ggYW55IGNvbGxpZGluZyB3aWRnZXRzIGRvd253YXJkLlxuICAgKiBSZXR1cm5zIHRoZSBmdWxsIGxpc3Qgd2l0aCByZXNvbHZlZCBwb3NpdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgbW92ZVdpZGdldChcbiAgICBhbGxXaWRnZXRzOiBHcmlkUmVjdFtdLFxuICAgIHdpZGdldDogR3JpZFJlY3QsXG4gICAgbmV3WDogbnVtYmVyLFxuICAgIG5ld1k6IG51bWJlcixcbiAgICBjb2x1bW5zOiBudW1iZXJcbiAgKTogR3JpZFJlY3RbXSB7XG4gICAgY29uc3Qgd2lkZ2V0cyA9IGFsbFdpZGdldHMubWFwKHcgPT4gKHsgLi4udyB9KSk7XG4gICAgY29uc3QgbW92aW5nID0gd2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gd2lkZ2V0LmlkKTtcbiAgICBpZiAoIW1vdmluZykgcmV0dXJuIHdpZGdldHM7XG5cbiAgICBtb3ZpbmcueCA9IE1hdGgubWF4KDAsIE1hdGgubWluKG5ld1gsIGNvbHVtbnMgLSBtb3ZpbmcuY29scykpO1xuICAgIG1vdmluZy55ID0gTWF0aC5tYXgoMCwgbmV3WSk7XG5cbiAgICBjb25zdCBzb3J0ZWQgPSBHcmlkRW5naW5lLnNvcnRCeVBvc2l0aW9uKHdpZGdldHMpO1xuICAgIEdyaWRFbmdpbmUucmVzb2x2ZUNvbGxpc2lvbnMoc29ydGVkLCBtb3ZpbmcpO1xuICAgIHJldHVybiBHcmlkRW5naW5lLmNvbXBhY3Qoc29ydGVkLCBjb2x1bW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNpemUgYSB3aWRnZXQgYW5kIHB1c2ggY29sbGlkaW5nIHdpZGdldHMgZG93bi5cbiAgICovXG4gIHN0YXRpYyByZXNpemVXaWRnZXQoXG4gICAgYWxsV2lkZ2V0czogR3JpZFJlY3RbXSxcbiAgICB3aWRnZXQ6IEdyaWRSZWN0LFxuICAgIG5ld0NvbHM6IG51bWJlcixcbiAgICBuZXdSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uczogbnVtYmVyXG4gICk6IEdyaWRSZWN0W10ge1xuICAgIGNvbnN0IHdpZGdldHMgPSBhbGxXaWRnZXRzLm1hcCh3ID0+ICh7IC4uLncgfSkpO1xuICAgIGNvbnN0IHJlc2l6aW5nID0gd2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gd2lkZ2V0LmlkKTtcbiAgICBpZiAoIXJlc2l6aW5nKSByZXR1cm4gd2lkZ2V0cztcblxuICAgIHJlc2l6aW5nLmNvbHMgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihuZXdDb2xzLCBjb2x1bW5zIC0gcmVzaXppbmcueCkpO1xuICAgIHJlc2l6aW5nLnJvd3MgPSBNYXRoLm1heCgxLCBuZXdSb3dzKTtcblxuICAgIGNvbnN0IHNvcnRlZCA9IEdyaWRFbmdpbmUuc29ydEJ5UG9zaXRpb24od2lkZ2V0cyk7XG4gICAgR3JpZEVuZ2luZS5yZXNvbHZlQ29sbGlzaW9ucyhzb3J0ZWQsIHJlc2l6aW5nKTtcbiAgICByZXR1cm4gR3JpZEVuZ2luZS5jb21wYWN0KHNvcnRlZCwgY29sdW1ucyk7XG4gIH1cblxuICAvKipcbiAgICogUHVzaCBhbGwgd2lkZ2V0cyB0aGF0IGNvbGxpZGUgd2l0aCBgbW92ZWRXaWRnZXRgIGRvd253YXJkLCByZWN1cnNpdmVseS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlc29sdmVDb2xsaXNpb25zKHdpZGdldHM6IEdyaWRSZWN0W10sIG1vdmVkV2lkZ2V0OiBHcmlkUmVjdCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbGxpc2lvbnMgPSBHcmlkRW5naW5lLmdldEFsbENvbGxpc2lvbnMod2lkZ2V0cywgbW92ZWRXaWRnZXQpO1xuICAgIGZvciAoY29uc3QgY29sbGlkZXIgb2YgY29sbGlzaW9ucykge1xuICAgICAgY29sbGlkZXIueSA9IG1vdmVkV2lkZ2V0LnkgKyBtb3ZlZFdpZGdldC5yb3dzO1xuICAgICAgR3JpZEVuZ2luZS5yZXNvbHZlQ29sbGlzaW9ucyh3aWRnZXRzLCBjb2xsaWRlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhY3QgdGhlIGdyaWQ6IG1vdmUgZXZlcnkgd2lkZ2V0IGFzIGZhciB1cCBhcyBwb3NzaWJsZSB3aXRob3V0IG92ZXJsYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGNvbXBhY3Qod2lkZ2V0czogR3JpZFJlY3RbXSwgX2NvbHVtbnM6IG51bWJlcik6IEdyaWRSZWN0W10ge1xuICAgIGNvbnN0IHNvcnRlZCA9IEdyaWRFbmdpbmUuc29ydEJ5UG9zaXRpb24od2lkZ2V0cyk7XG4gICAgY29uc3QgcGxhY2VkOiBHcmlkUmVjdFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHdpZGdldCBvZiBzb3J0ZWQpIHtcbiAgICAgIHdpZGdldC55ID0gR3JpZEVuZ2luZS5maW5kQ29tcGFjdFkocGxhY2VkLCB3aWRnZXQpO1xuICAgICAgcGxhY2VkLnB1c2god2lkZ2V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGxhY2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIGhpZ2hlc3QgWSBwb3NpdGlvbiBhIHdpZGdldCBjYW4gb2NjdXB5IHdpdGhvdXQgb3ZlcmxhcHBpbmcgYW55IGFscmVhZHktcGxhY2VkIHdpZGdldC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZpbmRDb21wYWN0WShwbGFjZWQ6IEdyaWRSZWN0W10sIHdpZGdldDogR3JpZFJlY3QpOiBudW1iZXIge1xuICAgIGxldCB5ID0gMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgdGVzdDogR3JpZFJlY3QgPSB7IC4uLndpZGdldCwgeSB9O1xuICAgICAgY29uc3QgY29sbGlzaW9uID0gcGxhY2VkLmZpbmQocCA9PiBHcmlkRW5naW5lLmNvbGxpZGVzKHAsIHRlc3QpKTtcbiAgICAgIGlmICghY29sbGlzaW9uKSByZXR1cm4geTtcbiAgICAgIHkgPSBjb2xsaXNpb24ueSArIGNvbGxpc2lvbi5yb3dzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cyB0aGUgZ3JpZCBuZWVkcy5cbiAgICovXG4gIHN0YXRpYyBnZXRHcmlkSGVpZ2h0KHdpZGdldHM6IEdyaWRSZWN0W10pOiBudW1iZXIge1xuICAgIGlmICh3aWRnZXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGgubWF4KC4uLndpZGdldHMubWFwKHcgPT4gdy55ICsgdy5yb3dzKSk7XG4gIH1cbn1cblxuLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gICBDVVNUT00gR1JJRCBDT01QT05FTlRcbiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqL1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZ3JpZCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgI2dyaWRDb250YWluZXJcbiAgICAgIGNsYXNzPVwiZ3JpZC1jb250YWluZXJcIlxuICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJjb250YWluZXJIZWlnaHRcIlxuICAgID5cbiAgICAgIDwhLS0gUGxhY2Vob2xkZXIgcHJldmlldyAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJncmlkLXBsYWNlaG9sZGVyXCJcbiAgICAgICAgKm5nSWY9XCJwbGFjZWhvbGRlclwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInBsYWNlaG9sZGVyLmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cInBsYWNlaG9sZGVyLnRvcFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJwbGFjZWhvbGRlci53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwicGxhY2Vob2xkZXIuaGVpZ2h0XCJcbiAgICAgID48L2Rpdj5cblxuICAgICAgPCEtLSBXaWRnZXQgaXRlbXMgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCB3aWRnZXQgb2Ygd2lkZ2V0czsgdHJhY2tCeTogdHJhY2tCeUZuXCJcbiAgICAgICAgY2xhc3M9XCJncmlkLWl0ZW1cIlxuICAgICAgICBbY2xhc3MuaXMtZHJhZ2dpbmddPVwiZHJhZ2dpbmc/LmlkID09PSB3aWRnZXQuaWRcIlxuICAgICAgICBbY2xhc3MuaXMtcmVzaXppbmddPVwicmVzaXppbmc/LmlkID09PSB3aWRnZXQuaWRcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJnZXRJdGVtTGVmdCh3aWRnZXQpXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJnZXRJdGVtVG9wKHdpZGdldClcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiZ2V0SXRlbVdpZHRoKHdpZGdldClcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImdldEl0ZW1IZWlnaHQod2lkZ2V0KVwiXG4gICAgICAgIFtzdHlsZS56LWluZGV4XT1cIihkcmFnZ2luZz8uaWQgPT09IHdpZGdldC5pZCB8fCByZXNpemluZz8uaWQgPT09IHdpZGdldC5pZCkgPyAxMDAgOiAxXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJvbkRyYWdTdGFydCgkZXZlbnQsIHdpZGdldClcIlxuICAgICAgPlxuICAgICAgICA8IS0tIENvbnRlbnQgc3RhbXBlZCBmcm9tIHBhcmVudCB0ZW1wbGF0ZSwgY29udGV4dCBjYXJyaWVzIHRoZSB3aWRnZXQgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cImNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRlbXBsYXRlXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyB3aWRnZXQ6IHdpZGdldCB9XCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gUmVzaXplIGhhbmRsZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlc2l6ZS1oYW5kbGVcIiAobW91c2Vkb3duKT1cIm9uUmVzaXplU3RhcnQoJGV2ZW50LCB3aWRnZXQpXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTExIDF2MTBIMVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTEgNXY2SDVcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTExIDl2Mkg5XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgfVxuXG4gICAgLmdyaWQtY29udGFpbmVyIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgbWluLWhlaWdodDogMTAwJTtcbiAgICAgIHRyYW5zaXRpb246IGhlaWdodCAwLjI1cyBlYXNlO1xuICAgIH1cblxuICAgIC5ncmlkLXBsYWNlaG9sZGVyIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRhc2gtcGxhY2Vob2xkZXItY29sb3IsIHZhcigtLWRhc2gtYWNjZW50LWNvbG9yLCAjMGE4NGZmKSk7XG4gICAgICBvcGFjaXR5OiAwLjEyO1xuICAgICAgYm9yZGVyLXJhZGl1czogMjRweDtcbiAgICAgIGJvcmRlcjogMnB4IGRhc2hlZCB2YXIoLS1kYXNoLXBsYWNlaG9sZGVyLWNvbG9yLCB2YXIoLS1kYXNoLWFjY2VudC1jb2xvciwgIzBhODRmZikpO1xuICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE1cyBlYXNlLCB0b3AgMC4xNXMgZWFzZSwgd2lkdGggMC4xNXMgZWFzZSwgaGVpZ2h0IDAuMTVzIGVhc2U7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIHotaW5kZXg6IDA7XG4gICAgfVxuXG4gICAgLmdyaWQtaXRlbSB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4yNXMgZWFzZSwgdG9wIDAuMjVzIGVhc2UsIHdpZHRoIDAuMjVzIGVhc2UsIGhlaWdodCAwLjI1cyBlYXNlO1xuICAgICAgYm9yZGVyLXJhZGl1czogMjRweDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgfVxuXG4gICAgLmdyaWQtaXRlbS5pcy1kcmFnZ2luZyxcbiAgICAuZ3JpZC1pdGVtLmlzLXJlc2l6aW5nIHtcbiAgICAgIHRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIG9wYWNpdHk6IDAuODg7XG4gICAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMCAyMHB4IDQwcHggcmdiYSgwLDAsMCwwLjQ1KSk7XG4gICAgfVxuXG4gICAgLyogUmVzaXplIEhhbmRsZSAqL1xuICAgIC5yZXNpemUtaGFuZGxlIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHJpZ2h0OiA0cHg7XG4gICAgICBib3R0b206IDRweDtcbiAgICAgIHdpZHRoOiAyMnB4O1xuICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgY3Vyc29yOiBud3NlLXJlc2l6ZTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBjb2xvcjogdmFyKC0tZGFzaC1yZXNpemUtaGFuZGxlLWNvbG9yLCByZ2JhKDI1NSwyNTUsMjU1LDAuMjUpKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMnMsIGJhY2tncm91bmQgMC4ycztcbiAgICAgIHotaW5kZXg6IDIwO1xuICAgIH1cbiAgICAucmVzaXplLWhhbmRsZTpob3ZlciB7XG4gICAgICBjb2xvcjogdmFyKC0tZGFzaC1hY2NlbnQtY29sb3IsICMwYTg0ZmYpO1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjA2KTtcbiAgICB9XG4gIGBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBDdXN0b21HcmlkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHdpZGdldHM6IFdpZGdldFtdID0gW107XG4gIEBJbnB1dCgpIGNvbHVtbnM6IG51bWJlciA9IDEyO1xuICBASW5wdXQoKSBnYXA6IG51bWJlciA9IDE2O1xuICBASW5wdXQoKSByb3dIZWlnaHQ6IG51bWJlciA9IDgwO1xuICBASW5wdXQoKSBtaW5JdGVtQ29sczogbnVtYmVyID0gMTtcbiAgQElucHV0KCkgbWluSXRlbVJvd3M6IG51bWJlciA9IDE7XG5cbiAgQE91dHB1dCgpIGl0ZW1DaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxXaWRnZXQ+KCk7XG4gIEBPdXRwdXQoKSBsYXlvdXRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxXaWRnZXRbXT4oKTtcblxuICBAVmlld0NoaWxkKCdncmlkQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSkgZ3JpZENvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIC8qKiBUaGUgbmctdGVtcGxhdGUgZGVjb3JhdGVkIHdpdGggZ3JpZENlbGwgZnJvbSB0aGUgcGFyZW50ICovXG4gIEBDb250ZW50Q2hpbGQoR3JpZENlbGxEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgY2VsbFRlbXBsYXRlITogVGVtcGxhdGVSZWY8eyB3aWRnZXQ6IFdpZGdldCB9PjtcblxuICBwbGFjZWhvbGRlcjogeyBsZWZ0OiBudW1iZXI7IHRvcDogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIGNvbnRhaW5lckhlaWdodCA9IDQwMDtcblxuICBkcmFnZ2luZzoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgb2Zmc2V0WDogbnVtYmVyO1xuICAgIG9mZnNldFk6IG51bWJlcjtcbiAgICBjdXJyZW50UGl4ZWxYOiBudW1iZXI7XG4gICAgY3VycmVudFBpeGVsWTogbnVtYmVyO1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgcmVzaXppbmc6IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHN0YXJ0TW91c2VYOiBudW1iZXI7XG4gICAgc3RhcnRNb3VzZVk6IG51bWJlcjtcbiAgICBzdGFydENvbHM6IG51bWJlcjtcbiAgICBzdGFydFJvd3M6IG51bWJlcjtcbiAgICBjdXJyZW50UGl4ZWxXOiBudW1iZXI7XG4gICAgY3VycmVudFBpeGVsSDogbnVtYmVyO1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBwcmV2aWV3V2lkZ2V0czogR3JpZFJlY3RbXSA9IFtdO1xuICBwcml2YXRlIGJvdW5kTW91c2VNb3ZlID0gdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpO1xuICBwcml2YXRlIGJvdW5kTW91c2VVcCA9IHRoaXMub25Nb3VzZVVwLmJpbmQodGhpcyk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB6b25lOiBOZ1pvbmUsIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbXBhY3RBbmRBcHBseSgpO1xuICAgIHRoaXMudXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmJvdW5kTW91c2VNb3ZlKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5ib3VuZE1vdXNlVXApO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoX2NoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLnVwZGF0ZUNvbnRhaW5lckhlaWdodCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuYm91bmRNb3VzZU1vdmUpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5ib3VuZE1vdXNlVXApO1xuICB9XG5cbiAgdHJhY2tCeUZuKF9pbmRleDogbnVtYmVyLCBpdGVtOiBXaWRnZXQpIHsgcmV0dXJuIGl0ZW0uaWQ7IH1cblxuICAvLyDilIDilIAgR2VvbWV0cnkg4pSA4pSAXG5cbiAgcHJpdmF0ZSBnZXQgY2VsbFdpZHRoKCk6IG51bWJlciB7XG4gICAgY29uc3QgY29udGFpbmVyVyA9IHRoaXMuZ3JpZENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudD8uY2xpZW50V2lkdGggPz8gODAwO1xuICAgIHJldHVybiAoY29udGFpbmVyVyAtICh0aGlzLmNvbHVtbnMgLSAxKSAqIHRoaXMuZ2FwKSAvIHRoaXMuY29sdW1ucztcbiAgfVxuXG4gIHByaXZhdGUgY29sVG9QaXhlbChjb2w6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGNvbCAqICh0aGlzLmNlbGxXaWR0aCArIHRoaXMuZ2FwKTtcbiAgfVxuXG4gIHByaXZhdGUgcm93VG9QaXhlbChyb3c6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHJvdyAqICh0aGlzLnJvd0hlaWdodCArIHRoaXMuZ2FwKTtcbiAgfVxuXG4gIHByaXZhdGUgcGl4ZWxUb0NvbChweDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChweCAvICh0aGlzLmNlbGxXaWR0aCArIHRoaXMuZ2FwKSk7XG4gIH1cblxuICBwcml2YXRlIHBpeGVsVG9Sb3cocHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQocHggLyAodGhpcy5yb3dIZWlnaHQgKyB0aGlzLmdhcCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xzVG9QaXhlbFdpZHRoKGNvbHM6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGNvbHMgKiB0aGlzLmNlbGxXaWR0aCArIChjb2xzIC0gMSkgKiB0aGlzLmdhcDtcbiAgfVxuXG4gIHByaXZhdGUgcm93c1RvUGl4ZWxIZWlnaHQocm93czogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcm93cyAqIHRoaXMucm93SGVpZ2h0ICsgKHJvd3MgLSAxKSAqIHRoaXMuZ2FwO1xuICB9XG5cbiAgZ2V0SXRlbUxlZnQodzogV2lkZ2V0KTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kcmFnZ2luZz8uaWQgPT09IHcuaWQgPyB0aGlzLmRyYWdnaW5nLmN1cnJlbnRQaXhlbFggOiB0aGlzLmNvbFRvUGl4ZWwody54KTtcbiAgfVxuXG4gIGdldEl0ZW1Ub3AodzogV2lkZ2V0KTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kcmFnZ2luZz8uaWQgPT09IHcuaWQgPyB0aGlzLmRyYWdnaW5nLmN1cnJlbnRQaXhlbFkgOiB0aGlzLnJvd1RvUGl4ZWwody55KTtcbiAgfVxuXG4gIGdldEl0ZW1XaWR0aCh3OiBXaWRnZXQpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJlc2l6aW5nPy5pZCA9PT0gdy5pZCA/IHRoaXMucmVzaXppbmcuY3VycmVudFBpeGVsVyA6IHRoaXMuY29sc1RvUGl4ZWxXaWR0aCh3LmNvbHMpO1xuICB9XG5cbiAgZ2V0SXRlbUhlaWdodCh3OiBXaWRnZXQpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJlc2l6aW5nPy5pZCA9PT0gdy5pZCA/IHRoaXMucmVzaXppbmcuY3VycmVudFBpeGVsSCA6IHRoaXMucm93c1RvUGl4ZWxIZWlnaHQody5yb3dzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBEcmFnIOKUgOKUgFxuXG4gIG9uRHJhZ1N0YXJ0KGV2ZW50OiBNb3VzZUV2ZW50LCB3aWRnZXQ6IFdpZGdldCkge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJ2J1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGEsIC5yZXNpemUtaGFuZGxlJykpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZ3JpZENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGl0ZW1MZWZ0ID0gdGhpcy5jb2xUb1BpeGVsKHdpZGdldC54KTtcbiAgICBjb25zdCBpdGVtVG9wID0gdGhpcy5yb3dUb1BpeGVsKHdpZGdldC55KTtcblxuICAgIHRoaXMuZHJhZ2dpbmcgPSB7XG4gICAgICBpZDogd2lkZ2V0LmlkLFxuICAgICAgb2Zmc2V0WDogZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIGl0ZW1MZWZ0LFxuICAgICAgb2Zmc2V0WTogZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wIC0gaXRlbVRvcCxcbiAgICAgIGN1cnJlbnRQaXhlbFg6IGl0ZW1MZWZ0LFxuICAgICAgY3VycmVudFBpeGVsWTogaXRlbVRvcCxcbiAgICB9O1xuICAgIHRoaXMucHJldmlld1dpZGdldHMgPSB0aGlzLndpZGdldHMubWFwKHcgPT4gKHsgaWQ6IHcuaWQsIHg6IHcueCwgeTogdy55LCBjb2xzOiB3LmNvbHMsIHJvd3M6IHcucm93cyB9KSk7XG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IHtcbiAgICAgIGxlZnQ6IGl0ZW1MZWZ0LCB0b3A6IGl0ZW1Ub3AsXG4gICAgICB3aWR0aDogdGhpcy5jb2xzVG9QaXhlbFdpZHRoKHdpZGdldC5jb2xzKSxcbiAgICAgIGhlaWdodDogdGhpcy5yb3dzVG9QaXhlbEhlaWdodCh3aWRnZXQucm93cyksXG4gICAgfTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uUmVzaXplU3RhcnQoZXZlbnQ6IE1vdXNlRXZlbnQsIHdpZGdldDogV2lkZ2V0KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnJlc2l6aW5nID0ge1xuICAgICAgaWQ6IHdpZGdldC5pZCxcbiAgICAgIHN0YXJ0TW91c2VYOiBldmVudC5jbGllbnRYLFxuICAgICAgc3RhcnRNb3VzZVk6IGV2ZW50LmNsaWVudFksXG4gICAgICBzdGFydENvbHM6IHdpZGdldC5jb2xzLFxuICAgICAgc3RhcnRSb3dzOiB3aWRnZXQucm93cyxcbiAgICAgIGN1cnJlbnRQaXhlbFc6IHRoaXMuY29sc1RvUGl4ZWxXaWR0aCh3aWRnZXQuY29scyksXG4gICAgICBjdXJyZW50UGl4ZWxIOiB0aGlzLnJvd3NUb1BpeGVsSGVpZ2h0KHdpZGdldC5yb3dzKSxcbiAgICB9O1xuICAgIHRoaXMucHJldmlld1dpZGdldHMgPSB0aGlzLndpZGdldHMubWFwKHcgPT4gKHsgaWQ6IHcuaWQsIHg6IHcueCwgeTogdy55LCBjb2xzOiB3LmNvbHMsIHJvd3M6IHcucm93cyB9KSk7XG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IHtcbiAgICAgIGxlZnQ6IHRoaXMuY29sVG9QaXhlbCh3aWRnZXQueCksIHRvcDogdGhpcy5yb3dUb1BpeGVsKHdpZGdldC55KSxcbiAgICAgIHdpZHRoOiB0aGlzLmNvbHNUb1BpeGVsV2lkdGgod2lkZ2V0LmNvbHMpLFxuICAgICAgaGVpZ2h0OiB0aGlzLnJvd3NUb1BpeGVsSGVpZ2h0KHdpZGdldC5yb3dzKSxcbiAgICB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLmRyYWdnaW5nKSB0aGlzLmhhbmRsZURyYWdNb3ZlKGV2ZW50KTtcbiAgICBlbHNlIGlmICh0aGlzLnJlc2l6aW5nKSB0aGlzLmhhbmRsZVJlc2l6ZU1vdmUoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk1vdXNlVXAoX2V2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZHJhZ2dpbmcpIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5maW5hbGl6ZURyYWcoKSk7XG4gICAgZWxzZSBpZiAodGhpcy5yZXNpemluZykgdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLmZpbmFsaXplUmVzaXplKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEcmFnTW92ZShldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZykgcmV0dXJuO1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmdyaWRDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB3aWRnZXQgPSB0aGlzLndpZGdldHMuZmluZCh3ID0+IHcuaWQgPT09IHRoaXMuZHJhZ2dpbmchLmlkKSE7XG4gICAgaWYgKCF3aWRnZXQpIHJldHVybjtcblxuICAgIGxldCBweCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQgLSB0aGlzLmRyYWdnaW5nLm9mZnNldFg7XG4gICAgbGV0IHB5ID0gZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wIC0gdGhpcy5kcmFnZ2luZy5vZmZzZXRZO1xuICAgIHB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocHgsIHJlY3Qud2lkdGggLSB0aGlzLmNvbHNUb1BpeGVsV2lkdGgod2lkZ2V0LmNvbHMpKSk7XG4gICAgcHkgPSBNYXRoLm1heCgwLCBweSk7XG5cbiAgICB0aGlzLmRyYWdnaW5nLmN1cnJlbnRQaXhlbFggPSBweDtcbiAgICB0aGlzLmRyYWdnaW5nLmN1cnJlbnRQaXhlbFkgPSBweTtcblxuICAgIGNvbnN0IHRhcmdldENvbCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMucGl4ZWxUb0NvbChweCksIHRoaXMuY29sdW1ucyAtIHdpZGdldC5jb2xzKSk7XG4gICAgY29uc3QgdGFyZ2V0Um93ID0gTWF0aC5tYXgoMCwgdGhpcy5waXhlbFRvUm93KHB5KSk7XG5cbiAgICBjb25zdCByZXNvbHZlZCA9IEdyaWRFbmdpbmUubW92ZVdpZGdldChcbiAgICAgIHRoaXMucHJldmlld1dpZGdldHMsXG4gICAgICB7IGlkOiB3aWRnZXQuaWQsIHg6IHdpZGdldC54LCB5OiB3aWRnZXQueSwgY29sczogd2lkZ2V0LmNvbHMsIHJvd3M6IHdpZGdldC5yb3dzIH0sXG4gICAgICB0YXJnZXRDb2wsIHRhcmdldFJvdywgdGhpcy5jb2x1bW5zXG4gICAgKTtcblxuICAgIHRoaXMucGxhY2Vob2xkZXIgPSB7XG4gICAgICBsZWZ0OiB0aGlzLmNvbFRvUGl4ZWwodGFyZ2V0Q29sKSwgdG9wOiB0aGlzLnJvd1RvUGl4ZWwodGFyZ2V0Um93KSxcbiAgICAgIHdpZHRoOiB0aGlzLmNvbHNUb1BpeGVsV2lkdGgod2lkZ2V0LmNvbHMpLFxuICAgICAgaGVpZ2h0OiB0aGlzLnJvd3NUb1BpeGVsSGVpZ2h0KHdpZGdldC5yb3dzKSxcbiAgICB9O1xuXG4gICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHJ3IG9mIHJlc29sdmVkKSB7XG4gICAgICAgIGlmIChydy5pZCA9PT0gd2lkZ2V0LmlkKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkZ2V0cy5maW5kKHd3ID0+IHd3LmlkID09PSBydy5pZCk7XG4gICAgICAgIGlmICh3KSB7IHcueCA9IHJ3Lng7IHcueSA9IHJ3Lnk7IH1cbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmluYWxpemVEcmFnKCkge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZykgcmV0dXJuO1xuICAgIGNvbnN0IHdpZGdldCA9IHRoaXMud2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gdGhpcy5kcmFnZ2luZyEuaWQpITtcbiAgICBjb25zdCB0YXJnZXRDb2wgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLnBpeGVsVG9Db2wodGhpcy5kcmFnZ2luZy5jdXJyZW50UGl4ZWxYKSwgdGhpcy5jb2x1bW5zIC0gd2lkZ2V0LmNvbHMpKTtcbiAgICBjb25zdCB0YXJnZXRSb3cgPSBNYXRoLm1heCgwLCB0aGlzLnBpeGVsVG9Sb3codGhpcy5kcmFnZ2luZy5jdXJyZW50UGl4ZWxZKSk7XG5cbiAgICBjb25zdCByZXNvbHZlZCA9IEdyaWRFbmdpbmUubW92ZVdpZGdldChcbiAgICAgIHRoaXMud2lkZ2V0cy5tYXAodyA9PiAoeyBpZDogdy5pZCwgeDogdy54LCB5OiB3LnksIGNvbHM6IHcuY29scywgcm93czogdy5yb3dzIH0pKSxcbiAgICAgIHsgaWQ6IHdpZGdldC5pZCwgeDogd2lkZ2V0LngsIHk6IHdpZGdldC55LCBjb2xzOiB3aWRnZXQuY29scywgcm93czogd2lkZ2V0LnJvd3MgfSxcbiAgICAgIHRhcmdldENvbCwgdGFyZ2V0Um93LCB0aGlzLmNvbHVtbnNcbiAgICApO1xuICAgIGZvciAoY29uc3Qgcncgb2YgcmVzb2x2ZWQpIHtcbiAgICAgIGNvbnN0IHcgPSB0aGlzLndpZGdldHMuZmluZCh3dyA9PiB3dy5pZCA9PT0gcncuaWQpO1xuICAgICAgaWYgKHcpIHsgdy54ID0gcncueDsgdy55ID0gcncueTsgdy5jb2xzID0gcncuY29sczsgdy5yb3dzID0gcncucm93czsgdGhpcy5pdGVtQ2hhbmdlZC5lbWl0KHcpOyB9XG4gICAgfVxuICAgIHRoaXMuZHJhZ2dpbmcgPSBudWxsO1xuICAgIHRoaXMucGxhY2Vob2xkZXIgPSBudWxsO1xuICAgIHRoaXMucHJldmlld1dpZGdldHMgPSBbXTtcbiAgICB0aGlzLnVwZGF0ZUNvbnRhaW5lckhlaWdodCgpO1xuICAgIHRoaXMubGF5b3V0Q2hhbmdlZC5lbWl0KHRoaXMud2lkZ2V0cyk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlc2l6ZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMucmVzaXppbmcpIHJldHVybjtcbiAgICBjb25zdCB3aWRnZXQgPSB0aGlzLndpZGdldHMuZmluZCh3ID0+IHcuaWQgPT09IHRoaXMucmVzaXppbmchLmlkKSE7XG4gICAgaWYgKCF3aWRnZXQpIHJldHVybjtcblxuICAgIGNvbnN0IGR4ID0gZXZlbnQuY2xpZW50WCAtIHRoaXMucmVzaXppbmcuc3RhcnRNb3VzZVg7XG4gICAgY29uc3QgZHkgPSBldmVudC5jbGllbnRZIC0gdGhpcy5yZXNpemluZy5zdGFydE1vdXNlWTtcblxuICAgIGxldCBuZXdDb2xzID0gTWF0aC5tYXgodGhpcy5taW5JdGVtQ29scywgTWF0aC5yb3VuZCgodGhpcy5jb2xzVG9QaXhlbFdpZHRoKHRoaXMucmVzaXppbmcuc3RhcnRDb2xzKSArIGR4KSAvICh0aGlzLmNlbGxXaWR0aCArIHRoaXMuZ2FwKSkpO1xuICAgIGxldCBuZXdSb3dzID0gTWF0aC5tYXgodGhpcy5taW5JdGVtUm93cywgTWF0aC5yb3VuZCgodGhpcy5yb3dzVG9QaXhlbEhlaWdodCh0aGlzLnJlc2l6aW5nLnN0YXJ0Um93cykgKyBkeSkgLyAodGhpcy5yb3dIZWlnaHQgKyB0aGlzLmdhcCkpKTtcbiAgICBuZXdDb2xzID0gTWF0aC5taW4obmV3Q29scywgdGhpcy5jb2x1bW5zIC0gd2lkZ2V0LngpO1xuXG4gICAgdGhpcy5yZXNpemluZy5jdXJyZW50UGl4ZWxXID0gdGhpcy5jb2xzVG9QaXhlbFdpZHRoKG5ld0NvbHMpO1xuICAgIHRoaXMucmVzaXppbmcuY3VycmVudFBpeGVsSCA9IHRoaXMucm93c1RvUGl4ZWxIZWlnaHQobmV3Um93cyk7XG5cbiAgICBjb25zdCByZXNvbHZlZCA9IEdyaWRFbmdpbmUucmVzaXplV2lkZ2V0KFxuICAgICAgdGhpcy5wcmV2aWV3V2lkZ2V0cyxcbiAgICAgIHsgaWQ6IHdpZGdldC5pZCwgeDogd2lkZ2V0LngsIHk6IHdpZGdldC55LCBjb2xzOiB3aWRnZXQuY29scywgcm93czogd2lkZ2V0LnJvd3MgfSxcbiAgICAgIG5ld0NvbHMsIG5ld1Jvd3MsIHRoaXMuY29sdW1uc1xuICAgICk7XG5cbiAgICB0aGlzLnBsYWNlaG9sZGVyID0ge1xuICAgICAgbGVmdDogdGhpcy5jb2xUb1BpeGVsKHdpZGdldC54KSwgdG9wOiB0aGlzLnJvd1RvUGl4ZWwod2lkZ2V0LnkpLFxuICAgICAgd2lkdGg6IHRoaXMuY29sc1RvUGl4ZWxXaWR0aChuZXdDb2xzKSxcbiAgICAgIGhlaWdodDogdGhpcy5yb3dzVG9QaXhlbEhlaWdodChuZXdSb3dzKSxcbiAgICB9O1xuXG4gICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHJ3IG9mIHJlc29sdmVkKSB7XG4gICAgICAgIGlmIChydy5pZCA9PT0gd2lkZ2V0LmlkKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkZ2V0cy5maW5kKHd3ID0+IHd3LmlkID09PSBydy5pZCk7XG4gICAgICAgIGlmICh3KSB7IHcueCA9IHJ3Lng7IHcueSA9IHJ3Lnk7IH1cbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmluYWxpemVSZXNpemUoKSB7XG4gICAgaWYgKCF0aGlzLnJlc2l6aW5nKSByZXR1cm47XG4gICAgY29uc3Qgd2lkZ2V0ID0gdGhpcy53aWRnZXRzLmZpbmQodyA9PiB3LmlkID09PSB0aGlzLnJlc2l6aW5nIS5pZCkhO1xuXG4gICAgbGV0IG5ld0NvbHMgPSBNYXRoLm1heCh0aGlzLm1pbkl0ZW1Db2xzLCBNYXRoLnJvdW5kKHRoaXMucmVzaXppbmcuY3VycmVudFBpeGVsVyAvICh0aGlzLmNlbGxXaWR0aCArIHRoaXMuZ2FwKSkpO1xuICAgIGxldCBuZXdSb3dzID0gTWF0aC5tYXgodGhpcy5taW5JdGVtUm93cywgTWF0aC5yb3VuZCh0aGlzLnJlc2l6aW5nLmN1cnJlbnRQaXhlbEggLyAodGhpcy5yb3dIZWlnaHQgKyB0aGlzLmdhcCkpKTtcbiAgICBuZXdDb2xzID0gTWF0aC5taW4obmV3Q29scywgdGhpcy5jb2x1bW5zIC0gd2lkZ2V0LngpO1xuXG4gICAgY29uc3QgcmVzb2x2ZWQgPSBHcmlkRW5naW5lLnJlc2l6ZVdpZGdldChcbiAgICAgIHRoaXMud2lkZ2V0cy5tYXAodyA9PiAoeyBpZDogdy5pZCwgeDogdy54LCB5OiB3LnksIGNvbHM6IHcuY29scywgcm93czogdy5yb3dzIH0pKSxcbiAgICAgIHsgaWQ6IHdpZGdldC5pZCwgeDogd2lkZ2V0LngsIHk6IHdpZGdldC55LCBjb2xzOiB3aWRnZXQuY29scywgcm93czogd2lkZ2V0LnJvd3MgfSxcbiAgICAgIG5ld0NvbHMsIG5ld1Jvd3MsIHRoaXMuY29sdW1uc1xuICAgICk7XG4gICAgZm9yIChjb25zdCBydyBvZiByZXNvbHZlZCkge1xuICAgICAgY29uc3QgdyA9IHRoaXMud2lkZ2V0cy5maW5kKHd3ID0+IHd3LmlkID09PSBydy5pZCk7XG4gICAgICBpZiAodykgeyB3LnggPSBydy54OyB3LnkgPSBydy55OyB3LmNvbHMgPSBydy5jb2xzOyB3LnJvd3MgPSBydy5yb3dzOyB0aGlzLml0ZW1DaGFuZ2VkLmVtaXQodyk7IH1cbiAgICB9XG4gICAgdGhpcy5yZXNpemluZyA9IG51bGw7XG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IG51bGw7XG4gICAgdGhpcy5wcmV2aWV3V2lkZ2V0cyA9IFtdO1xuICAgIHRoaXMudXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XG4gICAgdGhpcy5sYXlvdXRDaGFuZ2VkLmVtaXQodGhpcy53aWRnZXRzKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBVdGlsaXRpZXMg4pSA4pSAXG5cbiAgcHJpdmF0ZSBjb21wYWN0QW5kQXBwbHkoKSB7XG4gICAgaWYgKCF0aGlzLndpZGdldHM/Lmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbXBhY3RlZCA9IEdyaWRFbmdpbmUuY29tcGFjdChcbiAgICAgIHRoaXMud2lkZ2V0cy5tYXAodyA9PiAoeyBpZDogdy5pZCwgeDogdy54LCB5OiB3LnksIGNvbHM6IHcuY29scywgcm93czogdy5yb3dzIH0pKSxcbiAgICAgIHRoaXMuY29sdW1uc1xuICAgICk7XG4gICAgZm9yIChjb25zdCBydyBvZiBjb21wYWN0ZWQpIHtcbiAgICAgIGNvbnN0IHcgPSB0aGlzLndpZGdldHMuZmluZCh3dyA9PiB3dy5pZCA9PT0gcncuaWQpO1xuICAgICAgaWYgKHcpIHsgdy54ID0gcncueDsgdy55ID0gcncueTsgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29udGFpbmVySGVpZ2h0KCkge1xuICAgIGlmICghdGhpcy53aWRnZXRzPy5sZW5ndGgpIHsgdGhpcy5jb250YWluZXJIZWlnaHQgPSA0MDA7IHJldHVybjsgfVxuICAgIGNvbnN0IG1heFJvdyA9IEdyaWRFbmdpbmUuZ2V0R3JpZEhlaWdodChcbiAgICAgIHRoaXMud2lkZ2V0cy5tYXAodyA9PiAoeyBpZDogdy5pZCwgeDogdy54LCB5OiB3LnksIGNvbHM6IHcuY29scywgcm93czogdy5yb3dzIH0pKVxuICAgICk7XG4gICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSB0aGlzLnJvd1RvUGl4ZWwobWF4Um93KSArIHRoaXMucm93SGVpZ2h0ICsgdGhpcy5nYXA7XG4gIH1cbn1cbiJdfQ==