ngx-drag-drop 16.0.0 → 17.0.0

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.
@@ -0,0 +1,199 @@
1
+ import { Directive, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, inject, Input, NgZone, Output, Renderer2, } from '@angular/core';
2
+ import { dndState, endDrag, startDrag } from './dnd-state';
3
+ import { calculateDragImageOffset, setDragData, setDragImage, } from './dnd-utils';
4
+ import * as i0 from "@angular/core";
5
+ export class DndDragImageRefDirective {
6
+ dndDraggableDirective = inject(forwardRef(() => DndDraggableDirective));
7
+ elementRef = inject(ElementRef);
8
+ ngOnInit() {
9
+ this.dndDraggableDirective.registerDragImage(this.elementRef);
10
+ }
11
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: DndDragImageRefDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
12
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.4", type: DndDragImageRefDirective, isStandalone: true, selector: "[dndDragImageRef]", ngImport: i0 });
13
+ }
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: DndDragImageRefDirective, decorators: [{
15
+ type: Directive,
16
+ args: [{ selector: '[dndDragImageRef]', standalone: true }]
17
+ }] });
18
+ export class DndDraggableDirective {
19
+ dndDraggable;
20
+ dndEffectAllowed = 'copy';
21
+ dndType;
22
+ dndDraggingClass = 'dndDragging';
23
+ dndDraggingSourceClass = 'dndDraggingSource';
24
+ dndDraggableDisabledClass = 'dndDraggableDisabled';
25
+ dndDragImageOffsetFunction = calculateDragImageOffset;
26
+ dndStart = new EventEmitter();
27
+ dndDrag = new EventEmitter();
28
+ dndEnd = new EventEmitter();
29
+ dndMoved = new EventEmitter();
30
+ dndCopied = new EventEmitter();
31
+ dndLinked = new EventEmitter();
32
+ dndCanceled = new EventEmitter();
33
+ draggable = true;
34
+ dndHandle;
35
+ dndDragImageElementRef;
36
+ dragImage;
37
+ isDragStarted = false;
38
+ elementRef = inject(ElementRef);
39
+ renderer = inject(Renderer2);
40
+ ngZone = inject(NgZone);
41
+ set dndDisableIf(value) {
42
+ this.draggable = !value;
43
+ if (this.draggable) {
44
+ this.renderer.removeClass(this.elementRef.nativeElement, this.dndDraggableDisabledClass);
45
+ }
46
+ else {
47
+ this.renderer.addClass(this.elementRef.nativeElement, this.dndDraggableDisabledClass);
48
+ }
49
+ }
50
+ set dndDisableDragIf(value) {
51
+ this.dndDisableIf = value;
52
+ }
53
+ ngAfterViewInit() {
54
+ this.ngZone.runOutsideAngular(() => {
55
+ this.elementRef.nativeElement.addEventListener('drag', this.dragEventHandler);
56
+ });
57
+ }
58
+ ngOnDestroy() {
59
+ this.elementRef.nativeElement.removeEventListener('drag', this.dragEventHandler);
60
+ if (this.isDragStarted) {
61
+ endDrag();
62
+ }
63
+ }
64
+ onDragStart(event) {
65
+ if (!this.draggable) {
66
+ return false;
67
+ }
68
+ // check if there is dnd handle and if the dnd handle was used to start the drag
69
+ if (this.dndHandle != null && event._dndUsingHandle == null) {
70
+ event.stopPropagation();
71
+ return false;
72
+ }
73
+ // initialize global state
74
+ startDrag(event, this.dndEffectAllowed, this.dndType);
75
+ this.isDragStarted = true;
76
+ setDragData(event, { data: this.dndDraggable, type: this.dndType }, dndState.effectAllowed);
77
+ this.dragImage = this.determineDragImage();
78
+ // set dragging css class prior to setDragImage so styles are applied before
79
+ // TODO breaking change: add class to elementRef rather than drag image which could be another element
80
+ this.renderer.addClass(this.dragImage, this.dndDraggingClass);
81
+ // set custom dragimage if present
82
+ // set dragimage if drag is started from dndHandle
83
+ if (this.dndDragImageElementRef != null || event._dndUsingHandle != null) {
84
+ setDragImage(event, this.dragImage, this.dndDragImageOffsetFunction);
85
+ }
86
+ // add dragging source css class on first drag event
87
+ const unregister = this.renderer.listen(this.elementRef.nativeElement, 'drag', () => {
88
+ this.renderer.addClass(this.elementRef.nativeElement, this.dndDraggingSourceClass);
89
+ unregister();
90
+ });
91
+ this.dndStart.emit(event);
92
+ event.stopPropagation();
93
+ setTimeout(() => {
94
+ this.renderer.setStyle(this.dragImage, 'pointer-events', 'none');
95
+ }, 100);
96
+ return true;
97
+ }
98
+ onDrag(event) {
99
+ this.dndDrag.emit(event);
100
+ }
101
+ onDragEnd(event) {
102
+ if (!this.draggable || !this.isDragStarted) {
103
+ return;
104
+ }
105
+ // get drop effect from custom stored state as its not reliable across browsers
106
+ const dropEffect = dndState.dropEffect;
107
+ this.renderer.setStyle(this.dragImage, 'pointer-events', 'unset');
108
+ let dropEffectEmitter;
109
+ switch (dropEffect) {
110
+ case 'copy':
111
+ dropEffectEmitter = this.dndCopied;
112
+ break;
113
+ case 'link':
114
+ dropEffectEmitter = this.dndLinked;
115
+ break;
116
+ case 'move':
117
+ dropEffectEmitter = this.dndMoved;
118
+ break;
119
+ default:
120
+ dropEffectEmitter = this.dndCanceled;
121
+ break;
122
+ }
123
+ dropEffectEmitter.emit(event);
124
+ this.dndEnd.emit(event);
125
+ // reset global state
126
+ endDrag();
127
+ this.isDragStarted = false;
128
+ this.renderer.removeClass(this.dragImage, this.dndDraggingClass);
129
+ // IE9 special hammering
130
+ window.setTimeout(() => {
131
+ this.renderer.removeClass(this.elementRef.nativeElement, this.dndDraggingSourceClass);
132
+ }, 0);
133
+ event.stopPropagation();
134
+ }
135
+ registerDragHandle(handle) {
136
+ this.dndHandle = handle;
137
+ }
138
+ registerDragImage(elementRef) {
139
+ this.dndDragImageElementRef = elementRef;
140
+ }
141
+ dragEventHandler = (event) => this.onDrag(event);
142
+ determineDragImage() {
143
+ // evaluate custom drag image existence
144
+ if (typeof this.dndDragImageElementRef !== 'undefined') {
145
+ return this.dndDragImageElementRef.nativeElement;
146
+ }
147
+ else {
148
+ return this.elementRef.nativeElement;
149
+ }
150
+ }
151
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: DndDraggableDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
152
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.4", type: DndDraggableDirective, isStandalone: true, selector: "[dndDraggable]", inputs: { dndDraggable: "dndDraggable", dndEffectAllowed: "dndEffectAllowed", dndType: "dndType", dndDraggingClass: "dndDraggingClass", dndDraggingSourceClass: "dndDraggingSourceClass", dndDraggableDisabledClass: "dndDraggableDisabledClass", dndDragImageOffsetFunction: "dndDragImageOffsetFunction", dndDisableIf: "dndDisableIf", dndDisableDragIf: "dndDisableDragIf" }, outputs: { dndStart: "dndStart", dndDrag: "dndDrag", dndEnd: "dndEnd", dndMoved: "dndMoved", dndCopied: "dndCopied", dndLinked: "dndLinked", dndCanceled: "dndCanceled" }, host: { listeners: { "dragstart": "onDragStart($event)", "dragend": "onDragEnd($event)" }, properties: { "attr.draggable": "this.draggable" } }, ngImport: i0 });
153
+ }
154
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: DndDraggableDirective, decorators: [{
155
+ type: Directive,
156
+ args: [{ selector: '[dndDraggable]', standalone: true }]
157
+ }], propDecorators: { dndDraggable: [{
158
+ type: Input
159
+ }], dndEffectAllowed: [{
160
+ type: Input
161
+ }], dndType: [{
162
+ type: Input
163
+ }], dndDraggingClass: [{
164
+ type: Input
165
+ }], dndDraggingSourceClass: [{
166
+ type: Input
167
+ }], dndDraggableDisabledClass: [{
168
+ type: Input
169
+ }], dndDragImageOffsetFunction: [{
170
+ type: Input
171
+ }], dndStart: [{
172
+ type: Output
173
+ }], dndDrag: [{
174
+ type: Output
175
+ }], dndEnd: [{
176
+ type: Output
177
+ }], dndMoved: [{
178
+ type: Output
179
+ }], dndCopied: [{
180
+ type: Output
181
+ }], dndLinked: [{
182
+ type: Output
183
+ }], dndCanceled: [{
184
+ type: Output
185
+ }], draggable: [{
186
+ type: HostBinding,
187
+ args: ['attr.draggable']
188
+ }], dndDisableIf: [{
189
+ type: Input
190
+ }], dndDisableDragIf: [{
191
+ type: Input
192
+ }], onDragStart: [{
193
+ type: HostListener,
194
+ args: ['dragstart', ['$event']]
195
+ }], onDragEnd: [{
196
+ type: HostListener,
197
+ args: ['dragend', ['$event']]
198
+ }] } });
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWRyYWdnYWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kbmQvc3JjL2xpYi9kbmQtZHJhZ2dhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBR04sTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFM0QsT0FBTyxFQUNMLHdCQUF3QixFQUd4QixXQUFXLEVBQ1gsWUFBWSxHQUNiLE1BQU0sYUFBYSxDQUFDOztBQUdyQixNQUFNLE9BQU8sd0JBQXdCO0lBQ25DLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLFVBQVUsR0FBNEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXpELFFBQVE7UUFDTixJQUFJLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7dUdBTlUsd0JBQXdCOzJGQUF4Qix3QkFBd0I7OzJGQUF4Qix3QkFBd0I7a0JBRHBDLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTs7QUFXOUQsTUFBTSxPQUFPLHFCQUFxQjtJQUN2QixZQUFZLENBQU07SUFDbEIsZ0JBQWdCLEdBQWtCLE1BQU0sQ0FBQztJQUN6QyxPQUFPLENBQVU7SUFDakIsZ0JBQWdCLEdBQUcsYUFBYSxDQUFDO0lBQ2pDLHNCQUFzQixHQUFHLG1CQUFtQixDQUFDO0lBQzdDLHlCQUF5QixHQUFHLHNCQUFzQixDQUFDO0lBQ25ELDBCQUEwQixHQUNqQyx3QkFBd0IsQ0FBQztJQUVSLFFBQVEsR0FDekIsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUNiLE9BQU8sR0FDeEIsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUNiLE1BQU0sR0FDdkIsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUNiLFFBQVEsR0FDekIsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUNiLFNBQVMsR0FDMUIsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUNiLFNBQVMsR0FDMUIsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUNiLFdBQVcsR0FDNUIsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUVELFNBQVMsR0FBRyxJQUFJLENBQUM7SUFFeEMsU0FBUyxDQUFzQjtJQUMvQixzQkFBc0IsQ0FBYztJQUNwQyxTQUFTLENBQXNCO0lBQy9CLGFBQWEsR0FBWSxLQUFLLENBQUM7SUFFL0IsVUFBVSxHQUE0QixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekQsUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3QixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWhDLElBQWEsWUFBWSxDQUFDLEtBQWM7UUFDdEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUV4QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUM3QixJQUFJLENBQUMseUJBQXlCLENBQy9CLENBQUM7U0FDSDthQUFNO1lBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUM3QixJQUFJLENBQUMseUJBQXlCLENBQy9CLENBQUM7U0FDSDtJQUNILENBQUM7SUFFRCxJQUFhLGdCQUFnQixDQUFDLEtBQWM7UUFDMUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDNUIsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FDNUMsTUFBTSxFQUNOLElBQUksQ0FBQyxnQkFBZ0IsQ0FDdEIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FDL0MsTUFBTSxFQUNOLElBQUksQ0FBQyxnQkFBZ0IsQ0FDdEIsQ0FBQztRQUNGLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixPQUFPLEVBQUUsQ0FBQztTQUNYO0lBQ0gsQ0FBQztJQUVzQyxXQUFXLENBQUMsS0FBZTtRQUNoRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNuQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsZ0ZBQWdGO1FBQ2hGLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLGVBQWUsSUFBSSxJQUFJLEVBQUU7WUFDM0QsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCwwQkFBMEI7UUFDMUIsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBRTFCLFdBQVcsQ0FDVCxLQUFLLEVBQ0wsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUMvQyxRQUFRLENBQUMsYUFBYyxDQUN4QixDQUFDO1FBRUYsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUUzQyw0RUFBNEU7UUFDNUUsc0dBQXNHO1FBQ3RHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFOUQsa0NBQWtDO1FBQ2xDLGtEQUFrRDtRQUNsRCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLGVBQWUsSUFBSSxJQUFJLEVBQUU7WUFDeEUsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1NBQ3RFO1FBRUQsb0RBQW9EO1FBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFDN0IsTUFBTSxFQUNOLEdBQUcsRUFBRTtZQUNILElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFDN0IsSUFBSSxDQUFDLHNCQUFzQixDQUM1QixDQUFDO1lBQ0YsVUFBVSxFQUFFLENBQUM7UUFDZixDQUFDLENBQ0YsQ0FBQztRQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTFCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFUixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBZ0I7UUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVvQyxTQUFTLENBQUMsS0FBZ0I7UUFDN0QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQzFDLE9BQU87U0FDUjtRQUNELCtFQUErRTtRQUMvRSxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBRXZDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFbEUsSUFBSSxpQkFBMEMsQ0FBQztRQUUvQyxRQUFRLFVBQVUsRUFBRTtZQUNsQixLQUFLLE1BQU07Z0JBQ1QsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDbkMsTUFBTTtZQUVSLEtBQUssTUFBTTtnQkFDVCxpQkFBaUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNuQyxNQUFNO1lBRVIsS0FBSyxNQUFNO2dCQUNULGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ2xDLE1BQU07WUFFUjtnQkFDRSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO2dCQUNyQyxNQUFNO1NBQ1Q7UUFFRCxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFeEIscUJBQXFCO1FBQ3JCLE9BQU8sRUFBRSxDQUFDO1FBRVYsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFFM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUVqRSx3QkFBd0I7UUFDeEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUM3QixJQUFJLENBQUMsc0JBQXNCLENBQzVCLENBQUM7UUFDSixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFTixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGtCQUFrQixDQUFDLE1BQXNDO1FBQ3ZELElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO0lBQzFCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxVQUFrQztRQUNsRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsVUFBVSxDQUFDO0lBQzNDLENBQUM7SUFFZ0IsZ0JBQWdCLEdBQStCLENBQzlELEtBQWdCLEVBQ2hCLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWhCLGtCQUFrQjtRQUN4Qix1Q0FBdUM7UUFDdkMsSUFBSSxPQUFPLElBQUksQ0FBQyxzQkFBc0IsS0FBSyxXQUFXLEVBQUU7WUFDdEQsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBd0IsQ0FBQztTQUM3RDthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztTQUN0QztJQUNILENBQUM7dUdBOU1VLHFCQUFxQjsyRkFBckIscUJBQXFCOzsyRkFBckIscUJBQXFCO2tCQURqQyxTQUFTO21CQUFDLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7OEJBRWhELFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLHlCQUF5QjtzQkFBakMsS0FBSztnQkFDRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBR2EsUUFBUTtzQkFBMUIsTUFBTTtnQkFFWSxPQUFPO3NCQUF6QixNQUFNO2dCQUVZLE1BQU07c0JBQXhCLE1BQU07Z0JBRVksUUFBUTtzQkFBMUIsTUFBTTtnQkFFWSxTQUFTO3NCQUEzQixNQUFNO2dCQUVZLFNBQVM7c0JBQTNCLE1BQU07Z0JBRVksV0FBVztzQkFBN0IsTUFBTTtnQkFHd0IsU0FBUztzQkFBdkMsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBV2hCLFlBQVk7c0JBQXhCLEtBQUs7Z0JBZ0JPLGdCQUFnQjtzQkFBNUIsS0FBSztnQkF1QmlDLFdBQVc7c0JBQWpELFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQThEQSxTQUFTO3NCQUE3QyxZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEbmRIYW5kbGVEaXJlY3RpdmUgfSBmcm9tICcuL2RuZC1oYW5kbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IGRuZFN0YXRlLCBlbmREcmFnLCBzdGFydERyYWcgfSBmcm9tICcuL2RuZC1zdGF0ZSc7XG5pbXBvcnQgeyBFZmZlY3RBbGxvd2VkIH0gZnJvbSAnLi9kbmQtdHlwZXMnO1xuaW1wb3J0IHtcbiAgY2FsY3VsYXRlRHJhZ0ltYWdlT2Zmc2V0LFxuICBEbmREcmFnSW1hZ2VPZmZzZXRGdW5jdGlvbixcbiAgRG5kRXZlbnQsXG4gIHNldERyYWdEYXRhLFxuICBzZXREcmFnSW1hZ2UsXG59IGZyb20gJy4vZG5kLXV0aWxzJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2RuZERyYWdJbWFnZVJlZl0nLCBzdGFuZGFsb25lOiB0cnVlIH0pXG5leHBvcnQgY2xhc3MgRG5kRHJhZ0ltYWdlUmVmRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgZG5kRHJhZ2dhYmxlRGlyZWN0aXZlID0gaW5qZWN0KGZvcndhcmRSZWYoKCkgPT4gRG5kRHJhZ2dhYmxlRGlyZWN0aXZlKSk7XG4gIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZG5kRHJhZ2dhYmxlRGlyZWN0aXZlLnJlZ2lzdGVyRHJhZ0ltYWdlKHRoaXMuZWxlbWVudFJlZik7XG4gIH1cbn1cblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2RuZERyYWdnYWJsZV0nLCBzdGFuZGFsb25lOiB0cnVlIH0pXG5leHBvcnQgY2xhc3MgRG5kRHJhZ2dhYmxlRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgZG5kRHJhZ2dhYmxlOiBhbnk7XG4gIEBJbnB1dCgpIGRuZEVmZmVjdEFsbG93ZWQ6IEVmZmVjdEFsbG93ZWQgPSAnY29weSc7XG4gIEBJbnB1dCgpIGRuZFR5cGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRuZERyYWdnaW5nQ2xhc3MgPSAnZG5kRHJhZ2dpbmcnO1xuICBASW5wdXQoKSBkbmREcmFnZ2luZ1NvdXJjZUNsYXNzID0gJ2RuZERyYWdnaW5nU291cmNlJztcbiAgQElucHV0KCkgZG5kRHJhZ2dhYmxlRGlzYWJsZWRDbGFzcyA9ICdkbmREcmFnZ2FibGVEaXNhYmxlZCc7XG4gIEBJbnB1dCgpIGRuZERyYWdJbWFnZU9mZnNldEZ1bmN0aW9uOiBEbmREcmFnSW1hZ2VPZmZzZXRGdW5jdGlvbiA9XG4gICAgY2FsY3VsYXRlRHJhZ0ltYWdlT2Zmc2V0O1xuXG4gIEBPdXRwdXQoKSByZWFkb25seSBkbmRTdGFydDogRXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgZG5kRHJhZzogRXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgZG5kRW5kOiBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBkbmRNb3ZlZDogRXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgZG5kQ29waWVkOiBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBkbmRMaW5rZWQ6IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGRuZENhbmNlbGVkOiBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmRyYWdnYWJsZScpIGRyYWdnYWJsZSA9IHRydWU7XG5cbiAgcHJpdmF0ZSBkbmRIYW5kbGU/OiBEbmRIYW5kbGVEaXJlY3RpdmU7XG4gIHByaXZhdGUgZG5kRHJhZ0ltYWdlRWxlbWVudFJlZj86IEVsZW1lbnRSZWY7XG4gIHByaXZhdGUgZHJhZ0ltYWdlOiBFbGVtZW50IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGlzRHJhZ1N0YXJ0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gIHByaXZhdGUgbmdab25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgQElucHV0KCkgc2V0IGRuZERpc2FibGVJZih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuZHJhZ2dhYmxlID0gIXZhbHVlO1xuXG4gICAgaWYgKHRoaXMuZHJhZ2dhYmxlKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKFxuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgdGhpcy5kbmREcmFnZ2FibGVEaXNhYmxlZENsYXNzXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKFxuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgdGhpcy5kbmREcmFnZ2FibGVEaXNhYmxlZENsYXNzXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkbmREaXNhYmxlRHJhZ0lmKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5kbmREaXNhYmxlSWYgPSB2YWx1ZTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAnZHJhZycsXG4gICAgICAgIHRoaXMuZHJhZ0V2ZW50SGFuZGxlclxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAnZHJhZycsXG4gICAgICB0aGlzLmRyYWdFdmVudEhhbmRsZXJcbiAgICApO1xuICAgIGlmICh0aGlzLmlzRHJhZ1N0YXJ0ZWQpIHtcbiAgICAgIGVuZERyYWcoKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkcmFnc3RhcnQnLCBbJyRldmVudCddKSBvbkRyYWdTdGFydChldmVudDogRG5kRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dhYmxlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgZG5kIGhhbmRsZSBhbmQgaWYgdGhlIGRuZCBoYW5kbGUgd2FzIHVzZWQgdG8gc3RhcnQgdGhlIGRyYWdcbiAgICBpZiAodGhpcy5kbmRIYW5kbGUgIT0gbnVsbCAmJiBldmVudC5fZG5kVXNpbmdIYW5kbGUgPT0gbnVsbCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gaW5pdGlhbGl6ZSBnbG9iYWwgc3RhdGVcbiAgICBzdGFydERyYWcoZXZlbnQsIHRoaXMuZG5kRWZmZWN0QWxsb3dlZCwgdGhpcy5kbmRUeXBlKTtcblxuICAgIHRoaXMuaXNEcmFnU3RhcnRlZCA9IHRydWU7XG5cbiAgICBzZXREcmFnRGF0YShcbiAgICAgIGV2ZW50LFxuICAgICAgeyBkYXRhOiB0aGlzLmRuZERyYWdnYWJsZSwgdHlwZTogdGhpcy5kbmRUeXBlIH0sXG4gICAgICBkbmRTdGF0ZS5lZmZlY3RBbGxvd2VkIVxuICAgICk7XG5cbiAgICB0aGlzLmRyYWdJbWFnZSA9IHRoaXMuZGV0ZXJtaW5lRHJhZ0ltYWdlKCk7XG5cbiAgICAvLyBzZXQgZHJhZ2dpbmcgY3NzIGNsYXNzIHByaW9yIHRvIHNldERyYWdJbWFnZSBzbyBzdHlsZXMgYXJlIGFwcGxpZWQgYmVmb3JlXG4gICAgLy8gVE9ETyBicmVha2luZyBjaGFuZ2U6IGFkZCBjbGFzcyB0byBlbGVtZW50UmVmIHJhdGhlciB0aGFuIGRyYWcgaW1hZ2Ugd2hpY2ggY291bGQgYmUgYW5vdGhlciBlbGVtZW50XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmRyYWdJbWFnZSwgdGhpcy5kbmREcmFnZ2luZ0NsYXNzKTtcblxuICAgIC8vIHNldCBjdXN0b20gZHJhZ2ltYWdlIGlmIHByZXNlbnRcbiAgICAvLyBzZXQgZHJhZ2ltYWdlIGlmIGRyYWcgaXMgc3RhcnRlZCBmcm9tIGRuZEhhbmRsZVxuICAgIGlmICh0aGlzLmRuZERyYWdJbWFnZUVsZW1lbnRSZWYgIT0gbnVsbCB8fCBldmVudC5fZG5kVXNpbmdIYW5kbGUgIT0gbnVsbCkge1xuICAgICAgc2V0RHJhZ0ltYWdlKGV2ZW50LCB0aGlzLmRyYWdJbWFnZSwgdGhpcy5kbmREcmFnSW1hZ2VPZmZzZXRGdW5jdGlvbik7XG4gICAgfVxuXG4gICAgLy8gYWRkIGRyYWdnaW5nIHNvdXJjZSBjc3MgY2xhc3Mgb24gZmlyc3QgZHJhZyBldmVudFxuICAgIGNvbnN0IHVucmVnaXN0ZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3RlbihcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgJ2RyYWcnLFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKFxuICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgIHRoaXMuZG5kRHJhZ2dpbmdTb3VyY2VDbGFzc1xuICAgICAgICApO1xuICAgICAgICB1bnJlZ2lzdGVyKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuZG5kU3RhcnQuZW1pdChldmVudCk7XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyYWdJbWFnZSwgJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcbiAgICB9LCAxMDApO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBvbkRyYWcoZXZlbnQ6IERyYWdFdmVudCkge1xuICAgIHRoaXMuZG5kRHJhZy5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RyYWdlbmQnLCBbJyRldmVudCddKSBvbkRyYWdFbmQoZXZlbnQ6IERyYWdFdmVudCkge1xuICAgIGlmICghdGhpcy5kcmFnZ2FibGUgfHwgIXRoaXMuaXNEcmFnU3RhcnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBnZXQgZHJvcCBlZmZlY3QgZnJvbSBjdXN0b20gc3RvcmVkIHN0YXRlIGFzIGl0cyBub3QgcmVsaWFibGUgYWNyb3NzIGJyb3dzZXJzXG4gICAgY29uc3QgZHJvcEVmZmVjdCA9IGRuZFN0YXRlLmRyb3BFZmZlY3Q7XG5cbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJhZ0ltYWdlLCAncG9pbnRlci1ldmVudHMnLCAndW5zZXQnKTtcblxuICAgIGxldCBkcm9wRWZmZWN0RW1pdHRlcjogRXZlbnRFbWl0dGVyPERyYWdFdmVudD47XG5cbiAgICBzd2l0Y2ggKGRyb3BFZmZlY3QpIHtcbiAgICAgIGNhc2UgJ2NvcHknOlxuICAgICAgICBkcm9wRWZmZWN0RW1pdHRlciA9IHRoaXMuZG5kQ29waWVkO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbGluayc6XG4gICAgICAgIGRyb3BFZmZlY3RFbWl0dGVyID0gdGhpcy5kbmRMaW5rZWQ7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdtb3ZlJzpcbiAgICAgICAgZHJvcEVmZmVjdEVtaXR0ZXIgPSB0aGlzLmRuZE1vdmVkO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZHJvcEVmZmVjdEVtaXR0ZXIgPSB0aGlzLmRuZENhbmNlbGVkO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBkcm9wRWZmZWN0RW1pdHRlci5lbWl0KGV2ZW50KTtcbiAgICB0aGlzLmRuZEVuZC5lbWl0KGV2ZW50KTtcblxuICAgIC8vIHJlc2V0IGdsb2JhbCBzdGF0ZVxuICAgIGVuZERyYWcoKTtcblxuICAgIHRoaXMuaXNEcmFnU3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmRyYWdJbWFnZSwgdGhpcy5kbmREcmFnZ2luZ0NsYXNzKTtcblxuICAgIC8vIElFOSBzcGVjaWFsIGhhbW1lcmluZ1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoXG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICB0aGlzLmRuZERyYWdnaW5nU291cmNlQ2xhc3NcbiAgICAgICk7XG4gICAgfSwgMCk7XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHJlZ2lzdGVyRHJhZ0hhbmRsZShoYW5kbGU6IERuZEhhbmRsZURpcmVjdGl2ZSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuZG5kSGFuZGxlID0gaGFuZGxlO1xuICB9XG5cbiAgcmVnaXN0ZXJEcmFnSW1hZ2UoZWxlbWVudFJlZjogRWxlbWVudFJlZiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuZG5kRHJhZ0ltYWdlRWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGRyYWdFdmVudEhhbmRsZXI6IChldmVudDogRHJhZ0V2ZW50KSA9PiB2b2lkID0gKFxuICAgIGV2ZW50OiBEcmFnRXZlbnRcbiAgKSA9PiB0aGlzLm9uRHJhZyhldmVudCk7XG5cbiAgcHJpdmF0ZSBkZXRlcm1pbmVEcmFnSW1hZ2UoKTogRWxlbWVudCB7XG4gICAgLy8gZXZhbHVhdGUgY3VzdG9tIGRyYWcgaW1hZ2UgZXhpc3RlbmNlXG4gICAgaWYgKHR5cGVvZiB0aGlzLmRuZERyYWdJbWFnZUVsZW1lbnRSZWYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kbmREcmFnSW1hZ2VFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgRWxlbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,280 @@
1
+ import { ContentChild, Directive, EventEmitter, HostListener, Input, Output, } from '@angular/core';
2
+ import { getDndType, getDropEffect, isExternalDrag, setDropEffect, } from './dnd-state';
3
+ import { getDirectChildElement, getDropData, shouldPositionPlaceholderBeforeElement, } from './dnd-utils';
4
+ import * as i0 from "@angular/core";
5
+ export class DndPlaceholderRefDirective {
6
+ elementRef;
7
+ constructor(elementRef) {
8
+ this.elementRef = elementRef;
9
+ }
10
+ ngOnInit() {
11
+ // placeholder has to be "invisible" to the cursor, or it would interfere with the dragover detection for the same dropzone
12
+ this.elementRef.nativeElement.style.pointerEvents = 'none';
13
+ }
14
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: DndPlaceholderRefDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
15
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.4", type: DndPlaceholderRefDirective, isStandalone: true, selector: "[dndPlaceholderRef]", ngImport: i0 });
16
+ }
17
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: DndPlaceholderRefDirective, decorators: [{
18
+ type: Directive,
19
+ args: [{ selector: '[dndPlaceholderRef]', standalone: true }]
20
+ }], ctorParameters: () => [{ type: i0.ElementRef }] });
21
+ export class DndDropzoneDirective {
22
+ ngZone;
23
+ elementRef;
24
+ renderer;
25
+ dndDropzone = '';
26
+ dndEffectAllowed = 'uninitialized';
27
+ dndAllowExternal = false;
28
+ dndHorizontal = false;
29
+ dndDragoverClass = 'dndDragover';
30
+ dndDropzoneDisabledClass = 'dndDropzoneDisabled';
31
+ dndDragover = new EventEmitter();
32
+ dndDrop = new EventEmitter();
33
+ dndPlaceholderRef;
34
+ placeholder = null;
35
+ disabled = false;
36
+ constructor(ngZone, elementRef, renderer) {
37
+ this.ngZone = ngZone;
38
+ this.elementRef = elementRef;
39
+ this.renderer = renderer;
40
+ }
41
+ set dndDisableIf(value) {
42
+ this.disabled = value;
43
+ if (this.disabled) {
44
+ this.renderer.addClass(this.elementRef.nativeElement, this.dndDropzoneDisabledClass);
45
+ }
46
+ else {
47
+ this.renderer.removeClass(this.elementRef.nativeElement, this.dndDropzoneDisabledClass);
48
+ }
49
+ }
50
+ set dndDisableDropIf(value) {
51
+ this.dndDisableIf = value;
52
+ }
53
+ ngAfterViewInit() {
54
+ this.placeholder = this.tryGetPlaceholder();
55
+ this.removePlaceholderFromDOM();
56
+ this.ngZone.runOutsideAngular(() => {
57
+ this.elementRef.nativeElement.addEventListener('dragenter', this.dragEnterEventHandler);
58
+ this.elementRef.nativeElement.addEventListener('dragover', this.dragOverEventHandler);
59
+ this.elementRef.nativeElement.addEventListener('dragleave', this.dragLeaveEventHandler);
60
+ });
61
+ }
62
+ ngOnDestroy() {
63
+ this.elementRef.nativeElement.removeEventListener('dragenter', this.dragEnterEventHandler);
64
+ this.elementRef.nativeElement.removeEventListener('dragover', this.dragOverEventHandler);
65
+ this.elementRef.nativeElement.removeEventListener('dragleave', this.dragLeaveEventHandler);
66
+ }
67
+ onDragEnter(event) {
68
+ // check if another dropzone is activated
69
+ if (event._dndDropzoneActive === true) {
70
+ this.cleanupDragoverState();
71
+ return;
72
+ }
73
+ // set as active if the target element is inside this dropzone
74
+ if (event._dndDropzoneActive == null) {
75
+ const newTarget = document.elementFromPoint(event.clientX, event.clientY);
76
+ if (this.elementRef.nativeElement.contains(newTarget)) {
77
+ event._dndDropzoneActive = true;
78
+ }
79
+ }
80
+ // check if this drag event is allowed to drop on this dropzone
81
+ const type = getDndType(event);
82
+ if (!this.isDropAllowed(type)) {
83
+ return;
84
+ }
85
+ // allow the dragenter
86
+ event.preventDefault();
87
+ }
88
+ onDragOver(event) {
89
+ // With nested dropzones, we want to ignore this event if a child dropzone
90
+ // has already handled a dragover. Historically, event.stopPropagation() was
91
+ // used to prevent this bubbling, but that prevents any dragovers outside the
92
+ // ngx-drag-drop component, and stops other use cases such as scrolling on drag.
93
+ // Instead, we can check if the event was already prevented by a child and bail early.
94
+ if (event.defaultPrevented) {
95
+ return;
96
+ }
97
+ // check if this drag event is allowed to drop on this dropzone
98
+ const type = getDndType(event);
99
+ if (!this.isDropAllowed(type)) {
100
+ return;
101
+ }
102
+ this.checkAndUpdatePlaceholderPosition(event);
103
+ const dropEffect = getDropEffect(event, this.dndEffectAllowed);
104
+ if (dropEffect === 'none') {
105
+ this.cleanupDragoverState();
106
+ return;
107
+ }
108
+ // allow the dragover
109
+ event.preventDefault();
110
+ // set the drop effect
111
+ setDropEffect(event, dropEffect);
112
+ this.dndDragover.emit(event);
113
+ this.renderer.addClass(this.elementRef.nativeElement, this.dndDragoverClass);
114
+ }
115
+ onDrop(event) {
116
+ try {
117
+ // check if this drag event is allowed to drop on this dropzone
118
+ const type = getDndType(event);
119
+ if (!this.isDropAllowed(type)) {
120
+ return;
121
+ }
122
+ const data = getDropData(event, isExternalDrag());
123
+ if (!this.isDropAllowed(data.type)) {
124
+ return;
125
+ }
126
+ // signal custom drop handling
127
+ event.preventDefault();
128
+ const dropEffect = getDropEffect(event);
129
+ setDropEffect(event, dropEffect);
130
+ if (dropEffect === 'none') {
131
+ return;
132
+ }
133
+ const dropIndex = this.getPlaceholderIndex();
134
+ // if for whatever reason the placeholder is not present in the DOM but it should be there
135
+ // we don't allow/emit the drop event since it breaks the contract
136
+ // seems to only happen if drag and drop is executed faster than the DOM updates
137
+ if (dropIndex === -1) {
138
+ return;
139
+ }
140
+ this.dndDrop.emit({
141
+ event: event,
142
+ dropEffect: dropEffect,
143
+ isExternal: isExternalDrag(),
144
+ data: data.data,
145
+ index: dropIndex,
146
+ type: type,
147
+ });
148
+ event.stopPropagation();
149
+ }
150
+ finally {
151
+ this.cleanupDragoverState();
152
+ }
153
+ }
154
+ onDragLeave(event) {
155
+ event.preventDefault();
156
+ event.stopPropagation();
157
+ // check if still inside this dropzone and not yet handled by another dropzone
158
+ if (event._dndDropzoneActive == null) {
159
+ if (this.elementRef.nativeElement.contains(event.relatedTarget)) {
160
+ event._dndDropzoneActive = true;
161
+ return;
162
+ }
163
+ }
164
+ this.cleanupDragoverState();
165
+ // cleanup drop effect when leaving dropzone
166
+ setDropEffect(event, 'none');
167
+ }
168
+ dragEnterEventHandler = (event) => this.onDragEnter(event);
169
+ dragOverEventHandler = (event) => this.onDragOver(event);
170
+ dragLeaveEventHandler = (event) => this.onDragLeave(event);
171
+ isDropAllowed(type) {
172
+ // dropzone is disabled -> deny it
173
+ if (this.disabled) {
174
+ return false;
175
+ }
176
+ // if drag did not start from our directive
177
+ // and external drag sources are not allowed -> deny it
178
+ if (isExternalDrag() && !this.dndAllowExternal) {
179
+ return false;
180
+ }
181
+ // no filtering by types -> allow it
182
+ if (!this.dndDropzone) {
183
+ return true;
184
+ }
185
+ // no type set -> allow it
186
+ if (!type) {
187
+ return true;
188
+ }
189
+ if (!Array.isArray(this.dndDropzone)) {
190
+ throw new Error('dndDropzone: bound value to [dndDropzone] must be an array!');
191
+ }
192
+ // if dropzone contains type -> allow it
193
+ return this.dndDropzone.indexOf(type) !== -1;
194
+ }
195
+ tryGetPlaceholder() {
196
+ if (typeof this.dndPlaceholderRef !== 'undefined') {
197
+ return this.dndPlaceholderRef.elementRef.nativeElement;
198
+ }
199
+ // TODO nasty workaround needed because if ng-container / template is used @ContentChild() or DI will fail because
200
+ // of wrong context see angular bug https://github.com/angular/angular/issues/13517
201
+ return this.elementRef.nativeElement.querySelector('[dndPlaceholderRef]');
202
+ }
203
+ removePlaceholderFromDOM() {
204
+ if (this.placeholder !== null && this.placeholder.parentNode !== null) {
205
+ this.placeholder.parentNode.removeChild(this.placeholder);
206
+ }
207
+ }
208
+ checkAndUpdatePlaceholderPosition(event) {
209
+ if (this.placeholder === null) {
210
+ return;
211
+ }
212
+ // make sure the placeholder is in the DOM
213
+ if (this.placeholder.parentNode !== this.elementRef.nativeElement) {
214
+ this.renderer.appendChild(this.elementRef.nativeElement, this.placeholder);
215
+ }
216
+ // update the position if the event originates from a child element of the dropzone
217
+ const directChild = getDirectChildElement(this.elementRef.nativeElement, event.target);
218
+ // early exit if no direct child or direct child is placeholder
219
+ if (directChild === null || directChild === this.placeholder) {
220
+ return;
221
+ }
222
+ const positionPlaceholderBeforeDirectChild = shouldPositionPlaceholderBeforeElement(event, directChild, this.dndHorizontal);
223
+ if (positionPlaceholderBeforeDirectChild) {
224
+ // do insert before only if necessary
225
+ if (directChild.previousSibling !== this.placeholder) {
226
+ this.renderer.insertBefore(this.elementRef.nativeElement, this.placeholder, directChild);
227
+ }
228
+ }
229
+ else {
230
+ // do insert after only if necessary
231
+ if (directChild.nextSibling !== this.placeholder) {
232
+ this.renderer.insertBefore(this.elementRef.nativeElement, this.placeholder, directChild.nextSibling);
233
+ }
234
+ }
235
+ }
236
+ getPlaceholderIndex() {
237
+ if (this.placeholder === null) {
238
+ return undefined;
239
+ }
240
+ const element = this.elementRef.nativeElement;
241
+ return Array.prototype.indexOf.call(element.children, this.placeholder);
242
+ }
243
+ cleanupDragoverState() {
244
+ this.renderer.removeClass(this.elementRef.nativeElement, this.dndDragoverClass);
245
+ this.removePlaceholderFromDOM();
246
+ }
247
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: DndDropzoneDirective, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
248
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.4", type: DndDropzoneDirective, isStandalone: true, selector: "[dndDropzone]", inputs: { dndDropzone: "dndDropzone", dndEffectAllowed: "dndEffectAllowed", dndAllowExternal: "dndAllowExternal", dndHorizontal: "dndHorizontal", dndDragoverClass: "dndDragoverClass", dndDropzoneDisabledClass: "dndDropzoneDisabledClass", dndDisableIf: "dndDisableIf", dndDisableDropIf: "dndDisableDropIf" }, outputs: { dndDragover: "dndDragover", dndDrop: "dndDrop" }, host: { listeners: { "drop": "onDrop($event)" } }, queries: [{ propertyName: "dndPlaceholderRef", first: true, predicate: DndPlaceholderRefDirective, descendants: true }], ngImport: i0 });
249
+ }
250
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: DndDropzoneDirective, decorators: [{
251
+ type: Directive,
252
+ args: [{ selector: '[dndDropzone]', standalone: true }]
253
+ }], ctorParameters: () => [{ type: i0.NgZone }, { type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { dndDropzone: [{
254
+ type: Input
255
+ }], dndEffectAllowed: [{
256
+ type: Input
257
+ }], dndAllowExternal: [{
258
+ type: Input
259
+ }], dndHorizontal: [{
260
+ type: Input
261
+ }], dndDragoverClass: [{
262
+ type: Input
263
+ }], dndDropzoneDisabledClass: [{
264
+ type: Input
265
+ }], dndDragover: [{
266
+ type: Output
267
+ }], dndDrop: [{
268
+ type: Output
269
+ }], dndPlaceholderRef: [{
270
+ type: ContentChild,
271
+ args: [DndPlaceholderRefDirective]
272
+ }], dndDisableIf: [{
273
+ type: Input
274
+ }], dndDisableDropIf: [{
275
+ type: Input
276
+ }], onDrop: [{
277
+ type: HostListener,
278
+ args: ['drop', ['$event']]
279
+ }] } });
280
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWRyb3B6b25lLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2RuZC9zcmMvbGliL2RuZC1kcm9wem9uZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFlBQVksRUFDWixTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxVQUFVLEVBQ1YsYUFBYSxFQUNiLGNBQWMsRUFDZCxhQUFhLEdBQ2QsTUFBTSxhQUFhLENBQUM7QUFFckIsT0FBTyxFQUdMLHFCQUFxQixFQUNyQixXQUFXLEVBQ1gsc0NBQXNDLEdBQ3ZDLE1BQU0sYUFBYSxDQUFDOztBQVlyQixNQUFNLE9BQU8sMEJBQTBCO0lBQ1Q7SUFBNUIsWUFBNEIsVUFBbUM7UUFBbkMsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7SUFBRyxDQUFDO0lBRW5FLFFBQVE7UUFDTiwySEFBMkg7UUFDM0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7SUFDN0QsQ0FBQzt1R0FOVSwwQkFBMEI7MkZBQTFCLDBCQUEwQjs7MkZBQTFCLDBCQUEwQjtrQkFEdEMsU0FBUzttQkFBQyxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFOztBQVdoRSxNQUFNLE9BQU8sb0JBQW9CO0lBMkJyQjtJQUNBO0lBQ0E7SUE1QkQsV0FBVyxHQUFtQixFQUFFLENBQUM7SUFFakMsZ0JBQWdCLEdBQWtCLGVBQWUsQ0FBQztJQUVsRCxnQkFBZ0IsR0FBWSxLQUFLLENBQUM7SUFFbEMsYUFBYSxHQUFZLEtBQUssQ0FBQztJQUUvQixnQkFBZ0IsR0FBVyxhQUFhLENBQUM7SUFFekMsd0JBQXdCLEdBQUcscUJBQXFCLENBQUM7SUFFdkMsV0FBVyxH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Q3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUM3QixJQUFJLENBQUMsZ0JBQWdCLENBQ3RCLENBQUM7UUFFRixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO3VHQTdWVSxvQkFBb0I7MkZBQXBCLG9CQUFvQiw0aEJBbUJqQiwwQkFBMEI7OzJGQW5CN0Isb0JBQW9CO2tCQURoQyxTQUFTO21CQUFDLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFOzRIQUUvQyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUcsd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUVhLFdBQVc7c0JBQTdCLE1BQU07Z0JBR1ksT0FBTztzQkFBekIsTUFBTTtnQkFJVSxpQkFBaUI7c0JBRGpDLFlBQVk7dUJBQUMsMEJBQTBCO2dCQWEzQixZQUFZO3NCQUF4QixLQUFLO2dCQWdCTyxnQkFBZ0I7c0JBQTVCLEtBQUs7Z0JBeUc0QixNQUFNO3NCQUF2QyxZQUFZO3VCQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGdldERuZFR5cGUsXG4gIGdldERyb3BFZmZlY3QsXG4gIGlzRXh0ZXJuYWxEcmFnLFxuICBzZXREcm9wRWZmZWN0LFxufSBmcm9tICcuL2RuZC1zdGF0ZSc7XG5pbXBvcnQgeyBEcm9wRWZmZWN0LCBFZmZlY3RBbGxvd2VkIH0gZnJvbSAnLi9kbmQtdHlwZXMnO1xuaW1wb3J0IHtcbiAgRG5kRXZlbnQsXG4gIERyYWdEcm9wRGF0YSxcbiAgZ2V0RGlyZWN0Q2hpbGRFbGVtZW50LFxuICBnZXREcm9wRGF0YSxcbiAgc2hvdWxkUG9zaXRpb25QbGFjZWhvbGRlckJlZm9yZUVsZW1lbnQsXG59IGZyb20gJy4vZG5kLXV0aWxzJztcblxuZXhwb3J0IGludGVyZmFjZSBEbmREcm9wRXZlbnQge1xuICBldmVudDogRHJhZ0V2ZW50O1xuICBkcm9wRWZmZWN0OiBEcm9wRWZmZWN0O1xuICBpc0V4dGVybmFsOiBib29sZWFuO1xuICBkYXRhPzogYW55O1xuICBpbmRleD86IG51bWJlcjtcbiAgdHlwZT86IGFueTtcbn1cblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2RuZFBsYWNlaG9sZGVyUmVmXScsIHN0YW5kYWxvbmU6IHRydWUgfSlcbmV4cG9ydCBjbGFzcyBEbmRQbGFjZWhvbGRlclJlZkRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pikge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyBwbGFjZWhvbGRlciBoYXMgdG8gYmUgXCJpbnZpc2libGVcIiB0byB0aGUgY3Vyc29yLCBvciBpdCB3b3VsZCBpbnRlcmZlcmUgd2l0aCB0aGUgZHJhZ292ZXIgZGV0ZWN0aW9uIGZvciB0aGUgc2FtZSBkcm9wem9uZVxuICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gIH1cbn1cblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2RuZERyb3B6b25lXScsIHN0YW5kYWxvbmU6IHRydWUgfSlcbmV4cG9ydCBjbGFzcyBEbmREcm9wem9uZURpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGRuZERyb3B6b25lPzogc3RyaW5nW10gfCAnJyA9ICcnO1xuXG4gIEBJbnB1dCgpIGRuZEVmZmVjdEFsbG93ZWQ6IEVmZmVjdEFsbG93ZWQgPSAndW5pbml0aWFsaXplZCc7XG5cbiAgQElucHV0KCkgZG5kQWxsb3dFeHRlcm5hbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGRuZEhvcml6b250YWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBkbmREcmFnb3ZlckNsYXNzOiBzdHJpbmcgPSAnZG5kRHJhZ292ZXInO1xuXG4gIEBJbnB1dCgpIGRuZERyb3B6b25lRGlzYWJsZWRDbGFzcyA9ICdkbmREcm9wem9uZURpc2FibGVkJztcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgZG5kRHJhZ292ZXI6IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgZG5kRHJvcDogRXZlbnRFbWl0dGVyPERuZERyb3BFdmVudD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8RG5kRHJvcEV2ZW50PigpO1xuXG4gIEBDb250ZW50Q2hpbGQoRG5kUGxhY2Vob2xkZXJSZWZEaXJlY3RpdmUpXG4gIHByaXZhdGUgcmVhZG9ubHkgZG5kUGxhY2Vob2xkZXJSZWY/OiBEbmRQbGFjZWhvbGRlclJlZkRpcmVjdGl2ZTtcblxuICBwcml2YXRlIHBsYWNlaG9sZGVyOiBFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMlxuICApIHt9XG5cbiAgQElucHV0KCkgc2V0IGRuZERpc2FibGVJZih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSB2YWx1ZTtcblxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKFxuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgdGhpcy5kbmREcm9wem9uZURpc2FibGVkQ2xhc3NcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoXG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICB0aGlzLmRuZERyb3B6b25lRGlzYWJsZWRDbGFzc1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZG5kRGlzYWJsZURyb3BJZih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuZG5kRGlzYWJsZUlmID0gdmFsdWU7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IHRoaXMudHJ5R2V0UGxhY2Vob2xkZXIoKTtcblxuICAgIHRoaXMucmVtb3ZlUGxhY2Vob2xkZXJGcm9tRE9NKCk7XG5cbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAnZHJhZ2VudGVyJyxcbiAgICAgICAgdGhpcy5kcmFnRW50ZXJFdmVudEhhbmRsZXJcbiAgICAgICk7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAnZHJhZ292ZXInLFxuICAgICAgICB0aGlzLmRyYWdPdmVyRXZlbnRIYW5kbGVyXG4gICAgICApO1xuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ2RyYWdsZWF2ZScsXG4gICAgICAgIHRoaXMuZHJhZ0xlYXZlRXZlbnRIYW5kbGVyXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICdkcmFnZW50ZXInLFxuICAgICAgdGhpcy5kcmFnRW50ZXJFdmVudEhhbmRsZXJcbiAgICApO1xuICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAnZHJhZ292ZXInLFxuICAgICAgdGhpcy5kcmFnT3ZlckV2ZW50SGFuZGxlclxuICAgICk7XG4gICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICdkcmFnbGVhdmUnLFxuICAgICAgdGhpcy5kcmFnTGVhdmVFdmVudEhhbmRsZXJcbiAgICApO1xuICB9XG5cbiAgb25EcmFnRW50ZXIoZXZlbnQ6IERuZEV2ZW50KSB7XG4gICAgLy8gY2hlY2sgaWYgYW5vdGhlciBkcm9wem9uZSBpcyBhY3RpdmF0ZWRcbiAgICBpZiAoZXZlbnQuX2RuZERyb3B6b25lQWN0aXZlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmNsZWFudXBEcmFnb3ZlclN0YXRlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc2V0IGFzIGFjdGl2ZSBpZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgaW5zaWRlIHRoaXMgZHJvcHpvbmVcbiAgICBpZiAoZXZlbnQuX2RuZERyb3B6b25lQWN0aXZlID09IG51bGwpIHtcbiAgICAgIGNvbnN0IG5ld1RhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG5cbiAgICAgIGlmICh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhuZXdUYXJnZXQpKSB7XG4gICAgICAgIGV2ZW50Ll9kbmREcm9wem9uZUFjdGl2ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhpcyBkcmFnIGV2ZW50IGlzIGFsbG93ZWQgdG8gZHJvcCBvbiB0aGlzIGRyb3B6b25lXG4gICAgY29uc3QgdHlwZSA9IGdldERuZFR5cGUoZXZlbnQpO1xuICAgIGlmICghdGhpcy5pc0Ryb3BBbGxvd2VkKHR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYWxsb3cgdGhlIGRyYWdlbnRlclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICAvLyBXaXRoIG5lc3RlZCBkcm9wem9uZXMsIHdlIHdhbnQgdG8gaWdub3JlIHRoaXMgZXZlbnQgaWYgYSBjaGlsZCBkcm9wem9uZVxuICAgIC8vIGhhcyBhbHJlYWR5IGhhbmRsZWQgYSBkcmFnb3Zlci4gIEhpc3RvcmljYWxseSwgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkgd2FzXG4gICAgLy8gdXNlZCB0byBwcmV2ZW50IHRoaXMgYnViYmxpbmcsIGJ1dCB0aGF0IHByZXZlbnRzIGFueSBkcmFnb3ZlcnMgb3V0c2lkZSB0aGVcbiAgICAvLyBuZ3gtZHJhZy1kcm9wIGNvbXBvbmVudCwgYW5kIHN0b3BzIG90aGVyIHVzZSBjYXNlcyBzdWNoIGFzIHNjcm9sbGluZyBvbiBkcmFnLlxuICAgIC8vIEluc3RlYWQsIHdlIGNhbiBjaGVjayBpZiB0aGUgZXZlbnQgd2FzIGFscmVhZHkgcHJldmVudGVkIGJ5IGEgY2hpbGQgYW5kIGJhaWwgZWFybHkuXG4gICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB0aGlzIGRyYWcgZXZlbnQgaXMgYWxsb3dlZCB0byBkcm9wIG9uIHRoaXMgZHJvcHpvbmVcbiAgICBjb25zdCB0eXBlID0gZ2V0RG5kVHlwZShldmVudCk7XG4gICAgaWYgKCF0aGlzLmlzRHJvcEFsbG93ZWQodHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNoZWNrQW5kVXBkYXRlUGxhY2Vob2xkZXJQb3NpdGlvbihldmVudCk7XG5cbiAgICBjb25zdCBkcm9wRWZmZWN0ID0gZ2V0RHJvcEVmZmVjdChldmVudCwgdGhpcy5kbmRFZmZlY3RBbGxvd2VkKTtcblxuICAgIGlmIChkcm9wRWZmZWN0ID09PSAnbm9uZScpIHtcbiAgICAgIHRoaXMuY2xlYW51cERyYWdvdmVyU3RhdGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBhbGxvdyB0aGUgZHJhZ292ZXJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgLy8gc2V0IHRoZSBkcm9wIGVmZmVjdFxuICAgIHNldERyb3BFZmZlY3QoZXZlbnQsIGRyb3BFZmZlY3QpO1xuXG4gICAgdGhpcy5kbmREcmFnb3Zlci5lbWl0KGV2ZW50KTtcblxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgIHRoaXMuZG5kRHJhZ292ZXJDbGFzc1xuICAgICk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkcm9wJywgWyckZXZlbnQnXSkgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICB0cnkge1xuICAgICAgLy8gY2hlY2sgaWYgdGhpcyBkcmFnIGV2ZW50IGlzIGFsbG93ZWQgdG8gZHJvcCBvbiB0aGlzIGRyb3B6b25lXG4gICAgICBjb25zdCB0eXBlID0gZ2V0RG5kVHlwZShldmVudCk7XG4gICAgICBpZiAoIXRoaXMuaXNEcm9wQWxsb3dlZCh0eXBlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGE6IERyYWdEcm9wRGF0YSA9IGdldERyb3BEYXRhKGV2ZW50LCBpc0V4dGVybmFsRHJhZygpKTtcblxuICAgICAgaWYgKCF0aGlzLmlzRHJvcEFsbG93ZWQoZGF0YS50eXBlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIHNpZ25hbCBjdXN0b20gZHJvcCBoYW5kbGluZ1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgY29uc3QgZHJvcEVmZmVjdCA9IGdldERyb3BFZmZlY3QoZXZlbnQpO1xuXG4gICAgICBzZXREcm9wRWZmZWN0KGV2ZW50LCBkcm9wRWZmZWN0KTtcblxuICAgICAgaWYgKGRyb3BFZmZlY3QgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRyb3BJbmRleCA9IHRoaXMuZ2V0UGxhY2Vob2xkZXJJbmRleCgpO1xuXG4gICAgICAvLyBpZiBmb3Igd2hhdGV2ZXIgcmVhc29uIHRoZSBwbGFjZWhvbGRlciBpcyBub3QgcHJlc2VudCBpbiB0aGUgRE9NIGJ1dCBpdCBzaG91bGQgYmUgdGhlcmVcbiAgICAgIC8vIHdlIGRvbid0IGFsbG93L2VtaXQgdGhlIGRyb3AgZXZlbnQgc2luY2UgaXQgYnJlYWtzIHRoZSBjb250cmFjdFxuICAgICAgLy8gc2VlbXMgdG8gb25seSBoYXBwZW4gaWYgZHJhZyBhbmQgZHJvcCBpcyBleGVjdXRlZCBmYXN0ZXIgdGhhbiB0aGUgRE9NIHVwZGF0ZXNcbiAgICAgIGlmIChkcm9wSW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kbmREcm9wLmVtaXQoe1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIGRyb3BFZmZlY3Q6IGRyb3BFZmZlY3QsXG4gICAgICAgIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWxEcmFnKCksXG4gICAgICAgIGRhdGE6IGRhdGEuZGF0YSxcbiAgICAgICAgaW5kZXg6IGRyb3BJbmRleCxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgIH0pO1xuXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5jbGVhbnVwRHJhZ292ZXJTdGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9uRHJhZ0xlYXZlKGV2ZW50OiBEbmRFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAvLyBjaGVjayBpZiBzdGlsbCBpbnNpZGUgdGhpcyBkcm9wem9uZSBhbmQgbm90IHlldCBoYW5kbGVkIGJ5IGFub3RoZXIgZHJvcHpvbmVcbiAgICBpZiAoZXZlbnQuX2RuZERyb3B6b25lQWN0aXZlID09IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgICBldmVudC5fZG5kRHJvcHpvbmVBY3RpdmUgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jbGVhbnVwRHJhZ292ZXJTdGF0ZSgpO1xuXG4gICAgLy8gY2xlYW51cCBkcm9wIGVmZmVjdCB3aGVuIGxlYXZpbmcgZHJvcHpvbmVcbiAgICBzZXREcm9wRWZmZWN0KGV2ZW50LCAnbm9uZScpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkcmFnRW50ZXJFdmVudEhhbmRsZXI6IChldmVudDogRHJhZ0V2ZW50KSA9PiB2b2lkID0gKFxuICAgIGV2ZW50OiBEcmFnRXZlbnRcbiAgKSA9PiB0aGlzLm9uRHJhZ0VudGVyKGV2ZW50KTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRyYWdPdmVyRXZlbnRIYW5kbGVyOiAoZXZlbnQ6IERyYWdFdmVudCkgPT4gdm9pZCA9IChcbiAgICBldmVudDogRHJhZ0V2ZW50XG4gICkgPT4gdGhpcy5vbkRyYWdPdmVyKGV2ZW50KTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRyYWdMZWF2ZUV2ZW50SGFuZGxlcjogKGV2ZW50OiBEcmFnRXZlbnQpID0+IHZvaWQgPSAoXG4gICAgZXZlbnQ6IERyYWdFdmVudFxuICApID0+IHRoaXMub25EcmFnTGVhdmUoZXZlbnQpO1xuXG4gIHByaXZhdGUgaXNEcm9wQWxsb3dlZCh0eXBlPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gZHJvcHpvbmUgaXMgZGlzYWJsZWQgLT4gZGVueSBpdFxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gaWYgZHJhZyBkaWQgbm90IHN0YXJ0IGZyb20gb3VyIGRpcmVjdGl2ZVxuICAgIC8vIGFuZCBleHRlcm5hbCBkcmFnIHNvdXJjZXMgYXJlIG5vdCBhbGxvd2VkIC0+IGRlbnkgaXRcbiAgICBpZiAoaXNFeHRlcm5hbERyYWcoKSAmJiAhdGhpcy5kbmRBbGxvd0V4dGVybmFsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gbm8gZmlsdGVyaW5nIGJ5IHR5cGVzIC0+IGFsbG93IGl0XG4gICAgaWYgKCF0aGlzLmRuZERyb3B6b25lKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBubyB0eXBlIHNldCAtPiBhbGxvdyBpdFxuICAgIGlmICghdHlwZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuZG5kRHJvcHpvbmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdkbmREcm9wem9uZTogYm91bmQgdmFsdWUgdG8gW2RuZERyb3B6b25lXSBtdXN0IGJlIGFuIGFycmF5ISdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gaWYgZHJvcHpvbmUgY29udGFpbnMgdHlwZSAtPiBhbGxvdyBpdFxuICAgIHJldHVybiB0aGlzLmRuZERyb3B6b25lLmluZGV4T2YodHlwZSkgIT09IC0xO1xuICB9XG5cbiAgcHJpdmF0ZSB0cnlHZXRQbGFjZWhvbGRlcigpOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmRuZFBsYWNlaG9sZGVyUmVmICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMuZG5kUGxhY2Vob2xkZXJSZWYuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gVE9ETyBuYXN0eSB3b3JrYXJvdW5kIG5lZWRlZCBiZWNhdXNlIGlmIG5nLWNvbnRhaW5lciAvIHRlbXBsYXRlIGlzIHVzZWQgQENvbnRlbnRDaGlsZCgpIG9yIERJIHdpbGwgZmFpbCBiZWNhdXNlXG4gICAgLy8gb2Ygd3JvbmcgY29udGV4dCBzZWUgYW5ndWxhciBidWcgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTM1MTdcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignW2RuZFBsYWNlaG9sZGVyUmVmXScpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVQbGFjZWhvbGRlckZyb21ET00oKSB7XG4gICAgaWYgKHRoaXMucGxhY2Vob2xkZXIgIT09IG51bGwgJiYgdGhpcy5wbGFjZWhvbGRlci5wYXJlbnROb2RlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnBsYWNlaG9sZGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wbGFjZWhvbGRlcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0FuZFVwZGF0ZVBsYWNlaG9sZGVyUG9zaXRpb24oZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIHRoZSBwbGFjZWhvbGRlciBpcyBpbiB0aGUgRE9NXG4gICAgaWYgKHRoaXMucGxhY2Vob2xkZXIucGFyZW50Tm9kZSAhPT0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoXG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICB0aGlzLnBsYWNlaG9sZGVyXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSB0aGUgcG9zaXRpb24gaWYgdGhlIGV2ZW50IG9yaWdpbmF0ZXMgZnJvbSBhIGNoaWxkIGVsZW1lbnQgb2YgdGhlIGRyb3B6b25lXG4gICAgY29uc3QgZGlyZWN0Q2hpbGQgPSBnZXREaXJlY3RDaGlsZEVsZW1lbnQoXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgIGV2ZW50LnRhcmdldCBhcyBFbGVtZW50XG4gICAgKTtcblxuICAgIC8vIGVhcmx5IGV4aXQgaWYgbm8gZGlyZWN0IGNoaWxkIG9yIGRpcmVjdCBjaGlsZCBpcyBwbGFjZWhvbGRlclxuICAgIGlmIChkaXJlY3RDaGlsZCA9PT0gbnVsbCB8fCBkaXJlY3RDaGlsZCA9PT0gdGhpcy5wbGFjZWhvbGRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc2l0aW9uUGxhY2Vob2xkZXJCZWZvcmVEaXJlY3RDaGlsZCA9XG4gICAgICBzaG91bGRQb3NpdGlvblBsYWNlaG9sZGVyQmVmb3JlRWxlbWVudChcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIGRpcmVjdENoaWxkLFxuICAgICAgICB0aGlzLmRuZEhvcml6b250YWxcbiAgICAgICk7XG5cbiAgICBpZiAocG9zaXRpb25QbGFjZWhvbGRlckJlZm9yZURpcmVjdENoaWxkKSB7XG4gICAgICAvLyBkbyBpbnNlcnQgYmVmb3JlIG9ubHkgaWYgbmVjZXNzYXJ5XG4gICAgICBpZiAoZGlyZWN0Q2hpbGQucHJldmlvdXNTaWJsaW5nICE9PSB0aGlzLnBsYWNlaG9sZGVyKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuaW5zZXJ0QmVmb3JlKFxuICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXIsXG4gICAgICAgICAgZGlyZWN0Q2hpbGRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZG8gaW5zZXJ0IGFmdGVyIG9ubHkgaWYgbmVjZXNzYXJ5XG4gICAgICBpZiAoZGlyZWN0Q2hpbGQubmV4dFNpYmxpbmcgIT09IHRoaXMucGxhY2Vob2xkZXIpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5pbnNlcnRCZWZvcmUoXG4gICAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgdGhpcy5wbGFjZWhvbGRlcixcbiAgICAgICAgICBkaXJlY3RDaGlsZC5uZXh0U2libGluZ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGxhY2Vob2xkZXJJbmRleCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGVsZW1lbnQuY2hpbGRyZW4sIHRoaXMucGxhY2Vob2xkZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwRHJhZ292ZXJTdGF0ZSgpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKFxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLmRuZERyYWdvdmVyQ2xhc3NcbiAgICApO1xuXG4gICAgdGhpcy5yZW1vdmVQbGFjZWhvbGRlckZyb21ET00oKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,29 @@
1
+ import { Directive, HostBinding, HostListener, inject, } from '@angular/core';
2
+ import { DndDraggableDirective } from './dnd-draggable.directive';
3
+ import * as i0 from "@angular/core";
4
+ export class DndHandleDirective {
5
+ draggable = true;
6
+ dndDraggableDirective = inject(DndDraggableDirective);
7
+ ngOnInit() {
8
+ this.dndDraggableDirective.registerDragHandle(this);
9
+ }
10
+ onDragEvent(event) {
11
+ event._dndUsingHandle = true;
12
+ }
13
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: DndHandleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
14
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.4", type: DndHandleDirective, isStandalone: true, selector: "[dndHandle]", host: { listeners: { "dragstart": "onDragEvent($event)", "dragend": "onDragEvent($event)" }, properties: { "attr.draggable": "this.draggable" } }, ngImport: i0 });
15
+ }
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: DndHandleDirective, decorators: [{
17
+ type: Directive,
18
+ args: [{ selector: '[dndHandle]', standalone: true }]
19
+ }], propDecorators: { draggable: [{
20
+ type: HostBinding,
21
+ args: ['attr.draggable']
22
+ }], onDragEvent: [{
23
+ type: HostListener,
24
+ args: ['dragstart', ['$event']]
25
+ }, {
26
+ type: HostListener,
27
+ args: ['dragend', ['$event']]
28
+ }] } });
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWhhbmRsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kbmQvc3JjL2xpYi9kbmQtaGFuZGxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztBQUlsRSxNQUFNLE9BQU8sa0JBQWtCO0lBQ0UsU0FBUyxHQUFHLElBQUksQ0FBQztJQUVoRCxxQkFBcUIsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUV0RCxRQUFRO1FBQ04sSUFBSSxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFJRCxXQUFXLENBQUMsS0FBZTtRQUN6QixLQUFLLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO3VHQWJVLGtCQUFrQjsyRkFBbEIsa0JBQWtCOzsyRkFBbEIsa0JBQWtCO2tCQUQ5QixTQUFTO21CQUFDLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFOzhCQUV2QixTQUFTO3NCQUF2QyxXQUFXO3VCQUFDLGdCQUFnQjtnQkFVN0IsV0FBVztzQkFGVixZQUFZO3VCQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7c0JBQ3BDLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBpbmplY3QsXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEbmREcmFnZ2FibGVEaXJlY3RpdmUgfSBmcm9tICcuL2RuZC1kcmFnZ2FibGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IERuZEV2ZW50IH0gZnJvbSAnLi9kbmQtdXRpbHMnO1xuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbZG5kSGFuZGxlXScsIHN0YW5kYWxvbmU6IHRydWUgfSlcbmV4cG9ydCBjbGFzcyBEbmRIYW5kbGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuZHJhZ2dhYmxlJykgZHJhZ2dhYmxlID0gdHJ1ZTtcblxuICBkbmREcmFnZ2FibGVEaXJlY3RpdmUgPSBpbmplY3QoRG5kRHJhZ2dhYmxlRGlyZWN0aXZlKTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmRuZERyYWdnYWJsZURpcmVjdGl2ZS5yZWdpc3RlckRyYWdIYW5kbGUodGhpcyk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkcmFnc3RhcnQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdkcmFnZW5kJywgWyckZXZlbnQnXSlcbiAgb25EcmFnRXZlbnQoZXZlbnQ6IERuZEV2ZW50KSB7XG4gICAgZXZlbnQuX2RuZFVzaW5nSGFuZGxlID0gdHJ1ZTtcbiAgfVxufVxuIl19
@@ -0,0 +1,38 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { DndDraggableDirective, DndDragImageRefDirective, } from './dnd-draggable.directive';
3
+ import { DndDropzoneDirective, DndPlaceholderRefDirective, } from './dnd-dropzone.directive';
4
+ import { DndHandleDirective } from './dnd-handle.directive';
5
+ import * as i0 from "@angular/core";
6
+ export class DndModule {
7
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: DndModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
8
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.0.4", ngImport: i0, type: DndModule, imports: [DndDragImageRefDirective,
9
+ DndDropzoneDirective,
10
+ DndHandleDirective,
11
+ DndPlaceholderRefDirective,
12
+ DndDraggableDirective], exports: [DndDraggableDirective,
13
+ DndDropzoneDirective,
14
+ DndHandleDirective,
15
+ DndPlaceholderRefDirective,
16
+ DndDragImageRefDirective] });
17
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: DndModule });
18
+ }
19
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: DndModule, decorators: [{
20
+ type: NgModule,
21
+ args: [{
22
+ exports: [
23
+ DndDraggableDirective,
24
+ DndDropzoneDirective,
25
+ DndHandleDirective,
26
+ DndPlaceholderRefDirective,
27
+ DndDragImageRefDirective,
28
+ ],
29
+ imports: [
30
+ DndDragImageRefDirective,
31
+ DndDropzoneDirective,
32
+ DndHandleDirective,
33
+ DndPlaceholderRefDirective,
34
+ DndDraggableDirective,
35
+ ],
36
+ }]
37
+ }] });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2RuZC9zcmMvbGliL2RuZC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHdCQUF3QixHQUN6QixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsMEJBQTBCLEdBQzNCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBa0I1RCxNQUFNLE9BQU8sU0FBUzt1R0FBVCxTQUFTO3dHQUFULFNBQVMsWUFQbEIsd0JBQXdCO1lBQ3hCLG9CQUFvQjtZQUNwQixrQkFBa0I7WUFDbEIsMEJBQTBCO1lBQzFCLHFCQUFxQixhQVhyQixxQkFBcUI7WUFDckIsb0JBQW9CO1lBQ3BCLGtCQUFrQjtZQUNsQiwwQkFBMEI7WUFDMUIsd0JBQXdCO3dHQVVmLFNBQVM7OzJGQUFULFNBQVM7a0JBaEJyQixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxxQkFBcUI7d0JBQ3JCLG9CQUFvQjt3QkFDcEIsa0JBQWtCO3dCQUNsQiwwQkFBMEI7d0JBQzFCLHdCQUF3QjtxQkFDekI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLHdCQUF3Qjt3QkFDeEIsb0JBQW9CO3dCQUNwQixrQkFBa0I7d0JBQ2xCLDBCQUEwQjt3QkFDMUIscUJBQXFCO3FCQUN0QjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBEbmREcmFnZ2FibGVEaXJlY3RpdmUsXG4gIERuZERyYWdJbWFnZVJlZkRpcmVjdGl2ZSxcbn0gZnJvbSAnLi9kbmQtZHJhZ2dhYmxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICBEbmREcm9wem9uZURpcmVjdGl2ZSxcbiAgRG5kUGxhY2Vob2xkZXJSZWZEaXJlY3RpdmUsXG59IGZyb20gJy4vZG5kLWRyb3B6b25lLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEbmRIYW5kbGVEaXJlY3RpdmUgfSBmcm9tICcuL2RuZC1oYW5kbGUuZGlyZWN0aXZlJztcblxuQE5nTW9kdWxlKHtcbiAgZXhwb3J0czogW1xuICAgIERuZERyYWdnYWJsZURpcmVjdGl2ZSxcbiAgICBEbmREcm9wem9uZURpcmVjdGl2ZSxcbiAgICBEbmRIYW5kbGVEaXJlY3RpdmUsXG4gICAgRG5kUGxhY2Vob2xkZXJSZWZEaXJlY3RpdmUsXG4gICAgRG5kRHJhZ0ltYWdlUmVmRGlyZWN0aXZlLFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgRG5kRHJhZ0ltYWdlUmVmRGlyZWN0aXZlLFxuICAgIERuZERyb3B6b25lRGlyZWN0aXZlLFxuICAgIERuZEhhbmRsZURpcmVjdGl2ZSxcbiAgICBEbmRQbGFjZWhvbGRlclJlZkRpcmVjdGl2ZSxcbiAgICBEbmREcmFnZ2FibGVEaXJlY3RpdmUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIERuZE1vZHVsZSB7fVxuIl19