UNPKG

novo-elements

Version:

1 lines 27 kB
{"version":3,"file":"novo-elements-elements-drag-drop.mjs","sources":["../../../projects/novo-elements/src/elements/drag-drop/drag-drop-box.ts","../../../projects/novo-elements/src/elements/drag-drop/drag-drop.module.ts","../../../projects/novo-elements/src/elements/drag-drop/novo-elements-elements-drag-drop.ts"],"sourcesContent":["import { OverlayContainer } from '@angular/cdk/overlay';\nimport { AfterViewInit, computed, Directive, ElementRef, EventEmitter, HostBinding, HostListener, inject, Input, OnDestroy, Output, Renderer2, signal } from '@angular/core';\n\nexport interface NovoDragFinishEvent<T> {\n draggedItem: T;\n allItems: T[];\n event: DragEvent;\n}\n\ninterface NovoDragItem<T> {\n item: T;\n element: HTMLElement;\n removeListeners: () => void;\n}\n\nconst SCROLL_DRAGGABLE_PADDING_REGION = 30;\nconst SCROLL_DRAGGABLE_EVENT_AMT = 10;\n\n@Directive({\n selector: '[novoDragDrop]',\n standalone: false,\n host: {\n class: 'novo-drag-container',\n '[class.dragging]': '!!pickedUp',\n },\n})\nexport class NovoDragBoxParent<T> implements AfterViewInit, OnDestroy {\n\n pickedUp?: HTMLElement;\n previewReplacing?: HTMLElement;\n savedOrder?: NovoDragItem<T>[];\n\n overlayContainer = inject(OverlayContainer, { optional: true });\n\n @Input('novoDragDrop') items: T[];\n /**\n * A function to specify whether a given item in the child list is draggable.\n * (Note that altering this after setup is not yet supported)\n */\n @Input('novoDragDropFilter') dragFilter?: (item: T) => boolean;\n /**\n * Prevents behavior that eases the act of dragging an object to the edge of a scrollable container.\n */\n @Input('novoDragDropDisableScroll') disableScroll?: boolean;\n\n @Output() novoDragDropFinish = new EventEmitter<NovoDragFinishEvent<T>>();\n\n private trackedItems: NovoDragItem<T>[];\n private scrollContainer = signal<HTMLElement>(null);\n private scrollContainerRect = computed(() => this.scrollContainer()?.getBoundingClientRect());\n private scrollX = signal<boolean>(false);\n private scrollY = signal<boolean>(false);\n\n get itemsReordered(): T[] {\n return this.trackedItems.map(item => item.item);\n }\n\n @HostBinding('class.dragging')\n get dragging() {\n return Boolean(this.pickedUp);\n }\n\n mutationObserver = new MutationObserver(this.mutationDetected.bind(this));\n\n constructor(private elementRef: ElementRef, private renderer: Renderer2) { }\n\n get element(): HTMLElement {\n return this.elementRef.nativeElement;\n }\n\n ngAfterViewInit(): void {\n if (this.items) {\n this.registerChildren();\n this.mutationObserver.observe(this.element, { childList: true });\n }\n // if items is falsey, then no behavior is set up. In future, this component may support late enablement,\n // but for now it's not a priority. (It would open the question of late disablement)\n }\n\n ngOnDestroy(): void {\n this.trackedItems?.forEach(item => {\n item.removeListeners();\n });\n }\n\n private registerChildren(): void {\n if (this.items) {\n if (this.items.length !== this.element.children.length) {\n throw new Error(`Could not match item list to children list - drag box contains ${this.items.length} items, but has ${this.element.children.length} elements`);\n }\n this.trackedItems = [];\n for (let i = 0; i < this.element.children.length; i++) {\n this.registerChild(this.element.children[i] as HTMLElement, i);\n }\n }\n }\n\n private registerChild(element: HTMLElement, index: number) {\n const trackedItem: Partial<NovoDragItem<T>> = {\n item: this.items[index],\n element,\n };\n if (this.dragFilter && !this.dragFilter(this.items[index])) {\n element.draggable = false;\n trackedItem.removeListeners = () => {};\n } else {\n const listeners = [\n this.renderer.listen(element, 'dragstart', this.onDragStart.bind(this)),\n this.renderer.listen(element, 'drop', this.onDragFinish.bind(this)),\n this.renderer.listen(element, 'dragend', this.onDragStop.bind(this)),\n ];\n element.draggable = true;\n trackedItem.removeListeners = () => listeners.forEach(cb => cb());\n }\n this.trackedItems.push(trackedItem as NovoDragItem<T>);\n }\n\n mutationDetected(mutations: MutationRecord[]) {\n if (this.pickedUp) {\n return;\n }\n const addedNodes = new Set<HTMLElement>();\n const removedNodes = new Set<HTMLElement>();\n for (const mutation of mutations) {\n mutation.addedNodes.forEach((a: HTMLElement) => {\n if (!removedNodes.delete(a)) {\n addedNodes.add(a);\n }\n });\n mutation.removedNodes.forEach((a: HTMLElement) => {\n if (!addedNodes.delete(a)) {\n removedNodes.add(a);\n }\n });\n }\n addedNodes.forEach(node => {\n const idx = Array.prototype.indexOf.call(this.element.children, node);\n this.registerChild(node, idx);\n });\n if (removedNodes.size > 0) {\n this.trackedItems = this.trackedItems.filter(\n item => {\n const keep = !removedNodes.has(item.element);\n if (!keep) {\n item.removeListeners();\n }\n return keep;\n });\n }\n }\n\n /** Per-item listeners */\n\n onDragStart(event: DragEvent) {\n if (this.shouldBlockDragStart(event)) {\n event.preventDefault();\n return;\n }\n const dataTransfer = event.dataTransfer;\n // Present a native 'move item' effect\n dataTransfer.effectAllowed = 'move';\n if (!this.disableScroll) {\n this.scrollContainer.set(this.findScrollableParent());\n }\n\n this.pickedUp = event.target as HTMLElement;\n event.stopPropagation();\n this.savedOrder = [...this.trackedItems];\n }\n\n // Equivalent of \"finally\" - this runs whether or not the drag finished on a valid ending location\n onDragStop(event: DragEvent): void {\n this.pickedUp = null;\n this.previewReplacing = null;\n this.savedOrder = null;\n event.stopPropagation();\n }\n\n onDragFinish(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n if (!this.element.contains(event.currentTarget as HTMLElement)) {\n // this is for a different drag region - ignore\n return;\n }\n const draggedItem = this.trackedItems.find(item => item.element === this.pickedUp)?.item;\n this.trackedItems = Array.prototype.map.call(this.element.children, child => {\n const item = this.trackedItems.find(trackedItem => trackedItem.element === child);\n if (!item) {\n throw new Error('DragDrop: Error - could not reassociate an item post-drag');\n }\n return item;\n });\n this.novoDragDropFinish.emit({\n draggedItem,\n allItems: this.itemsReordered,\n event,\n });\n\n }\n\n /** - end per-item listeners */\n\n @HostListener('window:dragover', ['$event'])\n onDragOver(event: DragEvent): void {\n if (!this.pickedUp || this.inOverlay(event)) {\n return;\n }\n let target = event.target as HTMLElement;\n if (!this.element.contains(target)) {\n target = null;\n }\n // In some cases (maybe browser-specific) we may have this event reported from a sub-element of a drag destination.\n // We need to go upwards in the tree to find the actual target\n if (target && !target.draggable) {\n target = this.findDraggableParentOfElement(target);\n }\n // Check if this drag event is within this drag box\n if (target && target.parentElement === this.element) {\n event.stopPropagation();\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move';\n }\n if (this.previewReplacing !== target) {\n if (this.isValidTarget(target)) {\n this.previewReplacing = target;\n this.applyTempSort(this.pickedUp, target);\n } else {\n event.dataTransfer.dropEffect = 'none';\n }\n }\n } else {\n // if not within this drag box, then move this item back to its original position and show a diabled drag effect\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'none';\n }\n this.resetSorting();\n }\n if (!this.disableScroll) {\n this.processScrollDuringMove(event);\n }\n }\n\n private inOverlay(event: DragEvent): boolean {\n // Make sure a drag event is not looking at a tooltip or similar.\n // Return false if the dragbox itself is in an overlay - these scenarios will be harder to account for.\n const overlayElement = this.overlayContainer?.getContainerElement();\n return overlayElement && (overlayElement.contains(event.target as Node) && !overlayElement.contains(this.element));\n }\n\n private isValidTarget(target: HTMLElement): boolean {\n return target.draggable;\n }\n\n private findDraggableParentOfElement(target: HTMLElement): HTMLElement | null {\n const parentElement = target.parentElement;\n if (!parentElement) {\n return null;\n } else if (parentElement.draggable) {\n return parentElement;\n } else {\n return this.findDraggableParentOfElement(parentElement);\n }\n }\n\n private applyTempSort(showXElement: HTMLElement, inPlaceOfY: HTMLElement) {\n if (showXElement === inPlaceOfY) {\n // same element - ignoring\n return;\n }\n // Apply the \"preview\" effect from dragging one item to another\n const aIndex = Array.prototype.indexOf.call(this.elementRef.nativeElement.children, showXElement);\n const bIndex = Array.prototype.indexOf.call(this.elementRef.nativeElement.children, inPlaceOfY);\n const diff = bIndex - aIndex;\n let insertPosition: InsertPosition;\n if (diff > 0) {\n insertPosition = 'afterend';\n } else if (diff < 0) {\n insertPosition = 'beforebegin';\n } else {\n throw new Error('DragDrop: Two elements are in the same position');\n }\n inPlaceOfY.insertAdjacentElement(insertPosition, showXElement);\n }\n\n private resetSorting(): void {\n // return to the order of elements from the last time we called onDragPickup\n if (!this.savedOrder) {\n throw new Error('DragDrop: Cannot reset sorting with no saved order');\n }\n const boxElem = this.elementRef.nativeElement as HTMLElement;\n for (let i = 0; i < boxElem.children.length; i++) {\n const item = boxElem.children[i];\n if (this.savedOrder[i].element !== item && i > 0) {\n this.savedOrder[i - 1].element.insertAdjacentElement('afterend', this.savedOrder[i].element);\n }\n }\n }\n\n // If the user has provided classes indicating they only want a certain region to be draggable, ignore\n // this drag event if it is outside of there.\n private shouldBlockDragStart(event: DragEvent): boolean {\n const dragTarget = event.target as HTMLElement;\n // TODO: Allow for multiple drag targets, and drag exclusion targets\n const userDragTarget = dragTarget.querySelector('.novo-drag-target');\n if (userDragTarget) {\n return !this.isElementWithinEventBounds(userDragTarget, event);\n }\n }\n\n private processScrollDuringMove(event: DragEvent) {\n const scrollElement = this.scrollContainer();\n if (!scrollElement) {\n return;\n }\n const rect = this.scrollContainerRect();\n if (this.scrollX()) {\n if (event.x > rect.left && event.x < rect.left + SCROLL_DRAGGABLE_PADDING_REGION) {\n scrollElement.scrollLeft -= 10;\n } else if (event.x < rect.right && event.x > rect.right - SCROLL_DRAGGABLE_PADDING_REGION) {\n scrollElement.scrollLeft += 10;\n }\n }\n if (this.scrollY()) {\n if (event.y > rect.top && event.y < rect.top + SCROLL_DRAGGABLE_PADDING_REGION) {\n scrollElement.scrollTop -= 10;\n } else if (event.y < rect.bottom && event.y > rect.bottom - SCROLL_DRAGGABLE_PADDING_REGION) {\n scrollElement.scrollTop += 10;\n }\n }\n }\n\n public isElementWithinEventBounds(element: Element, event: DragEvent) {\n const rect = element.getBoundingClientRect();\n const isInside = event.clientX > rect.left && event.clientX < rect.right &&\n event.clientY < rect.bottom && event.clientY > rect.top;\n return isInside;\n }\n\n private findScrollableParent(): HTMLElement | null {\n let currentElement = this.element.parentElement;\n this.scrollX.set(false);\n this.scrollY.set(false);\n\n while (currentElement) {\n const hasVerticalScroll = currentElement.scrollHeight > currentElement.clientHeight;\n const hasHorizontalScroll = currentElement.scrollWidth > currentElement.clientWidth;\n const isScrollable = hasVerticalScroll || hasHorizontalScroll;\n\n if (isScrollable) {\n const computedStyle = window.getComputedStyle(currentElement);\n const overflowY = computedStyle.overflowY;\n const overflowX = computedStyle.overflowX;\n\n // Check if overflow is set to allow scrolling\n if ((overflowY === 'auto' || overflowY === 'scroll') ||\n (overflowX === 'auto' || overflowX === 'scroll')) {\n // Verify the scrollable parent is smaller than the drag container\n if (currentElement.clientHeight < this.element.clientHeight) {\n this.scrollY.set(true);\n }\n if (currentElement.clientWidth < this.element.clientWidth) {\n this.scrollX.set(true);\n }\n if (this.scrollX() || this.scrollY()) {\n return currentElement;\n }\n }\n }\n\n currentElement = currentElement.parentElement;\n }\n\n return null;\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { NovoDragBoxParent } from './drag-drop-box';\n\n\n@NgModule({\n declarations: [NovoDragBoxParent],\n exports: [NovoDragBoxParent],\n})\nexport class NovoDragDropModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAeA,MAAM,+BAA+B,GAAG,EAAE;AAC1C,MAAM,0BAA0B,GAAG,EAAE;MAUxB,iBAAiB,CAAA;AA2B1B,IAAA,IAAI,cAAc,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;IACnD;AAEA,IAAA,IACI,QAAQ,GAAA;AACR,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;IACjC;IAIA,WAAA,CAAoB,UAAsB,EAAU,QAAmB,EAAA;QAAnD,IAAA,CAAA,UAAU,GAAV,UAAU;QAAsB,IAAA,CAAA,QAAQ,GAAR,QAAQ;QAhC5D,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAarD,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,YAAY,EAA0B;AAGjE,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAc,IAAI,2DAAC;AAC3C,QAAA,IAAA,CAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,EAAE,qBAAqB,EAAE,+DAAC;AACrF,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAU,KAAK,mDAAC;AAChC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAU,KAAK,mDAAC;AAWxC,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEE;AAE3E,IAAA,IAAI,OAAO,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa;IACxC;IAEA,eAAe,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACpE;;;IAGJ;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,IAAG;YAC9B,IAAI,CAAC,eAAe,EAAE;AAC1B,QAAA,CAAC,CAAC;IACN;IAEQ,gBAAgB,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACZ,YAAA,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE;AACpD,gBAAA,MAAM,IAAI,KAAK,CAAC,kEAAkE,IAAI,CAAC,KAAK,CAAC,MAAM,mBAAmB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAA,SAAA,CAAW,CAAC;YAClK;AACA,YAAA,IAAI,CAAC,YAAY,GAAG,EAAE;AACtB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACnD,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAgB,EAAE,CAAC,CAAC;YAClE;QACJ;IACJ;IAEQ,aAAa,CAAC,OAAoB,EAAE,KAAa,EAAA;AACrD,QAAA,MAAM,WAAW,GAA6B;AAC1C,YAAA,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YACvB,OAAO;SACV;AACD,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE;AACxD,YAAA,OAAO,CAAC,SAAS,GAAG,KAAK;AACzB,YAAA,WAAW,CAAC,eAAe,GAAG,MAAK,EAAE,CAAC;QAC1C;aAAO;AACH,YAAA,MAAM,SAAS,GAAG;AACd,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvE,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnE,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACvE;AACD,YAAA,OAAO,CAAC,SAAS,GAAG,IAAI;AACxB,YAAA,WAAW,CAAC,eAAe,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QACrE;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAA8B,CAAC;IAC1D;AAEA,IAAA,gBAAgB,CAAC,SAA2B,EAAA;AACxC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf;QACJ;AACA,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAe;AACzC,QAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAe;AAC3C,QAAA,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;YAC9B,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAc,KAAI;gBAC3C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;AACzB,oBAAA,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrB;AACJ,YAAA,CAAC,CAAC;YACF,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAc,KAAI;gBAC7C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;AACvB,oBAAA,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvB;AACJ,YAAA,CAAC,CAAC;QACN;AACA,QAAA,UAAU,CAAC,OAAO,CAAC,IAAI,IAAG;AACtB,YAAA,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;AACrE,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC;AACjC,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE;YACvB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CACxC,IAAI,IAAG;gBACH,MAAM,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC5C,IAAI,CAAC,IAAI,EAAE;oBACP,IAAI,CAAC,eAAe,EAAE;gBAC1B;AACA,gBAAA,OAAO,IAAI;AACf,YAAA,CAAC,CAAC;QACV;IACJ;;AAIA,IAAA,WAAW,CAAC,KAAgB,EAAA;AACxB,QAAA,IAAI,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE;YAClC,KAAK,CAAC,cAAc,EAAE;YACtB;QACJ;AACA,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY;;AAEvC,QAAA,YAAY,CAAC,aAAa,GAAG,MAAM;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACrB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACzD;AAEA,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,MAAqB;QAC3C,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;IAC5C;;AAGA,IAAA,UAAU,CAAC,KAAgB,EAAA;AACvB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QACtB,KAAK,CAAC,eAAe,EAAE;IAC3B;AAEA,IAAA,YAAY,CAAC,KAAgB,EAAA;QACzB,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,aAA4B,CAAC,EAAE;;YAE5D;QACJ;QACA,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI;AACxF,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,IAAG;AACxE,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,OAAO,KAAK,KAAK,CAAC;YACjF,IAAI,CAAC,IAAI,EAAE;AACP,gBAAA,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC;YAChF;AACA,YAAA,OAAO,IAAI;AACf,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;YACzB,WAAW;YACX,QAAQ,EAAE,IAAI,CAAC,cAAc;YAC7B,KAAK;AACR,SAAA,CAAC;IAEN;;AAKA,IAAA,UAAU,CAAC,KAAgB,EAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YACzC;QACJ;AACA,QAAA,IAAI,MAAM,GAAG,KAAK,CAAC,MAAqB;QACxC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;YAChC,MAAM,GAAG,IAAI;QACjB;;;AAGA,QAAA,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;AAC7B,YAAA,MAAM,GAAG,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC;QACtD;;QAEA,IAAI,MAAM,IAAI,MAAM,CAAC,aAAa,KAAK,IAAI,CAAC,OAAO,EAAE;YACjD,KAAK,CAAC,eAAe,EAAE;YACvB,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,KAAK,CAAC,YAAY,EAAE;AACpB,gBAAA,KAAK,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM;YAC1C;AACA,YAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,MAAM,EAAE;AAClC,gBAAA,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE;AAC5B,oBAAA,IAAI,CAAC,gBAAgB,GAAG,MAAM;oBAC9B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAC7C;qBAAO;AACH,oBAAA,KAAK,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM;gBAC1C;YACJ;QACJ;aAAO;;AAEH,YAAA,IAAI,KAAK,CAAC,YAAY,EAAE;AACpB,gBAAA,KAAK,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM;YAC1C;YACA,IAAI,CAAC,YAAY,EAAE;QACvB;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACrB,YAAA,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;QACvC;IACJ;AAEQ,IAAA,SAAS,CAAC,KAAgB,EAAA;;;QAG9B,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE,mBAAmB,EAAE;QACnE,OAAO,cAAc,KAAK,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtH;AAEQ,IAAA,aAAa,CAAC,MAAmB,EAAA;QACrC,OAAO,MAAM,CAAC,SAAS;IAC3B;AAEQ,IAAA,4BAA4B,CAAC,MAAmB,EAAA;AACpD,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa;QAC1C,IAAI,CAAC,aAAa,EAAE;AAChB,YAAA,OAAO,IAAI;QACf;AAAO,aAAA,IAAI,aAAa,CAAC,SAAS,EAAE;AAChC,YAAA,OAAO,aAAa;QACxB;aAAO;AACH,YAAA,OAAO,IAAI,CAAC,4BAA4B,CAAC,aAAa,CAAC;QAC3D;IACJ;IAEQ,aAAa,CAAC,YAAyB,EAAE,UAAuB,EAAA;AACpE,QAAA,IAAI,YAAY,KAAK,UAAU,EAAE;;YAE7B;QACJ;;QAEA,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,EAAE,YAAY,CAAC;QACjG,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC;AAC/F,QAAA,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM;AAC5B,QAAA,IAAI,cAA8B;AAClC,QAAA,IAAI,IAAI,GAAG,CAAC,EAAE;YACV,cAAc,GAAG,UAAU;QAC/B;AAAO,aAAA,IAAI,IAAI,GAAG,CAAC,EAAE;YACjB,cAAc,GAAG,aAAa;QAClC;aAAO;AACH,YAAA,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC;QACtE;AACA,QAAA,UAAU,CAAC,qBAAqB,CAAC,cAAc,EAAE,YAAY,CAAC;IAClE;IAEQ,YAAY,GAAA;;AAEhB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAClB,YAAA,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC;QACzE;AACA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,aAA4B;AAC5D,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChC,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE;gBAC9C,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAChG;QACJ;IACJ;;;AAIQ,IAAA,oBAAoB,CAAC,KAAgB,EAAA;AACzC,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,MAAqB;;QAE9C,MAAM,cAAc,GAAG,UAAU,CAAC,aAAa,CAAC,mBAAmB,CAAC;QACpE,IAAI,cAAc,EAAE;YAChB,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,cAAc,EAAE,KAAK,CAAC;QAClE;IACJ;AAEQ,IAAA,uBAAuB,CAAC,KAAgB,EAAA;AAC5C,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE;QAC5C,IAAI,CAAC,aAAa,EAAE;YAChB;QACJ;AACA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,EAAE;AACvC,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;AAChB,YAAA,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,+BAA+B,EAAE;AAC9E,gBAAA,aAAa,CAAC,UAAU,IAAI,EAAE;YAClC;AAAO,iBAAA,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,+BAA+B,EAAE;AACvF,gBAAA,aAAa,CAAC,UAAU,IAAI,EAAE;YAClC;QACJ;AACA,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;AAChB,YAAA,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,+BAA+B,EAAE;AAC5E,gBAAA,aAAa,CAAC,SAAS,IAAI,EAAE;YACjC;AAAO,iBAAA,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,+BAA+B,EAAE;AACzF,gBAAA,aAAa,CAAC,SAAS,IAAI,EAAE;YACjC;QACJ;IACJ;IAEO,0BAA0B,CAAC,OAAgB,EAAE,KAAgB,EAAA;AAChE,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE;AAC5C,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK;AACpE,YAAA,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG;AAC3D,QAAA,OAAO,QAAQ;IACnB;IAEQ,oBAAoB,GAAA;AACxB,QAAA,IAAI,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;AAC/C,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QAEvB,OAAO,cAAc,EAAE;YACnB,MAAM,iBAAiB,GAAG,cAAc,CAAC,YAAY,GAAG,cAAc,CAAC,YAAY;YACnF,MAAM,mBAAmB,GAAG,cAAc,CAAC,WAAW,GAAG,cAAc,CAAC,WAAW;AACnF,YAAA,MAAM,YAAY,GAAG,iBAAiB,IAAI,mBAAmB;YAE7D,IAAI,YAAY,EAAE;gBACd,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC;AAC7D,gBAAA,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS;AACzC,gBAAA,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS;;gBAGzC,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,QAAQ;qBAC9C,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,QAAQ,CAAC,EAAE;;oBAElD,IAAI,cAAc,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;AACzD,wBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC1B;oBACA,IAAI,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;AACvD,wBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC1B;oBACA,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;AAClC,wBAAA,OAAO,cAAc;oBACzB;gBACJ;YACJ;AAEA,YAAA,cAAc,GAAG,cAAc,CAAC,aAAa;QACjD;AAEA,QAAA,OAAO,IAAI;IACf;+GA7VS,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAjB,iBAAiB,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,CAAA,cAAA,EAAA,OAAA,CAAA,EAAA,UAAA,EAAA,CAAA,oBAAA,EAAA,YAAA,CAAA,EAAA,aAAA,EAAA,CAAA,2BAAA,EAAA,eAAA,CAAA,EAAA,EAAA,OAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,EAAA,cAAA,EAAA,qBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAR7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,UAAU,EAAE,KAAK;AACjB,oBAAA,IAAI,EAAE;AACF,wBAAA,KAAK,EAAE,qBAAqB;AAC5B,wBAAA,kBAAkB,EAAE,YAAY;AACnC,qBAAA;AACJ,iBAAA;;sBASI,KAAK;uBAAC,cAAc;;sBAKpB,KAAK;uBAAC,oBAAoB;;sBAI1B,KAAK;uBAAC,2BAA2B;;sBAEjC;;sBAYA,WAAW;uBAAC,gBAAgB;;sBAkJ5B,YAAY;uBAAC,iBAAiB,EAAE,CAAC,QAAQ,CAAC;;;MCnMlC,kBAAkB,CAAA;+GAAlB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;gHAAlB,kBAAkB,EAAA,YAAA,EAAA,CAHZ,iBAAiB,CAAA,EAAA,OAAA,EAAA,CACtB,iBAAiB,CAAA,EAAA,CAAA,CAAA;gHAElB,kBAAkB,EAAA,CAAA,CAAA;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAJ9B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACN,YAAY,EAAE,CAAC,iBAAiB,CAAC;oBACjC,OAAO,EAAE,CAAC,iBAAiB,CAAC;AAC/B,iBAAA;;;ACPD;;AAEG;;;;"}