@libs-ui/components-drag-drop 0.2.10-6.2

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 ADDED
@@ -0,0 +1,3 @@
1
+ # drag-drop
2
+
3
+ This library was generated with [Nx](https://nx.dev).
@@ -0,0 +1,4 @@
1
+ export declare const styleContainer: (config: Array<{
2
+ className: string;
3
+ styles: string;
4
+ }>, viewEncapsulation: "emulated" | "none", groupID: string) => string;
@@ -0,0 +1,37 @@
1
+ import { AfterViewInit, OnDestroy } from "@angular/core";
2
+ import { LibsUiComponentsDragScrollDirective } from "./drag-scroll.directive";
3
+ import { IDragDropFunctionControlEvent, IDragEnd, IDragLeave, IDragOver, IDragStart, IDrop } from "./interfaces/event.interface";
4
+ import * as i0 from "@angular/core";
5
+ export declare class LibsUiComponentsDragContainerDirective extends LibsUiComponentsDragScrollDirective implements AfterViewInit, OnDestroy {
6
+ private groupID;
7
+ private isDragOver;
8
+ readonly disableDragContainer: import("@angular/core").InputSignal<boolean | undefined>;
9
+ readonly mode: import("@angular/core").InputSignalWithTransform<string, "move" | "copy" | "deepCopy">;
10
+ readonly directionDrag: import("@angular/core").InputSignal<"horizontal" | "vertical" | undefined>;
11
+ readonly viewEncapsulation: import("@angular/core").InputSignalWithTransform<"emulated" | "none", "emulated" | "none" | undefined>;
12
+ readonly acceptDragSameGroup: import("@angular/core").InputSignalWithTransform<boolean, boolean | undefined>;
13
+ readonly placeholder: import("@angular/core").InputSignalWithTransform<boolean, boolean | undefined>;
14
+ readonly groupName: import("@angular/core").InputSignalWithTransform<string, string | undefined>;
15
+ readonly dropToGroupName: import("@angular/core").InputSignal<string[] | null>;
16
+ readonly items: import("@angular/core").ModelSignal<unknown[]>;
17
+ readonly stylesOverride: import("@angular/core").InputSignal<{
18
+ className: string;
19
+ styles: string;
20
+ }[] | undefined>;
21
+ readonly outDragStartContainer: import("@angular/core").OutputEmitterRef<IDragStart>;
22
+ readonly outDragOverContainer: import("@angular/core").OutputEmitterRef<IDragOver>;
23
+ readonly outDragLeaveContainer: import("@angular/core").OutputEmitterRef<IDragLeave>;
24
+ readonly outDragEndContainer: import("@angular/core").OutputEmitterRef<IDragEnd>;
25
+ readonly outDroppedContainer: import("@angular/core").OutputEmitterRef<IDrop>;
26
+ readonly outDroppedContainerEmpty: import("@angular/core").OutputEmitterRef<IDrop>;
27
+ readonly outFunctionControl: import("@angular/core").OutputEmitterRef<IDragDropFunctionControlEvent>;
28
+ constructor();
29
+ ngAfterViewInit(): void;
30
+ private setAttributeElementAndItemDrag;
31
+ private initStyleAndAttribute;
32
+ private setAnimationElementDragOver;
33
+ private setIndexElement;
34
+ private removeAttributes;
35
+ static ɵfac: i0.ɵɵFactoryDeclaration<LibsUiComponentsDragContainerDirective, never>;
36
+ static ɵdir: i0.ɵɵDirectiveDeclaration<LibsUiComponentsDragContainerDirective, "[LibsUiComponentsDragContainerDirective]", never, { "disableDragContainer": { "alias": "disableDragContainer"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "directionDrag": { "alias": "directionDrag"; "required": false; "isSignal": true; }; "viewEncapsulation": { "alias": "viewEncapsulation"; "required": false; "isSignal": true; }; "acceptDragSameGroup": { "alias": "acceptDragSameGroup"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "groupName": { "alias": "groupName"; "required": false; "isSignal": true; }; "dropToGroupName": { "alias": "dropToGroupName"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": true; "isSignal": true; }; "stylesOverride": { "alias": "stylesOverride"; "required": false; "isSignal": true; }; }, { "items": "itemsChange"; "outDragStartContainer": "outDragStartContainer"; "outDragOverContainer": "outDragOverContainer"; "outDragLeaveContainer": "outDragLeaveContainer"; "outDragEndContainer": "outDragEndContainer"; "outDroppedContainer": "outDroppedContainer"; "outDroppedContainerEmpty": "outDroppedContainerEmpty"; "outFunctionControl": "outFunctionControl"; }, never, never, true, never>;
37
+ }
@@ -0,0 +1,45 @@
1
+ import { WritableSignal } from "@angular/core";
2
+ import { Subject } from "rxjs";
3
+ import { IDragEnd, IDragItemInContainerVirtualScroll, IDragLeave, IDragOver, IDragStart, IDragging, IDrop, IItemDragInfo } from "./interfaces/event.interface";
4
+ import * as i0 from "@angular/core";
5
+ export declare class MoLibsSharedDragDropService {
6
+ private itemsClick;
7
+ private onDragItemInContainerVirtualScroll;
8
+ private itemDragInfo?;
9
+ private container;
10
+ private targetItemDragFlag;
11
+ private classContainerDefine;
12
+ private classItemDefine;
13
+ private onDragging;
14
+ private onDragStart;
15
+ private onDragEnd;
16
+ private onDragOver;
17
+ private onDragLeave;
18
+ private onDrop;
19
+ private onDropContainer;
20
+ private onItemInit;
21
+ get OnDragItemInContainerVirtualScroll(): Subject<IDragItemInContainerVirtualScroll>;
22
+ set ItemDragInfo(data: IItemDragInfo | undefined);
23
+ get ItemDragInfo(): IItemDragInfo | undefined;
24
+ get Container(): WritableSignal<Map<string, {
25
+ element: HTMLElement;
26
+ elementScroll?: HTMLElement;
27
+ }>>;
28
+ get TargetItemDragFlag(): string;
29
+ get ClassContainerDefine(): string;
30
+ get ClassItemDefine(): string;
31
+ get OnDragging(): Subject<IDragging>;
32
+ get OnDragOver(): Subject<IDragOver>;
33
+ get OnDragLeave(): Subject<IDragLeave>;
34
+ get OnDragStart(): Subject<IDragStart>;
35
+ get OnDragEnd(): Subject<IDragEnd>;
36
+ get OnDropContainer(): Subject<IDrop>;
37
+ get OnDrop(): Subject<IDrop>;
38
+ get OnItemInit(): Subject<string>;
39
+ get ItemClick(): Array<HTMLElement>;
40
+ set ItemClick(item: HTMLElement);
41
+ resetItemClick(): void;
42
+ checkElementOverAcceptElementDrag(groupNameOfContainer: string | null, groupNameOfElementDrag: string | null, groupNameOfDropTo: string | null): boolean;
43
+ static ɵfac: i0.ɵɵFactoryDeclaration<MoLibsSharedDragDropService, never>;
44
+ static ɵprov: i0.ɵɵInjectableDeclaration<MoLibsSharedDragDropService>;
45
+ }
@@ -0,0 +1,25 @@
1
+ import { AfterViewInit, OnDestroy } from "@angular/core";
2
+ import { IBoundingClientRect } from "@libs-ui/interfaces-types";
3
+ import { Subject } from "rxjs";
4
+ import { MoLibsSharedDragDropService } from "./drag-drop.service";
5
+ import { IDragEnd } from "./interfaces/event.interface";
6
+ import * as i0 from "@angular/core";
7
+ export declare class LibsUiDragItemInContainerVirtualScrollDirective implements AfterViewInit, OnDestroy {
8
+ protected onDestroy: Subject<void>;
9
+ readonly outDragEndContainer: import("@angular/core").OutputEmitterRef<IDragEnd>;
10
+ protected dragDropService: MoLibsSharedDragDropService;
11
+ ngAfterViewInit(): void;
12
+ protected getClientPosition(element: HTMLElement, mousePosition: {
13
+ clientX: number;
14
+ clientY: number;
15
+ }, distanceStartElementAndMouseLeft: number, distanceStartElementAndMouseTop: number, dragBoundary?: boolean, elementContainer?: HTMLElement): {
16
+ clientX: number;
17
+ clientY: number;
18
+ elementKeepContainer: boolean;
19
+ viewport: IBoundingClientRect;
20
+ };
21
+ protected updateMouseEventsWhenMoveOverIframe(pointerEvents: 'none' | 'auto'): void;
22
+ ngOnDestroy(): void;
23
+ static ɵfac: i0.ɵɵFactoryDeclaration<LibsUiDragItemInContainerVirtualScrollDirective, never>;
24
+ static ɵdir: i0.ɵɵDirectiveDeclaration<LibsUiDragItemInContainerVirtualScrollDirective, "[LibsUiDragItemInContainerVirtualScrollDirective]", never, {}, { "outDragEndContainer": "outDragEndContainer"; }, never, never, true, never>;
25
+ }
@@ -0,0 +1,31 @@
1
+ import { AfterViewInit, OnDestroy } from "@angular/core";
2
+ import { LibsUiDragItemInContainerVirtualScrollDirective } from "./drag-item-in-container-virtual-scroll.directive";
3
+ import { IDragEnd, IDragLeave, IDragOver, IDragStart, IDrop } from "./interfaces/event.interface";
4
+ import * as i0 from "@angular/core";
5
+ export declare class LibsUiDragItemDirective extends LibsUiDragItemInContainerVirtualScrollDirective implements AfterViewInit, OnDestroy {
6
+ private isDragOver;
7
+ private isDragging;
8
+ readonly fieldId: import("@angular/core").InputSignal<string>;
9
+ readonly item: import("@angular/core").InputSignal<any>;
10
+ readonly itemInContainerVirtualScroll: import("@angular/core").InputSignal<boolean | undefined>;
11
+ readonly throttleTimeHandlerDraggingEvent: import("@angular/core").InputSignalWithTransform<number, number | undefined>;
12
+ readonly ignoreStopEvent: import("@angular/core").InputSignal<boolean | undefined>;
13
+ readonly onlyMouseDownStopEvent: import("@angular/core").InputSignal<boolean | undefined>;
14
+ readonly dragRootElement: import("@angular/core").InputSignal<boolean | undefined>;
15
+ readonly groupName: import("@angular/core").InputSignalWithTransform<string, string | undefined>;
16
+ readonly dragBoundary: import("@angular/core").InputSignal<boolean | undefined>;
17
+ readonly dragBoundaryAcceptMouseLeaveContainer: import("@angular/core").InputSignal<boolean | undefined>;
18
+ readonly elementContainer: import("@angular/core").InputSignal<HTMLElement | undefined>;
19
+ readonly zIndex: import("@angular/core").InputSignalWithTransform<number, number | undefined>;
20
+ readonly disable: import("@angular/core").InputSignal<boolean | undefined>;
21
+ readonly outDragStart: import("@angular/core").OutputEmitterRef<IDragStart>;
22
+ readonly outDragOver: import("@angular/core").OutputEmitterRef<IDragOver>;
23
+ readonly outDragLeave: import("@angular/core").OutputEmitterRef<IDragLeave>;
24
+ readonly outDragEnd: import("@angular/core").OutputEmitterRef<IDragEnd>;
25
+ readonly outDropped: import("@angular/core").OutputEmitterRef<IDrop>;
26
+ private elementRef;
27
+ constructor();
28
+ ngAfterViewInit(): void;
29
+ static ɵfac: i0.ɵɵFactoryDeclaration<LibsUiDragItemDirective, never>;
30
+ static ɵdir: i0.ɵɵDirectiveDeclaration<LibsUiDragItemDirective, "[LibsUiDragItemDirective]", never, { "fieldId": { "alias": "fieldId"; "required": false; "isSignal": true; }; "item": { "alias": "item"; "required": false; "isSignal": true; }; "itemInContainerVirtualScroll": { "alias": "itemInContainerVirtualScroll"; "required": false; "isSignal": true; }; "throttleTimeHandlerDraggingEvent": { "alias": "throttleTimeHandlerDraggingEvent"; "required": false; "isSignal": true; }; "ignoreStopEvent": { "alias": "ignoreStopEvent"; "required": false; "isSignal": true; }; "onlyMouseDownStopEvent": { "alias": "onlyMouseDownStopEvent"; "required": false; "isSignal": true; }; "dragRootElement": { "alias": "dragRootElement"; "required": false; "isSignal": true; }; "groupName": { "alias": "groupName"; "required": false; "isSignal": true; }; "dragBoundary": { "alias": "dragBoundary"; "required": false; "isSignal": true; }; "dragBoundaryAcceptMouseLeaveContainer": { "alias": "dragBoundaryAcceptMouseLeaveContainer"; "required": false; "isSignal": true; }; "elementContainer": { "alias": "elementContainer"; "required": false; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "disable": { "alias": "disable"; "required": false; "isSignal": true; }; }, { "outDragStart": "outDragStart"; "outDragOver": "outDragOver"; "outDragLeave": "outDragLeave"; "outDragEnd": "outDragEnd"; "outDropped": "outDropped"; }, never, never, true, never>;
31
+ }
@@ -0,0 +1,24 @@
1
+ import { AfterViewInit, ElementRef, OnDestroy } from "@angular/core";
2
+ import { VirtualScrollerComponent } from "@iharbeck/ngx-virtual-scroller";
3
+ import { Subject } from "rxjs";
4
+ import { MoLibsSharedDragDropService } from "./drag-drop.service";
5
+ import { IDragging } from "./interfaces/event.interface";
6
+ import * as i0 from "@angular/core";
7
+ export declare class LibsUiComponentsDragScrollDirective implements AfterViewInit, OnDestroy {
8
+ private stopScroll;
9
+ private virtualScrollPageInfo;
10
+ protected intervalScrollToElement: import("@angular/core").WritableSignal<number | undefined>;
11
+ protected onDestroy: Subject<void>;
12
+ readonly ignoreAutoScroll: import("@angular/core").InputSignal<boolean | undefined>;
13
+ readonly widthZoneDetect: import("@angular/core").InputSignalWithTransform<number, number | undefined>;
14
+ readonly movementLength: import("@angular/core").InputSignalWithTransform<number, number | undefined>;
15
+ readonly rootElementScroll: import("@angular/core").InputSignal<HTMLElement | undefined>;
16
+ readonly virtualScrollerComponent: import("@angular/core").InputSignal<VirtualScrollerComponent | undefined>;
17
+ protected elementRef: ElementRef<any>;
18
+ protected dragDropService: MoLibsSharedDragDropService;
19
+ ngAfterViewInit(): void;
20
+ protected checkAndScrollElementToPosition(eventDragging: IDragging, ignoreAutoScroll?: boolean): void;
21
+ ngOnDestroy(): void;
22
+ static ɵfac: i0.ɵɵFactoryDeclaration<LibsUiComponentsDragScrollDirective, never>;
23
+ static ɵdir: i0.ɵɵDirectiveDeclaration<LibsUiComponentsDragScrollDirective, "[LibsUiComponentsDragScrollDirective]", never, { "ignoreAutoScroll": { "alias": "ignoreAutoScroll"; "required": false; "isSignal": true; }; "widthZoneDetect": { "alias": "widthZoneDetect"; "required": false; "isSignal": true; }; "movementLength": { "alias": "movementLength"; "required": false; "isSignal": true; }; "rootElementScroll": { "alias": "rootElementScroll"; "required": false; "isSignal": true; }; "virtualScrollerComponent": { "alias": "virtualScrollerComponent"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
24
+ }
@@ -0,0 +1,102 @@
1
+ export const styleContainer = (config, viewEncapsulation, groupID) => {
2
+ const defaultConfig = [{
3
+ className: 'libs-ui-drag-drop-container',
4
+ styles: `display:block;`
5
+ },
6
+ {
7
+ className: 'libs-ui-drag-drop-item',
8
+ styles: `
9
+ cursor:move;`
10
+ },
11
+ {
12
+ className: 'libs-ui-drag-drop-item-placeholder',
13
+ styles: `visibility: hidden;`
14
+ },
15
+ {
16
+ className: 'libs-ui-drag-drop-item-origin-placeholder',
17
+ styles: `visibility: hidden;`
18
+ },
19
+ {
20
+ className: 'libs-ui-drag-drop-item-drop-placeholder',
21
+ styles: `visibility: hidden;`
22
+ },
23
+ {
24
+ className: 'libs-ui-drag-drop-item-dragging',
25
+ styles: `cursor:move; user-select: none; `
26
+ },
27
+ {
28
+ className: 'libs-ui-drag-drop-item-disable',
29
+ styles: ` cursor:not-allowed;`
30
+ },
31
+ {
32
+ className: 'libs-ui-drag-drop-item-translate-bottom',
33
+ styles: `position:relative;animation: translateBottom 0.35s 1 ease;`
34
+ },
35
+ {
36
+ className: 'libs-ui-drag-drop-item-translate-top',
37
+ styles: `position:relative;animation: translateTop 0.35s 1 ease;`
38
+ },
39
+ {
40
+ className: 'libs-ui-drag-drop-item-translate-left',
41
+ styles: `position:relative;animation: translateLeft 0.35s 1 ease;`
42
+ },
43
+ {
44
+ className: 'libs-ui-drag-drop-item-translate-right',
45
+ styles: `position:relative;animation: translateRight 0.35s 1 ease;`
46
+ }];
47
+ config.forEach(item => {
48
+ const itemExits = defaultConfig.find(defaultItem => defaultItem.className === item.className);
49
+ if (itemExits) {
50
+ itemExits.styles = item.styles;
51
+ return;
52
+ }
53
+ defaultConfig.push(item);
54
+ });
55
+ const groupAttr = viewEncapsulation ? `[groupID~="${groupID}"]` : '';
56
+ let styles = '';
57
+ defaultConfig.forEach((item) => {
58
+ const style = `${groupAttr}.${item.className}{${item.styles}}`;
59
+ styles = `${styles}${style}\n`;
60
+ });
61
+ styles = ` @keyframes translateTop {
62
+ 0% {
63
+ transform: translateY(30px);
64
+ }
65
+
66
+ 100% {
67
+ transform: translateX(0);
68
+ }
69
+ }
70
+
71
+ @keyframes translateBottom {
72
+ 0% {
73
+ transform: translateY(-30px);
74
+ }
75
+
76
+ 100% {
77
+ transform: translateX(0px);
78
+ }
79
+ }
80
+ @keyframes translateLeft {
81
+ 0% {
82
+ transform: translateX(30px);
83
+ }
84
+
85
+ 100% {
86
+ transform: translateX(0);
87
+ }
88
+ }
89
+
90
+ @keyframes translateRight {
91
+ 0% {
92
+ transform: translateX(-30px);
93
+ }
94
+
95
+ 100% {
96
+ transform: translateX(0px);
97
+ }
98
+ }
99
+ ${styles}`.replace(/\n+/g, '');
100
+ return styles;
101
+ };
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NzLmRlZmluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9kcmFnLWRyb3Avc3JjL2RlZmluZXMvY3NzLmRlZmluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUFvRCxFQUFFLGlCQUFzQyxFQUFFLE9BQWUsRUFBVSxFQUFFO0lBQ3RKLE1BQU0sYUFBYSxHQUFHLENBQUM7WUFDckIsU0FBUyxFQUFFLDZCQUE2QjtZQUN4QyxNQUFNLEVBQUUsZ0JBQWdCO1NBQ3pCO1FBQ0Q7WUFDRSxTQUFTLEVBQUUsd0JBQXdCO1lBQ25DLE1BQU0sRUFBRTtpQkFDSztTQUNkO1FBQ0Q7WUFDRSxTQUFTLEVBQUUsb0NBQW9DO1lBQy9DLE1BQU0sRUFBRSxxQkFBcUI7U0FDOUI7UUFDRDtZQUNFLFNBQVMsRUFBRSwyQ0FBMkM7WUFDdEQsTUFBTSxFQUFFLHFCQUFxQjtTQUM5QjtRQUNEO1lBQ0UsU0FBUyxFQUFFLHlDQUF5QztZQUNwRCxNQUFNLEVBQUUscUJBQXFCO1NBQzlCO1FBQ0Q7WUFDRSxTQUFTLEVBQUUsaUNBQWlDO1lBQzVDLE1BQU0sRUFBRSxtQ0FBbUM7U0FDNUM7UUFDRDtZQUNFLFNBQVMsRUFBRSxnQ0FBZ0M7WUFDM0MsTUFBTSxFQUFFLHNCQUFzQjtTQUMvQjtRQUNEO1lBQ0UsU0FBUyxFQUFFLHlDQUF5QztZQUNwRCxNQUFNLEVBQUUsNERBQTREO1NBQ3JFO1FBQ0Q7WUFDRSxTQUFTLEVBQUUsc0NBQXNDO1lBQ2pELE1BQU0sRUFBRSx5REFBeUQ7U0FDbEU7UUFDRDtZQUNFLFNBQVMsRUFBRSx1Q0FBdUM7WUFDbEQsTUFBTSxFQUFFLDBEQUEwRDtTQUNuRTtRQUNEO1lBQ0UsU0FBUyxFQUFFLHdDQUF3QztZQUNuRCxNQUFNLEVBQUUsMkRBQTJEO1NBQ3BFLENBQUMsQ0FBQztJQUVILE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDcEIsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTlGLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFFL0IsT0FBTztRQUNULENBQUM7UUFDRCxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGNBQWMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNyRSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFFaEIsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQzdCLE1BQU0sS0FBSyxHQUFHLEdBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBRS9ELE1BQU0sR0FBRyxHQUFHLE1BQU0sR0FBRyxLQUFLLElBQUksQ0FBQztJQUNqQyxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFzQ1AsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUUvQixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3Qgc3R5bGVDb250YWluZXIgPSAoY29uZmlnOiBBcnJheTx7IGNsYXNzTmFtZTogc3RyaW5nLCBzdHlsZXM6IHN0cmluZyB9Piwgdmlld0VuY2Fwc3VsYXRpb246ICdlbXVsYXRlZCcgfCAnbm9uZScsIGdyb3VwSUQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGRlZmF1bHRDb25maWcgPSBbe1xuICAgIGNsYXNzTmFtZTogJ2xpYnMtdWktZHJhZy1kcm9wLWNvbnRhaW5lcicsXG4gICAgc3R5bGVzOiBgZGlzcGxheTpibG9jaztgXG4gIH0sXG4gIHtcbiAgICBjbGFzc05hbWU6ICdsaWJzLXVpLWRyYWctZHJvcC1pdGVtJyxcbiAgICBzdHlsZXM6IGBcbiAgICBjdXJzb3I6bW92ZTtgXG4gIH0sXG4gIHtcbiAgICBjbGFzc05hbWU6ICdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXBsYWNlaG9sZGVyJyxcbiAgICBzdHlsZXM6IGB2aXNpYmlsaXR5OiBoaWRkZW47YFxuICB9LFxuICB7XG4gICAgY2xhc3NOYW1lOiAnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1vcmlnaW4tcGxhY2Vob2xkZXInLFxuICAgIHN0eWxlczogYHZpc2liaWxpdHk6IGhpZGRlbjtgXG4gIH0sXG4gIHtcbiAgICBjbGFzc05hbWU6ICdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLWRyb3AtcGxhY2Vob2xkZXInLFxuICAgIHN0eWxlczogYHZpc2liaWxpdHk6IGhpZGRlbjtgXG4gIH0sXG4gIHtcbiAgICBjbGFzc05hbWU6ICdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLWRyYWdnaW5nJyxcbiAgICBzdHlsZXM6IGBjdXJzb3I6bW92ZTsgIHVzZXItc2VsZWN0OiBub25lOyBgXG4gIH0sXG4gIHtcbiAgICBjbGFzc05hbWU6ICdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLWRpc2FibGUnLFxuICAgIHN0eWxlczogYCBjdXJzb3I6bm90LWFsbG93ZWQ7YFxuICB9LFxuICB7XG4gICAgY2xhc3NOYW1lOiAnbGlicy11aS1kcmFnLWRyb3AtaXRlbS10cmFuc2xhdGUtYm90dG9tJyxcbiAgICBzdHlsZXM6IGBwb3NpdGlvbjpyZWxhdGl2ZTthbmltYXRpb246IHRyYW5zbGF0ZUJvdHRvbSAwLjM1cyAxIGVhc2U7YFxuICB9LFxuICB7XG4gICAgY2xhc3NOYW1lOiAnbGlicy11aS1kcmFnLWRyb3AtaXRlbS10cmFuc2xhdGUtdG9wJyxcbiAgICBzdHlsZXM6IGBwb3NpdGlvbjpyZWxhdGl2ZTthbmltYXRpb246IHRyYW5zbGF0ZVRvcCAwLjM1cyAxIGVhc2U7YFxuICB9LFxuICB7XG4gICAgY2xhc3NOYW1lOiAnbGlicy11aS1kcmFnLWRyb3AtaXRlbS10cmFuc2xhdGUtbGVmdCcsXG4gICAgc3R5bGVzOiBgcG9zaXRpb246cmVsYXRpdmU7YW5pbWF0aW9uOiB0cmFuc2xhdGVMZWZ0IDAuMzVzIDEgZWFzZTtgXG4gIH0sXG4gIHtcbiAgICBjbGFzc05hbWU6ICdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXRyYW5zbGF0ZS1yaWdodCcsXG4gICAgc3R5bGVzOiBgcG9zaXRpb246cmVsYXRpdmU7YW5pbWF0aW9uOiB0cmFuc2xhdGVSaWdodCAwLjM1cyAxIGVhc2U7YFxuICB9XTtcblxuICBjb25maWcuZm9yRWFjaChpdGVtID0+IHtcbiAgICBjb25zdCBpdGVtRXhpdHMgPSBkZWZhdWx0Q29uZmlnLmZpbmQoZGVmYXVsdEl0ZW0gPT4gZGVmYXVsdEl0ZW0uY2xhc3NOYW1lID09PSBpdGVtLmNsYXNzTmFtZSk7XG5cbiAgICBpZiAoaXRlbUV4aXRzKSB7XG4gICAgICBpdGVtRXhpdHMuc3R5bGVzID0gaXRlbS5zdHlsZXM7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZGVmYXVsdENvbmZpZy5wdXNoKGl0ZW0pO1xuICB9KTtcbiAgY29uc3QgZ3JvdXBBdHRyID0gdmlld0VuY2Fwc3VsYXRpb24gPyBgW2dyb3VwSUR+PVwiJHtncm91cElEfVwiXWAgOiAnJztcbiAgbGV0IHN0eWxlcyA9ICcnO1xuXG4gIGRlZmF1bHRDb25maWcuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIGNvbnN0IHN0eWxlID0gYCR7Z3JvdXBBdHRyfS4ke2l0ZW0uY2xhc3NOYW1lfXske2l0ZW0uc3R5bGVzfX1gO1xuXG4gICAgc3R5bGVzID0gYCR7c3R5bGVzfSR7c3R5bGV9XFxuYDtcbiAgfSk7XG5cbiAgc3R5bGVzID0gYCBAa2V5ZnJhbWVzIHRyYW5zbGF0ZVRvcCB7XG4gICAgMCUge1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDMwcHgpO1xuICAgIH1cbiAgXG4gICAgMTAwJSB7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XG4gICAgfVxuICB9XG4gIFxuICBAa2V5ZnJhbWVzIHRyYW5zbGF0ZUJvdHRvbSB7XG4gICAgMCUge1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0zMHB4KTtcbiAgICB9XG4gIFxuICAgIDEwMCUge1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDBweCk7XG4gICAgfVxuICB9XG4gIEBrZXlmcmFtZXMgdHJhbnNsYXRlTGVmdCB7XG4gICAgMCUge1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDMwcHgpO1xuICAgIH1cbiAgXG4gICAgMTAwJSB7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XG4gICAgfVxuICB9XG4gIFxuICBAa2V5ZnJhbWVzIHRyYW5zbGF0ZVJpZ2h0IHtcbiAgICAwJSB7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTMwcHgpO1xuICAgIH1cbiAgXG4gICAgMTAwJSB7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMHB4KTtcbiAgICB9XG4gIH1cbiAgJHtzdHlsZXN9YC5yZXBsYWNlKC9cXG4rL2csICcnKTtcblxuICByZXR1cm4gc3R5bGVzO1xufTsiXX0=