{"version":3,"file":"eui-components-eui-file-upload.mjs","sources":["../../eui-file-upload/pipes/filesize.pipe.ts","../../eui-file-upload/file-preview/file-preview.component.ts","../../eui-file-upload/file-preview/file-preview.component.html","../../eui-file-upload/progress/eui-file-upload-progress.component.ts","../../eui-file-upload/progress/eui-file-upload-progress.component.html","../../eui-file-upload/eui-file-upload.component.ts","../../eui-file-upload/eui-file-upload.component.html","../../eui-file-upload/utils/eui-file-upload.utils.ts","../../eui-file-upload/utils/mime-types.ts","../../eui-file-upload/utils/eui-file-upload.validators.ts","../../eui-file-upload/index.ts","../../eui-file-upload/eui-components-eui-file-upload.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * A pipe that transforms a file size in bytes into a human-readable format (e.g., KB, MB, GB).\n *\n * @example\n * {{ 1024 | filesize }}  // Outputs: \"1.00 KB\"\n * {{ 1048576 | filesize:1 }}  // Outputs: \"1.0 MB\"\n *\n * @param {number} bytes - The file size in bytes.\n * @param {number} [precision=2] - The number of decimal places to include in the output.\n * @returns {string} The formatted file size with the appropriate unit.\n */\n@Pipe({\n    name: 'filesize',\n})\nexport class EuiFileSizePipe implements PipeTransform {\n    private units = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\n    /**\n     * Method used to format a size.\n     *\n     * @param bytes Bytes to format.\n     * @param precision Number of decimal\n     * @returns String with formated size and unit.\n     */\n    transform(bytes = 0, precision = 2): string {\n        if (isNaN(parseFloat(String(bytes))) || !isFinite(bytes)) {\n            return '?';\n        }\n\n        let unit = 0;\n\n        while (bytes >= 1024) {\n            bytes /= 1024;\n            unit++;\n        }\n\n        return bytes.toFixed(+precision) + ' ' + this.units[unit];\n    }\n}\n","import {\n    Component,\n    OnInit,\n    Input,\n    ChangeDetectionStrategy,\n    ViewEncapsulation,\n    ChangeDetectorRef,\n    Output,\n    EventEmitter,\n    ContentChildren,\n    QueryList,\n    TemplateRef,\n    booleanAttribute,\n    AfterViewInit,\n    inject,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\nimport { EuiTemplateDirective } from '@eui/components/directives';\nimport { EUI_ICON } from '@eui/components/eui-icon';\nimport { EUI_LABEL } from '@eui/components/eui-label';\nimport { EUI_BUTTON } from '@eui/components/eui-button';\n\nimport { EuiUploadedFileInterface } from '../models/uploaded-file.model';\nimport { EuiFileSizePipe } from '../pipes/filesize.pipe';\n\n/**\n * @description\n * Internal class used by `eui-file-upload` to display the files to be uploaded.\n */\n@Component({\n    selector: 'eui-file-preview',\n    templateUrl: './file-preview.component.html',\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    encapsulation: ViewEncapsulation.None,\n    imports: [\n        NgTemplateOutlet,\n        ...EUI_BUTTON,\n        ...EUI_ICON,\n        ...EUI_LABEL,\n        EuiFileSizePipe,\n    ],\n})\nexport class EuiFilePreviewComponent implements OnInit, AfterViewInit {\n    /**\n     * The file to use. Will be a `Blob` for a file to be uploaded, `EuiUploadedFileInterface` for an initial file.\n     */\n    // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    @Input() file: Blob | EuiUploadedFileInterface | any;\n    /**\n     * Template to use in the list of files.\n     */\n    @Input() uploadedFileTemplate: TemplateRef<{ $implicit: { file: EuiUploadedFileInterface, index: number, isFileObject: boolean } }>;\n    /**\n     * Index of the file in the list.\n     */\n    @Input() index: number;\n\n    /**\n     * Object matching extension and icon.\n     */\n    @Input() previewAsIconConfig = {\n        avi: 'eui-file-video:eui-file',\n        html: 'eui-file-html:eui-file',\n        htm: 'eui-file-code:eui-file',\n        js: 'eui-file-code:eui-file',\n        json: 'eui-file-code:eui-file',\n        mp3: 'eui-file-audio:eui-file',\n        mp4: 'eui-file-video:eui-file',\n        pdf: 'eui-file-pdf:eui-file',\n        png: 'eui-file-png:eui-file',\n        svg: 'eui-file-svg:eui-file',\n        txt: 'eui-file-txt:eui-file',\n        xml: 'eui-file-code:eui-file',\n        jpeg: 'eui-file-jpg:eui-file',\n        jpg: 'eui-file-jpg:eui-file',\n        zip: 'eui-file-archive:eui-file',\n        doc: 'eui-file-word:eui-file',\n        docx: 'eui-file-word:eui-file',\n        xls: 'eui-file-xls:eui-file',\n        xlsx: 'eui-file-xls:eui-file',\n        ppt: 'eui-file-ppt:eui-file',\n        csv: 'eui-file-csv:eui-file',\n        rtf: 'eui-file-txt:eui-file',\n    };\n\n    /**\n     * Event emitted when the remove button is clicked.\n     */\n    @Output() removeFromList = new EventEmitter<number>();\n\n    public url: string;\n    public icon: string;\n    public fileExtension: string;\n    public previewData: { image: boolean; display: string };\n    public isLoading = false;\n    public typeFromFileExtension: string = null;\n\n    /**\n     * Event emitted when a chosen file to upload is clicked.\n     */\n    // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    @Output() itemClick = new EventEmitter<Blob | EuiUploadedFileInterface | any>();\n\n    /**\n     * Whether a preview, image or icon, is displayed for a file to upload.\n     *\n     * @default true\n     */\n    @Input({ transform: booleanAttribute }) hasPreview = true;\n    /**\n     * Whether the filename is displayed.\n     *\n     * @default true\n     */\n    @Input({ transform: booleanAttribute }) isFilenameDisplayed = true;\n    /**\n     * Whether the filesize is displayed.\n     *\n     * @default true\n     */\n    @Input({ transform: booleanAttribute }) isFilesizeDisplayed = true;\n    /**\n     * Whether the file type is displayed.\n     *\n     * @default true\n     */\n    @Input({ transform: booleanAttribute }) isFiletypeDisplayed = true;\n    /**\n     * Whether a preview is displayed as image.\n     *\n     * @default true\n     */\n    @Input({ transform: booleanAttribute }) hasPreviewAsImage = true;\n    /**\n     * Whether a preview is displayed as a file format icon.\n     *\n     * @default false\n     */\n    @Input({ transform: booleanAttribute }) hasPreviewAsIcon = false;\n    /**\n     * Whether items can be clicked. `itemClick` event is emitted.\n     *\n     * @default false\n     */\n    @Input({ transform: booleanAttribute }) isItemsClickable = false;\n    /**\n     * Whether the file is `File` or has been provided by the user as initial value.\n     *\n     * @default false\n     */\n    @Input({ transform: booleanAttribute }) isFileObject = false;\n\n    @ContentChildren(EuiTemplateDirective) templates: QueryList<EuiTemplateDirective>;\n    private cd = inject(ChangeDetectorRef);\n\n    ngOnInit(): void {\n        if (this.hasPreviewAsIcon) {\n            this.hasPreviewAsImage = false;\n        }\n\n        if (this.file instanceof Blob) {\n            const reader = new FileReader();\n            reader.readAsArrayBuffer(this.file as Blob);\n\n            // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            reader.onload = (event: any): void => {\n                this.url = event.target.result;\n                this.fileExtension = this.getFileExtension(this.file.name);\n                this.icon = this.getIconForMime(this.fileExtension);\n\n                if (this.fileExtension === 'msg') {\n                    this.typeFromFileExtension = 'application/vnd.ms-outlook';\n                }\n\n                const blob = new Blob([reader.result], { type: this.file.type });\n                const imageUrl = URL.createObjectURL(blob);\n\n                this.previewData = this.getPreviewForMime(this.fileExtension, imageUrl);\n\n                this.cd.detectChanges();\n            };\n            reader.onloadstart = (event: ProgressEvent): void => {\n                this.isLoading = true;\n                this.cd.detectChanges();\n            };\n            reader.onloadend = (event: ProgressEvent): void => {\n                this.isLoading = false;\n                this.cd.detectChanges();\n            };\n        } else {\n            this.url = (this.file as EuiUploadedFileInterface).url;\n            this.fileExtension = this.getFileExtension(this.file.name);\n            this.icon = this.getIconForMime(this.fileExtension);\n\n            this.previewData = this.getPreviewForMime(this.fileExtension, this.url);\n\n            this.cd.detectChanges();\n        }\n    }\n\n    ngAfterViewInit(): void {\n        this.templates.forEach((item) => {\n            if (item.getType() === 'uploadedFile') {\n                this.uploadedFileTemplate = item.template;\n            }\n        });\n    }\n\n    /**\n     * Remove from the list handler.\n     */\n    public onRemoveFromList(): void {\n        this.removeFromList.emit(this.index);\n    }\n\n    /**\n     * Click item handler.\n     * @param e The item clicked.\n     */\n    public onItemClick(e: Event): void {\n        this.itemClick.emit(this.file);\n        e.preventDefault();\n    }\n\n    /**\n     * Method returning a file extension.\n     *\n     * @param fileName Filename of the file\n     * @returns the extension as a string\n     */\n    private getFileExtension(fileName: string): string {\n        const ext = fileName.split('.');\n\n        return ext[ext.length - 1];\n    }\n\n    /**\n     * Method that returns the preview for a file.\n     *\n     * @param fileExtension Extension of the file\n     * @param imgUrl URL of the file\n     * @returns The image URL of valid image otherwise an icon of the extension\n     */\n    private getPreviewForMime(fileExtension: string, imgUrl: string): { image: boolean; display: string } {\n        const f = fileExtension.toLowerCase();\n        const image = f === 'jpeg' || f === 'jpg' || f === 'png' || f === 'gif' ? true : false;\n        const display = f === 'jpeg' || f === 'jpg' || f === 'png' || f === 'gif' ? imgUrl : this.getIconForMime(f);\n\n        return { image, display };\n    }\n\n    /**\n     * Method that return the icon for a MIME type.\n     *\n     * @param fileExtension Extension of the file\n     * @returns An icon string\n     */\n    private getIconForMime(fileExtension: string): string {\n        const f = fileExtension.toLowerCase();\n        return !this.previewAsIconConfig[f] ? 'eui-file-empty-o' : this.previewAsIconConfig[f];\n    }\n}\n","@if (uploadedFileTemplate) {\n    <ng-template\n        [ngTemplateOutlet]=\"uploadedFileTemplate\"\n        [ngTemplateOutletContext]=\"{ $implicit: { file: { id: file.id, name: file.name, url: file.url || previewData?.display, size: file.size, type: file.type }, index, isFileObject } }\" />\n} @else {\n    <div class=\"eui-file-upload__preview\">\n        <div class=\"eui-file-upload__preview--left\">\n            @if (hasPreview && hasPreviewAsImage) {\n                <div class=\"eui-file-upload__preview--left__image\">\n                    @if (url && previewData.image) {\n                        <img [src]=\"previewData.display\" alt=\"File preview image\" />\n                    }\n                    @if (previewData && !previewData.image) {\n                        <eui-icon-svg icon=\"{{ previewData.display }}\" size=\"l\" class=\"eui-u-mr-s\"></eui-icon-svg>\n                    }\n                    @if (isLoading) {\n                        <div class=\"loading-container\">\n                            <eui-icon-svg isLoading size=\"2xl\"></eui-icon-svg>\n                        </div>\n                    }\n                </div>\n            }\n            @if (hasPreview && hasPreviewAsIcon) {\n                <div>\n                    <eui-icon-svg icon=\"{{ icon }}\" size=\"l\" class=\"eui-u-mr-s\"></eui-icon-svg>\n                </div>\n            }\n            @if (isFilenameDisplayed) {\n                <div class=\"eui-file-upload__preview--left__filename eui-u-text-truncate\">\n                    @if (!isItemsClickable) {\n                        {{ file.name }}\n                    }\n                    @if (isItemsClickable) {\n                        <a href=\"#\" (click)=\"onItemClick($event)\" class=\"eui-u-text-link eui-u-text-truncate\">{{ file.name }}</a>\n                    }\n                </div>\n            }\n        </div>\n        <div class=\"eui-file-upload__preview--right\">\n            @if (isFilesizeDisplayed) {\n                <div class=\"eui-u-text-no-wrap\">{{ file.size | filesize }}</div>\n            }\n            @if (isFiletypeDisplayed) {\n                <div>{{ file.type.length > 0 ? file.type : typeFromFileExtension }}</div>\n            }\n            <div>\n                <button euiButton euiDanger euiRounded euiIconButton euiBasicButton type=\"button\" (click)=\"onRemoveFromList()\" attr.aria-label=\"Remove {{ file.name }} from the list\">\n                    <eui-icon-svg icon=\"eui-trash\" />\n                </button>\n            </div>\n        </div>\n    </div>\n}\n","import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';\n\n/**\n * `eui-file-upload-progress` component for displaying file upload completion status.\n * Renders a visual indicator showing the percentage of upload progress.\n * Typically used internally by `eui-file-upload` but can be used standalone for custom upload implementations.\n */\n@Component({\n    selector: 'eui-file-upload-progress',\n    templateUrl: './eui-file-upload-progress.component.html',\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    encapsulation: ViewEncapsulation.None,\n})\nexport class EuiFileUploadProgressComponent {\n    /**\n     * Current upload progress percentage to display in the progress bar.\n     * Value should be between 0 and 100, where 0 represents no progress and 100 represents completion.\n     * @default 0\n     */\n    @Input() progress = 0;\n}\n","@if (progress > 0) {\n    <div class=\"eui-file-upload__progress-bar-container\">\n        <div class=\"progress-bar\" [style.width]=\"progress + '%'\"></div>\n    </div>\n    <div>{{ progress }}%</div>\n}\n","import {\n    Component,\n    ElementRef,\n    HostBinding,\n    HostListener,\n    Input,\n    ViewEncapsulation,\n    OnInit,\n    ViewChildren,\n    QueryList,\n    Output,\n    EventEmitter,\n    booleanAttribute,\n    AfterViewInit,\n    ContentChildren,\n    TemplateRef,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\n\nimport { EUI_BUTTON } from '@eui/components/eui-button';\nimport { EuiTemplateDirective } from '@eui/components/directives';\n\nimport { EuiUploadedFileInterface } from './models/uploaded-file.model';\nimport { EuiFilePreviewComponent } from './file-preview/file-preview.component';\nimport { EuiFileUploadProgressComponent } from './progress/eui-file-upload-progress.component';\nimport { EuiFileSizePipe } from './pipes/filesize.pipe';\nimport { NgTemplateOutlet } from '@angular/common';\n\n/**\n * @description\n * `eui-file-upload` component supporting both traditional file selection and drag-and-drop functionality.\n * Implements ControlValueAccessor for seamless integration with Angular reactive and template-driven forms.\n * `eui-file-upload` provides file preview, upload progress tracking, file type filtering, and multiple file management.\n * `eui-file-upload` displays uploaded files with customizable templates for previews, buttons, and progress indicators.\n *\n * @usageNotes\n * ### Basic file upload\n * ```html\n * <eui-file-upload \n *   [isMultiple]=\"true\" \n *   accept=\".pdf,.doc,.docx\"\n *   [maxFiles]=\"5\">\n * </eui-file-upload>\n * ```\n *\n * ### With form control\n * ```typescript\n * fileControl = new FormControl([]);\n * ```\n * ```html\n * <eui-file-upload \n *   [formControl]=\"fileControl\"\n *   [hasDragArea]=\"true\"\n *   [progress]=\"uploadProgress\">\n * </eui-file-upload>\n * ```\n *\n * ### Accessibility\n * - Native file input is keyboard accessible\n * - Drag-and-drop area announces state changes to screen readers\n * - File list items are navigable and removable via keyboard\n *\n * ### Notes\n * - Use `accept` to filter file types (e.g., \"image/*\", \".pdf\")\n * - Progress tracking requires external upload logic to update `progress` input\n * - Customize UI with templates: uploadedFile, browseButton, resetButton, progressBar\n * - Set `maxFiles` to limit simultaneous uploads\n */\n@Component({\n    selector: 'eui-file-upload',\n    templateUrl: './eui-file-upload.component.html',\n    providers: [\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: EuiFileUploadComponent,\n            multi: true,\n        },\n    ],\n    styleUrls: ['./eui-file-upload.scss'],\n    encapsulation: ViewEncapsulation.None,\n    imports: [\n        NgTemplateOutlet,\n        TranslateModule, \n        EuiFilePreviewComponent, \n        EuiFileUploadProgressComponent, \n        EuiFileSizePipe,\n        ...EUI_BUTTON,\n    ],\n})\nexport class EuiFileUploadComponent implements ControlValueAccessor, OnInit, AfterViewInit {\n    /**\n     * Data attribute used for end-to-end testing identification.\n     * @default 'eui-file-upload'\n     */\n    @Input() e2eAttr = 'eui-file-upload';\n    /**\n     * Current upload progress percentage displayed in the progress bar.\n     * Only effective when hasProgressBar is true. Value should be between 0 and 100.\n     * Must be updated externally to reflect actual upload progress.\n     */\n    @Input() progress: number;\n    /**\n     * Comma-separated list of allowed file extensions for upload filtering.\n     * Files not matching the specified extensions will be rejected.\n     * Use '*' to allow all file types.\n     * @default '*'\n     */\n    @Input() accept = '*';\n    /**\n     * Maximum number of files that can be uploaded simultaneously.\n     * When limit is reached, additional file selection is disabled.\n     * Set to null or undefined for unlimited files.\n     * @default null\n     */\n    @Input() maxFiles: number;\n    /**\n     * Emitted when files are dropped into the drag-and-drop area.\n     * Triggered after files are processed and added to the upload queue.\n     * No payload is emitted.\n     */\n    @Output() fileDrop = new EventEmitter();\n    /**\n     * Emitted when a file in the upload list is clicked.\n     * Only triggers when isItemsClickable is true.\n     * Payload: Blob, EuiUploadedFileInterface, or any file object representing the clicked item.\n     */\n    // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    @Output() itemClick = new EventEmitter<Blob | EuiUploadedFileInterface | any>();\n\n    /**\n     * Sets the `class` attribute for the host element.\n     *\n     * @returns A string with all CSS classes applied.\n     */\n    @HostBinding('class')\n    public get cssClasses(): string {\n        return [\n            'eui-file-upload',\n        ]\n            .join(' ')\n            .trim();\n    }\n\n    public files: File[] = [];\n    public filesTotalSize = 0;\n    /**\n     * Random number generated to give an unique id to the field.\n     */\n    public randomNumberId = Math.floor(Math.random() * 10000);\n    /**\n     * List of existing files to display in the component.\n     *\n     * @type {EuiUploadedFileInterface[]}\n     */\n    public uploadedFiles: EuiUploadedFileInterface[] = [];\n    // eslint-disable-next-line\n    public dragEntered = false;\n\n    /**\n     * List of templates passed to the component.\n     */\n    @ContentChildren(EuiTemplateDirective) templates: QueryList<EuiTemplateDirective>;\n\n    @ViewChildren('input') fileInputs: QueryList<ElementRef<HTMLInputElement>>;\n\n    public uploadedFileTemplate: TemplateRef<{ $implicit: { file: EuiUploadedFileInterface, index: number, isFileObject: boolean } }>;\n    public browseButtonTemplate: TemplateRef<HTMLElement>;\n    public resetButtonTemplate: TemplateRef<HTMLElement>;\n    public progressBarTemplate: TemplateRef<{ $implicit: { progress: number } }>;\n\n    /**\n     * Enables selection of multiple files in a single upload operation.\n     * When false, only one file can be selected at a time.\n     * @default true\n     */\n    @Input({ transform: booleanAttribute }) isMultiple = true;\n    /**\n     * Displays a progress bar indicating upload completion percentage.\n     * Progress value must be provided via the progress input property.\n     * @default true\n     */\n    @Input({ transform: booleanAttribute }) hasProgressBar = true;\n    /**\n     * Displays a visual preview for each file in the upload list.\n     * Preview type is controlled by hasPreviewAsImage and hasPreviewAsIcon properties.\n     * @default true\n     */\n    @Input({ transform: booleanAttribute }) hasPreview = true;\n    /**\n     * Renders file previews as thumbnail images for supported image file types.\n     * Automatically disabled when hasPreviewAsIcon is true.\n     * @default true\n     */\n    @Input({ transform: booleanAttribute }) hasPreviewAsImage = true;\n    /**\n     * Renders file previews as file format icons instead of image thumbnails.\n     * When enabled, automatically sets hasPreviewAsImage to false.\n     * @default false\n     */\n    @Input({ transform: booleanAttribute }) hasPreviewAsIcon = false;\n    /**\n     * Shows the total combined size of all files in the upload queue.\n     * Provides users with visibility into total upload size.\n     * @default true\n     */\n    @Input({ transform: booleanAttribute }) hasTotalSizeDisplayed = true;\n    /**\n     * Displays a button to clear all files from the upload queue.\n     * Only visible when isMultiple is true and files are present.\n     * @default true\n     */\n    @Input({ transform: booleanAttribute }) hasResetButton = true;\n    /**\n     * Enables drag-and-drop functionality for file selection.\n     * Displays a drop zone area where users can drag files from their file system.\n     * @default false\n     */\n    @Input({ transform: booleanAttribute }) hasDragArea = false;\n    /**\n     * Makes files in the upload list clickable, emitting itemClick events on interaction.\n     * Useful for implementing file preview or detail views.\n     * @default false\n     */\n    @Input({ transform: booleanAttribute }) isItemsClickable = false;\n\n    /**\n     * Drag and drop area listener.\n     *\n     * @param fileList `FileList` containing dropped file and initial file.\n     */\n    @HostListener('change', ['$any($event.target).files']) emitFiles(fileList: FileList): void {\n        let i = [...this.uploadedFiles, ...this.files].length;\n        for (const property in fileList) {\n            if (fileList[property] && typeof fileList[property] === 'object' && (!this.maxFiles || i < this.maxFiles)) {\n                const fileName = fileList[property].name.split('.');\n                const fileExtension = fileName[fileName.length - 1];\n\n                if (this.accept.indexOf(fileExtension.toLowerCase()) !== -1 || this.accept === '*') {\n                    this.files.push(fileList[property]);\n                }\n\n                i++;\n            }\n\n        }\n\n        this.getTotalSize();\n        // eslint-disable-next-line\n        this.uploadedFiles ? this.onChange([...this.uploadedFiles, ...this.files]) : this.onChange(this.files);\n        if (this.fileInputs) {\n            this.fileInputs.first.nativeElement.value = '';\n            this.fileInputs.last.nativeElement.value = '';\n        }\n\n        this.dragEntered = false;\n        this.fileDrop.emit();\n    }\n\n    /**\n     * Determines whether the reset button should be displayed.\n     *\n     * @returns {boolean} `true` if the reset button should be shown, otherwise `false`.\n     */\n    get showResetBtn(): boolean {\n        return this.hasResetButton && this.isMultiple && (this.files.length > 0 || this.uploadedFiles.length > 0);\n    }\n\n    /**\n     * Determines whether the drop area should be disabled.\n     *\n     * @returns {boolean} `true` if the drop area is disabled, otherwise `false`.\n     */\n    get isDropAreaDisabled(): boolean {\n        return (!this.isMultiple && this.files.length === 1) || [...this.uploadedFiles, ...this.files].length === this.maxFiles;\n    }\n\n    ngOnInit(): void {\n        if (this.hasPreviewAsIcon) {\n            this.hasPreviewAsImage = false;\n        }\n    }\n\n    ngAfterViewInit(): void {\n        // TODO EUI19: Change detection to OnPush to get rid of setTimeout workaround.\n        setTimeout(() => {\n            this.templates.forEach((item) => {\n                if (item.getType() === 'uploadedFile') {\n                    this.uploadedFileTemplate = item.template;\n                }\n                if (item.getType() === 'browseButton') {\n                    this.browseButtonTemplate = item.template;\n                }\n                if (item.getType() === 'resetButton') {\n                    this.resetButtonTemplate = item.template;\n                }\n                if (item.getType() === 'progressBar') {\n                    this.progressBarTemplate = item.template;\n                }\n            });\n        });\n    }\n\n    onDragEnter(): void {\n        if (!this.isDropAreaDisabled) {\n            this.dragEntered = true;\n        }\n    }\n\n    onDragLeave(): void {\n        this.dragEntered = false;\n    }\n\n    /**\n     * Remove a file from the array of files choosen by the user.\n     *\n     * @param index Index of the file to remove in the array.\n     */\n    public removeFromList(index: number): void {\n        this.files = this.files.filter((f, i) => i !== index);\n\n        if (this.files.length === 0) {\n            this.progress = 0;\n        }\n        this.getTotalSize();\n        this.onChange([...this.uploadedFiles, ...this.files]);\n    }\n\n    /**\n     * Remove a file from the array of files provided to the component as existing values.\n     *\n     * @param index Index of the file to remove in the array.\n     */\n    public removeFromUploadedList(index: number): void {\n        this.uploadedFiles = this.uploadedFiles.filter((f, i) => i !== index);\n\n        if (this.files.length === 0) {\n            this.progress = 0;\n        }\n\n        this.getTotalSize();\n        this.onChange([...this.uploadedFiles, ...this.files]);\n    }\n\n    /**\n     * Reset the list of files in the component.\n     */\n    public resetList(): void {\n        this.files = [];\n        this.uploadedFiles = [];\n        this.getTotalSize();\n        this.progress = 0;\n        this.onChange([...this.uploadedFiles, ...this.files]);\n    }\n\n    public openBrowseWindow(): void {\n        this.fileInputs.first.nativeElement.click();\n    }\n\n    /**\n     * Click item handler.\n     * @param e The item clicked. Will be a `Blob` for a file to be uploaded, `EuiUploadedFileInterface` for an initial file.\n     */\n    // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    public onItemClick(e: Blob | EuiUploadedFileInterface | any): void {\n        this.itemClick.emit(e);\n    }\n\n    // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    writeValue(value: any): void {\n        this.uploadedFiles = value || [];\n        this.files = [];\n        this.getTotalSize();\n    }\n\n    // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    registerOnChange(fn: any): void {\n        this.onChange = fn;\n    }\n\n    // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    registerOnTouched(fn: any): void {/* Nothing to be Done so far */}\n\n    // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    private onChange: any = (): void => {/* Nothing to be Done so far */};\n\n    /**\n     * Calculates the total size to be uploaded.\n     */\n    private getTotalSize(): void {\n        this.filesTotalSize = 0;\n        this.files.forEach((f) => {\n            this.filesTotalSize += f.size;\n        });\n    }\n}\n","@if (hasDragArea) {\n    <div\n        class=\"eui-file-upload__drop-area\"\n        [class.eui-file-upload__drop-area--active]=\"dragEntered\"\n        [class.eui-file-upload__drop-area--disabled]=\"isDropAreaDisabled\">\n        <button euiButton class=\"eui-file-upload__fake-btn\">{{ 'eui.euifileupload.CHOOSE-FILE' | translate }}</button>\n        <span>{{ 'eui.euifileupload.DRAG-AND-DROP-FILE-HERE' | translate }}</span>\n        <input\n            #input\n            class=\"eui-file-upload__file-input\"\n            attr.aria-label=\"{{ 'eui.euifileupload.CHOOSE-FILE' | translate }} 'or' {{\n                'eui.euifileupload.DRAG-AND-DROP-FILE-HERE' | translate\n            }}\"\n            type=\"file\"\n            accept=\"{{ accept }}\"\n            [attr.disabled]=\"isDropAreaDisabled ? 'disabled' : null\"\n            [multiple]=\"isMultiple\"\n            (dragenter)=\"onDragEnter()\"\n            (dragleave)=\"onDragLeave()\" />\n    </div>\n} @else {\n    <div class=\"eui-file-upload__simple-input-file\">\n        <label for=\"file-{{ randomNumberId }}\">\n            @if (browseButtonTemplate) {\n                <ng-template [ngTemplateOutlet]=\"browseButtonTemplate\"></ng-template>\n            } @else {\n                <button euiButton type=\"button\" (click)=\"openBrowseWindow()\">{{ 'eui.euifileupload.CHOOSE-FILE' | translate }}</button>\n            }\n        </label>\n    \n        @if (isMultiple) {\n            <input\n                #input\n                aria-label=\"Choose Multiple Files\"\n                class=\"file-input\"\n                id=\"file-{{ randomNumberId }}\"\n                type=\"file\"\n                accept=\"{{ accept }}\"\n                multiple />\n        } @else {\n            <input\n                #input\n                aria-label=\"Choose a single file\"\n                class=\"file-input\"\n                id=\"file-{{ randomNumberId }}\"\n                type=\"file\"\n                accept=\"{{ accept }}\" />\n        }\n    </div>\n}\n\n@if (hasProgressBar) {\n    @if (progressBarTemplate) {\n        <ng-template [ngTemplateOutlet]=\"progressBarTemplate\"\n            [ngTemplateOutletContext]=\"{ $implicit: { progress } }\" />\n    } @else {\n        <eui-file-upload-progress [progress]=\"progress\" />\n    }\n}\n\n@for (uploadedFile of uploadedFiles; let i = $index; track $index) {\n    <div>\n        <eui-file-preview\n            [isItemsClickable]=\"isItemsClickable\"\n            [index]=\"i\"\n            [file]=\"uploadedFile\"\n            [hasPreview]=\"hasPreview\"\n            [hasPreviewAsImage]=\"hasPreviewAsImage\"\n            [hasPreviewAsIcon]=\"hasPreviewAsIcon\"\n            [uploadedFileTemplate]=\"uploadedFileTemplate\"\n            (itemClick)=\"onItemClick($event)\"\n            (removeFromList)=\"removeFromUploadedList($event)\">\n        </eui-file-preview>\n    </div>\n}\n\n@for (file of files; let i = $index; track $index) {\n    <div>\n        <eui-file-preview\n            isFileObject\n            [isItemsClickable]=\"isItemsClickable\"\n            [index]=\"i\"\n            [file]=\"file\"\n            [hasPreview]=\"hasPreview\"\n            [hasPreviewAsImage]=\"hasPreviewAsImage\"\n            [hasPreviewAsIcon]=\"hasPreviewAsIcon\"\n            [uploadedFileTemplate]=\"uploadedFileTemplate\"\n            (itemClick)=\"onItemClick($event)\"\n            (removeFromList)=\"removeFromList($event)\">\n        </eui-file-preview>\n    </div>\n}\n\n@if (filesTotalSize && hasTotalSizeDisplayed) {\n    <div class=\"eui-file-upload__total-size\">\n        {{ filesTotalSize | filesize }} {{ 'eui.euifileupload.TOTAL-SIZE' | translate }}\n    </div>\n}\n\n<ng-content />\n\n@if (showResetBtn) {\n    @if (resetButtonTemplate) {\n        <ng-template [ngTemplateOutlet]=\"resetButtonTemplate\" />\n    } @else {\n        <button euiButton type=\"button\" (click)=\"resetList()\">\n            {{ 'eui.euifileupload.RESET-LIST' | translate }}\n        </button>\n    }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient, HttpEvent, HttpEventType, HttpResponse } from '@angular/common/http';\nimport { filter, map, tap } from 'rxjs/operators';\nimport { pipe, Observable, UnaryFunction, MonoTypeOperatorFunction } from 'rxjs';\n\n@Injectable()\nexport class EuiFileUploadUtilsService {\n    private httpClient = inject(HttpClient);\n\n    /**\n     * @description\n     * Method that will format data in `FormData` and send them to backend.\n     *\n     * @example\n     * Call the method and log the response in the console.\n     *\n     * ```\n     * this.euiFileUploadUtilsService.sendData(this.form.value, 'http://localhost:3000/api/fake-api').pipe(\n     *     this.euiFileUploadUtilsService.uploadProgress((progress) => {\n     *         console.log(progress);\n     *     }),\n     *     this.euiFileUploadUtilsService.toResponseBody(),\n     * ).subscribe((response) => {\n     *      console.log(response);\n     * });\n     * ```\n     *\n     * @param data Data to send to backend\n     * @param APIEndPoint Endpoint URL\n     * @returns The backend response.\n     */\n    // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    public sendData(data: any, APIEndPoint: string): Observable<any> {\n        return this.httpClient.post(APIEndPoint, this.toFormData(data), {\n            reportProgress: true,\n            observe: 'events',\n        });\n    }\n\n    /**\n     * @description\n     * Method that will return the upload progress.\n     *\n     * @example\n     * Call the method and log the progress in the console.\n     *\n     * ```\n     * this.euiFileUploadUtilsService.sendData(this.form.value, 'http://localhost:3000/api/fake-api').pipe(\n     *     this.euiFileUploadUtilsService.uploadProgress((progress) => {\n     *         console.log(progress);\n     *     }),\n     *     this.euiFileUploadUtilsService.toResponseBody(),\n     * ).subscribe((response) => {\n     *      console.log(response);\n     * });\n     * ```\n     *\n     * @param cb A method to execute on each progress step.\n     * @returns A number between 0 and 100.\n     */\n    public uploadProgress<T>(cb: (progress: number) => void): MonoTypeOperatorFunction<HttpEvent<T>> {\n        return tap((event: HttpEvent<T>) => {\n            if (event.type === HttpEventType.UploadProgress) {\n                cb(Math.round((100 * event.loaded) / event.total));\n            }\n        });\n    }\n\n    /**\n     * @description\n     * Method that will return only the body of the backend response.\n     *\n     * @example\n     * Call the method and log the response in the console.\n     *\n     * ```\n     * this.euiFileUploadUtilsService.sendData(this.form.value, 'http://localhost:3000/api/fake-api').pipe(\n     *     this.euiFileUploadUtilsService.uploadProgress((progress) => {\n     *         console.log(progress);\n     *     }),\n     *     this.euiFileUploadUtilsService.toResponseBody(),\n     * ).subscribe((response) => {\n     *      console.log(response);\n     * });\n     * ```\n     *\n     * @returns The backend response.\n     */\n    public toResponseBody<T>(): UnaryFunction<Observable<HttpEvent<T>>, Observable<T>> {\n        return pipe(\n            filter((event: HttpEvent<T>) => event.type === HttpEventType.Response),\n            map((res: HttpResponse<T>) => res.body),\n        );\n    }\n\n    /**\n     * @description\n     * Return the icon to be used with eui-icon-svg of the given extension or a default file icon\n     *\n     * @param fileExtension\n     * @returns Icon name as string\n     */\n    public getIconForExtension(fileExtension: string): string {\n        const previewAsIconConfig = {\n            avi: 'eui-file-video',\n            html: 'eui-file-html',\n            htm: 'eui-file-code',\n            js: 'eui-file-code',\n            json: 'eui-file-code',\n            mp3: 'eui-file-audio',\n            mp4: 'eui-file-video',\n            pdf: 'eui-file-pdf',\n            png: 'eui-file-image',\n            svg: 'eui-file-image',\n            txt: 'eui-file-text',\n            xml: 'eui-file-code',\n            jpeg: 'eui-file-image',\n            jpg: 'eui-file-image',\n            zip: 'eui-file-archive',\n            doc: 'eui-file-word',\n            docx: 'eui-file-word-o',\n            xls: 'eui-file-excel-o',\n            xlsx: 'eui-file-excel-o',\n            ppt: 'eui-file-powerpoint',\n            csv: 'eui-file-text',\n            rtf: 'eui-file-text',\n        };\n\n        const f = fileExtension.toLowerCase();\n        return !previewAsIconConfig[f] ? 'eui-file-empty-o' : previewAsIconConfig[f];\n    }\n\n    /**\n     * Internal method returning `FormData` object.\n     *\n     * @param formValue Data to send to form\n     * @returns A `FormData` object\n     */\n    // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    private toFormData(formValue: any): FormData {\n        const formData = new FormData();\n\n        for (const key of Object.keys(formValue)) {\n            if (Array.isArray(formValue[key])) {\n                let fileIndex = 0;\n                // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                formValue[key].forEach((value: any) => {\n                    if (value instanceof File) {\n                        formData.append(key + fileIndex, value);\n                        fileIndex++;\n                    }\n                });\n\n                const a = [];\n                // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                formValue[key].forEach((value: any): void => {\n                    a.push(value);\n                });\n\n                formData.append(key, JSON.stringify(a));\n            } else {\n                if (typeof formValue[key] === 'string') {\n                    formData.set(key, formValue[key]);\n                } else {\n                    formData.set(key, JSON.stringify(formValue[key]));\n                }\n            }\n        }\n\n        return formData;\n    }\n}\n","export type MimeType =\n    | 'image/jpeg'\n    | 'image/png'\n    | 'image/gif'\n    | 'image/webp'\n    | 'image/flif'\n    | 'image/x-xcf'\n    | 'image/x-canon-cr2'\n    | 'image/x-canon-cr3'\n    | 'image/tiff'\n    | 'image/bmp'\n    | 'image/icns'\n    | 'image/vnd.ms-photo'\n    | 'image/vnd.adobe.photoshop'\n    | 'application/x-indesign'\n    | 'application/epub+zip'\n    | 'application/x-xpinstall'\n    | 'application/vnd.oasis.opendocument.text'\n    | 'application/vnd.oasis.opendocument.spreadsheet'\n    | 'application/vnd.oasis.opendocument.presentation'\n    | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n    | 'application/vnd.openxmlformats-officedocument.presentationml.presentation'\n    | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n    | 'application/zip'\n    | 'application/json'\n    | 'application/x-tar'\n    | 'application/x-rar-compressed'\n    | 'application/gzip'\n    | 'application/x-bzip2'\n    | 'application/x-7z-compressed'\n    | 'application/x-apple-diskimage'\n    | 'video/mp4'\n    | 'audio/midi'\n    | 'video/x-matroska'\n    | 'video/webm'\n    | 'video/quicktime'\n    | 'video/vnd.avi'\n    | 'audio/vnd.wave'\n    | 'audio/qcelp'\n    | 'audio/x-ms-asf'\n    | 'video/x-ms-asf'\n    | 'application/vnd.ms-asf'\n    | 'video/mpeg'\n    | 'video/3gpp'\n    | 'audio/mpeg'\n    | 'audio/mp4'\n    | 'audio/opus'\n    | 'video/ogg'\n    | 'audio/ogg'\n    | 'application/ogg'\n    | 'audio/x-flac'\n    | 'audio/ape'\n    | 'audio/wavpack'\n    | 'audio/amr'\n    | 'application/pdf'\n    | 'application/x-elf'\n    | 'application/x-msdownload'\n    | 'application/x-shockwave-flash'\n    | 'application/rtf'\n    | 'application/wasm'\n    | 'font/woff'\n    | 'font/woff2'\n    | 'application/vnd.ms-fontobject'\n    | 'font/ttf'\n    | 'font/otf'\n    | 'image/x-icon'\n    | 'video/x-flv'\n    | 'application/postscript'\n    | 'application/eps'\n    | 'application/x-xz'\n    | 'application/x-sqlite3'\n    | 'application/x-nintendo-nes-rom'\n    | 'application/x-google-chrome-extension'\n    | 'application/vnd.ms-cab-compressed'\n    | 'application/x-deb'\n    | 'application/x-unix-archive'\n    | 'application/x-rpm'\n    | 'application/x-compress'\n    | 'application/x-lzip'\n    | 'application/x-cfb'\n    | 'application/x-mie'\n    | 'application/x-apache-arrow'\n    | 'application/mxf'\n    | 'video/mp2t'\n    | 'application/x-blender'\n    | 'image/bpg'\n    | 'image/j2c'\n    | 'image/jp2'\n    | 'image/jpx'\n    | 'image/jpm'\n    | 'image/mj2'\n    | 'audio/aiff'\n    | 'application/xml'\n    | 'application/x-mobipocket-ebook'\n    | 'image/heif'\n    | 'image/heif-sequence'\n    | 'image/heic'\n    | 'image/heic-sequence'\n    | 'image/ktx'\n    | 'application/dicom'\n    | 'audio/x-musepack'\n    | 'text/calendar'\n    | 'text/vcard'\n    | 'model/gltf-binary'\n    | 'application/vnd.tcpdump.pcap'\n    | 'audio/x-voc'\n    | 'audio/vnd.dolby.dd-raw'\n    | 'audio/x-m4a'\n    | 'image/apng'\n    | 'image/x-olympus-orf'\n    | 'image/x-sony-arw'\n    | 'image/x-adobe-dng'\n    | 'image/x-nikon-nef'\n    | 'image/x-panasonic-rw2'\n    | 'image/x-fujifilm-raf'\n    | 'video/x-m4v'\n    | 'video/3gpp2'\n    | 'application/x-esri-shape'\n    | 'audio/aac'\n    | 'audio/x-it'\n    | 'audio/x-s3m'\n    | 'audio/x-xm'\n    | 'video/MP1S'\n    | 'video/MP2P'\n    | 'application/vnd.sketchup.skp'\n    | 'image/avif'\n    | 'application/x-lzh-compressed'\n    | 'application/pgp-encrypted'\n    | 'application/x-asar'\n    | 'model/stl'\n    | 'application/vnd.ms-htmlhelp'\n    | 'model/3mf'\n    | 'image/jxl'\n    | 'application/zstd'\n    | 'image/jls'\n    | 'application/vnd.ms-outlook'\n    | 'image/vnd.dwg'\n    | 'application/x-parquet'\n    | 'application/java-vm'\n    | 'application/x-arj'\n    | 'application/x-cpio'\n    | 'application/x-ace-compressed'\n    | 'application/avro'\n    | 'application/vnd.iccprofile'; // eslint-disable-line semi-style\n\nexport const getMimeType = (header: Uint8Array): MimeType => {\n    // convert Uint8Array to hex string\n    const hex = uint8ArrayToHexString(header);\n\n    // map hex string to mime type\n    if (hex.startsWith('ffd8ff')) return 'image/jpeg';\n    if (hex.startsWith('89504e47')) return 'image/png';\n    if (hex.startsWith('464c4946')) return 'image/flif';\n    if (hex.startsWith('67696d7020786366')) return 'image/x-xcf';\n    if (hex.startsWith('49492a00')) return 'image/x-canon-cr2';\n    if (hex.startsWith('49492a00')) return 'image/x-canon-cr3';\n    if (hex.startsWith('49492a00')) return 'image/tiff';\n    if (hex.startsWith('424d')) return 'image/bmp';\n    if (hex.startsWith('69636e73')) return 'image/icns';\n    if (hex.startsWith('49491a0000004845415050')) return 'image/vnd.ms-photo';\n    if (hex.startsWith('38425053')) return 'image/vnd.adobe.photoshop';\n    if (hex.startsWith('06054b50')) return 'application/x-indesign';\n\t// Handle ZIP-based formats by examining content\n\tif (hex.startsWith('504b0304')) {\n\t\treturn identifyZipBasedFormat(header);\n\t}\n    if (hex.startsWith('7b2274797065223a226a736f6e227d')) return 'application/json';\n    if (hex.startsWith('7573746172')) return 'application/x-tar';\n    if (hex.startsWith('526172211a0700')) return 'application/x-rar-compressed';\n    if (hex.startsWith('1f8b08')) return 'application/gzip';\n    if (hex.startsWith('425a68')) return 'application/x-bzip2';\n    if (hex.startsWith('377abcaf271c')) return 'application/x-7z-compressed';\n    if (hex.startsWith('78da')) return 'application/x-apple-diskimage';\n    if (hex.startsWith('00000020667479706d70')) return 'video/mp4';\n    if (hex.startsWith('4d546864')) return 'audio/midi';\n    if (hex.startsWith('1a45dfa393428288')) return 'video/x-matroska';\n    if (hex.startsWith('1a45dfa3')) return 'video/webm';\n    if (hex.startsWith('00000014667479707174')) return 'video/quicktime';\n    if (hex.startsWith('52494646')) return 'video/vnd.avi';\n    if (hex.startsWith('52494646')) return 'audio/vnd.wave';\n    if (hex.startsWith('0a010301')) return 'audio/qcelp';\n    if (hex.startsWith('3026b2758e66cf11')) return identifyAsfFormat(header);\n    if (hex.startsWith('000001ba')) return 'video/mpeg';\n    if (hex.startsWith('00000020667479703367')) return 'video/3gpp';\n    if (hex.startsWith('494433')) return 'audio/mpeg';\n    if (hex.startsWith('00000020667479704d344120')) return 'audio/mp4';\n    if (hex.startsWith('4f707573')) return 'audio/opus';\n    if (hex.startsWith('4f676753')) return identifyOggFormat(header);\n    if (hex.startsWith('664c6143')) return 'audio/x-flac';\n    if (hex.startsWith('4d414320')) return 'audio/ape';\n    if (hex.startsWith('7776706b')) return 'audio/wavpack';\n    if (hex.startsWith('2321414d520a')) return 'audio/amr';\n    if (hex.startsWith('255044462d312e')) return 'application/pdf';\n    if (hex.startsWith('7f454c46')) return 'application/x-elf';\n    if (hex.startsWith('4d5a')) return 'application/x-msdownload';\n    if (hex.startsWith('435753')) return 'application/x-shockwave-flash';\n    if (hex.startsWith('7b5c72746631')) return 'application/rtf';\n    if (hex.startsWith('0061736d')) return 'application/wasm';\n    if (hex.startsWith('774f4646')) return 'font/woff';\n    if (hex.startsWith('774f4632')) return 'font/woff2';\n    if (hex.startsWith('000100000008')) return 'application/vnd.ms-fontobject';\n    if (hex.startsWith('0001000000')) return 'font/ttf';\n    if (hex.startsWith('4f54544f00')) return 'font/otf';\n    if (hex.startsWith('000001000100')) return 'image/x-icon';\n    if (hex.startsWith('464c560105')) return 'video/x-flv';\n    if (hex.startsWith('25215053')) return 'application/postscript';\n    if (hex.startsWith('25215053')) return 'application/eps';\n    if (hex.startsWith('fd377a585a00')) return 'application/x-xz';\n    if (hex.startsWith('53514c69746520666f726d6174203300')) return 'application/x-sqlite3';\n    if (hex.startsWith('4e45531a00000001')) return 'application/x-nintendo-nes-rom';\n    if (hex.startsWith('4d534346')) return 'application/vnd.ms-cab-compressed';\n    if (hex.startsWith('213c617263683e0a')) return 'application/x-deb';\n    if (hex.startsWith('1f8b08')) return 'application/x-unix-archive';\n    if (hex.startsWith('edabeedb')) return 'application/x-rpm';\n    if (hex.startsWith('1f9d90')) return 'application/x-compress';\n    if (hex.startsWith('4c5a4950')) return 'application/x-lzip';\n    if (hex.startsWith('d0cf11e0a1b11ae1')) return 'application/x-cfb';\n    if (hex.startsWith('4d49455f')) return 'application/x-mie';\n    if (hex.startsWith('4141523146')) return 'application/x-apache-arrow';\n    if (hex.startsWith('060e2b3402050101')) return 'application/mxf';\n    if (hex.startsWith('47')) return 'video/mp2t';\n    if (hex.startsWith('4250e4')) return 'application/x-blender';\n    if (hex.startsWith('425047fb')) return 'image/bpg';\n    if (hex.startsWith('ff4fff51')) return 'image/j2c';\n    if (hex.startsWith('0000000c6a5020200d0a')) return 'image/jp2';\n    if (hex.startsWith('6a5020200d0a870a')) return 'image/jpx';\n    if (hex.startsWith('6a5020200d0a870a')) return 'image/jpm';\n    if (hex.startsWith('0000000c6a5020200d0a')) return 'image/mj2';\n    if (hex.startsWith('464f524d')) return 'audio/aiff';\n    if (hex.startsWith('3c3f786d6c20')) return 'application/xml';\n    if (hex.startsWith('424f4f4b4d4f4249')) return 'application/x-mobipocket-ebook';\n    if (hex.startsWith('667479706174')) return identifyHeifFormat(header);\n    if (hex.startsWith('4b545820')) return 'image/ktx';\n    if (hex.startsWith('4449434d')) return 'application/dicom';\n    if (hex.startsWith('4d50434b')) return 'audio/x-musepack';\n    if (hex.startsWith('56656e64')) return 'text/calendar';\n    if (hex.startsWith('424547494e3a5643415244')) return 'text/vcard';\n    if (hex.startsWith('676c5458')) return 'model/gltf-binary';\n    if (hex.startsWith('d4c3b2a1')) return 'application/vnd.tcpdump.pcap';\n    if (hex.startsWith('464f524d')) return 'audio/x-voc';\n    if (hex.startsWith('64646f6c')) return 'audio/vnd.dolby.dd-raw';\n\n    return null;\n};\n\nconst identifyZipBasedFormat = (data: Uint8Array): MimeType => {\n\ttry {\n\t\tconst fileEntries = extractZipFileList(data);\n\n\t\t// Chrome extension\n\t\tif (fileEntries.includes('manifest.json')) {\n\t\t\treturn 'application/x-google-chrome-extension';\n\t\t}\n\n\t\t// EPUB\n\t\tif (fileEntries.includes('META-INF/container.xml') || fileEntries.includes('mimetype')) {\n\t\t\treturn 'application/epub+zip';\n\t\t}\n\n\t\t// OpenDocument formats\n\t\tif (fileEntries.includes('META-INF/manifest.xml')) {\n\t\t\tif (fileEntries.some(f => f.endsWith('.odp'))) return 'application/vnd.oasis.opendocument.presentation';\n\t\t\tif (fileEntries.some(f => f.endsWith('.ods'))) return 'application/vnd.oasis.opendocument.spreadsheet';\n\t\t\tif (fileEntries.some(f => f.endsWith('.odt'))) return 'application/vnd.oasis.opendocument.text';\n\t\t}\n\n\t\t// Microsoft Office formats\n\t\tif (fileEntries.includes('[Content_Types].xml')) {\n\t\t\tif (fileEntries.includes('ppt/presentation.xml')) return 'application/vnd.openxmlformats-officedocument.presentationml.presentation';\n\t\t\tif (fileEntries.includes('xl/workbook.xml')) return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n\t\t\tif (fileEntries.includes('word/document.xml')) return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';\n\t\t}\n\n\t\t// Default to generic ZIP\n\t\treturn 'application/zip';\n\n\t} catch {\n\t\treturn 'application/zip';\n\t}\n};\n\nconst extractZipFileList = (data: Uint8Array): string[] => {\n\t// Simplified ZIP parsing - looks for central directory entries\n\tconst files: string[] = [];\n\tlet offset = 0;\n\n\twhile (offset < data.length - 4) {\n\t\t// Look for local file header signature (0x04034b50)\n\t\tif (data[offset] === 0x50 && data[offset + 1] === 0x4b &&\n\t\t\tdata[offset + 2] === 0x03 && data[offset + 3] === 0x04) {\n\n\t\t\tconst filenameLength = data[offset + 26] | (data[offset + 27] << 8);\n\t\t\tconst extraFieldLength = data[offset + 28] | (data[offset + 29] << 8);\n\n\t\t\tif (filenameLength > 0 && offset + 30 + filenameLength <= data.length) {\n\t\t\t\tconst filename = new TextDecoder().decode(data.slice(offset + 30, offset + 30 + filenameLength));\n\t\t\t\tfiles.push(filename);\n\t\t\t}\n\n\t\t\toffset += 30 + filenameLength + extraFieldLength;\n\t\t} else {\n\t\t\toffset++;\n\t\t}\n\t}\n\n\treturn files;\n};\n\nconst uint8ArrayToHexString = (uint8Array): string => {\n    return Array.prototype.map.call(uint8Array, (byte) => ('00' + byte.toString(16)).slice(-2)).join('');\n};\n\nconst identifyAsfFormat = (data: Uint8Array): MimeType => {\n\t// ASF files all start with the same GUID: 3026b2758e66cf11a6d900aa0062ce6c\n\t// To distinguish between audio, video, and application ASF, we need to examine\n\t// the stream properties in the ASF header\n\n\ttry {\n\t\t// Look for stream properties object GUID starting at offset 30\n\t\t// Audio stream properties: b7dc0791a9b711cf8ee600c00c205365\n\t\t// Video stream properties: bc19efc05b4d11cf9b1100aa00bbcb8b\n\n\t\tif (data.length < 100) {\n\t\t\t// Not enough data to analyze, default to application\n\t\t\treturn 'application/vnd.ms-asf';\n\t\t}\n\n\t\tconst hex = uint8ArrayToHexString(data);\n\n\t\t// Look for video stream properties GUID (indicates video content)\n\t\tif (hex.includes('bc19efc05b4d11cf9b1100aa00bbcb8b')) {\n\t\t\treturn 'video/x-ms-asf';\n\t\t}\n\n\t\t// Look for audio stream properties GUID (indicates audio content)\n\t\tif (hex.includes('b7dc0791a9b711cf8ee600c00c205365')) {\n\t\t\treturn 'audio/x-ms-asf';\n\t\t}\n\n\t\t// Check for Windows Media Audio/Video codec identifiers\n\t\t// WMA codec: 161 (0xa1) or 162 (0xa2) or 163 (0xa3)\n\t\t// WMV codec: Common values include various Windows Media Video identifiers\n\n\t\t// Scan through the header for codec information\n\t\tfor (let i = 0; i < Math.min(data.length - 4, 1000); i++) {\n\t\t\t// Look for audio codec indicators\n\t\t\tif (data[i] === 0xa1 || data[i] === 0xa2 || data[i] === 0xa3) {\n\t\t\t\t// Found WMA codec indicator\n\t\t\t\treturn 'audio/x-ms-asf';\n\t\t\t}\n\t\t}\n\n\t\t// Look for common video indicators in the first 1KB\n\t\tconst textContent = new TextDecoder('utf-8', { fatal: false }).decode(data.slice(0, Math.min(1000, data.length)));\n\n\t\t// Check for video-related strings\n\t\tif (textContent.toLowerCase().includes('video') ||\n\t\t    textContent.toLowerCase().includes('wmv') ||\n\t\t    textContent.toLowerCase().includes('mpeg')) {\n\t\t\treturn 'video/x-ms-asf';\n\t\t}\n\n\t\t// Check for audio-related strings\n\t\tif (textContent.toLowerCase().includes('audio') ||\n\t\t    textContent.toLowerCase().includes('wma') ||\n\t\t    textContent.toLowerCase().includes('music')) {\n\t\t\treturn 'audio/x-ms-asf';\n\t\t}\n\n\t\t// Default to application/vnd.ms-asf if we can't determine the specific type\n\t\treturn 'application/vnd.ms-asf';\n\n\t} catch {\n\t\t// If any error occurs during analysis, default to application type\n\t\treturn 'application/vnd.ms-asf';\n\t}\n};\n\nconst identifyHeifFormat = (data: Uint8Array): MimeType => {\n\t// HEIF/HEIC files all start with the same ftyp box signature: 667479706174\n\t// To distinguish between formats, we need to examine the brand and compatible brands\n\t// in the ftyp (file type) box\n\n\ttry {\n\t\tif (data.length < 20) {\n\t\t\t// Not enough data to analyze, default to HEIF\n\t\t\treturn 'image/heif';\n\t\t}\n\n\t\tconst hex = uint8ArrayToHexString(data);\n\n\t\t// The ftyp box structure:\n\t\t// Bytes 0-3: Box size (4 bytes)\n\t\t// Bytes 4-7: Box type \"ftyp\" (4 bytes) - 667479706174\n\t\t// Bytes 8-11: Major brand (4 bytes)\n\t\t// Bytes 12-15: Minor version (4 bytes)\n\t\t// Bytes 16+: Compatible brands (4 bytes each)\n\n\t\t// Extract major brand (4 bytes starting at offset 8)\n\t\t// Convert to ASCII string for easier comparison\n\t\tconst majorBrand = String.fromCharCode(\n\t\t\tdata[8], data[9], data[10], data[11],\n\t\t);\n\n\t\t// Look for compatible brands in the first 100 bytes\n\t\tconst compatibleBrandsHex = hex.substring(32, Math.min(200, hex.length)); // Start after major brand + minor version\n\n\t\t// HEIC brands: 'heic', 'heix', 'hevc', 'hevx'\n\t\tif (majorBrand === 'heic' ||\n\t\t    compatibleBrandsHex.includes('68656963') || // 'heic'\n\t\t    compatibleBrandsHex.includes('68656978') || // 'heix'\n\t\t    compatibleBrandsHex.includes('68657663') || // 'hevc'\n\t\t    compatibleBrandsHex.includes('68657678')) { // 'hevx'\n\n\t\t\t// Check for sequence/animation indicators\n\t\t\tif (compatibleBrandsHex.includes('68657673') || // 'hevs' - HEIC sequence\n\t\t\t    compatibleBrandsHex.includes('6d736631') || // 'msf1' - sequence\n\t\t\t    majorBrand === 'hevs') {\n\t\t\t\treturn 'image/heic-sequence';\n\t\t\t}\n\n\t\t\treturn 'image/heic';\n\t\t}\n\n\t\t// HEIF brands: 'mif1', 'msf1'\n\t\tif (majorBrand === 'mif1' || majorBrand === 'msf1' ||\n\t\t    compatibleBrandsHex.includes('6d696631') || // 'mif1'\n\t\t    compatibleBrandsHex.includes('6d736631')) { // 'msf1'\n\n\t\t\t// Check for sequence/animation indicators\n\t\t\tif (majorBrand === 'msf1' ||\n\t\t\t    compatibleBrandsHex.includes('6d736631')) { // 'msf1' - sequence\n\t\t\t\treturn 'image/heif-sequence';\n\t\t\t}\n\n\t\t\treturn 'image/heif';\n\t\t}\n\n\t\t// Check for specific sequence indicators in the data\n\t\tif (hex.includes('6d736631') || // 'msf1' - multi-image sequence\n\t\t    hex.includes('68657673')) { // 'hevs' - HEIC sequence\n\n\t\t\t// If we find HEIC-related brands, it's HEIC sequence\n\t\t\tif (hex.includes('68656963') || hex.includes('68657663')) {\n\t\t\t\treturn 'image/heic-sequence';\n\t\t\t}\n\n\t\t\treturn 'image/heif-sequence';\n\t\t}\n\n\t\t// If we find HEIC indicators but no sequence, it's single HEIC\n\t\tif (hex.includes('68656963') || // 'heic'\n\t\t    hex.includes('68657663') || // 'hevc'\n\t\t    hex.includes('68656978') || // 'heix'\n\t\t    hex.includes('68657678')) { // 'hevx'\n\t\t\treturn 'image/heic';\n\t\t}\n\n\t\t// Default to HEIF for any other case\n\t\treturn 'image/heif';\n\n\t} catch {\n\t\t// If any error occurs during analysis, default to HEIF\n\t\treturn 'image/heif';\n\t}\n};\n\nconst identifyOggFormat = (data: Uint8Array): MimeType => {\n\t// OGG files all start with \"OggS\" (4f676753) but can contain different codecs\n\t// To distinguish between audio, video, and application OGG, we need to examine\n\t// the codec information in the OGG page headers\n\n\ttry {\n\t\tif (data.length < 64) {\n\t\t\t// Not enough data to analyze, default to audio\n\t\t\treturn 'audio/ogg';\n\t\t}\n\n\t\tconst hex = uint8ArrayToHexString(data);\n\n\t\t// Look for codec identification patterns in the first few hundred bytes\n\t\t// Common video codecs in OGG:\n\t\t// - Theora: \"theora\" or \"\\x80theora\"\n\t\t// - VP8/VP9: various signatures\n\t\t// - Dirac: \"BBCD\"\n\n\t\t// Common audio codecs in OGG:\n\t\t// - Vorbis: \"vorbis\" or \"\\x01vorbis\"\n\t\t// - Opus: \"OpusHead\"\n\t\t// - FLAC: \"fLaC\"\n\t\t// - Speex: \"Speex\"\n\n\t\t// Convert some bytes to text for string matching\n\t\tconst textContent = new TextDecoder('utf-8', { fatal: false }).decode(data.slice(0, Math.min(512, data.length)));\n\t\tconst lowerContent = textContent.toLowerCase();\n\n\t\t// Check for video codec indicators first (as they're more specific)\n\t\tif (lowerContent.includes('theora') ||\n\t\t    hex.includes('8074686f726120') || // \"\\x80theora \"\n\t\t    hex.includes('7468656f7261') ||   // \"theora\"\n\t\t    lowerContent.includes('dirac') ||\n\t\t    hex.includes('42424344') ||       // \"BBCD\" - Dirac\n\t\t    lowerContent.includes('vp8') ||\n\t\t    lowerContent.includes('vp9')) {\n\t\t\treturn 'video/ogg';\n\t\t}\n\n\t\t// Check for audio codec indicators\n\t\tif (lowerContent.includes('vorbis') ||\n\t\t    hex.includes('01766f72626973') || // \"\\x01vorbis\"\n\t\t    hex.includes('766f72626973') ||   // \"vorbis\"\n\t\t    lowerContent.includes('opushead') ||\n\t\t    hex.includes('4f7075734865616420') || // \"OpusHead \"\n\t\t    lowerContent.includes('speex') ||\n\t\t    hex.includes('53706565782020') || // \"Speex  \"\n\t\t    lowerContent.includes('flac') ||\n\t\t    hex.includes('664c6143')) {      // \"fLaC\"\n\t\t\treturn 'audio/ogg';\n\t\t}\n\n\t\t// Look for OGG stream structure patterns\n\t\t// OGG pages have a specific structure, look for multiple \"OggS\" signatures\n\t\t// which might indicate a complex multimedia container\n\t\tlet oggSCount = 0;\n\t\tfor (let i = 0; i < Math.min(data.length - 4, 1000); i += 4) {\n\t\t\tif (data[i] === 0x4f && data[i + 1] === 0x67 &&\n\t\t\t    data[i + 2] === 0x67 && data[i + 3] === 0x53) {\n\t\t\t\toggSCount++;\n\t\t\t}\n\t\t}\n\n\t\t// Multiple OGG pages might indicate a more complex application format\n\t\tif (oggSCount > 3) {\n\t\t\t// Check if it's likely a multimedia container vs pure audio/video\n\t\t\tif (lowerContent.includes('application') ||\n\t\t\t    lowerContent.includes('metadata') ||\n\t\t\t    lowerContent.includes('index') ||\n\t\t\t    (!lowerContent.includes('audio') && !lowerContent.includes('video') &&\n\t\t\t     !lowerContent.includes('vorbis') && !lowerContent.includes('theora'))) {\n\t\t\t\treturn 'application/ogg';\n\t\t\t}\n\t\t}\n\n\t\t// Look for file extension hints in metadata (if present)\n\t\tif (lowerContent.includes('.ogv') || lowerContent.includes('video')) {\n\t\t\treturn 'video/ogg';\n\t\t}\n\n\t\tif (lowerContent.includes('.oga') || lowerContent.includes('audio') || lowerContent.includes('music')) {\n\t\t\treturn 'audio/ogg';\n\t\t}\n\n\t\t// Check the OGG page header flags\n\t\t// Byte 5 in OGG page header contains flags\n\t\t// If we have enough data, check the stream type\n\t\tif (data.length > 26) {\n\t\t\tconst pageHeaderType = data[5];\n\t\t\t// Fresh packet start (0x02) often indicates beginning of codec data\n\t\t\tif ((pageHeaderType & 0x02) === 0x02) {\n\t\t\t\t// Look at the packet data starting around byte 27\n\t\t\t\tconst packetStart = data.slice(27, Math.min(data.length, 50));\n\t\t\t\tconst packetHex = uint8ArrayToHexString(packetStart);\n\n\t\t\t\t// Check for Vorbis identification header\n\t\t\t\tif (packetHex.startsWith('01766f72626973')) {\n\t\t\t\t\treturn 'audio/ogg';\n\t\t\t\t}\n\n\t\t\t\t// Check for Theora identification header\n\t\t\t\tif (packetHex.startsWith('8074686f726120')) {\n\t\t\t\t\treturn 'video/ogg';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Default to audio/ogg as it's the most common OGG format\n\t\treturn 'audio/ogg';\n\n\t} catch {\n\t\t// If any error occurs during analysis, default to audio\n\t\treturn 'audio/ogg';\n\t}\n};\n","import { AbstractControl, AsyncValidatorFn, ValidationErrors, ValidatorFn } from '@angular/forms';\nimport { Observable, of, zip } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { getMimeType, MimeType } from './mime-types';\n\n/**\n * @description\n * Validator that requires the maximum length of files that can be uploaded.\n *\n * @example\n * Validate that the user selected maximum 3 files:\n *\n * ```\n * const fileUpload = new FormControl(null, maxFilesValidator(3));\n * console.log(fileUpload.errors); // { maxFiles: 3 }\n * ```\n *\n * @param {MimeType[]} maxFiles - The maximum number of files allowed.\n * @returns A validator function that returns an error map with the\n * `maxFiles` if the validation check fails, otherwise `null`.\n */\nexport const maxFilesValidator =\n    (maxFiles: number): ValidatorFn =>\n    (control: AbstractControl): { maxFiles: number } | null =>\n        control.value && control.value.length > maxFiles ? { maxFiles } : null;\n\n/**\n * @description\n * Validator that checks the **total size** (in bytes) of the selected files.\n * Returns an error when the combined size exceeds the provided limit.\n *\n * @example\n * Validate that the user doesn't select files whose **combined size** exceeds 300 kB (300000 bytes):\n *\n * ```ts\n * const fileUpload = new FormControl<File[] | null>(null, maxSizeValidator(300000));\n * console.log(fileUpload.errors); // { maxSize: 300000 } if totalSize > 300000\n * ```\n *\n * @param {number} maxSize - Maximum allowed **total size** in bytes.\n * @returns A validator function that returns `{ maxSize }` if the validation check fails,\n * otherwise `null`.\n */\nexport const maxSizeValidator =\n    (maxSize: number): ValidatorFn =>\n    (control: AbstractControl): { maxSize: number } | null => {\n        let totalSize = 0;\n        if (control.value) {\n            control.value.forEach((file: File) => {\n                totalSize += file.size;\n            });\n        }\n\n        return control.value && totalSize > maxSize ? { maxSize } : null;\n    };\n\n/**\n * @description\n * Validator that checks the **maximum size per file** (in bytes).\n * Returns an error if one or more selected files exceed the configured limit.\n *\n * @example\n * Validate that the user doesn't select files that exceed 300 kB (300000 bytes) per file:\n *\n * ```ts\n * const fileUpload = new FormControl<File[] | null>(null, maxFileSizeValidator(300000));\n * console.log(fileUpload.errors); // { maxFileSize: 300000, indexes: [0, 2] }\n * ```\n *\n * @param {number} maxFileSize - Maximum allowed size **per file** in bytes.\n * @returns A validator function that returns `{ maxFileSize, indexes }` if the validation check fails,\n * otherwise `null`. `indexes` contains the indices of the files that exceeded the limit.\n */\nexport const maxFileSizeValidator =\n    (maxFileSize: number): ValidatorFn =>\n    (control: AbstractControl): { maxFileSize: number, indexes: Array<number> } | null => {\n        const fileIndexes =[];\n        let maxFileExceeded = false;\n        if (control.value) {\n            control.value.forEach((file: File, index: number) => {\n                if (file.size > maxFileSize) {\n                    fileIndexes.push(index);\n                    maxFileExceeded = true;\n                }\n            });\n        }\n\n        return control.value && maxFileExceeded ? { maxFileSize, indexes: fileIndexes } : null;\n    };\n\n/**\n * @description\n * Validator that requires an array of mime type that can be uploaded.\n *\n * @example\n * Validate that the user doesn't select a file having another extension than .jpg or .jpeg:\n * ```\n * const fileUpload = new FormControl(null, mimeTypeExtensionValidator(['image/jpeg'])),\n * console.log(fileUpload.errors); // { invalidFileExtension: ['image/jpeg'] }\n * ```\n * \n * @param {MimeType[]} mimeTypes - The list of allowed MIME types.\n * @returns A validator function that returns an error map with the\n * `invalidFileExtension` if the validation check fails, otherwise `null`.\n */\nexport const mimeTypeExtensionValidator =\n    (mimeTypes: string[]): ValidatorFn =>\n    (control: AbstractControl): { invalidFileExtension: string[] } | null => {\n        const invalidFileExtension: string[] = [];\n        if (control.value) {\n            control.value.forEach((file: File) => {\n                if (mimeTypes.indexOf(file.type) === -1) {\n                    invalidFileExtension.push(file.name);\n                }\n            });\n        }\n\n        return control.value && invalidFileExtension.length > 0 ? { invalidFileExtension } : null;\n    };\n\n/**\n * @description\n * Validator that requires an array of mime type that can be uploaded.\n *\n * @example\n * Validate that the user doesn't select a file having another extension than .jpg or .jpeg:\n *\n * ```\n * const fileUpload = new FormControl(null, mimeTypeExtensionValidator(['image/jpeg'])),\n * console.log(fileUpload.errors); // { invalidMimeFileType: ['image/jpeg'] }\n * ```\n * @param {MimeType[]} mimeTypes - The list of allowed MIME types.\n * @returns An Async validator function that returns an error map with the\n * `invalidMimeFileType` if the validation check fails, otherwise `null`.\n */\nexport const asyncMimeTypeExtensionValidator =\n    (mimeTypes: MimeType[]): AsyncValidatorFn =>\n    (control: AbstractControl): Promise<ValidationErrors | null> | Observable<ValidationErrors | null> => {\n        if (control.value) {\n            const fileErrorObservables: Observable<ValidationErrors | null>[] = [];\n            // iterate over files\n            control.value.forEach((file: File) => {\n                // push observable which will check the mime validation type\n                fileErrorObservables.push(validateFileMimeType(file, mimeTypes));\n            });\n            return zip(...fileErrorObservables).pipe(\n                map((fileErrors) => {\n                    const errors = fileErrors.filter((fileError) => fileError !== null);\n                    // Error should be { fileName: FileType }\n\n                    if (errors.length === 0) {\n                        return null;\n                    }\n\n                    return { invalidMimeFileType: errors };\n                }),\n            );\n        }\n        return of(null);\n    };\n\n/**\n * Validates the MIME type of a file against a list of allowed MIME types.\n *\n * @param {File} file - The file to validate.\n * @param {MimeType[]} mimeTypes - The list of allowed MIME types.\n * @returns {Observable<{ [key: string]: MimeType }>} An observable that emits an object containing the file name as the key and\n * its detected MIME type as the value if the file type is not allowed.\n */\nconst validateFileMimeType = (file: File, mimeTypes: MimeType[]): Observable<{ [key: string]: MimeType } | null> => {\n    return new Observable<{ [p: string]: MimeType }>((subscriber) => {\n        const reader = new FileReader();\n        reader.onloadend = (): void => {\n            const buffer = reader.result as ArrayBuffer;\n            // Read more bytes to support complex MIME type detection (e.g., ASF format analysis)\n            const headerBytes = new Uint8Array(buffer).slice(0, Math.min(1024, buffer.byteLength));\n            const mime = getMimeType(headerBytes);\n            if (mimeTypes.includes(mime)) {\n                subscriber.next(null);\n            } else {\n                subscriber.next({ [file.name]: mime });\n            }\n            subscriber.complete();\n        };\n        reader.readAsArrayBuffer(file);\n    });\n};\n","import { EuiFileUploadComponent } from './eui-file-upload.component';\nimport { EuiFileUploadProgressComponent } from './progress/eui-file-upload-progress.component';\nimport { EuiFilePreviewComponent } from './file-preview/file-preview.component';\nimport { EuiFileSizePipe } from './pipes/filesize.pipe';\n\nexport const EUI_FILE_UPLOAD = [\n    EuiFileUploadComponent,\n    EuiFileUploadProgressComponent,\n    EuiFilePreviewComponent,\n    EuiFileSizePipe,\n] as const;\nexport * from './eui-file-upload.component';\nexport * from './progress/eui-file-upload-progress.component';\nexport * from './file-preview/file-preview.component';\nexport * from './eui-file-upload.component';\nexport * from './utils/eui-file-upload.utils';\nexport * from './utils/eui-file-upload.validators';\nexport * from './models/uploaded-file.model';\nexport * from './pipes/filesize.pipe';\nexport * from './utils/mime-types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2"],"mappings":";;;;;;;;;;;;;;;;AAEA;;;;;;;;;;AAUG;MAIU,eAAe,CAAA;AAH5B,IAAA,WAAA,GAAA;AAIY,QAAA,IAAA,CAAA,KAAK,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;AAuB1D,IAAA;AArBG;;;;;;AAMG;AACH,IAAA,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,EAAA;AAC9B,QAAA,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACtD,YAAA,OAAO,GAAG;QACd;QAEA,IAAI,IAAI,GAAG,CAAC;AAEZ,QAAA,OAAO,KAAK,IAAI,IAAI,EAAE;YAClB,KAAK,IAAI,IAAI;AACb,YAAA,IAAI,EAAE;QACV;AAEA,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IAC7D;8GAvBS,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACF,oBAAA,IAAI,EAAE,UAAU;AACnB,iBAAA;;;ACWD;;;AAGG;MAcU,uBAAuB,CAAA;AAbpC,IAAA,WAAA,GAAA;AA6BI;;AAEG;AACM,QAAA,IAAA,CAAA,mBAAmB,GAAG;AAC3B,YAAA,GAAG,EAAE,yBAAyB;AAC9B,YAAA,IAAI,EAAE,wBAAwB;AAC9B,YAAA,GAAG,EAAE,wBAAwB;AAC7B,YAAA,EAAE,EAAE,wBAAwB;AAC5B,YAAA,IAAI,EAAE,wBAAwB;AAC9B,YAAA,GAAG,EAAE,yBAAyB;AAC9B,YAAA,GAAG,EAAE,yBAAyB;AAC9B,YAAA,GAAG,EAAE,uBAAuB;AAC5B,YAAA,GAAG,EAAE,uBAAuB;AAC5B,YAAA,GAAG,EAAE,uBAAuB;AAC5B,YAAA,GAAG,EAAE,uBAAuB;AAC5B,YAAA,GAAG,EAAE,wBAAwB;AAC7B,YAAA,IAAI,EAAE,uBAAuB;AAC7B,YAAA,GAAG,EAAE,uBAAuB;AAC5B,YAAA,GAAG,EAAE,2BAA2B;AAChC,YAAA,GAAG,EAAE,wBAAwB;AAC7B,YAAA,IAAI,EAAE,wBAAwB;AAC9B,YAAA,GAAG,EAAE,uBAAuB;AAC5B,YAAA,IAAI,EAAE,uBAAuB;AAC7B,YAAA,GAAG,EAAE,uBAAuB;AAC5B,YAAA,GAAG,EAAE,uBAAuB;AAC5B,YAAA,GAAG,EAAE,uBAAuB;SAC/B;AAED;;AAEG;AACO,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,YAAY,EAAU;QAM9C,IAAA,CAAA,SAAS,GAAG,KAAK;QACjB,IAAA,CAAA,qBAAqB,GAAW,IAAI;AAE3C;;AAEG;;;AAGO,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,YAAY,EAAyC;AAE/E;;;;AAIG;QACqC,IAAA,CAAA,UAAU,GAAG,IAAI;AACzD;;;;AAIG;QACqC,IAAA,CAAA,mBAAmB,GAAG,IAAI;AAClE;;;;AAIG;QACqC,IAAA,CAAA,mBAAmB,GAAG,IAAI;AAClE;;;;AAIG;QACqC,IAAA,CAAA,mBAAmB,GAAG,IAAI;AAClE;;;;AAIG;QACqC,IAAA,CAAA,iBAAiB,GAAG,IAAI;AAChE;;;;AAIG;QACqC,IAAA,CAAA,gBAAgB,GAAG,KAAK;AAChE;;;;AAIG;QACqC,IAAA,CAAA,gBAAgB,GAAG,KAAK;AAChE;;;;AAIG;QACqC,IAAA,CAAA,YAAY,GAAG,KAAK;AAGpD,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC;AA6GzC,IAAA;IA3GG,QAAQ,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;QAClC;AAEA,QAAA,IAAI,IAAI,CAAC,IAAI,YAAY,IAAI,EAAE;AAC3B,YAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;AAC/B,YAAA,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAY,CAAC;;;AAI3C,YAAA,MAAM,CAAC,MAAM,GAAG,CAAC,KAAU,KAAU;gBACjC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM;AAC9B,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC1D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC;AAEnD,gBAAA,IAAI,IAAI,CAAC,aAAa,KAAK,KAAK,EAAE;AAC9B,oBAAA,IAAI,CAAC,qBAAqB,GAAG,4BAA4B;gBAC7D;gBAEA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAChE,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AAE1C,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;AAEvE,gBAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;AAC3B,YAAA,CAAC;AACD,YAAA,MAAM,CAAC,WAAW,GAAG,CAAC,KAAoB,KAAU;AAChD,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,gBAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;AAC3B,YAAA,CAAC;AACD,YAAA,MAAM,CAAC,SAAS,GAAG,CAAC,KAAoB,KAAU;AAC9C,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,gBAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;AAC3B,YAAA,CAAC;QACL;aAAO;YACH,IAAI,CAAC,GAAG,GAAI,IAAI,CAAC,IAAiC,CAAC,GAAG;AACtD,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAC1D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC;AAEnD,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC;AAEvE,YAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;QAC3B;IACJ;IAEA,eAAe,GAAA;QACX,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC5B,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,cAAc,EAAE;AACnC,gBAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,QAAQ;YAC7C;AACJ,QAAA,CAAC,CAAC;IACN;AAEA;;AAEG;IACI,gBAAgB,GAAA;QACnB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACxC;AAEA;;;AAGG;AACI,IAAA,WAAW,CAAC,CAAQ,EAAA;QACvB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9B,CAAC,CAAC,cAAc,EAAE;IACtB;AAEA;;;;;AAKG;AACK,IAAA,gBAAgB,CAAC,QAAgB,EAAA;QACrC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;QAE/B,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B;AAEA;;;;;;AAMG;IACK,iBAAiB,CAAC,aAAqB,EAAE,MAAc,EAAA;AAC3D,QAAA,MAAM,CAAC,GAAG,aAAa,CAAC,WAAW,EAAE;QACrC,MAAM,KAAK,GAAG,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,GAAG,KAAK;AACtF,QAAA,MAAM,OAAO,GAAG,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;AAE3G,QAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IAC7B;AAEA;;;;;AAKG;AACK,IAAA,cAAc,CAAC,aAAqB,EAAA;AACxC,QAAA,MAAM,CAAC,GAAG,aAAa,CAAC,WAAW,EAAE;QACrC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1F;8GA7NS,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAoEZ,gBAAgB,CAAA,EAAA,mBAAA,EAAA,CAAA,qBAAA,EAAA,qBAAA,EAMhB,gBAAgB,uEAMhB,gBAAgB,CAAA,EAAA,mBAAA,EAAA,CAAA,qBAAA,EAAA,qBAAA,EAMhB,gBAAgB,CAAA,EAAA,iBAAA,EAAA,CAAA,mBAAA,EAAA,mBAAA,EAMhB,gBAAgB,CAAA,EAAA,gBAAA,EAAA,CAAA,kBAAA,EAAA,kBAAA,EAMhB,gBAAgB,CAAA,EAAA,gBAAA,EAAA,CAAA,kBAAA,EAAA,kBAAA,EAMhB,gBAAgB,CAAA,EAAA,YAAA,EAAA,CAAA,cAAA,EAAA,cAAA,EAMhB,gBAAgB,CAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAEnB,oBAAoB,6BC3JzC,miFAqDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjBQ,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,EAAA,KAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAIhB,eAAe,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAGV,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAbnC,SAAS;+BACI,kBAAkB,EAAA,eAAA,EAEX,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;wBACL,gBAAgB;AAChB,wBAAA,GAAG,UAAU;AACb,wBAAA,GAAG,QAAQ;AACX,wBAAA,GAAG,SAAS;wBACZ,eAAe;AAClB,qBAAA,EAAA,QAAA,EAAA,miFAAA,EAAA;;sBAQA;;sBAIA;;sBAIA;;sBAKA;;sBA4BA;;sBAcA;;sBAOA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAMrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAMrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAMrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAMrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAMrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAMrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAMrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAErC,eAAe;uBAAC,oBAAoB;;;AEzJzC;;;;AAIG;MAOU,8BAA8B,CAAA;AAN3C,IAAA,WAAA,GAAA;AAOI;;;;AAIG;QACM,IAAA,CAAA,QAAQ,GAAG,CAAC;AACxB,IAAA;8GAPY,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,8BAA8B,sHCb3C,iNAMA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FDOa,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAN1C,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,mBAEnB,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,iNAAA,EAAA;;sBAQpC;;;AEUL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCG;MAsBU,sBAAsB,CAAA;AArBnC,IAAA,WAAA,GAAA;AAsBI;;;AAGG;QACM,IAAA,CAAA,OAAO,GAAG,iBAAiB;AAOpC;;;;;AAKG;QACM,IAAA,CAAA,MAAM,GAAG,GAAG;AAQrB;;;;AAIG;AACO,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,YAAY,EAAE;AACvC;;;;AAIG;;;AAGO,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,YAAY,EAAyC;QAgBxE,IAAA,CAAA,KAAK,GAAW,EAAE;QAClB,IAAA,CAAA,cAAc,GAAG,CAAC;AACzB;;AAEG;AACI,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC;AACzD;;;;AAIG;QACI,IAAA,CAAA,aAAa,GAA+B,EAAE;;QAE9C,IAAA,CAAA,WAAW,GAAG,KAAK;AAc1B;;;;AAIG;QACqC,IAAA,CAAA,UAAU,GAAG,IAAI;AACzD;;;;AAIG;QACqC,IAAA,CAAA,cAAc,GAAG,IAAI;AAC7D;;;;AAIG;QACqC,IAAA,CAAA,UAAU,GAAG,IAAI;AACzD;;;;AAIG;QACqC,IAAA,CAAA,iBAAiB,GAAG,IAAI;AAChE;;;;AAIG;QACqC,IAAA,CAAA,gBAAgB,GAAG,KAAK;AAChE;;;;AAIG;QACqC,IAAA,CAAA,qBAAqB,GAAG,IAAI;AACpE;;;;AAIG;QACqC,IAAA,CAAA,cAAc,GAAG,IAAI;AAC7D;;;;AAIG;QACqC,IAAA,CAAA,WAAW,GAAG,KAAK;AAC3D;;;;AAIG;QACqC,IAAA,CAAA,gBAAgB,GAAG,KAAK;;;AAqKxD,QAAA,IAAA,CAAA,QAAQ,GAAQ,MAAW,EAAiC,CAAC;AAWxE,IAAA;AA9QG;;;;AAIG;AACH,IAAA,IACW,UAAU,GAAA;QACjB,OAAO;YACH,iBAAiB;AACpB;aACI,IAAI,CAAC,GAAG;AACR,aAAA,IAAI,EAAE;IACf;AAoFA;;;;AAIG;AACoD,IAAA,SAAS,CAAC,QAAkB,EAAA;AAC/E,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM;AACrD,QAAA,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE;YAC7B,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,QAAQ,CAAC,QAAQ,CAAC,KAAK,QAAQ,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE;AACvG,gBAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;gBACnD,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;gBAEnD,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE;oBAChF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACvC;AAEA,gBAAA,CAAC,EAAE;YACP;QAEJ;QAEA,IAAI,CAAC,YAAY,EAAE;;AAEnB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AACtG,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE;YAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE;QACjD;AAEA,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;IACxB;AAEA;;;;AAIG;AACH,IAAA,IAAI,YAAY,GAAA;QACZ,OAAO,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7G;AAEA;;;;AAIG;AACH,IAAA,IAAI,kBAAkB,GAAA;AAClB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ;IAC3H;IAEA,QAAQ,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;QAClC;IACJ;IAEA,eAAe,GAAA;;QAEX,UAAU,CAAC,MAAK;YACZ,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC5B,gBAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,cAAc,EAAE;AACnC,oBAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,QAAQ;gBAC7C;AACA,gBAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,cAAc,EAAE;AACnC,oBAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,QAAQ;gBAC7C;AACA,gBAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,aAAa,EAAE;AAClC,oBAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,QAAQ;gBAC5C;AACA,gBAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,aAAa,EAAE;AAClC,oBAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,QAAQ;gBAC5C;AACJ,YAAA,CAAC,CAAC;AACN,QAAA,CAAC,CAAC;IACN;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;AAC1B,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QAC3B;IACJ;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;IAC5B;AAEA;;;;AAIG;AACI,IAAA,cAAc,CAAC,KAAa,EAAA;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;QAErD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;QACrB;QACA,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD;AAEA;;;;AAIG;AACI,IAAA,sBAAsB,CAAC,KAAa,EAAA;QACvC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;QAErE,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;QACrB;QAEA,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD;AAEA;;AAEG;IACI,SAAS,GAAA;AACZ,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE;AACf,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;QACvB,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;AACjB,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD;IAEO,gBAAgB,GAAA;QACnB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE;IAC/C;AAEA;;;AAGG;;;AAGI,IAAA,WAAW,CAAC,CAAwC,EAAA;AACvD,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1B;;;AAIA,IAAA,UAAU,CAAC,KAAU,EAAA;AACjB,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK,IAAI,EAAE;AAChC,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE;QACf,IAAI,CAAC,YAAY,EAAE;IACvB;;;AAIA,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACtB;;;IAIA,iBAAiB,CAAC,EAAO,EAAA,EAAwC;AAMjE;;AAEG;IACK,YAAY,GAAA;AAChB,QAAA,IAAI,CAAC,cAAc,GAAG,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AACrB,YAAA,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,IAAI;AACjC,QAAA,CAAC,CAAC;IACN;8GAtTS,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,wLAuFX,gBAAgB,CAAA,EAAA,cAAA,EAAA,CAAA,gBAAA,EAAA,gBAAA,EAMhB,gBAAgB,CAAA,EAAA,UAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAMhB,gBAAgB,iEAMhB,gBAAgB,CAAA,EAAA,gBAAA,EAAA,CAAA,kBAAA,EAAA,kBAAA,EAMhB,gBAAgB,CAAA,EAAA,qBAAA,EAAA,CAAA,uBAAA,EAAA,uBAAA,EAMhB,gBAAgB,CAAA,EAAA,cAAA,EAAA,CAAA,gBAAA,EAAA,gBAAA,EAMhB,gBAAgB,+CAMhB,gBAAgB,CAAA,EAAA,gBAAA,EAAA,CAAA,kBAAA,EAAA,kBAAA,EAMhB,gBAAgB,CAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,SAAA,EAzJzB;AACP,YAAA;AACI,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,sBAAsB;AACnC,gBAAA,KAAK,EAAE,IAAI;AACd,aAAA;AACJ,SAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAqFgB,oBAAoB,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnKzC,u8HA8GA,EAAA,MAAA,EAAA,CAAA,63DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED5BQ,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,uBAAuB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,sBAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,8BAA8B,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAC9B,eAAe,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAIV,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBArBlC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,SAAA,EAEhB;AACP,wBAAA;AACI,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAA,sBAAwB;AACnC,4BAAA,KAAK,EAAE,IAAI;AACd,yBAAA;qBACJ,EAAA,aAAA,EAEc,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;wBACL,gBAAgB;wBAChB,eAAe;wBACf,uBAAuB;wBACvB,8BAA8B;wBAC9B,eAAe;AACf,wBAAA,GAAG,UAAU;AAChB,qBAAA,EAAA,QAAA,EAAA,u8HAAA,EAAA,MAAA,EAAA,CAAA,63DAAA,CAAA,EAAA;;sBAOA;;sBAMA;;sBAOA;;sBAOA;;sBAMA;;sBAQA;;sBAOA,WAAW;uBAAC,OAAO;;sBA2BnB,eAAe;uBAAC,oBAAoB;;sBAEpC,YAAY;uBAAC,OAAO;;sBAYpB,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAMrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAMrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAMrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAMrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAMrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAMrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAMrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAMrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAOrC,YAAY;uBAAC,QAAQ,EAAE,CAAC,2BAA2B,CAAC;;;MElO5C,yBAAyB,CAAA;AADtC,IAAA,WAAA,GAAA;AAEY,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAwK1C,IAAA;AAtKG;;;;;;;;;;;;;;;;;;;;;AAqBG;;;IAGI,QAAQ,CAAC,IAAS,EAAE,WAAmB,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;AAC5D,YAAA,cAAc,EAAE,IAAI;AACpB,YAAA,OAAO,EAAE,QAAQ;AACpB,SAAA,CAAC;IACN;AAEA;;;;;;;;;;;;;;;;;;;;AAoBG;AACI,IAAA,cAAc,CAAI,EAA8B,EAAA;AACnD,QAAA,OAAO,GAAG,CAAC,CAAC,KAAmB,KAAI;YAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,cAAc,EAAE;AAC7C,gBAAA,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;YACtD;AACJ,QAAA,CAAC,CAAC;IACN;AAEA;;;;;;;;;;;;;;;;;;;AAmBG;IACI,cAAc,GAAA;AACjB,QAAA,OAAO,IAAI,CACP,MAAM,CAAC,CAAC,KAAmB,KAAK,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,QAAQ,CAAC,EACtE,GAAG,CAAC,CAAC,GAAoB,KAAK,GAAG,CAAC,IAAI,CAAC,CAC1C;IACL;AAEA;;;;;;AAMG;AACI,IAAA,mBAAmB,CAAC,aAAqB,EAAA;AAC5C,QAAA,MAAM,mBAAmB,GAAG;AACxB,YAAA,GAAG,EAAE,gBAAgB;AACrB,YAAA,IAAI,EAAE,eAAe;AACrB,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,EAAE,EAAE,eAAe;AACnB,YAAA,IAAI,EAAE,eAAe;AACrB,YAAA,GAAG,EAAE,gBAAgB;AACrB,YAAA,GAAG,EAAE,gBAAgB;AACrB,YAAA,GAAG,EAAE,cAAc;AACnB,YAAA,GAAG,EAAE,gBAAgB;AACrB,YAAA,GAAG,EAAE,gBAAgB;AACrB,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,GAAG,EAAE,gBAAgB;AACrB,YAAA,GAAG,EAAE,kBAAkB;AACvB,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,IAAI,EAAE,iBAAiB;AACvB,YAAA,GAAG,EAAE,kBAAkB;AACvB,YAAA,IAAI,EAAE,kBAAkB;AACxB,YAAA,GAAG,EAAE,qBAAqB;AAC1B,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,GAAG,EAAE,eAAe;SACvB;AAED,QAAA,MAAM,CAAC,GAAG,aAAa,CAAC,WAAW,EAAE;AACrC,QAAA,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,kBAAkB,GAAG,mBAAmB,CAAC,CAAC,CAAC;IAChF;AAEA;;;;;AAKG;;;AAGK,IAAA,UAAU,CAAC,SAAc,EAAA;AAC7B,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE;QAE/B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACtC,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE;gBAC/B,IAAI,SAAS,GAAG,CAAC;;;gBAGjB,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,KAAU,KAAI;AAClC,oBAAA,IAAI,KAAK,YAAY,IAAI,EAAE;wBACvB,QAAQ,CAAC,MAAM,CAAC,GAAG,GAAG,SAAS,EAAE,KAAK,CAAC;AACvC,wBAAA,SAAS,EAAE;oBACf;AACJ,gBAAA,CAAC,CAAC;gBAEF,MAAM,CAAC,GAAG,EAAE;;;gBAGZ,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,KAAU,KAAU;AACxC,oBAAA,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;AACjB,gBAAA,CAAC,CAAC;AAEF,gBAAA,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC3C;iBAAO;gBACH,IAAI,OAAO,SAAS,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE;oBACpC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;gBACrC;qBAAO;AACH,oBAAA,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrD;YACJ;QACJ;AAEA,QAAA,OAAO,QAAQ;IACnB;8GAxKS,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAzB,yBAAyB,EAAA,CAAA,CAAA;;2FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBADrC;;;AC4IM,MAAM,WAAW,GAAG,CAAC,MAAkB,KAAc;;AAExD,IAAA,MAAM,GAAG,GAAG,qBAAqB,CAAC,MAAM,CAAC;;AAGzC,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,QAAA,OAAO,YAAY;AACjD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,WAAW;AAClD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,YAAY;AACnD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC;AAAE,QAAA,OAAO,aAAa;AAC5D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,mBAAmB;AAC1D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,mBAAmB;AAC1D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,YAAY;AACnD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,WAAW;AAC9C,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,YAAY;AACnD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,wBAAwB,CAAC;AAAE,QAAA,OAAO,oBAAoB;AACzE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,2BAA2B;AAClE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,wBAAwB;;AAElE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;AAC/B,QAAA,OAAO,sBAAsB,CAAC,MAAM,CAAC;IACtC;AACG,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,gCAAgC,CAAC;AAAE,QAAA,OAAO,kBAAkB;AAC/E,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC;AAAE,QAAA,OAAO,mBAAmB;AAC5D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC;AAAE,QAAA,OAAO,8BAA8B;AAC3E,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,QAAA,OAAO,kBAAkB;AACvD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,QAAA,OAAO,qBAAqB;AAC1D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC;AAAE,QAAA,OAAO,6BAA6B;AACxE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,+BAA+B;AAClE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,sBAAsB,CAAC;AAAE,QAAA,OAAO,WAAW;AAC9D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,YAAY;AACnD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC;AAAE,QAAA,OAAO,kBAAkB;AACjE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,YAAY;AACnD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,sBAAsB,CAAC;AAAE,QAAA,OAAO,iBAAiB;AACpE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,eAAe;AACtD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,gBAAgB;AACvD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,aAAa;AACpD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC;AAAE,QAAA,OAAO,iBAAiB,CAAC,MAAM,CAAC;AACxE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,YAAY;AACnD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,sBAAsB,CAAC;AAAE,QAAA,OAAO,YAAY;AAC/D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,QAAA,OAAO,YAAY;AACjD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,0BAA0B,CAAC;AAAE,QAAA,OAAO,WAAW;AAClE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,YAAY;AACnD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,iBAAiB,CAAC,MAAM,CAAC;AAChE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,cAAc;AACrD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,WAAW;AAClD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,eAAe;AACtD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC;AAAE,QAAA,OAAO,WAAW;AACtD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC;AAAE,QAAA,OAAO,iBAAiB;AAC9D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,mBAAmB;AAC1D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,0BAA0B;AAC7D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,QAAA,OAAO,+BAA+B;AACpE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC;AAAE,QAAA,OAAO,iBAAiB;AAC5D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,kBAAkB;AACzD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,WAAW;AAClD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,YAAY;AACnD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC;AAAE,QAAA,OAAO,+BAA+B;AAC1E,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC;AAAE,QAAA,OAAO,UAAU;AACnD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC;AAAE,QAAA,OAAO,UAAU;AACnD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC;AAAE,QAAA,OAAO,cAAc;AACzD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC;AAAE,QAAA,OAAO,aAAa;AACtD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,wBAAwB;AAC/D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,iBAAiB;AACxD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC;AAAE,QAAA,OAAO,kBAAkB;AAC7D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,kCAAkC,CAAC;AAAE,QAAA,OAAO,uBAAuB;AACtF,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC;AAAE,QAAA,OAAO,gCAAgC;AAC/E,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,mCAAmC;AAC1E,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC;AAAE,QAAA,OAAO,mBAAmB;AAClE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,QAAA,OAAO,4BAA4B;AACjE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,mBAAmB;AAC1D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,QAAA,OAAO,wBAAwB;AAC7D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,oBAAoB;AAC3D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC;AAAE,QAAA,OAAO,mBAAmB;AAClE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,mBAAmB;AAC1D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC;AAAE,QAAA,OAAO,4BAA4B;AACrE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC;AAAE,QAAA,OAAO,iBAAiB;AAChE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;AAAE,QAAA,OAAO,YAAY;AAC7C,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,QAAA,OAAO,uBAAuB;AAC5D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,WAAW;AAClD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,WAAW;AAClD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,sBAAsB,CAAC;AAAE,QAAA,OAAO,WAAW;AAC9D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC;AAAE,QAAA,OAAO,WAAW;AAC1D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC;AAAE,QAAA,OAAO,WAAW;AAC1D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,sBAAsB,CAAC;AAAE,QAAA,OAAO,WAAW;AAC9D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,YAAY;AACnD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC;AAAE,QAAA,OAAO,iBAAiB;AAC5D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC;AAAE,QAAA,OAAO,gCAAgC;AAC/E,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC;AAAE,QAAA,OAAO,kBAAkB,CAAC,MAAM,CAAC;AACrE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,WAAW;AAClD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,mBAAmB;AAC1D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,kBAAkB;AACzD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,eAAe;AACtD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,wBAAwB,CAAC;AAAE,QAAA,OAAO,YAAY;AACjE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,mBAAmB;AAC1D,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,8BAA8B;AACrE,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,aAAa;AACpD,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAAE,QAAA,OAAO,wBAAwB;AAE/D,IAAA,OAAO,IAAI;AACf;AAEA,MAAM,sBAAsB,GAAG,CAAC,IAAgB,KAAc;AAC7D,IAAA,IAAI;AACH,QAAA,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC;;AAG5C,QAAA,IAAI,WAAW,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE;AAC1C,YAAA,OAAO,uCAAuC;QAC/C;;AAGA,QAAA,IAAI,WAAW,CAAC,QAAQ,CAAC,wBAAwB,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AACvF,YAAA,OAAO,sBAAsB;QAC9B;;AAGA,QAAA,IAAI,WAAW,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE;AAClD,YAAA,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAE,gBAAA,OAAO,iDAAiD;AACvG,YAAA,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAE,gBAAA,OAAO,gDAAgD;AACtG,YAAA,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAE,gBAAA,OAAO,yCAAyC;QAChG;;AAGA,QAAA,IAAI,WAAW,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE;AAChD,YAAA,IAAI,WAAW,CAAC,QAAQ,CAAC,sBAAsB,CAAC;AAAE,gBAAA,OAAO,2EAA2E;AACpI,YAAA,IAAI,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC;AAAE,gBAAA,OAAO,mEAAmE;AACvH,YAAA,IAAI,WAAW,CAAC,QAAQ,CAAC,mBAAmB,CAAC;AAAE,gBAAA,OAAO,yEAAyE;QAChI;;AAGA,QAAA,OAAO,iBAAiB;IAEzB;AAAE,IAAA,MAAM;AACP,QAAA,OAAO,iBAAiB;IACzB;AACD,CAAC;AAED,MAAM,kBAAkB,GAAG,CAAC,IAAgB,KAAc;;IAEzD,MAAM,KAAK,GAAa,EAAE;IAC1B,IAAI,MAAM,GAAG,CAAC;IAEd,OAAO,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;;AAEhC,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI;AACrD,YAAA,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE;AAExD,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AACnE,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AAErE,YAAA,IAAI,cAAc,GAAG,CAAC,IAAI,MAAM,GAAG,EAAE,GAAG,cAAc,IAAI,IAAI,CAAC,MAAM,EAAE;gBACtE,MAAM,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,GAAG,cAAc,CAAC,CAAC;AAChG,gBAAA,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;YACrB;AAEA,YAAA,MAAM,IAAI,EAAE,GAAG,cAAc,GAAG,gBAAgB;QACjD;aAAO;AACN,YAAA,MAAM,EAAE;QACT;IACD;AAEA,IAAA,OAAO,KAAK;AACb,CAAC;AAED,MAAM,qBAAqB,GAAG,CAAC,UAAU,KAAY;AACjD,IAAA,OAAO,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AACxG,CAAC;AAED,MAAM,iBAAiB,GAAG,CAAC,IAAgB,KAAc;;;;AAKxD,IAAA,IAAI;;;;AAKH,QAAA,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE;;AAEtB,YAAA,OAAO,wBAAwB;QAChC;AAEA,QAAA,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC;;AAGvC,QAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE;AACrD,YAAA,OAAO,gBAAgB;QACxB;;AAGA,QAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE;AACrD,YAAA,OAAO,gBAAgB;QACxB;;;;;QAOA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;;YAEzD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;;AAE7D,gBAAA,OAAO,gBAAgB;YACxB;QACD;;AAGA,QAAA,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;;QAGjH,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;AAC3C,YAAA,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;YACzC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC/C,YAAA,OAAO,gBAAgB;QACxB;;QAGA,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;AAC3C,YAAA,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;YACzC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAChD,YAAA,OAAO,gBAAgB;QACxB;;AAGA,QAAA,OAAO,wBAAwB;IAEhC;AAAE,IAAA,MAAM;;AAEP,QAAA,OAAO,wBAAwB;IAChC;AACD,CAAC;AAED,MAAM,kBAAkB,GAAG,CAAC,IAAgB,KAAc;;;;AAKzD,IAAA,IAAI;AACH,QAAA,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE;;AAErB,YAAA,OAAO,YAAY;QACpB;AAEA,QAAA,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC;;;;;;;;;QAWvC,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CACrC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CACpC;;QAGD,MAAM,mBAAmB,GAAG,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;;QAGzE,IAAI,UAAU,KAAK,MAAM;AACrB,YAAA,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC;AACxC,YAAA,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC;AACxC,YAAA,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC;YACxC,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;;AAG7C,YAAA,IAAI,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC;AACxC,gBAAA,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC;gBACxC,UAAU,KAAK,MAAM,EAAE;AAC1B,gBAAA,OAAO,qBAAqB;YAC7B;AAEA,YAAA,OAAO,YAAY;QACpB;;AAGA,QAAA,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,MAAM;AAC9C,YAAA,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC;YACxC,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;;YAG7C,IAAI,UAAU,KAAK,MAAM;gBACrB,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AAC7C,gBAAA,OAAO,qBAAqB;YAC7B;AAEA,YAAA,OAAO,YAAY;QACpB;;AAGA,QAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;YACxB,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;;AAG7B,YAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AACzD,gBAAA,OAAO,qBAAqB;YAC7B;AAEA,YAAA,OAAO,qBAAqB;QAC7B;;AAGA,QAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;AACxB,YAAA,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;AACxB,YAAA,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;YACxB,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AAC7B,YAAA,OAAO,YAAY;QACpB;;AAGA,QAAA,OAAO,YAAY;IAEpB;AAAE,IAAA,MAAM;;AAEP,QAAA,OAAO,YAAY;IACpB;AACD,CAAC;AAED,MAAM,iBAAiB,GAAG,CAAC,IAAgB,KAAc;;;;AAKxD,IAAA,IAAI;AACH,QAAA,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE;;AAErB,YAAA,OAAO,WAAW;QACnB;AAEA,QAAA,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC;;;;;;;;;;;;AAevC,QAAA,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAChH,QAAA,MAAM,YAAY,GAAG,WAAW,CAAC,WAAW,EAAE;;AAG9C,QAAA,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC/B,YAAA,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AAC9B,YAAA,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;AAC5B,YAAA,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC;AAC9B,YAAA,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;AACxB,YAAA,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC5B,YAAA,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACjC,YAAA,OAAO,WAAW;QACnB;;AAGA,QAAA,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC/B,YAAA,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AAC9B,YAAA,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;AAC5B,YAAA,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC;AACjC,YAAA,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC;AAClC,YAAA,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC;AAC9B,YAAA,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AAC9B,YAAA,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC7B,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AAC7B,YAAA,OAAO,WAAW;QACnB;;;;QAKA,IAAI,SAAS,GAAG,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;AAC5D,YAAA,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI;AACxC,gBAAA,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE;AACjD,gBAAA,SAAS,EAAE;YACZ;QACD;;AAGA,QAAA,IAAI,SAAS,GAAG,CAAC,EAAE;;AAElB,YAAA,IAAI,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC;AACpC,gBAAA,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC;AACjC,gBAAA,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC;AAC9B,iBAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC;AAClE,oBAAA,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE;AAC3E,gBAAA,OAAO,iBAAiB;YACzB;QACD;;AAGA,QAAA,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AACpE,YAAA,OAAO,WAAW;QACnB;QAEA,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AACtG,YAAA,OAAO,WAAW;QACnB;;;;AAKA,QAAA,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE;AACrB,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC;;YAE9B,IAAI,CAAC,cAAc,GAAG,IAAI,MAAM,IAAI,EAAE;;AAErC,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC7D,gBAAA,MAAM,SAAS,GAAG,qBAAqB,CAAC,WAAW,CAAC;;AAGpD,gBAAA,IAAI,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE;AAC3C,oBAAA,OAAO,WAAW;gBACnB;;AAGA,gBAAA,IAAI,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE;AAC3C,oBAAA,OAAO,WAAW;gBACnB;YACD;QACD;;AAGA,QAAA,OAAO,WAAW;IAEnB;AAAE,IAAA,MAAM;;AAEP,QAAA,OAAO,WAAW;IACnB;AACD,CAAC;;AChkBD;;;;;;;;;;;;;;;AAeG;AACI,MAAM,iBAAiB,GAC1B,CAAC,QAAgB,KACjB,CAAC,OAAwB,KACrB,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,EAAE,QAAQ,EAAE,GAAG;AAE1E;;;;;;;;;;;;;;;;AAgBG;AACI,MAAM,gBAAgB,GACzB,CAAC,OAAe,KAChB,CAAC,OAAwB,KAAgC;IACrD,IAAI,SAAS,GAAG,CAAC;AACjB,IAAA,IAAI,OAAO,CAAC,KAAK,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAU,KAAI;AACjC,YAAA,SAAS,IAAI,IAAI,CAAC,IAAI;AAC1B,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,OAAO,OAAO,CAAC,KAAK,IAAI,SAAS,GAAG,OAAO,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI;AACpE;AAEJ;;;;;;;;;;;;;;;;AAgBG;AACI,MAAM,oBAAoB,GAC7B,CAAC,WAAmB,KACpB,CAAC,OAAwB,KAA4D;IACjF,MAAM,WAAW,GAAE,EAAE;IACrB,IAAI,eAAe,GAAG,KAAK;AAC3B,IAAA,IAAI,OAAO,CAAC,KAAK,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAU,EAAE,KAAa,KAAI;AAChD,YAAA,IAAI,IAAI,CAAC,IAAI,GAAG,WAAW,EAAE;AACzB,gBAAA,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;gBACvB,eAAe,GAAG,IAAI;YAC1B;AACJ,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,OAAO,OAAO,CAAC,KAAK,IAAI,eAAe,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI;AAC1F;AAEJ;;;;;;;;;;;;;;AAcG;AACI,MAAM,0BAA0B,GACnC,CAAC,SAAmB,KACpB,CAAC,OAAwB,KAA+C;IACpE,MAAM,oBAAoB,GAAa,EAAE;AACzC,IAAA,IAAI,OAAO,CAAC,KAAK,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAU,KAAI;AACjC,YAAA,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;AACrC,gBAAA,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YACxC;AACJ,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,OAAO,OAAO,CAAC,KAAK,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,IAAI;AAC7F;AAEJ;;;;;;;;;;;;;;AAcG;AACI,MAAM,+BAA+B,GACxC,CAAC,SAAqB,KACtB,CAAC,OAAwB,KAA4E;AACjG,IAAA,IAAI,OAAO,CAAC,KAAK,EAAE;QACf,MAAM,oBAAoB,GAA0C,EAAE;;QAEtE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAU,KAAI;;YAEjC,oBAAoB,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACpE,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,GAAG,CAAC,GAAG,oBAAoB,CAAC,CAAC,IAAI,CACpC,GAAG,CAAC,CAAC,UAAU,KAAI;AACf,YAAA,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,KAAK,SAAS,KAAK,IAAI,CAAC;;AAGnE,YAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACrB,gBAAA,OAAO,IAAI;YACf;AAEA,YAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE;QAC1C,CAAC,CAAC,CACL;IACL;AACA,IAAA,OAAO,EAAE,CAAC,IAAI,CAAC;AACnB;AAEJ;;;;;;;AAOG;AACH,MAAM,oBAAoB,GAAG,CAAC,IAAU,EAAE,SAAqB,KAAoD;AAC/G,IAAA,OAAO,IAAI,UAAU,CAA4B,CAAC,UAAU,KAAI;AAC5D,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;AAC/B,QAAA,MAAM,CAAC,SAAS,GAAG,MAAW;AAC1B,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAqB;;YAE3C,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;AACtF,YAAA,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC;AACrC,YAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC1B,gBAAA,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB;iBAAO;AACH,gBAAA,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC;YAC1C;YACA,UAAU,CAAC,QAAQ,EAAE;AACzB,QAAA,CAAC;AACD,QAAA,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAClC,IAAA,CAAC,CAAC;AACN,CAAC;;ACtLM,MAAM,eAAe,GAAG;IAC3B,sBAAsB;IACtB,8BAA8B;IAC9B,uBAAuB;IACvB,eAAe;;;ACTnB;;AAEG;;;;"}