@ogidor/dashboard 1.0.16 → 1.0.18

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
@@ -2,7 +2,7 @@
2
2
 
3
3
  A lightweight, content-agnostic drag-and-drop dashboard library for Angular 15.
4
4
  Drop it into any project, supply your own card content, and get a fully featured
5
- multi-workspace grid with persistent layout, pop-out windows, and live cross-tab
5
+ multi-workspace grid with pluggable persistence, pop-out windows, and live cross-tab
6
6
  sync — out of the box.
7
7
 
8
8
  ---
@@ -30,7 +30,7 @@ sync — out of the box.
30
30
  - **Multi-Workspace** — unlimited tabbed workspaces, each with its own independent layout.
31
31
  - **Independent Pop-out Layouts** — pop a workspace into its own window; dragging there never affects the main window.
32
32
  - **Structural Sync** — adding, removing, or renaming a widget in any window instantly appears in all open windows via `BroadcastChannel`.
33
- - **Persistent Layout** — state is saved to `localStorage` on every change and restored on reload.
33
+ - **Pluggable Persistence** — localStorage by default, or inject your own DB/API adapter.
34
34
  - **Content-Agnostic Cards** — you own the card body; stamp any Angular component, chart, or markup inside via `ng-template`.
35
35
  - **Fully Themeable** — 36 colour tokens plus font family, controllable via a typed `DashboardTheme` input or CSS custom properties.
36
36
 
@@ -252,6 +252,13 @@ export { WidgetRendererComponent } from '@ogidor/dashboard';
252
252
  export { CustomGridComponent } from '@ogidor/dashboard';
253
253
  export { GridCellDirective } from '@ogidor/dashboard';
254
254
  export { DashboardStateService } from '@ogidor/dashboard';
255
+ export {
256
+ DashboardPersistence,
257
+ LocalStorageDashboardPersistence,
258
+ DASHBOARD_PERSISTENCE,
259
+ DASHBOARD_PERSISTENCE_CONTEXT,
260
+ PositionMap,
261
+ } from '@ogidor/dashboard';
255
262
  export { Widget, Page, DashboardConfig, DashboardTheme } from '@ogidor/dashboard';
256
263
  ```
257
264
 
@@ -505,26 +512,89 @@ this.state.popOutPage(pageId);
505
512
 
506
513
  ## Persisting Layouts
507
514
 
508
- State is saved to `localStorage` automatically on every change.
515
+ By default, state is saved to `localStorage` automatically on every change.
509
516
 
510
517
  | Key | Contents |
511
518
  |---|---|
512
- | `ogidor_shared` | Page list and widget metadata. Shared across all windows. |
513
- | `ogidor_positions_main` | Grid positions for the main window. |
514
- | `ogidor_positions_<pageId>` | Grid positions for each pop-out window. |
519
+ | `ogidor_shared` | Page list and widget metadata for the default dashboard context. |
520
+ | `ogidor_positions_main` | Grid positions for the main window (default context). |
521
+ | `ogidor_positions_<pageId>` | Grid positions for each pop-out window (default context). |
522
+
523
+ For multi-tenant scenarios, provide `DASHBOARD_PERSISTENCE_CONTEXT` with a custom `dashboardId`; keys are namespaced automatically in the default localStorage adapter.
524
+
525
+ ### Use a database/API instead of localStorage
515
526
 
516
- To save and restore via a backend:
527
+ Provide your own implementation of `DashboardPersistence` and override the `DASHBOARD_PERSISTENCE` token.
517
528
 
518
529
  ```typescript
519
- // Save
520
- const json = this.dash.serializeLayout();
521
- await api.save(json);
530
+ import { Injectable, NgModule } from '@angular/core';
531
+ import { HttpClient } from '@angular/common/http';
532
+ import {
533
+ DashboardConfig,
534
+ DashboardModule,
535
+ DashboardPersistence,
536
+ DASHBOARD_PERSISTENCE,
537
+ DASHBOARD_PERSISTENCE_CONTEXT,
538
+ PositionMap,
539
+ } from '@ogidor/dashboard';
540
+
541
+ @Injectable()
542
+ export class HttpDashboardPersistence extends DashboardPersistence {
543
+ constructor(private http: HttpClient) { super(); }
544
+
545
+ loadShared(dashboardId: string) {
546
+ return this.http
547
+ .get<DashboardConfig | null>(`/api/dashboards/${encodeURIComponent(dashboardId)}/shared`)
548
+ .toPromise();
549
+ }
550
+
551
+ saveShared(dashboardId: string, shared: DashboardConfig) {
552
+ return this.http
553
+ .put<void>(`/api/dashboards/${encodeURIComponent(dashboardId)}/shared`, shared)
554
+ .toPromise()
555
+ .then(() => undefined);
556
+ }
557
+
558
+ loadPositions(dashboardId: string, windowId: string) {
559
+ return this.http
560
+ .get<PositionMap | null>(`/api/dashboards/${encodeURIComponent(dashboardId)}/positions/${encodeURIComponent(windowId)}`)
561
+ .toPromise();
562
+ }
563
+
564
+ savePositions(dashboardId: string, windowId: string, positions: PositionMap) {
565
+ return this.http
566
+ .put<void>(`/api/dashboards/${encodeURIComponent(dashboardId)}/positions/${encodeURIComponent(windowId)}`, positions)
567
+ .toPromise()
568
+ .then(() => undefined);
569
+ }
570
+ }
522
571
 
523
- // Restore
524
- const json = await api.load();
525
- this.dash.stateService.loadLayout(JSON.parse(json));
572
+ @NgModule({
573
+ imports: [DashboardModule],
574
+ providers: [
575
+ { provide: DASHBOARD_PERSISTENCE, useClass: HttpDashboardPersistence },
576
+ { provide: DASHBOARD_PERSISTENCE_CONTEXT, useValue: { dashboardId: 'customer-123' } },
577
+ ],
578
+ })
579
+ export class AppModule {}
526
580
  ```
527
581
 
582
+ Recommended backend endpoints:
583
+
584
+ - `GET /api/dashboards/:dashboardId/shared`
585
+ - `PUT /api/dashboards/:dashboardId/shared`
586
+ - `GET /api/dashboards/:dashboardId/positions/:windowId`
587
+ - `PUT /api/dashboards/:dashboardId/positions/:windowId`
588
+
589
+ ### Migration tip
590
+
591
+ If users already have data in localStorage, run a one-time migration in your app:
592
+
593
+ 1. Read `ogidor_shared` and `ogidor_positions_*` from localStorage.
594
+ 2. Upload them to your backend using the new API.
595
+ 3. Set a migration flag (for example `ogidor_migrated=true`).
596
+ 4. Use your HTTP persistence adapter as the source of truth from then on.
597
+
528
598
  ---
529
599
 
530
600
  ## Full Integration Example
@@ -64,7 +64,7 @@ export declare class CustomGridComponent implements OnInit, OnDestroy, OnChanges
64
64
  private boundMouseUp;
65
65
  constructor(zone: NgZone, cdr: ChangeDetectorRef);
66
66
  ngOnInit(): void;
67
- ngOnChanges(_changes: SimpleChanges): void;
67
+ ngOnChanges(changes: SimpleChanges): void;
68
68
  ngOnDestroy(): void;
69
69
  trackByFn(_index: number, item: Widget): string;
70
70
  private get cellWidth();
@@ -87,6 +87,7 @@ export declare class CustomGridComponent implements OnInit, OnDestroy, OnChanges
87
87
  private handleResizeMove;
88
88
  private finalizeResize;
89
89
  private compactAndApply;
90
+ private applyCompactionAndSync;
90
91
  private updateContainerHeight;
91
92
  static ɵfac: i0.ɵɵFactoryDeclaration<CustomGridComponent, never>;
92
93
  static ɵcmp: i0.ɵɵComponentDeclaration<CustomGridComponent, "app-grid", never, { "widgets": "widgets"; "columns": "columns"; "gap": "gap"; "rowHeight": "rowHeight"; "minItemCols": "minItemCols"; "minItemRows": "minItemRows"; }, { "itemChanged": "itemChanged"; "layoutChanged": "layoutChanged"; }, ["cellTemplate"], never, false, never>;
@@ -0,0 +1,37 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ import { DashboardConfig } from './models';
3
+ import * as i0 from "@angular/core";
4
+ export type PositionMap = Record<string, {
5
+ x: number;
6
+ y: number;
7
+ cols: number;
8
+ rows: number;
9
+ }>;
10
+ export interface DashboardPersistenceContext {
11
+ dashboardId: string;
12
+ }
13
+ export declare const DASHBOARD_PERSISTENCE: InjectionToken<DashboardPersistence>;
14
+ export declare const DASHBOARD_PERSISTENCE_CONTEXT: InjectionToken<DashboardPersistenceContext>;
15
+ export declare abstract class DashboardPersistence {
16
+ abstract loadShared(dashboardId: string): Promise<DashboardConfig | null>;
17
+ abstract saveShared(dashboardId: string, shared: DashboardConfig): Promise<void>;
18
+ abstract loadPositions(dashboardId: string, windowId: string): Promise<PositionMap | null>;
19
+ abstract savePositions(dashboardId: string, windowId: string, positions: PositionMap): Promise<void>;
20
+ }
21
+ export declare class LocalStorageDashboardPersistence implements DashboardPersistence {
22
+ loadShared(dashboardId: string): Promise<DashboardConfig | null>;
23
+ saveShared(dashboardId: string, shared: DashboardConfig): Promise<void>;
24
+ loadPositions(dashboardId: string, windowId: string): Promise<PositionMap | null>;
25
+ savePositions(dashboardId: string, windowId: string, positions: PositionMap): Promise<void>;
26
+ private _sharedKey;
27
+ private _positionsKey;
28
+ static ɵfac: i0.ɵɵFactoryDeclaration<LocalStorageDashboardPersistence, never>;
29
+ static ɵprov: i0.ɵɵInjectableDeclaration<LocalStorageDashboardPersistence>;
30
+ }
31
+ export declare function resolveDefaultDashboardId(): string;
32
+ export declare class DashboardPersistenceFacade {
33
+ readonly dashboardId: string;
34
+ constructor(context: DashboardPersistenceContext | null);
35
+ static ɵfac: i0.ɵɵFactoryDeclaration<DashboardPersistenceFacade, [{ optional: true; }]>;
36
+ static ɵprov: i0.ɵɵInjectableDeclaration<DashboardPersistenceFacade>;
37
+ }
@@ -1,21 +1,14 @@
1
1
  import { NgZone, OnDestroy } from '@angular/core';
2
2
  import { Page, Widget } from './models';
3
+ import { DashboardPersistence, DashboardPersistenceFacade, LocalStorageDashboardPersistence } from './dashboard-persistence';
3
4
  import * as i0 from "@angular/core";
4
5
  export declare class DashboardStateService implements OnDestroy {
5
6
  private zone;
6
- /**
7
- * Shared key — stores page list + widget metadata (no positions).
8
- * Read and written by every window.
9
- */
10
- private readonly SHARED_KEY;
11
- /**
12
- * Per-window positions key — stores {pageId:widgetId → {x,y,cols,rows}}.
13
- * Pop-out windows get a key scoped to their pageId so they never overwrite
14
- * the main window or each other.
15
- * main window → ogidor_positions_main
16
- * pop-out #abc → ogidor_positions_abc
17
- */
18
- private readonly positionsKey;
7
+ private persistenceFacade;
8
+ private localPersistence;
9
+ private persistence;
10
+ private readonly windowId;
11
+ private readonly dashboardId;
19
12
  private readonly CHANNEL_NAME;
20
13
  private channel;
21
14
  private readonly initialPages;
@@ -23,7 +16,7 @@ export declare class DashboardStateService implements OnDestroy {
23
16
  private activePageIdSubject;
24
17
  pages$: import("rxjs").Observable<Page[]>;
25
18
  activePageId$: import("rxjs").Observable<string>;
26
- constructor(zone: NgZone);
19
+ constructor(zone: NgZone, persistenceFacade: DashboardPersistenceFacade, localPersistence: LocalStorageDashboardPersistence, persistence: DashboardPersistence | null);
27
20
  ngOnDestroy(): void;
28
21
  getActivePage(): Page | undefined;
29
22
  setActivePage(id: string): void;
@@ -34,37 +27,17 @@ export declare class DashboardStateService implements OnDestroy {
34
27
  }): Widget;
35
28
  updateWidget(widgetId: string, patch: Partial<Omit<Widget, 'id' | 'x' | 'y' | 'cols' | 'rows'>>): void;
36
29
  removeWidget(widgetId: string): void;
37
- /**
38
- * Update a widget's grid position/size.
39
- * Saved only for this window — never broadcast to others.
40
- */
41
30
  updateWidgetPosition(pageId: string, widgetId: string, x: number, y: number, cols: number, rows: number): void;
42
31
  serializeLayout(): string;
43
32
  loadLayout(config: any): void;
44
33
  popOutPage(pageId: string): void;
45
- /**
46
- * Save page list + widget metadata (titles, cardColor, data) — no positions.
47
- */
48
34
  private _saveShared;
49
- /**
50
- * Save this window's grid positions (x, y, cols, rows) per widget.
51
- */
52
35
  private _savePositions;
53
- /**
54
- * Overlay the positions saved for THIS window on top of the current pages.
55
- */
56
- private _restorePositions;
57
- /**
58
- * Apply a shared config object (page list + metadata) without touching
59
- * this window's saved positions.
60
- */
36
+ private _applyPositions;
61
37
  private _applyShared;
62
- /**
63
- * Handle a structural sync event arriving from another window.
64
- * Position changes are never sent so we never receive them here.
65
- */
66
38
  private _onSyncEvent;
67
39
  private _broadcast;
68
- static ɵfac: i0.ɵɵFactoryDeclaration<DashboardStateService, never>;
40
+ private _bootstrapFromPersistence;
41
+ static ɵfac: i0.ɵɵFactoryDeclaration<DashboardStateService, [null, null, null, { optional: true; }]>;
69
42
  static ɵprov: i0.ɵɵInjectableDeclaration<DashboardStateService>;
70
43
  }
@@ -5,6 +5,7 @@ import { DashboardComponent, OverflowActivePipe } from './dashboard.component';
5
5
  import { WidgetRendererComponent } from './widget-renderer.component';
6
6
  import { CustomGridComponent, GridCellDirective } from './custom-grid.component';
7
7
  import { DashboardStateService } from './dashboard-state.service';
8
+ import { DASHBOARD_PERSISTENCE, LocalStorageDashboardPersistence, } from './dashboard-persistence';
8
9
  import * as i0 from "@angular/core";
9
10
  export class DashboardModule {
10
11
  }
@@ -18,7 +19,10 @@ DashboardModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version
18
19
  WidgetRendererComponent,
19
20
  CustomGridComponent,
20
21
  GridCellDirective] });
21
- DashboardModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardModule, providers: [DashboardStateService], imports: [CommonModule] });
22
+ DashboardModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardModule, providers: [
23
+ DashboardStateService,
24
+ { provide: DASHBOARD_PERSISTENCE, useExisting: LocalStorageDashboardPersistence },
25
+ ], imports: [CommonModule] });
22
26
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardModule, decorators: [{
23
27
  type: NgModule,
24
28
  args: [{
@@ -32,7 +36,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
32
36
  imports: [
33
37
  CommonModule,
34
38
  ],
35
- providers: [DashboardStateService],
39
+ providers: [
40
+ DashboardStateService,
41
+ { provide: DASHBOARD_PERSISTENCE, useExisting: LocalStorageDashboardPersistence },
42
+ ],
36
43
  exports: [
37
44
  DashboardComponent,
38
45
  OverflowActivePipe,
@@ -58,4 +65,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
58
65
  bootstrap: [DashboardComponent],
59
66
  }]
60
67
  }] });
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAvYXBwLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBc0JsRSxNQUFNLE9BQU8sZUFBZTs7NkdBQWYsZUFBZTs4R0FBZixlQUFlLGlCQWxCeEIsa0JBQWtCO1FBQ2xCLGtCQUFrQjtRQUNsQix1QkFBdUI7UUFDdkIsbUJBQW1CO1FBQ25CLGlCQUFpQixhQUdqQixZQUFZLGFBSVosa0JBQWtCO1FBQ2xCLGtCQUFrQjtRQUNsQix1QkFBdUI7UUFDdkIsbUJBQW1CO1FBQ25CLGlCQUFpQjs4R0FHUixlQUFlLGFBVGYsQ0FBQyxxQkFBcUIsQ0FBQyxZQUZoQyxZQUFZOzRGQVdILGVBQWU7a0JBcEIzQixRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRTt3QkFDWixrQkFBa0I7d0JBQ2xCLGtCQUFrQjt3QkFDbEIsdUJBQXVCO3dCQUN2QixtQkFBbUI7d0JBQ25CLGlCQUFpQjtxQkFDbEI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLFlBQVk7cUJBQ2I7b0JBQ0QsU0FBUyxFQUFFLENBQUMscUJBQXFCLENBQUM7b0JBQ2xDLE9BQU8sRUFBRTt3QkFDUCxrQkFBa0I7d0JBQ2xCLGtCQUFrQjt3QkFDbEIsdUJBQXVCO3dCQUN2QixtQkFBbUI7d0JBQ25CLGlCQUFpQjtxQkFDbEI7aUJBQ0Y7O0FBR0Q7OztHQUdHO0FBS0gsTUFBTSxPQUFPLFNBQVM7O3VHQUFULFNBQVM7d0dBQVQsU0FBUyxjQUZSLGtCQUFrQixhQURwQixhQUFhLEVBUFosZUFBZTt3R0FVZixTQUFTLFlBSFYsYUFBYSxFQUFFLGVBQWU7NEZBRzdCLFNBQVM7a0JBSnJCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQztvQkFDekMsU0FBUyxFQUFFLENBQUMsa0JBQWtCLENBQUM7aUJBQ2hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJyb3dzZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IERhc2hib2FyZENvbXBvbmVudCwgT3ZlcmZsb3dBY3RpdmVQaXBlIH0gZnJvbSAnLi9kYXNoYm9hcmQuY29tcG9uZW50JztcbmltcG9ydCB7IFdpZGdldFJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi93aWRnZXQtcmVuZGVyZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEN1c3RvbUdyaWRDb21wb25lbnQsIEdyaWRDZWxsRGlyZWN0aXZlIH0gZnJvbSAnLi9jdXN0b20tZ3JpZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGFzaGJvYXJkU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi9kYXNoYm9hcmQtc3RhdGUuc2VydmljZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIERhc2hib2FyZENvbXBvbmVudCxcbiAgICBPdmVyZmxvd0FjdGl2ZVBpcGUsXG4gICAgV2lkZ2V0UmVuZGVyZXJDb21wb25lbnQsXG4gICAgQ3VzdG9tR3JpZENvbXBvbmVudCxcbiAgICBHcmlkQ2VsbERpcmVjdGl2ZSxcbiAgXSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgXSxcbiAgcHJvdmlkZXJzOiBbRGFzaGJvYXJkU3RhdGVTZXJ2aWNlXSxcbiAgZXhwb3J0czogW1xuICAgIERhc2hib2FyZENvbXBvbmVudCxcbiAgICBPdmVyZmxvd0FjdGl2ZVBpcGUsXG4gICAgV2lkZ2V0UmVuZGVyZXJDb21wb25lbnQsXG4gICAgQ3VzdG9tR3JpZENvbXBvbmVudCxcbiAgICBHcmlkQ2VsbERpcmVjdGl2ZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkTW9kdWxlIHt9XG5cbi8qKlxuICogUm9vdCBtb2R1bGUgZm9yIGxvY2FsIGRlbW8gLyB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG4gKiBMaWJyYXJ5IGNvbnN1bWVycyBpbXBvcnQgRGFzaGJvYXJkTW9kdWxlLCBub3QgQXBwTW9kdWxlLlxuICovXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQnJvd3Nlck1vZHVsZSwgRGFzaGJvYXJkTW9kdWxlXSxcbiAgYm9vdHN0cmFwOiBbRGFzaGJvYXJkQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgQXBwTW9kdWxlIHt9XG4iXX0=
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAvYXBwLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixnQ0FBZ0MsR0FDakMsTUFBTSx5QkFBeUIsQ0FBQzs7QUF5QmpDLE1BQU0sT0FBTyxlQUFlOzs2R0FBZixlQUFlOzhHQUFmLGVBQWUsaUJBckJ4QixrQkFBa0I7UUFDbEIsa0JBQWtCO1FBQ2xCLHVCQUF1QjtRQUN2QixtQkFBbUI7UUFDbkIsaUJBQWlCLGFBR2pCLFlBQVksYUFPWixrQkFBa0I7UUFDbEIsa0JBQWtCO1FBQ2xCLHVCQUF1QjtRQUN2QixtQkFBbUI7UUFDbkIsaUJBQWlCOzhHQUdSLGVBQWUsYUFaZjtRQUNULHFCQUFxQjtRQUNyQixFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsZ0NBQWdDLEVBQUU7S0FDbEYsWUFMQyxZQUFZOzRGQWNILGVBQWU7a0JBdkIzQixRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRTt3QkFDWixrQkFBa0I7d0JBQ2xCLGtCQUFrQjt3QkFDbEIsdUJBQXVCO3dCQUN2QixtQkFBbUI7d0JBQ25CLGlCQUFpQjtxQkFDbEI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLFlBQVk7cUJBQ2I7b0JBQ0QsU0FBUyxFQUFFO3dCQUNULHFCQUFxQjt3QkFDckIsRUFBRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsV0FBVyxFQUFFLGdDQUFnQyxFQUFFO3FCQUNsRjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1Asa0JBQWtCO3dCQUNsQixrQkFBa0I7d0JBQ2xCLHVCQUF1Qjt3QkFDdkIsbUJBQW1CO3dCQUNuQixpQkFBaUI7cUJBQ2xCO2lCQUNGOztBQUdEOzs7R0FHRztBQUtILE1BQU0sT0FBTyxTQUFTOzt1R0FBVCxTQUFTO3dHQUFULFNBQVMsY0FGUixrQkFBa0IsYUFEcEIsYUFBYSxFQVBaLGVBQWU7d0dBVWYsU0FBUyxZQUhWLGFBQWEsRUFBRSxlQUFlOzRGQUc3QixTQUFTO2tCQUpyQixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLGFBQWEsRUFBRSxlQUFlLENBQUM7b0JBQ3pDLFNBQVMsRUFBRSxDQUFDLGtCQUFrQixDQUFDO2lCQUNoQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCcm93c2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5pbXBvcnQgeyBEYXNoYm9hcmRDb21wb25lbnQsIE92ZXJmbG93QWN0aXZlUGlwZSB9IGZyb20gJy4vZGFzaGJvYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXaWRnZXRSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4vd2lkZ2V0LXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDdXN0b21HcmlkQ29tcG9uZW50LCBHcmlkQ2VsbERpcmVjdGl2ZSB9IGZyb20gJy4vY3VzdG9tLWdyaWQuY29tcG9uZW50JztcbmltcG9ydCB7IERhc2hib2FyZFN0YXRlU2VydmljZSB9IGZyb20gJy4vZGFzaGJvYXJkLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgREFTSEJPQVJEX1BFUlNJU1RFTkNFLFxuICBMb2NhbFN0b3JhZ2VEYXNoYm9hcmRQZXJzaXN0ZW5jZSxcbn0gZnJvbSAnLi9kYXNoYm9hcmQtcGVyc2lzdGVuY2UnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBEYXNoYm9hcmRDb21wb25lbnQsXG4gICAgT3ZlcmZsb3dBY3RpdmVQaXBlLFxuICAgIFdpZGdldFJlbmRlcmVyQ29tcG9uZW50LFxuICAgIEN1c3RvbUdyaWRDb21wb25lbnQsXG4gICAgR3JpZENlbGxEaXJlY3RpdmUsXG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIERhc2hib2FyZFN0YXRlU2VydmljZSxcbiAgICB7IHByb3ZpZGU6IERBU0hCT0FSRF9QRVJTSVNURU5DRSwgdXNlRXhpc3Rpbmc6IExvY2FsU3RvcmFnZURhc2hib2FyZFBlcnNpc3RlbmNlIH0sXG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBEYXNoYm9hcmRDb21wb25lbnQsXG4gICAgT3ZlcmZsb3dBY3RpdmVQaXBlLFxuICAgIFdpZGdldFJlbmRlcmVyQ29tcG9uZW50LFxuICAgIEN1c3RvbUdyaWRDb21wb25lbnQsXG4gICAgR3JpZENlbGxEaXJlY3RpdmUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIERhc2hib2FyZE1vZHVsZSB7fVxuXG4vKipcbiAqIFJvb3QgbW9kdWxlIGZvciBsb2NhbCBkZW1vIC8gdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuICogTGlicmFyeSBjb25zdW1lcnMgaW1wb3J0IERhc2hib2FyZE1vZHVsZSwgbm90IEFwcE1vZHVsZS5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0Jyb3dzZXJNb2R1bGUsIERhc2hib2FyZE1vZHVsZV0sXG4gIGJvb3RzdHJhcDogW0Rhc2hib2FyZENvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIEFwcE1vZHVsZSB7fVxuIl19
@@ -140,15 +140,23 @@ export class CustomGridComponent {
140
140
  this.boundMouseUp = this.onMouseUp.bind(this);
141
141
  }
142
142
  ngOnInit() {
143
- this.compactAndApply();
143
+ this.applyCompactionAndSync();
144
144
  this.updateContainerHeight();
145
145
  this.zone.runOutsideAngular(() => {
146
146
  window.addEventListener('mousemove', this.boundMouseMove);
147
147
  window.addEventListener('mouseup', this.boundMouseUp);
148
148
  });
149
149
  }
150
- ngOnChanges(_changes) {
150
+ ngOnChanges(changes) {
151
+ if (this.dragging || this.resizing) {
152
+ this.updateContainerHeight();
153
+ return;
154
+ }
155
+ if (changes['widgets'] || changes['columns']) {
156
+ this.applyCompactionAndSync();
157
+ }
151
158
  this.updateContainerHeight();
159
+ this.cdr.markForCheck();
152
160
  }
153
161
  ngOnDestroy() {
154
162
  window.removeEventListener('mousemove', this.boundMouseMove);
@@ -367,15 +375,32 @@ export class CustomGridComponent {
367
375
  // ── Utilities ──
368
376
  compactAndApply() {
369
377
  if (!this.widgets?.length)
370
- return;
378
+ return [];
371
379
  const compacted = GridEngine.compact(this.widgets.map(w => ({ id: w.id, x: w.x, y: w.y, cols: w.cols, rows: w.rows })), this.columns);
380
+ const changedWidgets = [];
372
381
  for (const rw of compacted) {
373
382
  const w = this.widgets.find(ww => ww.id === rw.id);
374
- if (w) {
383
+ if (!w)
384
+ continue;
385
+ const changed = w.x !== rw.x || w.y !== rw.y || w.cols !== rw.cols || w.rows !== rw.rows;
386
+ if (changed) {
375
387
  w.x = rw.x;
376
388
  w.y = rw.y;
389
+ w.cols = rw.cols;
390
+ w.rows = rw.rows;
391
+ changedWidgets.push(w);
377
392
  }
378
393
  }
394
+ return changedWidgets;
395
+ }
396
+ applyCompactionAndSync() {
397
+ const changedWidgets = this.compactAndApply();
398
+ if (!changedWidgets.length)
399
+ return;
400
+ for (const widget of changedWidgets) {
401
+ this.itemChanged.emit(widget);
402
+ }
403
+ this.layoutChanged.emit(this.widgets);
379
404
  }
380
405
  updateContainerHeight() {
381
406
  if (!this.widgets?.length) {
@@ -506,4 +531,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
506
531
  type: ContentChild,
507
532
  args: [GridCellDirective, { read: TemplateRef }]
508
533
  }] } });
509
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcC9jdXN0b20tZ3JpZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFDdEMsU0FBUyxFQUNULFlBQVksRUFBRSxXQUFXLEVBQ3pCLFNBQVMsRUFBRSx1QkFBdUIsRUFDbkMsTUFBTSxlQUFlLENBQUM7OztBQUd2Qjs7Ozs7Ozs7R0FRRztBQUVILE1BQU0sT0FBTyxpQkFBaUI7SUFDNUIsWUFBbUIsV0FBNEM7UUFBNUMsZ0JBQVcsR0FBWCxXQUFXLENBQWlDO0lBQUcsQ0FBQzs7K0dBRHhELGlCQUFpQjttR0FBakIsaUJBQWlCOzRGQUFqQixpQkFBaUI7a0JBRDdCLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFOztBQW1CckMsTUFBTSxVQUFVO0lBRWQ7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQVcsRUFBRSxDQUFXO1FBQ3RDLE9BQU8sQ0FBQyxDQUNOLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbkIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNwQixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQW1CLEVBQUUsSUFBYztRQUN6RCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUs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OztHQThDVCxtQkEyRGdCLHVCQUF1QixDQUFDLE1BQU07NkhBR3RDLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFFdUMsYUFBYTtzQkFBMUQsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdZLFlBQVk7c0JBQW5FLFlBQVk7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsXG4gIFZpZXdDaGlsZCwgT25EZXN0cm95LCBPbkluaXQsIE5nWm9uZSwgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbnRlbnRDaGlsZCwgVGVtcGxhdGVSZWYsXG4gIERpcmVjdGl2ZSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdpZGdldCB9IGZyb20gJy4vbW9kZWxzJztcblxuLyoqXG4gKiBEaXJlY3RpdmUgYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgdGhhdCBzaG91bGQgYmUgc3RhbXBlZCBpbnNpZGUgZWFjaCBncmlkIGNlbGwuXG4gKiBVc2FnZTpcbiAqICAgPGFwcC1ncmlkIFt3aWRnZXRzXT1cIi4uLlwiPlxuICogICAgIDxuZy10ZW1wbGF0ZSBncmlkQ2VsbCBsZXQtd2lkZ2V0PVwid2lkZ2V0XCI+XG4gKiAgICAgICA8YXBwLXdpZGdldC1yZW5kZXJlciBbd2lkZ2V0XT1cIndpZGdldFwiIC4uLj48L2FwcC13aWRnZXQtcmVuZGVyZXI+XG4gKiAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgPC9hcHAtZ3JpZD5cbiAqL1xuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2dyaWRDZWxsXScgfSlcbmV4cG9ydCBjbGFzcyBHcmlkQ2VsbERpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8eyB3aWRnZXQ6IFdpZGdldCB9Pikge31cbn1cblxuLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gICBHUklEIEVOR0lORSDigJQgcHVyZSBkYXRhLCB6ZXJvIERPTVxuICAgSGFuZGxlcyBjb2xsaXNpb24gZGV0ZWN0aW9uLCByZXNvbHV0aW9uLCBhbmQgY29tcGFjdGlvbi5cbiAgIEluc3BpcmVkIGJ5IHJlYWN0LWdyaWQtbGF5b3V0IC8gZ3JpZHN0ZXIgYWxnb3JpdGhtcy5cbiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqL1xuXG5pbnRlcmZhY2UgR3JpZFJlY3Qge1xuICBpZDogc3RyaW5nO1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgY29sczogbnVtYmVyO1xuICByb3dzOiBudW1iZXI7XG59XG5cbmNsYXNzIEdyaWRFbmdpbmUge1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0d28gcmVjdHMgb3ZlcmxhcC5cbiAgICovXG4gIHN0YXRpYyBjb2xsaWRlcyhhOiBHcmlkUmVjdCwgYjogR3JpZFJlY3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIShcbiAgICAgIGEueCArIGEuY29scyA8PSBiLnggfHxcbiAgICAgIGIueCArIGIuY29scyA8PSBhLnggfHxcbiAgICAgIGEueSArIGEucm93cyA8PSBiLnkgfHxcbiAgICAgIGIueSArIGIucm93cyA8PSBhLnlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBBTEwgd2lkZ2V0cyB0aGF0IGNvbGxpZGUgd2l0aCBgcmVjdGAuXG4gICAqL1xuICBzdGF0aWMgZ2V0QWxsQ29sbGlzaW9ucyh3aWRnZXRzOiBHcmlkUmVjdFtdLCByZWN0OiBHcmlkUmVjdCk6IEdyaWRSZWN0W10ge1xuICAgIHJldHVybiB3aWRnZXRzLmZpbHRlcih3ID0+IHcuaWQgIT09IHJlY3QuaWQgJiYgR3JpZEVuZ2luZS5jb2xsaWRlcyh3LCByZWN0KSk7XG4gIH1cblxuICAvKipcbiAgICogU29ydCB3aWRnZXRzIHRvcC10by1ib3R0b20sIGxlZnQtdG8tcmlnaHQuXG4gICAqL1xuICBzdGF0aWMgc29ydEJ5UG9zaXRpb24od2lkZ2V0czogR3JpZFJlY3RbXSk6IEdyaWRSZWN0W10ge1xuICAgIHJldHVybiBbLi4ud2lkZ2V0c10uc29ydCgoYSwgYikgPT4gYS55IC0gYi55IHx8IGEueCAtIGIueCk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBhIHdpZGdldCB0byAoeCwgeSkgYW5kIHB1c2ggYW55IGNvbGxpZGluZyB3aWRnZXRzIGRvd253YXJkLlxuICAgKiBSZXR1cm5zIHRoZSBmdWxsIGxpc3Qgd2l0aCByZXNvbHZlZCBwb3NpdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgbW92ZVdpZGdldChcbiAgICBhbGxXaWRnZXRzOiBHcmlkUmVjdFtdLFxuICAgIHdpZGdldDogR3JpZFJlY3QsXG4gICAgbmV3WDogbnVtYmVyLFxuICAgIG5ld1k6IG51bWJlcixcbiAgICBjb2x1bW5zOiBudW1iZXJcbiAgKTogR3JpZFJlY3RbXSB7XG4gICAgY29uc3Qgd2lkZ2V0cyA9IGFsbFdpZGdldHMubWFwKHcgPT4gKHsgLi4udyB9KSk7XG4gICAgY29uc3QgbW92aW5nID0gd2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gd2lkZ2V0LmlkKTtcbiAgICBpZiAoIW1vdmluZykgcmV0dXJuIHdpZGdldHM7XG5cbiAgICBtb3ZpbmcueCA9IE1hdGgubWF4KDAsIE1hdGgubWluKG5ld1gsIGNvbHVtbnMgLSBtb3ZpbmcuY29scykpO1xuICAgIG1vdmluZy55ID0gTWF0aC5tYXgoMCwgbmV3WSk7XG5cbiAgICBjb25zdCBzb3J0ZWQgPSBHcmlkRW5naW5lLnNvcnRCeVBvc2l0aW9uKHdpZGdldHMpO1xuICAgIEdyaWRFbmdpbmUucmVzb2x2ZUNvbGxpc2lvbnMoc29ydGVkLCBtb3ZpbmcpO1xuICAgIHJldHVybiBHcmlkRW5naW5lLmNvbXBhY3Qoc29ydGVkLCBjb2x1bW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNpemUgYSB3aWRnZXQgYW5kIHB1c2ggY29sbGlkaW5nIHdpZGdldHMgZG93bi5cbiAgICovXG4gIHN0YXRpYyByZXNpemVXaWRnZXQoXG4gICAgYWxsV2lkZ2V0czogR3JpZFJlY3RbXSxcbiAgICB3aWRnZXQ6IEdyaWRSZWN0LFxuICAgIG5ld0NvbHM6IG51bWJlcixcbiAgICBuZXdSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uczogbnVtYmVyXG4gICk6IEdyaWRSZWN0W10ge1xuICAgIGNvbnN0IHdpZGdldHMgPSBhbGxXaWRnZXRzLm1hcCh3ID0+ICh7IC4uLncgfSkpO1xuICAgIGNvbnN0IHJlc2l6aW5nID0gd2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gd2lkZ2V0LmlkKTtcbiAgICBpZiAoIXJlc2l6aW5nKSByZXR1cm4gd2lkZ2V0cztcblxuICAgIHJlc2l6aW5nLmNvbHMgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihuZXdDb2xzLCBjb2x1bW5zIC0gcmVzaXppbmcueCkpO1xuICAgIHJlc2l6aW5nLnJvd3MgPSBNYXRoLm1heCgxLCBuZXdSb3dzKTtcblxuICAgIGNvbnN0IHNvcnRlZCA9IEdyaWRFbmdpbmUuc29ydEJ5UG9zaXRpb24od2lkZ2V0cyk7XG4gICAgR3JpZEVuZ2luZS5yZXNvbHZlQ29sbGlzaW9ucyhzb3J0ZWQsIHJlc2l6aW5nKTtcbiAgICByZXR1cm4gR3JpZEVuZ2luZS5jb21wYWN0KHNvcnRlZCwgY29sdW1ucyk7XG4gIH1cblxuICAvKipcbiAgICogUHVzaCBhbGwgd2lkZ2V0cyB0aGF0IGNvbGxpZGUgd2l0aCBgbW92ZWRXaWRnZXRgIGRvd253YXJkLCByZWN1cnNpdmVseS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlc29sdmVDb2xsaXNpb25zKHdpZGdldHM6IEdyaWRSZWN0W10sIG1vdmVkV2lkZ2V0OiBHcmlkUmVjdCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbGxpc2lvbnMgPSBHcmlkRW5naW5lLmdldEFsbENvbGxpc2lvbnMod2lkZ2V0cywgbW92ZWRXaWRnZXQpO1xuICAgIGZvciAoY29uc3QgY29sbGlkZXIgb2YgY29sbGlzaW9ucykge1xuICAgICAgY29sbGlkZXIueSA9IG1vdmVkV2lkZ2V0LnkgKyBtb3ZlZFdpZGdldC5yb3dzO1xuICAgICAgR3JpZEVuZ2luZS5yZXNvbHZlQ29sbGlzaW9ucyh3aWRnZXRzLCBjb2xsaWRlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhY3QgdGhlIGdyaWQ6IG1vdmUgZXZlcnkgd2lkZ2V0IGFzIGZhciB1cCBhcyBwb3NzaWJsZSB3aXRob3V0IG92ZXJsYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGNvbXBhY3Qod2lkZ2V0czogR3JpZFJlY3RbXSwgX2NvbHVtbnM6IG51bWJlcik6IEdyaWRSZWN0W10ge1xuICAgIGNvbnN0IHNvcnRlZCA9IEdyaWRFbmdpbmUuc29ydEJ5UG9zaXRpb24od2lkZ2V0cyk7XG4gICAgY29uc3QgcGxhY2VkOiBHcmlkUmVjdFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHdpZGdldCBvZiBzb3J0ZWQpIHtcbiAgICAgIHdpZGdldC55ID0gR3JpZEVuZ2luZS5maW5kQ29tcGFjdFkocGxhY2VkLCB3aWRnZXQpO1xuICAgICAgcGxhY2VkLnB1c2god2lkZ2V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGxhY2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIGhpZ2hlc3QgWSBwb3NpdGlvbiBhIHdpZGdldCBjYW4gb2NjdXB5IHdpdGhvdXQgb3ZlcmxhcHBpbmcgYW55IGFscmVhZHktcGxhY2VkIHdpZGdldC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZpbmRDb21wYWN0WShwbGFjZWQ6IEdyaWRSZWN0W10sIHdpZGdldDogR3JpZFJlY3QpOiBudW1iZXIge1xuICAgIGxldCB5ID0gMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgdGVzdDogR3JpZFJlY3QgPSB7IC4uLndpZGdldCwgeSB9O1xuICAgICAgY29uc3QgY29sbGlzaW9uID0gcGxhY2VkLmZpbmQocCA9PiBHcmlkRW5naW5lLmNvbGxpZGVzKHAsIHRlc3QpKTtcbiAgICAgIGlmICghY29sbGlzaW9uKSByZXR1cm4geTtcbiAgICAgIHkgPSBjb2xsaXNpb24ueSArIGNvbGxpc2lvbi5yb3dzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cyB0aGUgZ3JpZCBuZWVkcy5cbiAgICovXG4gIHN0YXRpYyBnZXRHcmlkSGVpZ2h0KHdpZGdldHM6IEdyaWRSZWN0W10pOiBudW1iZXIge1xuICAgIGlmICh3aWRnZXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGgubWF4KC4uLndpZGdldHMubWFwKHcgPT4gdy55ICsgdy5yb3dzKSk7XG4gIH1cbn1cblxuLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gICBDVVNUT00gR1JJRCBDT01QT05FTlRcbiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqL1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZ3JpZCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgI2dyaWRDb250YWluZXJcbiAgICAgIGNsYXNzPVwiZ3JpZC1jb250YWluZXJcIlxuICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJjb250YWluZXJIZWlnaHRcIlxuICAgID5cbiAgICAgIDwhLS0gUGxhY2Vob2xkZXIgcHJldmlldyAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJncmlkLXBsYWNlaG9sZGVyXCJcbiAgICAgICAgKm5nSWY9XCJwbGFjZWhvbGRlclwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInBsYWNlaG9sZGVyLmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cInBsYWNlaG9sZGVyLnRvcFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJwbGFjZWhvbGRlci53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwicGxhY2Vob2xkZXIuaGVpZ2h0XCJcbiAgICAgID48L2Rpdj5cblxuICAgICAgPCEtLSBXaWRnZXQgaXRlbXMgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCB3aWRnZXQgb2Ygd2lkZ2V0czsgdHJhY2tCeTogdHJhY2tCeUZuXCJcbiAgICAgICAgY2xhc3M9XCJncmlkLWl0ZW1cIlxuICAgICAgICBbY2xhc3MuaXMtZHJhZ2dpbmddPVwiZHJhZ2dpbmc/LmlkID09PSB3aWRnZXQuaWRcIlxuICAgICAgICBbY2xhc3MuaXMtcmVzaXppbmddPVwicmVzaXppbmc/LmlkID09PSB3aWRnZXQuaWRcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJnZXRJdGVtTGVmdCh3aWRnZXQpXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJnZXRJdGVtVG9wKHdpZGdldClcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiZ2V0SXRlbVdpZHRoKHdpZGdldClcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImdldEl0ZW1IZWlnaHQod2lkZ2V0KVwiXG4gICAgICAgIFtzdHlsZS56LWluZGV4XT1cIihkcmFnZ2luZz8uaWQgPT09IHdpZGdldC5pZCB8fCByZXNpemluZz8uaWQgPT09IHdpZGdldC5pZCkgPyAxMDAgOiAxXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJvbkRyYWdTdGFydCgkZXZlbnQsIHdpZGdldClcIlxuICAgICAgPlxuICAgICAgICA8IS0tIENvbnRlbnQgc3RhbXBlZCBmcm9tIHBhcmVudCB0ZW1wbGF0ZSwgY29udGV4dCBjYXJyaWVzIHRoZSB3aWRnZXQgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cImNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRlbXBsYXRlXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyB3aWRnZXQ6IHdpZGdldCB9XCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gUmVzaXplIGhhbmRsZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlc2l6ZS1oYW5kbGVcIiAobW91c2Vkb3duKT1cIm9uUmVzaXplU3RhcnQoJGV2ZW50LCB3aWRnZXQpXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTExIDF2MTBIMVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTEgNXY2SDVcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTExIDl2Mkg5XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgfVxuXG4gICAgLmdyaWQtY29udGFpbmVyIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgbWluLWhlaWdodDogMTAwJTtcbiAgICAgIHRyYW5zaXRpb246IGhlaWdodCAwLjI1cyBlYXNlO1xuICAgIH1cblxuICAgIC5ncmlkLXBsYWNlaG9sZGVyIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRhc2gtcGxhY2Vob2xkZXItY29sb3IsIHZhcigtLWRhc2gtYWNjZW50LWNvbG9yLCAjMGE4NGZmKSk7XG4gICAgICBvcGFjaXR5OiAwLjEyO1xuICAgICAgYm9yZGVyLXJhZGl1czogMjRweDtcbiAgICAgIGJvcmRlcjogMnB4IGRhc2hlZCB2YXIoLS1kYXNoLXBsYWNlaG9sZGVyLWNvbG9yLCB2YXIoLS1kYXNoLWFjY2VudC1jb2xvciwgIzBhODRmZikpO1xuICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE1cyBlYXNlLCB0b3AgMC4xNXMgZWFzZSwgd2lkdGggMC4xNXMgZWFzZSwgaGVpZ2h0IDAuMTVzIGVhc2U7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIHotaW5kZXg6IDA7XG4gICAgfVxuXG4gICAgLmdyaWQtaXRlbSB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4yNXMgZWFzZSwgdG9wIDAuMjVzIGVhc2UsIHdpZHRoIDAuMjVzIGVhc2UsIGhlaWdodCAwLjI1cyBlYXNlO1xuICAgICAgYm9yZGVyLXJhZGl1czogMjRweDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgfVxuXG4gICAgLmdyaWQtaXRlbS5pcy1kcmFnZ2luZyxcbiAgICAuZ3JpZC1pdGVtLmlzLXJlc2l6aW5nIHtcbiAgICAgIHRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIG9wYWNpdHk6IDAuODg7XG4gICAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICB9XG5cbiAgICAvKiBSZXNpemUgSGFuZGxlICovXG4gICAgLnJlc2l6ZS1oYW5kbGUge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgcmlnaHQ6IDRweDtcbiAgICAgIGJvdHRvbTogNHB4O1xuICAgICAgd2lkdGg6IDIycHg7XG4gICAgICBoZWlnaHQ6IDIycHg7XG4gICAgICBjdXJzb3I6IG53c2UtcmVzaXplO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGNvbG9yOiB2YXIoLS1kYXNoLXJlc2l6ZS1oYW5kbGUtY29sb3IsIHJnYmEoMjU1LDI1NSwyNTUsMC4yNSkpO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgdHJhbnNpdGlvbjogY29sb3IgMC4ycywgYmFja2dyb3VuZCAwLjJzO1xuICAgICAgei1pbmRleDogMjA7XG4gICAgfVxuICAgIC5yZXNpemUtaGFuZGxlOmhvdmVyIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1kYXNoLWFjY2VudC1jb2xvciwgIzBhODRmZik7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMDYpO1xuICAgIH1cbiAgYF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEN1c3RvbUdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgd2lkZ2V0czogV2lkZ2V0W10gPSBbXTtcbiAgQElucHV0KCkgY29sdW1uczogbnVtYmVyID0gMTI7XG4gIEBJbnB1dCgpIGdhcDogbnVtYmVyID0gMTY7XG4gIEBJbnB1dCgpIHJvd0hlaWdodDogbnVtYmVyID0gODA7XG4gIEBJbnB1dCgpIG1pbkl0ZW1Db2xzOiBudW1iZXIgPSAxO1xuICBASW5wdXQoKSBtaW5JdGVtUm93czogbnVtYmVyID0gMTtcblxuICBAT3V0cHV0KCkgaXRlbUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFdpZGdldD4oKTtcbiAgQE91dHB1dCgpIGxheW91dENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFdpZGdldFtdPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2dyaWRDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBncmlkQ29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgLyoqIFRoZSBuZy10ZW1wbGF0ZSBkZWNvcmF0ZWQgd2l0aCBncmlkQ2VsbCBmcm9tIHRoZSBwYXJlbnQgKi9cbiAgQENvbnRlbnRDaGlsZChHcmlkQ2VsbERpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBjZWxsVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjx7IHdpZGdldDogV2lkZ2V0IH0+O1xuXG4gIHBsYWNlaG9sZGVyOiB7IGxlZnQ6IG51bWJlcjsgdG9wOiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgY29udGFpbmVySGVpZ2h0ID0gNDAwO1xuXG4gIGRyYWdnaW5nOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBvZmZzZXRYOiBudW1iZXI7XG4gICAgb2Zmc2V0WTogbnVtYmVyO1xuICAgIGN1cnJlbnRQaXhlbFg6IG51bWJlcjtcbiAgICBjdXJyZW50UGl4ZWxZOiBudW1iZXI7XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICByZXNpemluZzoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgc3RhcnRNb3VzZVg6IG51bWJlcjtcbiAgICBzdGFydE1vdXNlWTogbnVtYmVyO1xuICAgIHN0YXJ0Q29sczogbnVtYmVyO1xuICAgIHN0YXJ0Um93czogbnVtYmVyO1xuICAgIGN1cnJlbnRQaXhlbFc6IG51bWJlcjtcbiAgICBjdXJyZW50UGl4ZWxIOiBudW1iZXI7XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHByZXZpZXdXaWRnZXRzOiBHcmlkUmVjdFtdID0gW107XG4gIHByaXZhdGUgYm91bmRNb3VzZU1vdmUgPSB0aGlzLm9uTW91c2VNb3ZlLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgYm91bmRNb3VzZVVwID0gdGhpcy5vbk1vdXNlVXAuYmluZCh0aGlzKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29tcGFjdEFuZEFwcGx5KCk7XG4gICAgdGhpcy51cGRhdGVDb250YWluZXJIZWlnaHQoKTtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuYm91bmRNb3VzZU1vdmUpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmJvdW5kTW91c2VVcCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhfY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIHRoaXMudXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5ib3VuZE1vdXNlTW92ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmJvdW5kTW91c2VVcCk7XG4gIH1cblxuICB0cmFja0J5Rm4oX2luZGV4OiBudW1iZXIsIGl0ZW06IFdpZGdldCkgeyByZXR1cm4gaXRlbS5pZDsgfVxuXG4gIC8vIOKUgOKUgCBHZW9tZXRyeSDilIDilIBcblxuICBwcml2YXRlIGdldCBjZWxsV2lkdGgoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb250YWluZXJXID0gdGhpcy5ncmlkQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5jbGllbnRXaWR0aCA/PyA4MDA7XG4gICAgcmV0dXJuIChjb250YWluZXJXIC0gKHRoaXMuY29sdW1ucyAtIDEpICogdGhpcy5nYXApIC8gdGhpcy5jb2x1bW5zO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xUb1BpeGVsKGNvbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY29sICogKHRoaXMuY2VsbFdpZHRoICsgdGhpcy5nYXApO1xuICB9XG5cbiAgcHJpdmF0ZSByb3dUb1BpeGVsKHJvdzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcm93ICogKHRoaXMucm93SGVpZ2h0ICsgdGhpcy5nYXApO1xuICB9XG5cbiAgcHJpdmF0ZSBwaXhlbFRvQ29sKHB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHB4IC8gKHRoaXMuY2VsbFdpZHRoICsgdGhpcy5nYXApKTtcbiAgfVxuXG4gIHByaXZhdGUgcGl4ZWxUb1JvdyhweDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChweCAvICh0aGlzLnJvd0hlaWdodCArIHRoaXMuZ2FwKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbHNUb1BpeGVsV2lkdGgoY29sczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY29scyAqIHRoaXMuY2VsbFdpZHRoICsgKGNvbHMgLSAxKSAqIHRoaXMuZ2FwO1xuICB9XG5cbiAgcHJpdmF0ZSByb3dzVG9QaXhlbEhlaWdodChyb3dzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiByb3dzICogdGhpcy5yb3dIZWlnaHQgKyAocm93cyAtIDEpICogdGhpcy5nYXA7XG4gIH1cblxuICBnZXRJdGVtTGVmdCh3OiBXaWRnZXQpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRyYWdnaW5nPy5pZCA9PT0gdy5pZCA/IHRoaXMuZHJhZ2dpbmcuY3VycmVudFBpeGVsWCA6IHRoaXMuY29sVG9QaXhlbCh3LngpO1xuICB9XG5cbiAgZ2V0SXRlbVRvcCh3OiBXaWRnZXQpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRyYWdnaW5nPy5pZCA9PT0gdy5pZCA/IHRoaXMuZHJhZ2dpbmcuY3VycmVudFBpeGVsWSA6IHRoaXMucm93VG9QaXhlbCh3LnkpO1xuICB9XG5cbiAgZ2V0SXRlbVdpZHRoKHc6IFdpZGdldCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVzaXppbmc/LmlkID09PSB3LmlkID8gdGhpcy5yZXNpemluZy5jdXJyZW50UGl4ZWxXIDogdGhpcy5jb2xzVG9QaXhlbFdpZHRoKHcuY29scyk7XG4gIH1cblxuICBnZXRJdGVtSGVpZ2h0KHc6IFdpZGdldCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVzaXppbmc/LmlkID09PSB3LmlkID8gdGhpcy5yZXNpemluZy5jdXJyZW50UGl4ZWxIIDogdGhpcy5yb3dzVG9QaXhlbEhlaWdodCh3LnJvd3MpO1xuICB9XG5cbiAgLy8g4pSA4pSAIERyYWcg4pSA4pSAXG5cbiAgb25EcmFnU3RhcnQoZXZlbnQ6IE1vdXNlRXZlbnQsIHdpZGdldDogV2lkZ2V0KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYSwgLnJlc2l6ZS1oYW5kbGUnKSkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy5ncmlkQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgaXRlbUxlZnQgPSB0aGlzLmNvbFRvUGl4ZWwod2lkZ2V0LngpO1xuICAgIGNvbnN0IGl0ZW1Ub3AgPSB0aGlzLnJvd1RvUGl4ZWwod2lkZ2V0LnkpO1xuXG4gICAgdGhpcy5kcmFnZ2luZyA9IHtcbiAgICAgIGlkOiB3aWRnZXQuaWQsXG4gICAgICBvZmZzZXRYOiBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gaXRlbUxlZnQsXG4gICAgICBvZmZzZXRZOiBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSBpdGVtVG9wLFxuICAgICAgY3VycmVudFBpeGVsWDogaXRlbUxlZnQsXG4gICAgICBjdXJyZW50UGl4ZWxZOiBpdGVtVG9wLFxuICAgIH07XG4gICAgdGhpcy5wcmV2aWV3V2lkZ2V0cyA9IHRoaXMud2lkZ2V0cy5tYXAodyA9PiAoeyBpZDogdy5pZCwgeDogdy54LCB5OiB3LnksIGNvbHM6IHcuY29scywgcm93czogdy5yb3dzIH0pKTtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0ge1xuICAgICAgbGVmdDogaXRlbUxlZnQsIHRvcDogaXRlbVRvcCxcbiAgICAgIHdpZHRoOiB0aGlzLmNvbHNUb1BpeGVsV2lkdGgod2lkZ2V0LmNvbHMpLFxuICAgICAgaGVpZ2h0OiB0aGlzLnJvd3NUb1BpeGVsSGVpZ2h0KHdpZGdldC5yb3dzKSxcbiAgICB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25SZXNpemVTdGFydChldmVudDogTW91c2VFdmVudCwgd2lkZ2V0OiBXaWRnZXQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmVzaXppbmcgPSB7XG4gICAgICBpZDogd2lkZ2V0LmlkLFxuICAgICAgc3RhcnRNb3VzZVg6IGV2ZW50LmNsaWVudFgsXG4gICAgICBzdGFydE1vdXNlWTogZXZlbnQuY2xpZW50WSxcbiAgICAgIHN0YXJ0Q29sczogd2lkZ2V0LmNvbHMsXG4gICAgICBzdGFydFJvd3M6IHdpZGdldC5yb3dzLFxuICAgICAgY3VycmVudFBpeGVsVzogdGhpcy5jb2xzVG9QaXhlbFdpZHRoKHdpZGdldC5jb2xzKSxcbiAgICAgIGN1cnJlbnRQaXhlbEg6IHRoaXMucm93c1RvUGl4ZWxIZWlnaHQod2lkZ2V0LnJvd3MpLFxuICAgIH07XG4gICAgdGhpcy5wcmV2aWV3V2lkZ2V0cyA9IHRoaXMud2lkZ2V0cy5tYXAodyA9PiAoeyBpZDogdy5pZCwgeDogdy54LCB5OiB3LnksIGNvbHM6IHcuY29scywgcm93czogdy5yb3dzIH0pKTtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0ge1xuICAgICAgbGVmdDogdGhpcy5jb2xUb1BpeGVsKHdpZGdldC54KSwgdG9wOiB0aGlzLnJvd1RvUGl4ZWwod2lkZ2V0LnkpLFxuICAgICAgd2lkdGg6IHRoaXMuY29sc1RvUGl4ZWxXaWR0aCh3aWRnZXQuY29scyksXG4gICAgICBoZWlnaHQ6IHRoaXMucm93c1RvUGl4ZWxIZWlnaHQod2lkZ2V0LnJvd3MpLFxuICAgIH07XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZHJhZ2dpbmcpIHRoaXMuaGFuZGxlRHJhZ01vdmUoZXZlbnQpO1xuICAgIGVsc2UgaWYgKHRoaXMucmVzaXppbmcpIHRoaXMuaGFuZGxlUmVzaXplTW92ZShldmVudCk7XG4gIH1cblxuICBwcml2YXRlIG9uTW91c2VVcChfZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kcmFnZ2luZykgdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLmZpbmFsaXplRHJhZygpKTtcbiAgICBlbHNlIGlmICh0aGlzLnJlc2l6aW5nKSB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMuZmluYWxpemVSZXNpemUoKSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURyYWdNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZ3JpZENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHdpZGdldCA9IHRoaXMud2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gdGhpcy5kcmFnZ2luZyEuaWQpITtcbiAgICBpZiAoIXdpZGdldCkgcmV0dXJuO1xuXG4gICAgbGV0IHB4ID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIHRoaXMuZHJhZ2dpbmcub2Zmc2V0WDtcbiAgICBsZXQgcHkgPSBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSB0aGlzLmRyYWdnaW5nLm9mZnNldFk7XG4gICAgcHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihweCwgcmVjdC53aWR0aCAtIHRoaXMuY29sc1RvUGl4ZWxXaWR0aCh3aWRnZXQuY29scykpKTtcbiAgICBweSA9IE1hdGgubWF4KDAsIHB5KTtcblxuICAgIHRoaXMuZHJhZ2dpbmcuY3VycmVudFBpeGVsWCA9IHB4O1xuICAgIHRoaXMuZHJhZ2dpbmcuY3VycmVudFBpeGVsWSA9IHB5O1xuXG4gICAgY29uc3QgdGFyZ2V0Q29sID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5waXhlbFRvQ29sKHB4KSwgdGhpcy5jb2x1bW5zIC0gd2lkZ2V0LmNvbHMpKTtcbiAgICBjb25zdCB0YXJnZXRSb3cgPSBNYXRoLm1heCgwLCB0aGlzLnBpeGVsVG9Sb3cocHkpKTtcblxuICAgIGNvbnN0IHJlc29sdmVkID0gR3JpZEVuZ2luZS5tb3ZlV2lkZ2V0KFxuICAgICAgdGhpcy5wcmV2aWV3V2lkZ2V0cyxcbiAgICAgIHsgaWQ6IHdpZGdldC5pZCwgeDogd2lkZ2V0LngsIHk6IHdpZGdldC55LCBjb2xzOiB3aWRnZXQuY29scywgcm93czogd2lkZ2V0LnJvd3MgfSxcbiAgICAgIHRhcmdldENvbCwgdGFyZ2V0Um93LCB0aGlzLmNvbHVtbnNcbiAgICApO1xuXG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IHtcbiAgICAgIGxlZnQ6IHRoaXMuY29sVG9QaXhlbCh0YXJnZXRDb2wpLCB0b3A6IHRoaXMucm93VG9QaXhlbCh0YXJnZXRSb3cpLFxuICAgICAgd2lkdGg6IHRoaXMuY29sc1RvUGl4ZWxXaWR0aCh3aWRnZXQuY29scyksXG4gICAgICBoZWlnaHQ6IHRoaXMucm93c1RvUGl4ZWxIZWlnaHQod2lkZ2V0LnJvd3MpLFxuICAgIH07XG5cbiAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qgcncgb2YgcmVzb2x2ZWQpIHtcbiAgICAgICAgaWYgKHJ3LmlkID09PSB3aWRnZXQuaWQpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB3ID0gdGhpcy53aWRnZXRzLmZpbmQod3cgPT4gd3cuaWQgPT09IHJ3LmlkKTtcbiAgICAgICAgaWYgKHcpIHsgdy54ID0gcncueDsgdy55ID0gcncueTsgfVxuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVDb250YWluZXJIZWlnaHQoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5hbGl6ZURyYWcoKSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47XG4gICAgY29uc3Qgd2lkZ2V0ID0gdGhpcy53aWRnZXRzLmZpbmQodyA9PiB3LmlkID09PSB0aGlzLmRyYWdnaW5nIS5pZCkhO1xuICAgIGNvbnN0IHRhcmdldENvbCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMucGl4ZWxUb0NvbCh0aGlzLmRyYWdnaW5nLmN1cnJlbnRQaXhlbFgpLCB0aGlzLmNvbHVtbnMgLSB3aWRnZXQuY29scykpO1xuICAgIGNvbnN0IHRhcmdldFJvdyA9IE1hdGgubWF4KDAsIHRoaXMucGl4ZWxUb1Jvdyh0aGlzLmRyYWdnaW5nLmN1cnJlbnRQaXhlbFkpKTtcblxuICAgIGNvbnN0IHJlc29sdmVkID0gR3JpZEVuZ2luZS5tb3ZlV2lkZ2V0KFxuICAgICAgdGhpcy53aWRnZXRzLm1hcCh3ID0+ICh7IGlkOiB3LmlkLCB4OiB3LngsIHk6IHcueSwgY29sczogdy5jb2xzLCByb3dzOiB3LnJvd3MgfSkpLFxuICAgICAgeyBpZDogd2lkZ2V0LmlkLCB4OiB3aWRnZXQueCwgeTogd2lkZ2V0LnksIGNvbHM6IHdpZGdldC5jb2xzLCByb3dzOiB3aWRnZXQucm93cyB9LFxuICAgICAgdGFyZ2V0Q29sLCB0YXJnZXRSb3csIHRoaXMuY29sdW1uc1xuICAgICk7XG4gICAgZm9yIChjb25zdCBydyBvZiByZXNvbHZlZCkge1xuICAgICAgY29uc3QgdyA9IHRoaXMud2lkZ2V0cy5maW5kKHd3ID0+IHd3LmlkID09PSBydy5pZCk7XG4gICAgICBpZiAodykgeyB3LnggPSBydy54OyB3LnkgPSBydy55OyB3LmNvbHMgPSBydy5jb2xzOyB3LnJvd3MgPSBydy5yb3dzOyB0aGlzLml0ZW1DaGFuZ2VkLmVtaXQodyk7IH1cbiAgICB9XG4gICAgdGhpcy5kcmFnZ2luZyA9IG51bGw7XG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IG51bGw7XG4gICAgdGhpcy5wcmV2aWV3V2lkZ2V0cyA9IFtdO1xuICAgIHRoaXMudXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XG4gICAgdGhpcy5sYXlvdXRDaGFuZ2VkLmVtaXQodGhpcy53aWRnZXRzKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUmVzaXplTW92ZShldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICghdGhpcy5yZXNpemluZykgcmV0dXJuO1xuICAgIGNvbnN0IHdpZGdldCA9IHRoaXMud2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gdGhpcy5yZXNpemluZyEuaWQpITtcbiAgICBpZiAoIXdpZGdldCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZHggPSBldmVudC5jbGllbnRYIC0gdGhpcy5yZXNpemluZy5zdGFydE1vdXNlWDtcbiAgICBjb25zdCBkeSA9IGV2ZW50LmNsaWVudFkgLSB0aGlzLnJlc2l6aW5nLnN0YXJ0TW91c2VZO1xuXG4gICAgbGV0IG5ld0NvbHMgPSBNYXRoLm1heCh0aGlzLm1pbkl0ZW1Db2xzLCBNYXRoLnJvdW5kKCh0aGlzLmNvbHNUb1BpeGVsV2lkdGgodGhpcy5yZXNpemluZy5zdGFydENvbHMpICsgZHgpIC8gKHRoaXMuY2VsbFdpZHRoICsgdGhpcy5nYXApKSk7XG4gICAgbGV0IG5ld1Jvd3MgPSBNYXRoLm1heCh0aGlzLm1pbkl0ZW1Sb3dzLCBNYXRoLnJvdW5kKCh0aGlzLnJvd3NUb1BpeGVsSGVpZ2h0KHRoaXMucmVzaXppbmcuc3RhcnRSb3dzKSArIGR5KSAvICh0aGlzLnJvd0hlaWdodCArIHRoaXMuZ2FwKSkpO1xuICAgIG5ld0NvbHMgPSBNYXRoLm1pbihuZXdDb2xzLCB0aGlzLmNvbHVtbnMgLSB3aWRnZXQueCk7XG5cbiAgICB0aGlzLnJlc2l6aW5nLmN1cnJlbnRQaXhlbFcgPSB0aGlzLmNvbHNUb1BpeGVsV2lkdGgobmV3Q29scyk7XG4gICAgdGhpcy5yZXNpemluZy5jdXJyZW50UGl4ZWxIID0gdGhpcy5yb3dzVG9QaXhlbEhlaWdodChuZXdSb3dzKTtcblxuICAgIGNvbnN0IHJlc29sdmVkID0gR3JpZEVuZ2luZS5yZXNpemVXaWRnZXQoXG4gICAgICB0aGlzLnByZXZpZXdXaWRnZXRzLFxuICAgICAgeyBpZDogd2lkZ2V0LmlkLCB4OiB3aWRnZXQueCwgeTogd2lkZ2V0LnksIGNvbHM6IHdpZGdldC5jb2xzLCByb3dzOiB3aWRnZXQucm93cyB9LFxuICAgICAgbmV3Q29scywgbmV3Um93cywgdGhpcy5jb2x1bW5zXG4gICAgKTtcblxuICAgIHRoaXMucGxhY2Vob2xkZXIgPSB7XG4gICAgICBsZWZ0OiB0aGlzLmNvbFRvUGl4ZWwod2lkZ2V0LngpLCB0b3A6IHRoaXMucm93VG9QaXhlbCh3aWRnZXQueSksXG4gICAgICB3aWR0aDogdGhpcy5jb2xzVG9QaXhlbFdpZHRoKG5ld0NvbHMpLFxuICAgICAgaGVpZ2h0OiB0aGlzLnJvd3NUb1BpeGVsSGVpZ2h0KG5ld1Jvd3MpLFxuICAgIH07XG5cbiAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qgcncgb2YgcmVzb2x2ZWQpIHtcbiAgICAgICAgaWYgKHJ3LmlkID09PSB3aWRnZXQuaWQpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB3ID0gdGhpcy53aWRnZXRzLmZpbmQod3cgPT4gd3cuaWQgPT09IHJ3LmlkKTtcbiAgICAgICAgaWYgKHcpIHsgdy54ID0gcncueDsgdy55ID0gcncueTsgfVxuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVDb250YWluZXJIZWlnaHQoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5hbGl6ZVJlc2l6ZSgpIHtcbiAgICBpZiAoIXRoaXMucmVzaXppbmcpIHJldHVybjtcbiAgICBjb25zdCB3aWRnZXQgPSB0aGlzLndpZGdldHMuZmluZCh3ID0+IHcuaWQgPT09IHRoaXMucmVzaXppbmchLmlkKSE7XG5cbiAgICBsZXQgbmV3Q29scyA9IE1hdGgubWF4KHRoaXMubWluSXRlbUNvbHMsIE1hdGgucm91bmQodGhpcy5yZXNpemluZy5jdXJyZW50UGl4ZWxXIC8gKHRoaXMuY2VsbFdpZHRoICsgdGhpcy5nYXApKSk7XG4gICAgbGV0IG5ld1Jvd3MgPSBNYXRoLm1heCh0aGlzLm1pbkl0ZW1Sb3dzLCBNYXRoLnJvdW5kKHRoaXMucmVzaXppbmcuY3VycmVudFBpeGVsSCAvICh0aGlzLnJvd0hlaWdodCArIHRoaXMuZ2FwKSkpO1xuICAgIG5ld0NvbHMgPSBNYXRoLm1pbihuZXdDb2xzLCB0aGlzLmNvbHVtbnMgLSB3aWRnZXQueCk7XG5cbiAgICBjb25zdCByZXNvbHZlZCA9IEdyaWRFbmdpbmUucmVzaXplV2lkZ2V0KFxuICAgICAgdGhpcy53aWRnZXRzLm1hcCh3ID0+ICh7IGlkOiB3LmlkLCB4OiB3LngsIHk6IHcueSwgY29sczogdy5jb2xzLCByb3dzOiB3LnJvd3MgfSkpLFxuICAgICAgeyBpZDogd2lkZ2V0LmlkLCB4OiB3aWRnZXQueCwgeTogd2lkZ2V0LnksIGNvbHM6IHdpZGdldC5jb2xzLCByb3dzOiB3aWRnZXQucm93cyB9LFxuICAgICAgbmV3Q29scywgbmV3Um93cywgdGhpcy5jb2x1bW5zXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IHJ3IG9mIHJlc29sdmVkKSB7XG4gICAgICBjb25zdCB3ID0gdGhpcy53aWRnZXRzLmZpbmQod3cgPT4gd3cuaWQgPT09IHJ3LmlkKTtcbiAgICAgIGlmICh3KSB7IHcueCA9IHJ3Lng7IHcueSA9IHJ3Lnk7IHcuY29scyA9IHJ3LmNvbHM7IHcucm93cyA9IHJ3LnJvd3M7IHRoaXMuaXRlbUNoYW5nZWQuZW1pdCh3KTsgfVxuICAgIH1cbiAgICB0aGlzLnJlc2l6aW5nID0gbnVsbDtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gbnVsbDtcbiAgICB0aGlzLnByZXZpZXdXaWRnZXRzID0gW107XG4gICAgdGhpcy51cGRhdGVDb250YWluZXJIZWlnaHQoKTtcbiAgICB0aGlzLmxheW91dENoYW5nZWQuZW1pdCh0aGlzLndpZGdldHMpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFV0aWxpdGllcyDilIDilIBcblxuICBwcml2YXRlIGNvbXBhY3RBbmRBcHBseSgpIHtcbiAgICBpZiAoIXRoaXMud2lkZ2V0cz8ubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgY29tcGFjdGVkID0gR3JpZEVuZ2luZS5jb21wYWN0KFxuICAgICAgdGhpcy53aWRnZXRzLm1hcCh3ID0+ICh7IGlkOiB3LmlkLCB4OiB3LngsIHk6IHcueSwgY29sczogdy5jb2xzLCByb3dzOiB3LnJvd3MgfSkpLFxuICAgICAgdGhpcy5jb2x1bW5zXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IHJ3IG9mIGNvbXBhY3RlZCkge1xuICAgICAgY29uc3QgdyA9IHRoaXMud2lkZ2V0cy5maW5kKHd3ID0+IHd3LmlkID09PSBydy5pZCk7XG4gICAgICBpZiAodykgeyB3LnggPSBydy54OyB3LnkgPSBydy55OyB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb250YWluZXJIZWlnaHQoKSB7XG4gICAgaWYgKCF0aGlzLndpZGdldHM/Lmxlbmd0aCkgeyB0aGlzLmNvbnRhaW5lckhlaWdodCA9IDQwMDsgcmV0dXJuOyB9XG4gICAgY29uc3QgbWF4Um93ID0gR3JpZEVuZ2luZS5nZXRHcmlkSGVpZ2h0KFxuICAgICAgdGhpcy53aWRnZXRzLm1hcCh3ID0+ICh7IGlkOiB3LmlkLCB4OiB3LngsIHk6IHcueSwgY29sczogdy5jb2xzLCByb3dzOiB3LnJvd3MgfSkpXG4gICAgKTtcbiAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHRoaXMucm93VG9QaXhlbChtYXhSb3cpICsgdGhpcy5yb3dIZWlnaHQgKyB0aGlzLmdhcDtcbiAgfVxufVxuIl19
534
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcC9jdXN0b20tZ3JpZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFDdEMsU0FBUyxFQUNULFlBQVksRUFBRSxXQUFXLEVBQ3pCLFNBQVMsRUFBRSx1QkFBdUIsRUFDbkMsTUFBTSxlQUFlLENBQUM7OztBQUd2Qjs7Ozs7Ozs7R0FRRztBQUVILE1BQU0sT0FBTyxpQkFBaUI7SUFDNUIsWUFBbUIsV0FBNEM7UUFBNUMsZ0JBQVcsR0FBWCxXQUFXLENBQWlDO0lBQUcsQ0FBQzs7K0dBRHhELGlCQUFpQjttR0FBakIsaUJBQWlCOzRGQUFqQixpQkFBaUI7a0JBRDdCLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFOztBQW1CckMsTUFBTSxVQUFVO0lBRWQ7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQVcsRUFBRSxDQUFXO1FBQ3RDLE9BQU8sQ0FBQyxDQUNOLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbkIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNwQixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQW1CLEVBQUUsSUFBYztRQUN6RCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUs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Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThDVCxtQkEyRGdCLHVCQUF1QixDQUFDLE1BQU07NkhBR3RDLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFFdUMsYUFBYTtzQkFBMUQsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdZLFlBQVk7c0JBQW5FLFlBQVk7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsXG4gIFZpZXdDaGlsZCwgT25EZXN0cm95LCBPbkluaXQsIE5nWm9uZSwgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbnRlbnRDaGlsZCwgVGVtcGxhdGVSZWYsXG4gIERpcmVjdGl2ZSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdpZGdldCB9IGZyb20gJy4vbW9kZWxzJztcblxuLyoqXG4gKiBEaXJlY3RpdmUgYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgdGhhdCBzaG91bGQgYmUgc3RhbXBlZCBpbnNpZGUgZWFjaCBncmlkIGNlbGwuXG4gKiBVc2FnZTpcbiAqICAgPGFwcC1ncmlkIFt3aWRnZXRzXT1cIi4uLlwiPlxuICogICAgIDxuZy10ZW1wbGF0ZSBncmlkQ2VsbCBsZXQtd2lkZ2V0PVwid2lkZ2V0XCI+XG4gKiAgICAgICA8YXBwLXdpZGdldC1yZW5kZXJlciBbd2lkZ2V0XT1cIndpZGdldFwiIC4uLj48L2FwcC13aWRnZXQtcmVuZGVyZXI+XG4gKiAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgPC9hcHAtZ3JpZD5cbiAqL1xuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2dyaWRDZWxsXScgfSlcbmV4cG9ydCBjbGFzcyBHcmlkQ2VsbERpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8eyB3aWRnZXQ6IFdpZGdldCB9Pikge31cbn1cblxuLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gICBHUklEIEVOR0lORSDigJQgcHVyZSBkYXRhLCB6ZXJvIERPTVxuICAgSGFuZGxlcyBjb2xsaXNpb24gZGV0ZWN0aW9uLCByZXNvbHV0aW9uLCBhbmQgY29tcGFjdGlvbi5cbiAgIEluc3BpcmVkIGJ5IHJlYWN0LWdyaWQtbGF5b3V0IC8gZ3JpZHN0ZXIgYWxnb3JpdGhtcy5cbiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqL1xuXG5pbnRlcmZhY2UgR3JpZFJlY3Qge1xuICBpZDogc3RyaW5nO1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgY29sczogbnVtYmVyO1xuICByb3dzOiBudW1iZXI7XG59XG5cbmNsYXNzIEdyaWRFbmdpbmUge1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0d28gcmVjdHMgb3ZlcmxhcC5cbiAgICovXG4gIHN0YXRpYyBjb2xsaWRlcyhhOiBHcmlkUmVjdCwgYjogR3JpZFJlY3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIShcbiAgICAgIGEueCArIGEuY29scyA8PSBiLnggfHxcbiAgICAgIGIueCArIGIuY29scyA8PSBhLnggfHxcbiAgICAgIGEueSArIGEucm93cyA8PSBiLnkgfHxcbiAgICAgIGIueSArIGIucm93cyA8PSBhLnlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBBTEwgd2lkZ2V0cyB0aGF0IGNvbGxpZGUgd2l0aCBgcmVjdGAuXG4gICAqL1xuICBzdGF0aWMgZ2V0QWxsQ29sbGlzaW9ucyh3aWRnZXRzOiBHcmlkUmVjdFtdLCByZWN0OiBHcmlkUmVjdCk6IEdyaWRSZWN0W10ge1xuICAgIHJldHVybiB3aWRnZXRzLmZpbHRlcih3ID0+IHcuaWQgIT09IHJlY3QuaWQgJiYgR3JpZEVuZ2luZS5jb2xsaWRlcyh3LCByZWN0KSk7XG4gIH1cblxuICAvKipcbiAgICogU29ydCB3aWRnZXRzIHRvcC10by1ib3R0b20sIGxlZnQtdG8tcmlnaHQuXG4gICAqL1xuICBzdGF0aWMgc29ydEJ5UG9zaXRpb24od2lkZ2V0czogR3JpZFJlY3RbXSk6IEdyaWRSZWN0W10ge1xuICAgIHJldHVybiBbLi4ud2lkZ2V0c10uc29ydCgoYSwgYikgPT4gYS55IC0gYi55IHx8IGEueCAtIGIueCk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBhIHdpZGdldCB0byAoeCwgeSkgYW5kIHB1c2ggYW55IGNvbGxpZGluZyB3aWRnZXRzIGRvd253YXJkLlxuICAgKiBSZXR1cm5zIHRoZSBmdWxsIGxpc3Qgd2l0aCByZXNvbHZlZCBwb3NpdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgbW92ZVdpZGdldChcbiAgICBhbGxXaWRnZXRzOiBHcmlkUmVjdFtdLFxuICAgIHdpZGdldDogR3JpZFJlY3QsXG4gICAgbmV3WDogbnVtYmVyLFxuICAgIG5ld1k6IG51bWJlcixcbiAgICBjb2x1bW5zOiBudW1iZXJcbiAgKTogR3JpZFJlY3RbXSB7XG4gICAgY29uc3Qgd2lkZ2V0cyA9IGFsbFdpZGdldHMubWFwKHcgPT4gKHsgLi4udyB9KSk7XG4gICAgY29uc3QgbW92aW5nID0gd2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gd2lkZ2V0LmlkKTtcbiAgICBpZiAoIW1vdmluZykgcmV0dXJuIHdpZGdldHM7XG5cbiAgICBtb3ZpbmcueCA9IE1hdGgubWF4KDAsIE1hdGgubWluKG5ld1gsIGNvbHVtbnMgLSBtb3ZpbmcuY29scykpO1xuICAgIG1vdmluZy55ID0gTWF0aC5tYXgoMCwgbmV3WSk7XG5cbiAgICBjb25zdCBzb3J0ZWQgPSBHcmlkRW5naW5lLnNvcnRCeVBvc2l0aW9uKHdpZGdldHMpO1xuICAgIEdyaWRFbmdpbmUucmVzb2x2ZUNvbGxpc2lvbnMoc29ydGVkLCBtb3ZpbmcpO1xuICAgIHJldHVybiBHcmlkRW5naW5lLmNvbXBhY3Qoc29ydGVkLCBjb2x1bW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNpemUgYSB3aWRnZXQgYW5kIHB1c2ggY29sbGlkaW5nIHdpZGdldHMgZG93bi5cbiAgICovXG4gIHN0YXRpYyByZXNpemVXaWRnZXQoXG4gICAgYWxsV2lkZ2V0czogR3JpZFJlY3RbXSxcbiAgICB3aWRnZXQ6IEdyaWRSZWN0LFxuICAgIG5ld0NvbHM6IG51bWJlcixcbiAgICBuZXdSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uczogbnVtYmVyXG4gICk6IEdyaWRSZWN0W10ge1xuICAgIGNvbnN0IHdpZGdldHMgPSBhbGxXaWRnZXRzLm1hcCh3ID0+ICh7IC4uLncgfSkpO1xuICAgIGNvbnN0IHJlc2l6aW5nID0gd2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gd2lkZ2V0LmlkKTtcbiAgICBpZiAoIXJlc2l6aW5nKSByZXR1cm4gd2lkZ2V0cztcblxuICAgIHJlc2l6aW5nLmNvbHMgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihuZXdDb2xzLCBjb2x1bW5zIC0gcmVzaXppbmcueCkpO1xuICAgIHJlc2l6aW5nLnJvd3MgPSBNYXRoLm1heCgxLCBuZXdSb3dzKTtcblxuICAgIGNvbnN0IHNvcnRlZCA9IEdyaWRFbmdpbmUuc29ydEJ5UG9zaXRpb24od2lkZ2V0cyk7XG4gICAgR3JpZEVuZ2luZS5yZXNvbHZlQ29sbGlzaW9ucyhzb3J0ZWQsIHJlc2l6aW5nKTtcbiAgICByZXR1cm4gR3JpZEVuZ2luZS5jb21wYWN0KHNvcnRlZCwgY29sdW1ucyk7XG4gIH1cblxuICAvKipcbiAgICogUHVzaCBhbGwgd2lkZ2V0cyB0aGF0IGNvbGxpZGUgd2l0aCBgbW92ZWRXaWRnZXRgIGRvd253YXJkLCByZWN1cnNpdmVseS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlc29sdmVDb2xsaXNpb25zKHdpZGdldHM6IEdyaWRSZWN0W10sIG1vdmVkV2lkZ2V0OiBHcmlkUmVjdCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbGxpc2lvbnMgPSBHcmlkRW5naW5lLmdldEFsbENvbGxpc2lvbnMod2lkZ2V0cywgbW92ZWRXaWRnZXQpO1xuICAgIGZvciAoY29uc3QgY29sbGlkZXIgb2YgY29sbGlzaW9ucykge1xuICAgICAgY29sbGlkZXIueSA9IG1vdmVkV2lkZ2V0LnkgKyBtb3ZlZFdpZGdldC5yb3dzO1xuICAgICAgR3JpZEVuZ2luZS5yZXNvbHZlQ29sbGlzaW9ucyh3aWRnZXRzLCBjb2xsaWRlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhY3QgdGhlIGdyaWQ6IG1vdmUgZXZlcnkgd2lkZ2V0IGFzIGZhciB1cCBhcyBwb3NzaWJsZSB3aXRob3V0IG92ZXJsYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGNvbXBhY3Qod2lkZ2V0czogR3JpZFJlY3RbXSwgX2NvbHVtbnM6IG51bWJlcik6IEdyaWRSZWN0W10ge1xuICAgIGNvbnN0IHNvcnRlZCA9IEdyaWRFbmdpbmUuc29ydEJ5UG9zaXRpb24od2lkZ2V0cyk7XG4gICAgY29uc3QgcGxhY2VkOiBHcmlkUmVjdFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHdpZGdldCBvZiBzb3J0ZWQpIHtcbiAgICAgIHdpZGdldC55ID0gR3JpZEVuZ2luZS5maW5kQ29tcGFjdFkocGxhY2VkLCB3aWRnZXQpO1xuICAgICAgcGxhY2VkLnB1c2god2lkZ2V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGxhY2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIGhpZ2hlc3QgWSBwb3NpdGlvbiBhIHdpZGdldCBjYW4gb2NjdXB5IHdpdGhvdXQgb3ZlcmxhcHBpbmcgYW55IGFscmVhZHktcGxhY2VkIHdpZGdldC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZpbmRDb21wYWN0WShwbGFjZWQ6IEdyaWRSZWN0W10sIHdpZGdldDogR3JpZFJlY3QpOiBudW1iZXIge1xuICAgIGxldCB5ID0gMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgdGVzdDogR3JpZFJlY3QgPSB7IC4uLndpZGdldCwgeSB9O1xuICAgICAgY29uc3QgY29sbGlzaW9uID0gcGxhY2VkLmZpbmQocCA9PiBHcmlkRW5naW5lLmNvbGxpZGVzKHAsIHRlc3QpKTtcbiAgICAgIGlmICghY29sbGlzaW9uKSByZXR1cm4geTtcbiAgICAgIHkgPSBjb2xsaXNpb24ueSArIGNvbGxpc2lvbi5yb3dzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cyB0aGUgZ3JpZCBuZWVkcy5cbiAgICovXG4gIHN0YXRpYyBnZXRHcmlkSGVpZ2h0KHdpZGdldHM6IEdyaWRSZWN0W10pOiBudW1iZXIge1xuICAgIGlmICh3aWRnZXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGgubWF4KC4uLndpZGdldHMubWFwKHcgPT4gdy55ICsgdy5yb3dzKSk7XG4gIH1cbn1cblxuLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gICBDVVNUT00gR1JJRCBDT01QT05FTlRcbiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqL1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZ3JpZCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgI2dyaWRDb250YWluZXJcbiAgICAgIGNsYXNzPVwiZ3JpZC1jb250YWluZXJcIlxuICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJjb250YWluZXJIZWlnaHRcIlxuICAgID5cbiAgICAgIDwhLS0gUGxhY2Vob2xkZXIgcHJldmlldyAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJncmlkLXBsYWNlaG9sZGVyXCJcbiAgICAgICAgKm5nSWY9XCJwbGFjZWhvbGRlclwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInBsYWNlaG9sZGVyLmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cInBsYWNlaG9sZGVyLnRvcFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJwbGFjZWhvbGRlci53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwicGxhY2Vob2xkZXIuaGVpZ2h0XCJcbiAgICAgID48L2Rpdj5cblxuICAgICAgPCEtLSBXaWRnZXQgaXRlbXMgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCB3aWRnZXQgb2Ygd2lkZ2V0czsgdHJhY2tCeTogdHJhY2tCeUZuXCJcbiAgICAgICAgY2xhc3M9XCJncmlkLWl0ZW1cIlxuICAgICAgICBbY2xhc3MuaXMtZHJhZ2dpbmddPVwiZHJhZ2dpbmc/LmlkID09PSB3aWRnZXQuaWRcIlxuICAgICAgICBbY2xhc3MuaXMtcmVzaXppbmddPVwicmVzaXppbmc/LmlkID09PSB3aWRnZXQuaWRcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJnZXRJdGVtTGVmdCh3aWRnZXQpXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJnZXRJdGVtVG9wKHdpZGdldClcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiZ2V0SXRlbVdpZHRoKHdpZGdldClcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImdldEl0ZW1IZWlnaHQod2lkZ2V0KVwiXG4gICAgICAgIFtzdHlsZS56LWluZGV4XT1cIihkcmFnZ2luZz8uaWQgPT09IHdpZGdldC5pZCB8fCByZXNpemluZz8uaWQgPT09IHdpZGdldC5pZCkgPyAxMDAgOiAxXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJvbkRyYWdTdGFydCgkZXZlbnQsIHdpZGdldClcIlxuICAgICAgPlxuICAgICAgICA8IS0tIENvbnRlbnQgc3RhbXBlZCBmcm9tIHBhcmVudCB0ZW1wbGF0ZSwgY29udGV4dCBjYXJyaWVzIHRoZSB3aWRnZXQgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cImNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRlbXBsYXRlXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyB3aWRnZXQ6IHdpZGdldCB9XCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gUmVzaXplIGhhbmRsZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlc2l6ZS1oYW5kbGVcIiAobW91c2Vkb3duKT1cIm9uUmVzaXplU3RhcnQoJGV2ZW50LCB3aWRnZXQpXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTExIDF2MTBIMVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTEgNXY2SDVcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTExIDl2Mkg5XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgfVxuXG4gICAgLmdyaWQtY29udGFpbmVyIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgbWluLWhlaWdodDogMTAwJTtcbiAgICAgIHRyYW5zaXRpb246IGhlaWdodCAwLjI1cyBlYXNlO1xuICAgIH1cblxuICAgIC5ncmlkLXBsYWNlaG9sZGVyIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRhc2gtcGxhY2Vob2xkZXItY29sb3IsIHZhcigtLWRhc2gtYWNjZW50LWNvbG9yLCAjMGE4NGZmKSk7XG4gICAgICBvcGFjaXR5OiAwLjEyO1xuICAgICAgYm9yZGVyLXJhZGl1czogMjRweDtcbiAgICAgIGJvcmRlcjogMnB4IGRhc2hlZCB2YXIoLS1kYXNoLXBsYWNlaG9sZGVyLWNvbG9yLCB2YXIoLS1kYXNoLWFjY2VudC1jb2xvciwgIzBhODRmZikpO1xuICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE1cyBlYXNlLCB0b3AgMC4xNXMgZWFzZSwgd2lkdGggMC4xNXMgZWFzZSwgaGVpZ2h0IDAuMTVzIGVhc2U7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIHotaW5kZXg6IDA7XG4gICAgfVxuXG4gICAgLmdyaWQtaXRlbSB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4yNXMgZWFzZSwgdG9wIDAuMjVzIGVhc2UsIHdpZHRoIDAuMjVzIGVhc2UsIGhlaWdodCAwLjI1cyBlYXNlO1xuICAgICAgYm9yZGVyLXJhZGl1czogMjRweDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgfVxuXG4gICAgLmdyaWQtaXRlbS5pcy1kcmFnZ2luZyxcbiAgICAuZ3JpZC1pdGVtLmlzLXJlc2l6aW5nIHtcbiAgICAgIHRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIG9wYWNpdHk6IDAuODg7XG4gICAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICB9XG5cbiAgICAvKiBSZXNpemUgSGFuZGxlICovXG4gICAgLnJlc2l6ZS1oYW5kbGUge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgcmlnaHQ6IDRweDtcbiAgICAgIGJvdHRvbTogNHB4O1xuICAgICAgd2lkdGg6IDIycHg7XG4gICAgICBoZWlnaHQ6IDIycHg7XG4gICAgICBjdXJzb3I6IG53c2UtcmVzaXplO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGNvbG9yOiB2YXIoLS1kYXNoLXJlc2l6ZS1oYW5kbGUtY29sb3IsIHJnYmEoMjU1LDI1NSwyNTUsMC4yNSkpO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgdHJhbnNpdGlvbjogY29sb3IgMC4ycywgYmFja2dyb3VuZCAwLjJzO1xuICAgICAgei1pbmRleDogMjA7XG4gICAgfVxuICAgIC5yZXNpemUtaGFuZGxlOmhvdmVyIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1kYXNoLWFjY2VudC1jb2xvciwgIzBhODRmZik7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMDYpO1xuICAgIH1cbiAgYF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEN1c3RvbUdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgd2lkZ2V0czogV2lkZ2V0W10gPSBbXTtcbiAgQElucHV0KCkgY29sdW1uczogbnVtYmVyID0gMTI7XG4gIEBJbnB1dCgpIGdhcDogbnVtYmVyID0gMTY7XG4gIEBJbnB1dCgpIHJvd0hlaWdodDogbnVtYmVyID0gODA7XG4gIEBJbnB1dCgpIG1pbkl0ZW1Db2xzOiBudW1iZXIgPSAxO1xuICBASW5wdXQoKSBtaW5JdGVtUm93czogbnVtYmVyID0gMTtcblxuICBAT3V0cHV0KCkgaXRlbUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFdpZGdldD4oKTtcbiAgQE91dHB1dCgpIGxheW91dENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFdpZGdldFtdPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2dyaWRDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBncmlkQ29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgLyoqIFRoZSBuZy10ZW1wbGF0ZSBkZWNvcmF0ZWQgd2l0aCBncmlkQ2VsbCBmcm9tIHRoZSBwYXJlbnQgKi9cbiAgQENvbnRlbnRDaGlsZChHcmlkQ2VsbERpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBjZWxsVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjx7IHdpZGdldDogV2lkZ2V0IH0+O1xuXG4gIHBsYWNlaG9sZGVyOiB7IGxlZnQ6IG51bWJlcjsgdG9wOiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgY29udGFpbmVySGVpZ2h0ID0gNDAwO1xuXG4gIGRyYWdnaW5nOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBvZmZzZXRYOiBudW1iZXI7XG4gICAgb2Zmc2V0WTogbnVtYmVyO1xuICAgIGN1cnJlbnRQaXhlbFg6IG51bWJlcjtcbiAgICBjdXJyZW50UGl4ZWxZOiBudW1iZXI7XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICByZXNpemluZzoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgc3RhcnRNb3VzZVg6IG51bWJlcjtcbiAgICBzdGFydE1vdXNlWTogbnVtYmVyO1xuICAgIHN0YXJ0Q29sczogbnVtYmVyO1xuICAgIHN0YXJ0Um93czogbnVtYmVyO1xuICAgIGN1cnJlbnRQaXhlbFc6IG51bWJlcjtcbiAgICBjdXJyZW50UGl4ZWxIOiBudW1iZXI7XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHByZXZpZXdXaWRnZXRzOiBHcmlkUmVjdFtdID0gW107XG4gIHByaXZhdGUgYm91bmRNb3VzZU1vdmUgPSB0aGlzLm9uTW91c2VNb3ZlLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgYm91bmRNb3VzZVVwID0gdGhpcy5vbk1vdXNlVXAuYmluZCh0aGlzKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuYXBwbHlDb21wYWN0aW9uQW5kU3luYygpO1xuICAgIHRoaXMudXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmJvdW5kTW91c2VNb3ZlKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5ib3VuZE1vdXNlVXApO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmICh0aGlzLmRyYWdnaW5nIHx8IHRoaXMucmVzaXppbmcpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ3dpZGdldHMnXSB8fCBjaGFuZ2VzWydjb2x1bW5zJ10pIHtcbiAgICAgIHRoaXMuYXBwbHlDb21wYWN0aW9uQW5kU3luYygpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5ib3VuZE1vdXNlTW92ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmJvdW5kTW91c2VVcCk7XG4gIH1cblxuICB0cmFja0J5Rm4oX2luZGV4OiBudW1iZXIsIGl0ZW06IFdpZGdldCkgeyByZXR1cm4gaXRlbS5pZDsgfVxuXG4gIC8vIOKUgOKUgCBHZW9tZXRyeSDilIDilIBcblxuICBwcml2YXRlIGdldCBjZWxsV2lkdGgoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb250YWluZXJXID0gdGhpcy5ncmlkQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5jbGllbnRXaWR0aCA/PyA4MDA7XG4gICAgcmV0dXJuIChjb250YWluZXJXIC0gKHRoaXMuY29sdW1ucyAtIDEpICogdGhpcy5nYXApIC8gdGhpcy5jb2x1bW5zO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xUb1BpeGVsKGNvbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY29sICogKHRoaXMuY2VsbFdpZHRoICsgdGhpcy5nYXApO1xuICB9XG5cbiAgcHJpdmF0ZSByb3dUb1BpeGVsKHJvdzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcm93ICogKHRoaXMucm93SGVpZ2h0ICsgdGhpcy5nYXApO1xuICB9XG5cbiAgcHJpdmF0ZSBwaXhlbFRvQ29sKHB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHB4IC8gKHRoaXMuY2VsbFdpZHRoICsgdGhpcy5nYXApKTtcbiAgfVxuXG4gIHByaXZhdGUgcGl4ZWxUb1JvdyhweDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChweCAvICh0aGlzLnJvd0hlaWdodCArIHRoaXMuZ2FwKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbHNUb1BpeGVsV2lkdGgoY29sczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY29scyAqIHRoaXMuY2VsbFdpZHRoICsgKGNvbHMgLSAxKSAqIHRoaXMuZ2FwO1xuICB9XG5cbiAgcHJpdmF0ZSByb3dzVG9QaXhlbEhlaWdodChyb3dzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiByb3dzICogdGhpcy5yb3dIZWlnaHQgKyAocm93cyAtIDEpICogdGhpcy5nYXA7XG4gIH1cblxuICBnZXRJdGVtTGVmdCh3OiBXaWRnZXQpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRyYWdnaW5nPy5pZCA9PT0gdy5pZCA/IHRoaXMuZHJhZ2dpbmcuY3VycmVudFBpeGVsWCA6IHRoaXMuY29sVG9QaXhlbCh3LngpO1xuICB9XG5cbiAgZ2V0SXRlbVRvcCh3OiBXaWRnZXQpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRyYWdnaW5nPy5pZCA9PT0gdy5pZCA/IHRoaXMuZHJhZ2dpbmcuY3VycmVudFBpeGVsWSA6IHRoaXMucm93VG9QaXhlbCh3LnkpO1xuICB9XG5cbiAgZ2V0SXRlbVdpZHRoKHc6IFdpZGdldCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVzaXppbmc/LmlkID09PSB3LmlkID8gdGhpcy5yZXNpemluZy5jdXJyZW50UGl4ZWxXIDogdGhpcy5jb2xzVG9QaXhlbFdpZHRoKHcuY29scyk7XG4gIH1cblxuICBnZXRJdGVtSGVpZ2h0KHc6IFdpZGdldCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVzaXppbmc/LmlkID09PSB3LmlkID8gdGhpcy5yZXNpemluZy5jdXJyZW50UGl4ZWxIIDogdGhpcy5yb3dzVG9QaXhlbEhlaWdodCh3LnJvd3MpO1xuICB9XG5cbiAgLy8g4pSA4pSAIERyYWcg4pSA4pSAXG5cbiAgb25EcmFnU3RhcnQoZXZlbnQ6IE1vdXNlRXZlbnQsIHdpZGdldDogV2lkZ2V0KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYSwgLnJlc2l6ZS1oYW5kbGUnKSkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy5ncmlkQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgaXRlbUxlZnQgPSB0aGlzLmNvbFRvUGl4ZWwod2lkZ2V0LngpO1xuICAgIGNvbnN0IGl0ZW1Ub3AgPSB0aGlzLnJvd1RvUGl4ZWwod2lkZ2V0LnkpO1xuXG4gICAgdGhpcy5kcmFnZ2luZyA9IHtcbiAgICAgIGlkOiB3aWRnZXQuaWQsXG4gICAgICBvZmZzZXRYOiBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gaXRlbUxlZnQsXG4gICAgICBvZmZzZXRZOiBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSBpdGVtVG9wLFxuICAgICAgY3VycmVudFBpeGVsWDogaXRlbUxlZnQsXG4gICAgICBjdXJyZW50UGl4ZWxZOiBpdGVtVG9wLFxuICAgIH07XG4gICAgdGhpcy5wcmV2aWV3V2lkZ2V0cyA9IHRoaXMud2lkZ2V0cy5tYXAodyA9PiAoeyBpZDogdy5pZCwgeDogdy54LCB5OiB3LnksIGNvbHM6IHcuY29scywgcm93czogdy5yb3dzIH0pKTtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0ge1xuICAgICAgbGVmdDogaXRlbUxlZnQsIHRvcDogaXRlbVRvcCxcbiAgICAgIHdpZHRoOiB0aGlzLmNvbHNUb1BpeGVsV2lkdGgod2lkZ2V0LmNvbHMpLFxuICAgICAgaGVpZ2h0OiB0aGlzLnJvd3NUb1BpeGVsSGVpZ2h0KHdpZGdldC5yb3dzKSxcbiAgICB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25SZXNpemVTdGFydChldmVudDogTW91c2VFdmVudCwgd2lkZ2V0OiBXaWRnZXQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmVzaXppbmcgPSB7XG4gICAgICBpZDogd2lkZ2V0LmlkLFxuICAgICAgc3RhcnRNb3VzZVg6IGV2ZW50LmNsaWVudFgsXG4gICAgICBzdGFydE1vdXNlWTogZXZlbnQuY2xpZW50WSxcbiAgICAgIHN0YXJ0Q29sczogd2lkZ2V0LmNvbHMsXG4gICAgICBzdGFydFJvd3M6IHdpZGdldC5yb3dzLFxuICAgICAgY3VycmVudFBpeGVsVzogdGhpcy5jb2xzVG9QaXhlbFdpZHRoKHdpZGdldC5jb2xzKSxcbiAgICAgIGN1cnJlbnRQaXhlbEg6IHRoaXMucm93c1RvUGl4ZWxIZWlnaHQod2lkZ2V0LnJvd3MpLFxuICAgIH07XG4gICAgdGhpcy5wcmV2aWV3V2lkZ2V0cyA9IHRoaXMud2lkZ2V0cy5tYXAodyA9PiAoeyBpZDogdy5pZCwgeDogdy54LCB5OiB3LnksIGNvbHM6IHcuY29scywgcm93czogdy5yb3dzIH0pKTtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0ge1xuICAgICAgbGVmdDogdGhpcy5jb2xUb1BpeGVsKHdpZGdldC54KSwgdG9wOiB0aGlzLnJvd1RvUGl4ZWwod2lkZ2V0LnkpLFxuICAgICAgd2lkdGg6IHRoaXMuY29sc1RvUGl4ZWxXaWR0aCh3aWRnZXQuY29scyksXG4gICAgICBoZWlnaHQ6IHRoaXMucm93c1RvUGl4ZWxIZWlnaHQod2lkZ2V0LnJvd3MpLFxuICAgIH07XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZHJhZ2dpbmcpIHRoaXMuaGFuZGxlRHJhZ01vdmUoZXZlbnQpO1xuICAgIGVsc2UgaWYgKHRoaXMucmVzaXppbmcpIHRoaXMuaGFuZGxlUmVzaXplTW92ZShldmVudCk7XG4gIH1cblxuICBwcml2YXRlIG9uTW91c2VVcChfZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kcmFnZ2luZykgdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLmZpbmFsaXplRHJhZygpKTtcbiAgICBlbHNlIGlmICh0aGlzLnJlc2l6aW5nKSB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMuZmluYWxpemVSZXNpemUoKSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURyYWdNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZ3JpZENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHdpZGdldCA9IHRoaXMud2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gdGhpcy5kcmFnZ2luZyEuaWQpITtcbiAgICBpZiAoIXdpZGdldCkgcmV0dXJuO1xuXG4gICAgbGV0IHB4ID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIHRoaXMuZHJhZ2dpbmcub2Zmc2V0WDtcbiAgICBsZXQgcHkgPSBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSB0aGlzLmRyYWdnaW5nLm9mZnNldFk7XG4gICAgcHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihweCwgcmVjdC53aWR0aCAtIHRoaXMuY29sc1RvUGl4ZWxXaWR0aCh3aWRnZXQuY29scykpKTtcbiAgICBweSA9IE1hdGgubWF4KDAsIHB5KTtcblxuICAgIHRoaXMuZHJhZ2dpbmcuY3VycmVudFBpeGVsWCA9IHB4O1xuICAgIHRoaXMuZHJhZ2dpbmcuY3VycmVudFBpeGVsWSA9IHB5O1xuXG4gICAgY29uc3QgdGFyZ2V0Q29sID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5waXhlbFRvQ29sKHB4KSwgdGhpcy5jb2x1bW5zIC0gd2lkZ2V0LmNvbHMpKTtcbiAgICBjb25zdCB0YXJnZXRSb3cgPSBNYXRoLm1heCgwLCB0aGlzLnBpeGVsVG9Sb3cocHkpKTtcblxuICAgIGNvbnN0IHJlc29sdmVkID0gR3JpZEVuZ2luZS5tb3ZlV2lkZ2V0KFxuICAgICAgdGhpcy5wcmV2aWV3V2lkZ2V0cyxcbiAgICAgIHsgaWQ6IHdpZGdldC5pZCwgeDogd2lkZ2V0LngsIHk6IHdpZGdldC55LCBjb2xzOiB3aWRnZXQuY29scywgcm93czogd2lkZ2V0LnJvd3MgfSxcbiAgICAgIHRhcmdldENvbCwgdGFyZ2V0Um93LCB0aGlzLmNvbHVtbnNcbiAgICApO1xuXG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IHtcbiAgICAgIGxlZnQ6IHRoaXMuY29sVG9QaXhlbCh0YXJnZXRDb2wpLCB0b3A6IHRoaXMucm93VG9QaXhlbCh0YXJnZXRSb3cpLFxuICAgICAgd2lkdGg6IHRoaXMuY29sc1RvUGl4ZWxXaWR0aCh3aWRnZXQuY29scyksXG4gICAgICBoZWlnaHQ6IHRoaXMucm93c1RvUGl4ZWxIZWlnaHQod2lkZ2V0LnJvd3MpLFxuICAgIH07XG5cbiAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qgcncgb2YgcmVzb2x2ZWQpIHtcbiAgICAgICAgaWYgKHJ3LmlkID09PSB3aWRnZXQuaWQpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB3ID0gdGhpcy53aWRnZXRzLmZpbmQod3cgPT4gd3cuaWQgPT09IHJ3LmlkKTtcbiAgICAgICAgaWYgKHcpIHsgdy54ID0gcncueDsgdy55ID0gcncueTsgfVxuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVDb250YWluZXJIZWlnaHQoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5hbGl6ZURyYWcoKSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47XG4gICAgY29uc3Qgd2lkZ2V0ID0gdGhpcy53aWRnZXRzLmZpbmQodyA9PiB3LmlkID09PSB0aGlzLmRyYWdnaW5nIS5pZCkhO1xuICAgIGNvbnN0IHRhcmdldENvbCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMucGl4ZWxUb0NvbCh0aGlzLmRyYWdnaW5nLmN1cnJlbnRQaXhlbFgpLCB0aGlzLmNvbHVtbnMgLSB3aWRnZXQuY29scykpO1xuICAgIGNvbnN0IHRhcmdldFJvdyA9IE1hdGgubWF4KDAsIHRoaXMucGl4ZWxUb1Jvdyh0aGlzLmRyYWdnaW5nLmN1cnJlbnRQaXhlbFkpKTtcblxuICAgIGNvbnN0IHJlc29sdmVkID0gR3JpZEVuZ2luZS5tb3ZlV2lkZ2V0KFxuICAgICAgdGhpcy53aWRnZXRzLm1hcCh3ID0+ICh7IGlkOiB3LmlkLCB4OiB3LngsIHk6IHcueSwgY29sczogdy5jb2xzLCByb3dzOiB3LnJvd3MgfSkpLFxuICAgICAgeyBpZDogd2lkZ2V0LmlkLCB4OiB3aWRnZXQueCwgeTogd2lkZ2V0LnksIGNvbHM6IHdpZGdldC5jb2xzLCByb3dzOiB3aWRnZXQucm93cyB9LFxuICAgICAgdGFyZ2V0Q29sLCB0YXJnZXRSb3csIHRoaXMuY29sdW1uc1xuICAgICk7XG4gICAgZm9yIChjb25zdCBydyBvZiByZXNvbHZlZCkge1xuICAgICAgY29uc3QgdyA9IHRoaXMud2lkZ2V0cy5maW5kKHd3ID0+IHd3LmlkID09PSBydy5pZCk7XG4gICAgICBpZiAodykgeyB3LnggPSBydy54OyB3LnkgPSBydy55OyB3LmNvbHMgPSBydy5jb2xzOyB3LnJvd3MgPSBydy5yb3dzOyB0aGlzLml0ZW1DaGFuZ2VkLmVtaXQodyk7IH1cbiAgICB9XG4gICAgdGhpcy5kcmFnZ2luZyA9IG51bGw7XG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IG51bGw7XG4gICAgdGhpcy5wcmV2aWV3V2lkZ2V0cyA9IFtdO1xuICAgIHRoaXMudXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XG4gICAgdGhpcy5sYXlvdXRDaGFuZ2VkLmVtaXQodGhpcy53aWRnZXRzKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUmVzaXplTW92ZShldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICghdGhpcy5yZXNpemluZykgcmV0dXJuO1xuICAgIGNvbnN0IHdpZGdldCA9IHRoaXMud2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gdGhpcy5yZXNpemluZyEuaWQpITtcbiAgICBpZiAoIXdpZGdldCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZHggPSBldmVudC5jbGllbnRYIC0gdGhpcy5yZXNpemluZy5zdGFydE1vdXNlWDtcbiAgICBjb25zdCBkeSA9IGV2ZW50LmNsaWVudFkgLSB0aGlzLnJlc2l6aW5nLnN0YXJ0TW91c2VZO1xuXG4gICAgbGV0IG5ld0NvbHMgPSBNYXRoLm1heCh0aGlzLm1pbkl0ZW1Db2xzLCBNYXRoLnJvdW5kKCh0aGlzLmNvbHNUb1BpeGVsV2lkdGgodGhpcy5yZXNpemluZy5zdGFydENvbHMpICsgZHgpIC8gKHRoaXMuY2VsbFdpZHRoICsgdGhpcy5nYXApKSk7XG4gICAgbGV0IG5ld1Jvd3MgPSBNYXRoLm1heCh0aGlzLm1pbkl0ZW1Sb3dzLCBNYXRoLnJvdW5kKCh0aGlzLnJvd3NUb1BpeGVsSGVpZ2h0KHRoaXMucmVzaXppbmcuc3RhcnRSb3dzKSArIGR5KSAvICh0aGlzLnJvd0hlaWdodCArIHRoaXMuZ2FwKSkpO1xuICAgIG5ld0NvbHMgPSBNYXRoLm1pbihuZXdDb2xzLCB0aGlzLmNvbHVtbnMgLSB3aWRnZXQueCk7XG5cbiAgICB0aGlzLnJlc2l6aW5nLmN1cnJlbnRQaXhlbFcgPSB0aGlzLmNvbHNUb1BpeGVsV2lkdGgobmV3Q29scyk7XG4gICAgdGhpcy5yZXNpemluZy5jdXJyZW50UGl4ZWxIID0gdGhpcy5yb3dzVG9QaXhlbEhlaWdodChuZXdSb3dzKTtcblxuICAgIGNvbnN0IHJlc29sdmVkID0gR3JpZEVuZ2luZS5yZXNpemVXaWRnZXQoXG4gICAgICB0aGlzLnByZXZpZXdXaWRnZXRzLFxuICAgICAgeyBpZDogd2lkZ2V0LmlkLCB4OiB3aWRnZXQueCwgeTogd2lkZ2V0LnksIGNvbHM6IHdpZGdldC5jb2xzLCByb3dzOiB3aWRnZXQucm93cyB9LFxuICAgICAgbmV3Q29scywgbmV3Um93cywgdGhpcy5jb2x1bW5zXG4gICAgKTtcblxuICAgIHRoaXMucGxhY2Vob2xkZXIgPSB7XG4gICAgICBsZWZ0OiB0aGlzLmNvbFRvUGl4ZWwod2lkZ2V0LngpLCB0b3A6IHRoaXMucm93VG9QaXhlbCh3aWRnZXQueSksXG4gICAgICB3aWR0aDogdGhpcy5jb2xzVG9QaXhlbFdpZHRoKG5ld0NvbHMpLFxuICAgICAgaGVpZ2h0OiB0aGlzLnJvd3NUb1BpeGVsSGVpZ2h0KG5ld1Jvd3MpLFxuICAgIH07XG5cbiAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qgcncgb2YgcmVzb2x2ZWQpIHtcbiAgICAgICAgaWYgKHJ3LmlkID09PSB3aWRnZXQuaWQpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB3ID0gdGhpcy53aWRnZXRzLmZpbmQod3cgPT4gd3cuaWQgPT09IHJ3LmlkKTtcbiAgICAgICAgaWYgKHcpIHsgdy54ID0gcncueDsgdy55ID0gcncueTsgfVxuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVDb250YWluZXJIZWlnaHQoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5hbGl6ZVJlc2l6ZSgpIHtcbiAgICBpZiAoIXRoaXMucmVzaXppbmcpIHJldHVybjtcbiAgICBjb25zdCB3aWRnZXQgPSB0aGlzLndpZGdldHMuZmluZCh3ID0+IHcuaWQgPT09IHRoaXMucmVzaXppbmchLmlkKSE7XG5cbiAgICBsZXQgbmV3Q29scyA9IE1hdGgubWF4KHRoaXMubWluSXRlbUNvbHMsIE1hdGgucm91bmQodGhpcy5yZXNpemluZy5jdXJyZW50UGl4ZWxXIC8gKHRoaXMuY2VsbFdpZHRoICsgdGhpcy5nYXApKSk7XG4gICAgbGV0IG5ld1Jvd3MgPSBNYXRoLm1heCh0aGlzLm1pbkl0ZW1Sb3dzLCBNYXRoLnJvdW5kKHRoaXMucmVzaXppbmcuY3VycmVudFBpeGVsSCAvICh0aGlzLnJvd0hlaWdodCArIHRoaXMuZ2FwKSkpO1xuICAgIG5ld0NvbHMgPSBNYXRoLm1pbihuZXdDb2xzLCB0aGlzLmNvbHVtbnMgLSB3aWRnZXQueCk7XG5cbiAgICBjb25zdCByZXNvbHZlZCA9IEdyaWRFbmdpbmUucmVzaXplV2lkZ2V0KFxuICAgICAgdGhpcy53aWRnZXRzLm1hcCh3ID0+ICh7IGlkOiB3LmlkLCB4OiB3LngsIHk6IHcueSwgY29sczogdy5jb2xzLCByb3dzOiB3LnJvd3MgfSkpLFxuICAgICAgeyBpZDogd2lkZ2V0LmlkLCB4OiB3aWRnZXQueCwgeTogd2lkZ2V0LnksIGNvbHM6IHdpZGdldC5jb2xzLCByb3dzOiB3aWRnZXQucm93cyB9LFxuICAgICAgbmV3Q29scywgbmV3Um93cywgdGhpcy5jb2x1bW5zXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IHJ3IG9mIHJlc29sdmVkKSB7XG4gICAgICBjb25zdCB3ID0gdGhpcy53aWRnZXRzLmZpbmQod3cgPT4gd3cuaWQgPT09IHJ3LmlkKTtcbiAgICAgIGlmICh3KSB7IHcueCA9IHJ3Lng7IHcueSA9IHJ3Lnk7IHcuY29scyA9IHJ3LmNvbHM7IHcucm93cyA9IHJ3LnJvd3M7IHRoaXMuaXRlbUNoYW5nZWQuZW1pdCh3KTsgfVxuICAgIH1cbiAgICB0aGlzLnJlc2l6aW5nID0gbnVsbDtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gbnVsbDtcbiAgICB0aGlzLnByZXZpZXdXaWRnZXRzID0gW107XG4gICAgdGhpcy51cGRhdGVDb250YWluZXJIZWlnaHQoKTtcbiAgICB0aGlzLmxheW91dENoYW5nZWQuZW1pdCh0aGlzLndpZGdldHMpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFV0aWxpdGllcyDilIDilIBcblxuICBwcml2YXRlIGNvbXBhY3RBbmRBcHBseSgpOiBXaWRnZXRbXSB7XG4gICAgaWYgKCF0aGlzLndpZGdldHM/Lmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGNvbXBhY3RlZCA9IEdyaWRFbmdpbmUuY29tcGFjdChcbiAgICAgIHRoaXMud2lkZ2V0cy5tYXAodyA9PiAoeyBpZDogdy5pZCwgeDogdy54LCB5OiB3LnksIGNvbHM6IHcuY29scywgcm93czogdy5yb3dzIH0pKSxcbiAgICAgIHRoaXMuY29sdW1uc1xuICAgICk7XG5cbiAgICBjb25zdCBjaGFuZ2VkV2lkZ2V0czogV2lkZ2V0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJ3IG9mIGNvbXBhY3RlZCkge1xuICAgICAgY29uc3QgdyA9IHRoaXMud2lkZ2V0cy5maW5kKHd3ID0+IHd3LmlkID09PSBydy5pZCk7XG4gICAgICBpZiAoIXcpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBjaGFuZ2VkID0gdy54ICE9PSBydy54IHx8IHcueSAhPT0gcncueSB8fCB3LmNvbHMgIT09IHJ3LmNvbHMgfHwgdy5yb3dzICE9PSBydy5yb3dzO1xuICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgdy54ID0gcncueDtcbiAgICAgICAgdy55ID0gcncueTtcbiAgICAgICAgdy5jb2xzID0gcncuY29scztcbiAgICAgICAgdy5yb3dzID0gcncucm93cztcbiAgICAgICAgY2hhbmdlZFdpZGdldHMucHVzaCh3KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbmdlZFdpZGdldHM7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Q29tcGFjdGlvbkFuZFN5bmMoKSB7XG4gICAgY29uc3QgY2hhbmdlZFdpZGdldHMgPSB0aGlzLmNvbXBhY3RBbmRBcHBseSgpO1xuICAgIGlmICghY2hhbmdlZFdpZGdldHMubGVuZ3RoKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IHdpZGdldCBvZiBjaGFuZ2VkV2lkZ2V0cykge1xuICAgICAgdGhpcy5pdGVtQ2hhbmdlZC5lbWl0KHdpZGdldCk7XG4gICAgfVxuICAgIHRoaXMubGF5b3V0Q2hhbmdlZC5lbWl0KHRoaXMud2lkZ2V0cyk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbnRhaW5lckhlaWdodCgpIHtcbiAgICBpZiAoIXRoaXMud2lkZ2V0cz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IDQwMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhSb3cgPSBHcmlkRW5naW5lLmdldEdyaWRIZWlnaHQoXG4gICAgICB0aGlzLndpZGdldHMubWFwKHcgPT4gKHsgaWQ6IHcuaWQsIHg6IHcueCwgeTogdy55LCBjb2xzOiB3LmNvbHMsIHJvd3M6IHcucm93cyB9KSlcbiAgICApO1xuICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdGhpcy5yb3dUb1BpeGVsKG1heFJvdykgKyB0aGlzLnJvd0hlaWdodCArIHRoaXMuZ2FwO1xuICB9XG59XG4iXX0=