@siemens/element-ng 49.1.0 → 49.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/fesm2022/siemens-element-ng-accordion.mjs +2 -2
  2. package/fesm2022/siemens-element-ng-accordion.mjs.map +1 -1
  3. package/fesm2022/siemens-element-ng-application-header.mjs +11 -3
  4. package/fesm2022/siemens-element-ng-application-header.mjs.map +1 -1
  5. package/fesm2022/siemens-element-ng-auto-collapsable-list.mjs.map +1 -1
  6. package/fesm2022/siemens-element-ng-avatar.mjs.map +1 -1
  7. package/fesm2022/siemens-element-ng-circle-status.mjs.map +1 -1
  8. package/fesm2022/siemens-element-ng-common.mjs +2 -2
  9. package/fesm2022/siemens-element-ng-common.mjs.map +1 -1
  10. package/fesm2022/siemens-element-ng-content-action-bar.mjs +2 -2
  11. package/fesm2022/siemens-element-ng-content-action-bar.mjs.map +1 -1
  12. package/fesm2022/siemens-element-ng-dashboard.mjs +1 -1
  13. package/fesm2022/siemens-element-ng-dashboard.mjs.map +1 -1
  14. package/fesm2022/siemens-element-ng-date-range-filter.mjs.map +1 -1
  15. package/fesm2022/siemens-element-ng-datepicker.mjs +22 -24
  16. package/fesm2022/siemens-element-ng-datepicker.mjs.map +1 -1
  17. package/fesm2022/siemens-element-ng-file-uploader.mjs.map +1 -1
  18. package/fesm2022/siemens-element-ng-filtered-search.mjs +89 -95
  19. package/fesm2022/siemens-element-ng-filtered-search.mjs.map +1 -1
  20. package/fesm2022/siemens-element-ng-form.mjs.map +1 -1
  21. package/fesm2022/siemens-element-ng-formly.mjs +1 -1
  22. package/fesm2022/siemens-element-ng-formly.mjs.map +1 -1
  23. package/fesm2022/siemens-element-ng-header-dropdown.mjs +2 -2
  24. package/fesm2022/siemens-element-ng-header-dropdown.mjs.map +1 -1
  25. package/fesm2022/siemens-element-ng-list-details.mjs.map +1 -1
  26. package/fesm2022/siemens-element-ng-main-detail-container.mjs +21 -25
  27. package/fesm2022/siemens-element-ng-main-detail-container.mjs.map +1 -1
  28. package/fesm2022/siemens-element-ng-menu.mjs +6 -6
  29. package/fesm2022/siemens-element-ng-menu.mjs.map +1 -1
  30. package/fesm2022/siemens-element-ng-navbar-vertical.mjs +8 -4
  31. package/fesm2022/siemens-element-ng-navbar-vertical.mjs.map +1 -1
  32. package/fesm2022/siemens-element-ng-navbar.mjs.map +1 -1
  33. package/fesm2022/siemens-element-ng-number-input.mjs.map +1 -1
  34. package/fesm2022/siemens-element-ng-phone-number.mjs.map +1 -1
  35. package/fesm2022/siemens-element-ng-photo-upload.mjs +1 -1
  36. package/fesm2022/siemens-element-ng-photo-upload.mjs.map +1 -1
  37. package/fesm2022/siemens-element-ng-search-bar.mjs +7 -2
  38. package/fesm2022/siemens-element-ng-search-bar.mjs.map +1 -1
  39. package/fesm2022/siemens-element-ng-select.mjs +2 -2
  40. package/fesm2022/siemens-element-ng-select.mjs.map +1 -1
  41. package/fesm2022/siemens-element-ng-side-panel.mjs +164 -10
  42. package/fesm2022/siemens-element-ng-side-panel.mjs.map +1 -1
  43. package/fesm2022/siemens-element-ng-split.mjs.map +1 -1
  44. package/fesm2022/siemens-element-ng-status-bar.mjs.map +1 -1
  45. package/fesm2022/siemens-element-ng-status-toggle.mjs +1 -1
  46. package/fesm2022/siemens-element-ng-status-toggle.mjs.map +1 -1
  47. package/fesm2022/siemens-element-ng-tree-view.mjs +11 -3
  48. package/fesm2022/siemens-element-ng-tree-view.mjs.map +1 -1
  49. package/fesm2022/siemens-element-ng-typeahead.mjs +14 -4
  50. package/fesm2022/siemens-element-ng-typeahead.mjs.map +1 -1
  51. package/package.json +4 -4
  52. package/schematics/vitest-setup.js +5 -0
  53. package/types/siemens-element-ng-application-header.d.ts +2 -1
  54. package/types/siemens-element-ng-auto-collapsable-list.d.ts +1 -1
  55. package/types/siemens-element-ng-avatar.d.ts +1 -1
  56. package/types/siemens-element-ng-circle-status.d.ts +1 -1
  57. package/types/siemens-element-ng-common.d.ts +1 -1
  58. package/types/siemens-element-ng-dashboard.d.ts +2 -2
  59. package/types/siemens-element-ng-date-range-filter.d.ts +1 -1
  60. package/types/siemens-element-ng-datepicker.d.ts +7 -7
  61. package/types/siemens-element-ng-file-uploader.d.ts +2 -2
  62. package/types/siemens-element-ng-filtered-search.d.ts +4 -10
  63. package/types/siemens-element-ng-form.d.ts +2 -2
  64. package/types/siemens-element-ng-list-details.d.ts +1 -1
  65. package/types/siemens-element-ng-main-detail-container.d.ts +10 -11
  66. package/types/siemens-element-ng-navbar-vertical.d.ts +7 -3
  67. package/types/siemens-element-ng-navbar.d.ts +1 -1
  68. package/types/siemens-element-ng-number-input.d.ts +1 -1
  69. package/types/siemens-element-ng-phone-number.d.ts +1 -1
  70. package/types/siemens-element-ng-photo-upload.d.ts +1 -1
  71. package/types/siemens-element-ng-search-bar.d.ts +1 -1
  72. package/types/siemens-element-ng-side-panel.d.ts +115 -5
  73. package/types/siemens-element-ng-split.d.ts +2 -2
  74. package/types/siemens-element-ng-status-bar.d.ts +1 -1
  75. package/types/siemens-element-ng-status-toggle.d.ts +1 -1
  76. package/types/siemens-element-ng-tree-view.d.ts +1 -1
  77. package/types/siemens-element-ng-typeahead.d.ts +8 -3
@@ -1 +1 @@
1
- {"version":3,"file":"siemens-element-ng-file-uploader.mjs","sources":["../../../../projects/element-ng/file-uploader/si-file-uploader.model.ts","../../../../projects/element-ng/file-uploader/si-file-upload.directive.ts","../../../../projects/element-ng/file-uploader/si-file-dropzone.component.ts","../../../../projects/element-ng/file-uploader/si-file-dropzone.component.html","../../../../projects/element-ng/file-uploader/si-file-uploader.component.ts","../../../../projects/element-ng/file-uploader/si-file-uploader.component.html","../../../../projects/element-ng/file-uploader/si-file-uploader.module.ts","../../../../projects/element-ng/file-uploader/index.ts","../../../../projects/element-ng/file-uploader/siemens-element-ng-file-uploader.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\n\nimport { TranslatableString } from '@siemens/element-translate-ng/translate';\n\n/** */\nexport interface UploadFile {\n status: 'added' | 'invalid' | 'queued' | 'uploading' | 'success' | 'error';\n file: File;\n fileName: string;\n size: string;\n errorText?: TranslatableString;\n progress: number;\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport {\n Directive,\n ElementRef,\n inject,\n input,\n LOCALE_ID,\n booleanAttribute,\n output\n} from '@angular/core';\nimport { t, TranslatableString } from '@siemens/element-translate-ng/translate';\n\nimport { UploadFile } from './si-file-uploader.model';\n\nexport interface FileUploadError extends UploadFile {\n status: 'invalid';\n errorText: TranslatableString;\n}\n\n/**\n * Directive for handling file uploads with validation for file type and size.\n *\n * @example\n * ```html\n * <input\n * #fileInput\n * type=\"file\"\n * class=\"d-none\"\n * siFileUpload\n * [accept]=\"accept()\"\n * [maxFileSize]=\"maxFileSize()\"\n * [multiple]=\"true\"\n * (validFiles)=\"onFilesAdded($event)\"\n * (fileError)=\"onFileError($event)\"\n * />\n * ```\n */\n@Directive({\n selector: 'input[type=\"file\"][siFileUpload]',\n host: {\n '[attr.accept]': 'accept()',\n '[multiple]': 'directoryUpload() || multiple()',\n '[attr.webkitdirectory]': 'directoryUpload() ? \"\" : null',\n '(change)': 'onInputChange($event)'\n }\n})\nexport class SiFileUploadDirective {\n /**\n * Text or translation key of message title if incorrect file type is dragged / dropped.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n * ```\n */\n readonly errorTextFileType = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n );\n\n /**\n * Message or translation key if file exceeds the maximum file size limit.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`)\n * ```\n */\n readonly errorTextFileMaxSize = input(\n t(\n () =>\n $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`\n )\n );\n\n /**\n * Define which file types are suggested in file browser.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr-accept\n */\n readonly accept = input<string>();\n\n /**\n * Define maximal allowed file size in bytes.\n */\n readonly maxFileSize = input<number>();\n\n /**\n * Defines whether the file input allows selecting multiple files.\n * When {@link directoryUpload} is enabled, this will have no effect.\n *\n * @defaultValue false\n */\n readonly multiple = input(false, { transform: booleanAttribute });\n\n /**\n * Enable directory upload.\n *\n * @defaultValue false\n */\n readonly directoryUpload = input(false, { transform: booleanAttribute });\n\n /**\n * Event emitted when valid files are added.\n * Invalid files (due to size or type) will be ignored and instead the {@link fileError} event will be emitted.\n */\n readonly validFiles = output<UploadFile[]>();\n\n /**\n * Event emitted when valid files are added.\n * Also includes invalid files, but with status 'invalid' and an errorText describing why they were ignored.\n */\n readonly filesAdded = output<UploadFile[]>();\n\n /**\n * Event emitted when file validation errors occur, including files that were ignored due to size or type.\n */\n readonly fileError = output<FileUploadError>();\n\n private readonly elementRef = inject(ElementRef<HTMLInputElement>);\n private locale = inject(LOCALE_ID).toString();\n private numberFormat = new Intl.NumberFormat(this.locale, { maximumFractionDigits: 2 });\n\n protected onInputChange(event: Event): void {\n const inputElement = event.target as HTMLInputElement;\n this.handleFiles(inputElement.files);\n }\n\n /**\n * Handle files from input or drag and drop\n */\n handleFiles(files: FileList | null): void {\n if (!files?.length) {\n return;\n }\n\n const newFiles: UploadFile[] = [];\n const validFiles: UploadFile[] = [];\n\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < files.length; i++) {\n const uploadFile = this.makeUploadFile(files[i]);\n newFiles.push(uploadFile);\n\n if (uploadFile.status === 'invalid' && uploadFile.errorText) {\n this.fileError.emit(uploadFile as FileUploadError);\n } else if (uploadFile.status === 'added') {\n validFiles.push(uploadFile);\n }\n }\n\n if (newFiles.length > 0) {\n newFiles.sort((a, b) => a.fileName.localeCompare(b.fileName));\n this.filesAdded.emit(newFiles);\n }\n\n if (validFiles.length > 0) {\n validFiles.sort((a, b) => a.fileName.localeCompare(b.fileName));\n this.validFiles.emit(validFiles);\n }\n\n this.reset();\n }\n\n /**\n * Handle directory entries for drag and drop\n */\n handleItems(items: DataTransferItemList): void {\n const newFiles: UploadFile[] = [];\n let pendingEntries = 0;\n\n const traverseFileTree = (item: FileSystemEntry): void => {\n if (item.isFile) {\n (item as FileSystemFileEntry).file(file => {\n const uploadFile = this.makeUploadFile(file);\n newFiles.push(uploadFile);\n\n if (uploadFile.status === 'invalid' && uploadFile.errorText) {\n this.fileError.emit(uploadFile as FileUploadError);\n }\n\n if (--pendingEntries === 0) {\n if (newFiles.length > 0) {\n this.filesAdded.emit(newFiles);\n }\n const validFiles = newFiles.filter(f => f.status === 'added');\n if (validFiles.length > 0) {\n this.filesAdded.emit(validFiles);\n }\n this.reset();\n }\n });\n } else if (item.isDirectory) {\n const dirReader = (item as FileSystemDirectoryEntry).createReader();\n dirReader.readEntries(entries => {\n for (const entry of entries) {\n pendingEntries++;\n traverseFileTree(entry);\n }\n if (--pendingEntries === 0) {\n if (newFiles.length > 0) {\n this.filesAdded.emit(newFiles);\n }\n const validFiles = newFiles.filter(f => f.status === 'added');\n if (validFiles.length > 0) {\n this.filesAdded.emit(validFiles);\n }\n this.reset();\n }\n });\n }\n };\n\n // items is not an array but of type DataTransferItemList\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < items.length; i++) {\n const item = items[i].webkitGetAsEntry();\n if (item) {\n pendingEntries++;\n traverseFileTree(item);\n }\n }\n }\n\n /**\n * Reset the file input value\n */\n reset(): void {\n this.elementRef.nativeElement.value = '';\n }\n\n /**\n * Trigger the file input click\n */\n triggerClick(): void {\n this.elementRef.nativeElement.click();\n }\n\n private makeUploadFile(file: File): UploadFile {\n const uploadFile: UploadFile = {\n fileName: file.name,\n file,\n size: this.fileSizeToString(file.size),\n progress: 0,\n status: 'added'\n };\n // use MIME type of file if set. Otherwise fall back to file name ending\n const ext = '.' + uploadFile.file.name.split('.').pop();\n if (!this.verifyFileType(uploadFile.file.type, ext)) {\n uploadFile.status = 'invalid';\n uploadFile.errorText = this.errorTextFileType();\n } else if (!this.verifyFileSize(uploadFile.file.size)) {\n uploadFile.status = 'invalid';\n uploadFile.errorText = this.errorTextFileMaxSize();\n }\n return uploadFile;\n }\n\n private verifyFileSize(size: number): boolean {\n const maxFileSize = this.maxFileSize();\n return !maxFileSize || size <= maxFileSize;\n }\n\n private verifyFileType(fileType: string | undefined, ext: string | undefined): boolean {\n const accept = this.accept();\n if (!accept) {\n return true;\n }\n if (fileType === undefined && ext === undefined) {\n return false;\n }\n // Spec says that comma is the delimiter for filetypes. Also allow pipe for compatibility\n return accept.split(/,|\\|/).some(acceptedType => {\n // convert accept glob into regex (example: images/* --> images/.*)\n const acceptedRegexStr = acceptedType.replace(/\\./g, '\\\\.').replace('*', '.*').trim();\n const acceptedRegex = new RegExp(acceptedRegexStr, 'i');\n\n // if fileType is set and accepted type looks like a MIME type, match that otherwise extension\n if (fileType && acceptedType.includes('/')) {\n return !!fileType.match(acceptedRegex);\n }\n return !!ext?.match(acceptedRegex);\n });\n }\n\n fileSizeToString(num: number): string {\n return SiFileUploadDirective.formatFileSize(num, this.numberFormat);\n }\n\n static formatFileSize(num: number, formatter?: Intl.NumberFormat): string {\n const numberFormat = formatter ?? new Intl.NumberFormat('en-US', { maximumFractionDigits: 2 });\n let suffix = 'B';\n if (num >= 1_073_741_824) {\n num /= 1_073_741_824;\n suffix = 'GB';\n } else if (num >= 1_048_576) {\n num /= 1_048_576;\n suffix = 'MB';\n } else if (num >= 1_024) {\n num /= 1_024;\n suffix = 'KB';\n }\n return numberFormat.format(num) + suffix;\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n viewChild\n} from '@angular/core';\nimport { elementUpload } from '@siemens/element-icons';\nimport { addIcons, SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\n\nimport { SiFileUploadDirective, FileUploadError } from './si-file-upload.directive';\nimport { UploadFile } from './si-file-uploader.model';\n\n@Component({\n selector: 'si-file-dropzone',\n imports: [SiIconComponent, SiTranslatePipe, SiFileUploadDirective],\n templateUrl: './si-file-dropzone.component.html',\n styleUrl: './si-file-dropzone.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SiFileDropzoneComponent {\n /**\n * Text or translation key of the input file selector (is combined with the `uploadTextRest`).\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n * ```\n */\n readonly uploadTextFileSelect = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n );\n /**\n * Text or translation key of the drag&drop field (is combined with the `uploadTextFileSelect`).\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`)\n * ```\n */\n readonly uploadDropText = input(t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`));\n /**\n * Text or translation key for max file size.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Max. {{maxFileSize}} upload size.`)\n * ```\n */\n readonly maxFileSizeText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Max. {{maxFileSize}} upload size.`)\n );\n /**\n * Text or translation key for accepted types.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types: {{accept}}.`)\n * ```\n */\n readonly acceptText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types: {{accept}}.`)\n );\n /**\n * Text or translation key of message title if incorrect file type is dragged / dropped.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n * ```\n */\n readonly errorTextFileType = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n );\n /**\n * Message or translation key if file exceeds the maximum file size limit.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`)\n * ```\n */\n readonly errorTextFileMaxSize = input(\n t(\n () =>\n $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`\n )\n );\n /**\n * Define which file types are suggested in file browser.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr-accept\n */\n readonly accept = input<string>();\n /**\n * Define maximal allowed file size in bytes.\n */\n readonly maxFileSize = input<number>();\n /**\n * Defines whether the file input allows selecting multiple files.\n * When {@link directoryUpload} is enabled, this will have no effect.\n *\n * @defaultValue false\n */\n readonly multiple = input(false, { transform: booleanAttribute });\n /**\n * Event emitted when valid files are added.\n * Invalid files are also included here, but with status 'invalid' and an errorText describing why they were ignored.\n */\n readonly filesAdded = output<UploadFile[]>();\n\n /**\n * Event emitted when file validation errors occur, including files that were ignored due to size or type.\n */\n readonly fileError = output<FileUploadError>();\n\n /**\n * Enable directory upload.\n *\n * @defaultValue false\n */\n readonly directoryUpload = input(false, { transform: booleanAttribute });\n\n protected readonly maxFileSizeString = computed(() => {\n const maxFileSize = this.maxFileSize();\n return maxFileSize ? this.fileUploadDirective().fileSizeToString(maxFileSize) : '';\n });\n\n protected readonly icons = addIcons({ elementUpload });\n\n protected dragOver = false;\n\n private readonly fileUploadDirective = viewChild.required(SiFileUploadDirective);\n\n protected dropHandler(event: DragEvent): void {\n event.preventDefault();\n if (this.directoryUpload()) {\n this.fileUploadDirective().handleItems(event.dataTransfer!.items);\n } else {\n this.fileUploadDirective().handleFiles(event.dataTransfer!.files);\n }\n this.dragOver = false;\n }\n\n protected dragOverHandler(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.dragOver = true;\n }\n\n protected inputEnterHandler(): void {\n this.fileUploadDirective().triggerClick();\n }\n\n protected onFilesAdded(files: UploadFile[]): void {\n this.filesAdded.emit(files);\n }\n\n protected onFileError(error: FileUploadError): void {\n this.fileError.emit(error);\n }\n\n /**\n * Reset all the files inside the native file input (and therefore the dropzone).\n */\n reset(): void {\n this.fileUploadDirective().reset();\n }\n}\n","<div\n class=\"drag-and-drop rounded p-6\"\n [class.drag-over]=\"dragOver\"\n (drop)=\"dropHandler($event)\"\n (dragover)=\"dragOverHandler($event)\"\n (dragleave)=\"dragOver = false\"\n>\n <si-icon class=\"mb-6 si-display-bold\" [icon]=\"icons.elementUpload\" />\n <span class=\"drag-and-drop-description si-h5 d-flex\">\n <span>{{ uploadDropText() | translate }}</span>\n &nbsp;\n <label class=\"select-file si-h5 mb-0\">\n <span tabindex=\"0\" (keydown.enter)=\"inputEnterHandler()\">{{\n uploadTextFileSelect() | translate\n }}</span>\n <input\n #fileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"d-none\"\n siFileUpload\n [accept]=\"accept()\"\n [maxFileSize]=\"maxFileSize()\"\n [multiple]=\"multiple()\"\n [directoryUpload]=\"directoryUpload()\"\n [errorTextFileType]=\"errorTextFileType()\"\n [errorTextFileMaxSize]=\"errorTextFileMaxSize()\"\n (filesAdded)=\"onFilesAdded($event)\"\n (fileError)=\"onFileError($event)\"\n (cancel)=\"$event.stopPropagation()\"\n />\n </label>\n </span>\n @if (maxFileSize() || accept()) {\n <div class=\"allowed si-caption mt-6 text-center\">\n @if (maxFileSize()) {\n {{ maxFileSizeText() | translate: { maxFileSize: maxFileSizeString() } }}\n }\n @if (accept()) {\n {{ acceptText() | translate: { accept: accept() } }}\n }\n </div>\n }\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport {\n HttpClient,\n HttpErrorResponse,\n HttpEvent,\n HttpEventType,\n HttpHeaders,\n HttpRequest,\n HttpResponse\n} from '@angular/common/http';\nimport {\n booleanAttribute,\n ChangeDetectorRef,\n Component,\n inject,\n input,\n numberAttribute,\n OnChanges,\n output,\n SimpleChanges,\n viewChild\n} from '@angular/core';\nimport { elementCancel, elementDelete, elementDocument, elementRedo } from '@siemens/element-icons';\nimport { addIcons, SiIconComponent, SiStatusIconComponent } from '@siemens/element-ng/icon';\nimport { SiInlineNotificationComponent } from '@siemens/element-ng/inline-notification';\nimport { SiProgressbarComponent } from '@siemens/element-ng/progressbar';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\nimport { Observable, Subscription } from 'rxjs';\nimport { retry } from 'rxjs/operators';\n\nimport { SiFileDropzoneComponent } from './si-file-dropzone.component';\nimport { UploadFile } from './si-file-uploader.model';\n\n/**\n * The FileUploadResult is emitted at completion of the file uploading\n * via the `uploadCompleted` emitter. On success the Http `response` from\n * the backend is provided and on failure, the `error` object is available.\n */\nexport interface FileUploadResult {\n file: string;\n response?: HttpResponse<unknown>;\n error?: Error;\n}\n\nexport interface FileUploadConfig {\n headers: HttpHeaders | string | Record<string, string | number | (string | number)[]> | Headers;\n method: 'POST' | 'PUT' | 'PATCH';\n url: string;\n /** Form field name for the uploaded file. */\n fieldName: string;\n /**\n * Additional form fields added in the HTTP request.\n *\n * @example\n * ```json\n * { upload_user: 'Reiner Zufall', expiry_date: ' 21.12.2012' }\n * ```\n */\n additionalFields?: Record<string, string>;\n /** Specify the server response type */\n responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n /** A function to modify the HTTP request sent on the consumer side. */\n handler?: (req: HttpRequest<unknown>) => Observable<HttpEvent<unknown>>;\n /**\n * When `true`, the file will be sent directly w/o the use of `FormData`.\n * You will also need to set the `Content-Type` header when sending binary. See: {@link headers}\n */\n sendBinary?: boolean;\n}\n\ninterface ExtUploadFile extends UploadFile {\n httpErrorText?: string;\n subscription?: Subscription;\n successResponse?: HttpResponse<unknown>;\n fadeOut?: boolean;\n}\n\n@Component({\n selector: 'si-file-uploader',\n imports: [\n SiStatusIconComponent,\n SiFileDropzoneComponent,\n SiIconComponent,\n SiInlineNotificationComponent,\n SiProgressbarComponent,\n SiTranslatePipe\n ],\n templateUrl: './si-file-uploader.component.html',\n styleUrl: './si-file-uploader.component.scss'\n})\nexport class SiFileUploaderComponent implements OnChanges {\n /**\n * Text of the link to open the file select dialog (follows `uploadDropText`).\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n * ```\n */\n readonly uploadTextFileSelect = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n );\n /**\n * Text instructing a user to drop the files inside the dropzone.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`)\n * ```\n */\n readonly uploadDropText = input(t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`));\n /**\n * Text to describe the maximum file size.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Max. {{maxFileSize}} upload size.`)\n * ```\n */\n readonly maxFileSizeText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Max. {{maxFileSize}} upload size.`)\n );\n /**\n * Error message shown when the maximum number of files are reached.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.MAX_FILE_REACHED:Max. {{maxFiles}} files`)\n * ```\n */\n readonly maxFilesReachedText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.MAX_FILE_REACHED:Max. {{maxFiles}} files`)\n );\n /**\n * Text for the accepted file types.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types: {{accept}}.`)\n * ```\n */\n readonly acceptText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types: {{accept}}.`)\n );\n /**\n * Text used inside the upload button.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD:Upload`)\n * ```\n */\n readonly uploadButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD:Upload`));\n /**\n * Text used inside the clear button.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.CLEAR:Clear`)\n * ```\n */\n readonly clearButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.CLEAR:Clear`));\n /**\n * Text shown during the file upload.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOADING:Uploading`)\n * ```\n */\n readonly uploadingText = input(t(() => $localize`:@@SI_FILE_UPLOADER.UPLOADING:Uploading`));\n /**\n * Text shown to remove a file from the file list. Required for a11y.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.REMOVE:Remove`)\n * ```\n */\n readonly removeButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.REMOVE:Remove`));\n /**\n * Text of cancel button. Shown during upload. Required for a11y.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.CANCEL:Cancel`)\n * ```\n */\n readonly cancelButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.CANCEL:Cancel`));\n /**\n * Text shown if the upload was successful.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_COMPLETED:Upload completed`)\n * ```\n */\n readonly successTextTitle = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_COMPLETED:Upload completed`)\n );\n /**\n * Text shown if the upload failed.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_FAILED:Upload failed`)\n * ```\n */\n readonly errorUploadFailed = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_FAILED:Upload failed`)\n );\n /**\n * On failed upload, show the error received from the server.\n *\n * @defaultValue false\n */\n readonly showHttpError = input(false, { transform: booleanAttribute });\n /**\n * Text shown to indicate that an incorrect file type was added to file list.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n * ```\n */\n readonly errorTextFileType = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n );\n /**\n * Message or translation key if file exceeds the maximum file size limit.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`)\n * ```\n */\n readonly errorTextFileMaxSize = input(\n t(\n () =>\n $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`\n )\n );\n /**\n * Config for HTTP request to upload file.\n *\n * @defaultValue\n * ```\n * {\n * headers: new HttpHeaders({ 'Accept': 'application/json' }),\n * method: 'POST',\n * url: '',\n * fieldName: 'upload_file',\n * responseType: 'json'\n * }\n * ```\n */\n readonly uploadConfig = input<FileUploadConfig>({\n headers: new HttpHeaders({ 'Accept': 'application/json' }),\n method: 'POST',\n url: '',\n fieldName: 'upload_file',\n responseType: 'json'\n });\n /**\n * Define which file types are suggested in file browser.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr-accept\n */\n readonly accept = input<string>();\n /**\n * Define maximal allowed file size in bytes.\n *\n * @defaultValue undefined\n */\n readonly maxFileSize = input<number | undefined, unknown>(undefined, {\n transform: numberAttribute\n });\n /**\n * Define maximal allowed number of files.\n * When {@link directoryUpload} is enabled, this will have no effect.\n * @defaultValue 10\n */\n readonly maxFiles = input(10, { transform: numberAttribute });\n /**\n * Maximum number of concurrent uploads.\n *\n * @defaultValue 3\n */\n readonly maxConcurrentUploads = input(3, { transform: numberAttribute });\n /**\n * Numbers of retries for failed uploads.\n *\n * @defaultValue 0\n */\n readonly retries = input(0, { transform: numberAttribute });\n /**\n * Auto-upload mode - automatically start upload once files are added.\n *\n * @defaultValue false\n */\n readonly autoUpload = input(false, { transform: booleanAttribute });\n /**\n * Disable the upload button.\n *\n * @defaultValue false\n */\n readonly disableUpload = input(false, { transform: booleanAttribute });\n\n /**\n * Enable directory upload mode.\n * When enabled, the file input will accept directories and upload all files within as a flat list.\n * The hierarchy of the directory will not be preserved.\n * The `maxFiles` property will have no effect when `directoryUpload` is enabled.\n *\n * **Note:** This feature is not yet available for safari (iOS)\n *\n * @defaultValue false\n */\n readonly directoryUpload = input(false, { transform: booleanAttribute });\n\n /**\n * Emits when a user press cancel during upload. The event provides the file details.\n */\n readonly uploadCanceled = output<UploadFile>();\n\n /**\n * Output callback event will provide you if upload is finished. If an error\n * occurred it will be emitted.\n */\n readonly uploadCompleted = output<FileUploadResult>();\n\n /**\n * Output which fires whenever new files are added to or removed from the uploader.\n */\n readonly filesChanges = output<UploadFile[]>();\n\n protected readonly icons = addIcons({\n elementCancel,\n elementDelete,\n elementDocument,\n elementRedo\n });\n protected files: ExtUploadFile[] = [];\n protected pending = 0;\n private uploading = 0;\n protected uploadEnabled = false;\n protected maxFilesReached = false;\n\n private readonly dropZone = viewChild.required<SiFileDropzoneComponent>('dropZone');\n private cdRef = inject(ChangeDetectorRef);\n private http? = inject(HttpClient, { optional: true });\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.maxFiles || changes.disableUpload) {\n this.updateStates();\n }\n }\n\n protected handleFiles(files: UploadFile[]): void {\n if (!files?.length) {\n return;\n }\n\n const maxFiles = this.maxFiles();\n // for single-file case, replace exiting file if any\n if (maxFiles === 1 && this.files.length) {\n this.reset(false);\n }\n\n let numValid = this.countValid();\n for (const file of files) {\n const duplicate = this.isDuplicate(file);\n if (duplicate) {\n // in case this is duplicated: reset if already uploaded or not handled yet\n if (duplicate.status !== 'uploading' && duplicate.status !== 'queued') {\n Object.assign(duplicate, file);\n }\n continue;\n }\n\n const canAdd = numValid + 1 <= maxFiles;\n const valid = file.status === 'added';\n if (valid && !canAdd) {\n this.maxFilesReached = true;\n break;\n } else if (valid) {\n numValid++;\n }\n this.files.push(file);\n }\n\n this.files.sort((a, b) => a.fileName.localeCompare(b.fileName));\n\n this.filesChanges.emit(this.files.slice());\n\n this.updateStates();\n\n // needed for drag drop of directory\n this.cdRef.markForCheck();\n\n if (this.autoUpload()) {\n // allow concurrent uploads for auto upload mode.\n this.uploadEnabled = true;\n this.fileUpload(false);\n }\n }\n\n protected removeFile(index: number): void {\n if (index >= 0) {\n this.files.splice(index, 1);\n this.filesChanges.emit(this.files.slice());\n this.dropZone().reset();\n this.updateStates();\n }\n }\n\n protected cancelUpload(file: ExtUploadFile): void {\n if (file.subscription) {\n file.subscription.unsubscribe();\n file.subscription = undefined;\n this.uploading--;\n }\n this.pending--;\n file.status = 'added';\n file.progress = 0;\n this.updateStates();\n\n const { status, fileName, size, progress } = file;\n this.uploadCanceled.emit({\n status,\n fileName,\n size,\n progress,\n file: file.file\n });\n }\n\n protected retryUpload(file: UploadFile): void {\n file.status = 'added';\n this.doUpload([file], true);\n }\n\n /**\n * Reset the state.\n */\n reset(emit = true): void {\n this.files.forEach(f => f.subscription?.unsubscribe());\n this.files = [];\n this.dropZone().reset();\n this.updateStates();\n if (emit) {\n this.filesChanges.emit([]);\n }\n }\n\n /**\n * Uploads the file\n */\n fileUpload(doRetry = true): void {\n if (!this.uploadEnabled) {\n return;\n }\n this.uploadEnabled = false;\n this.doUpload(this.files, doRetry);\n }\n\n private doUpload(files: UploadFile[], doRetry: boolean): void {\n for (const file of files) {\n if (file.status !== 'added' && (!doRetry || file.status !== 'error')) {\n continue;\n }\n this.pending++;\n file.status = 'queued';\n }\n this.processQueue();\n }\n\n private processQueue(): void {\n for (let i = 0; i < this.files.length && this.uploading < this.maxConcurrentUploads(); i++) {\n const file = this.files[i];\n if (file.status === 'queued') {\n this.uploading++;\n this.uploadOneFile(file);\n }\n }\n }\n\n private uploadOneFile(file: ExtUploadFile): void {\n let formData: FormData | undefined;\n const config = this.uploadConfig();\n if (!config.sendBinary) {\n formData = new FormData();\n\n if (config.additionalFields) {\n Object.keys(config.additionalFields).forEach(key => {\n formData!.append(key, config.additionalFields![key]);\n });\n }\n // this needs to be last for AWS\n formData.append(config.fieldName, file.file, file.fileName);\n }\n const headers =\n config.headers instanceof HttpHeaders ? config.headers : new HttpHeaders(config.headers);\n\n const req = new HttpRequest(config.method, config.url, formData ?? file.file, {\n headers,\n responseType: config.responseType,\n reportProgress: true\n });\n\n file.status = 'uploading';\n file.errorText = undefined;\n file.httpErrorText = undefined;\n\n const requestHandler =\n config.handler ??\n (this.http ? (r: HttpRequest<unknown>) => this.http!.request(r) : undefined);\n if (!requestHandler) {\n return;\n }\n\n file.subscription = requestHandler(req)\n .pipe(retry(this.retries()))\n .subscribe({\n next: event => this.handleUploadEvent(file, event),\n error: (error: HttpErrorResponse) => this.handleUploadError(file, error),\n complete: () => this.handleUploadComplete(file)\n });\n }\n\n // this is a light check for duplicate file - name and size only, not content!\n private isDuplicate(file: UploadFile): UploadFile | null {\n for (const uploadFile of this.files) {\n if (uploadFile.file.name === file.file.name && uploadFile.file.size === file.file.size) {\n return uploadFile;\n }\n }\n return null;\n }\n\n private handleUploadEvent(file: ExtUploadFile, httpEvent: HttpEvent<unknown>): void {\n if (httpEvent instanceof HttpResponse) {\n file.successResponse = httpEvent as HttpResponse<unknown>;\n } else if (httpEvent.type === HttpEventType.UploadProgress && httpEvent.total) {\n file.progress = Math.floor((100 * httpEvent.loaded) / httpEvent.total);\n this.cdRef.markForCheck();\n }\n }\n\n private handleUploadError(file: ExtUploadFile, error: HttpErrorResponse): void {\n this.uploadCompleted.emit({ file: file.fileName, error });\n file.status = 'error';\n file.errorText = this.errorUploadFailed();\n if (this.showHttpError() && error.status && error.statusText) {\n file.httpErrorText = `${error.status}: ${error.statusText}`;\n }\n this.oneUploadDone(file);\n }\n\n private handleUploadComplete(file: ExtUploadFile): void {\n this.uploadCompleted.emit({ file: file.fileName, response: file.successResponse });\n file.status = 'success';\n file.progress = 100;\n file.successResponse = undefined;\n if (this.autoUpload()) {\n this.fadeOut(file);\n }\n this.oneUploadDone(file);\n }\n\n private oneUploadDone(file: ExtUploadFile): void {\n file.subscription = undefined;\n this.pending--;\n this.uploading--;\n this.updateStates();\n this.processQueue();\n }\n\n private fadeOut(file: ExtUploadFile): void {\n setTimeout(() => {\n file.fadeOut = true;\n this.cdRef.markForCheck();\n setTimeout(() => {\n this.removeFile(this.files.indexOf(file));\n this.cdRef.markForCheck();\n }, 500);\n this.cdRef.markForCheck();\n }, 3500);\n }\n\n private updateStates(): void {\n this.uploadEnabled =\n !this.disableUpload() &&\n !this.pending &&\n this.files.some(f => f.status === 'added' || f.status === 'error');\n if (this.maxFilesReached && this.countValid() < this.maxFiles()) {\n this.maxFilesReached = false;\n }\n }\n\n private countValid(): number {\n return this.files.reduce<number>((acc, f) => acc + (f.status !== 'invalid' ? 1 : 0), 0);\n }\n}\n","<si-file-dropzone\n #dropZone\n [class]=\"autoUpload() ? 'mb-8' : 'mb-4'\"\n [uploadTextFileSelect]=\"uploadTextFileSelect()\"\n [uploadDropText]=\"uploadDropText()\"\n [multiple]=\"maxFiles() > 1\"\n [directoryUpload]=\"directoryUpload()\"\n [maxFileSizeText]=\"maxFileSizeText()\"\n [acceptText]=\"acceptText()\"\n [errorTextFileType]=\"errorTextFileType()\"\n [errorTextFileMaxSize]=\"errorTextFileMaxSize()\"\n [accept]=\"accept()\"\n [maxFileSize]=\"maxFileSize()\"\n (filesAdded)=\"handleFiles($event)\"\n/>\n\n@if (maxFilesReached) {\n <si-inline-notification\n class=\"mb-4\"\n severity=\"info\"\n [message]=\"maxFilesReachedText()\"\n [translationParams]=\"{ maxFiles: maxFiles() }\"\n />\n}\n\n<div class=\"file-list\">\n @for (file of files; track file) {\n <div [class]=\"`file d-flex ${autoUpload() ? 'mb-8' : 'mb-4'}`\" [class.fade-out]=\"file.fadeOut\">\n <si-icon class=\"icon align-self-center ms-6 me-4\" [icon]=\"icons.elementDocument\" />\n <div class=\"flex-fill overflow-hidden\">\n <div class=\"file-info\">\n <div class=\"file-name text-truncate si-h5\">{{ file.fileName }}</div>\n <div class=\"file-size text-secondary\">{{ file.size }}</div>\n </div>\n @if (file.errorText) {\n <div\n class=\"error text-truncate d-flex align-items-center\"\n [class.text-warning]=\"file.status === 'invalid'\"\n [class.text-danger]=\"file.status === 'error'\"\n >\n <si-status-icon\n class=\"icon-sm my-n2 me-2\"\n [status]=\"file.status === 'invalid' ? 'warning' : 'danger'\"\n />\n {{ file.errorText | translate }}\n @if (file.httpErrorText) {\n : {{ file.httpErrorText }}\n }\n </div>\n } @else {\n <div class=\"position-relative\">\n <div class=\"position-absolute si-caption end-0 mt-n8\">{{ file.progress }} %</div>\n <si-progressbar\n height=\"small\"\n [value]=\"file.progress\"\n [ariaLabel]=\"uploadingText() | translate\"\n />\n </div>\n }\n </div>\n <div class=\"status align-self-center text-nowrap ps-4 pe-6\">\n @if (file.status === 'error') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-tertiary me-4\"\n [disabled]=\"!uploadEnabled\"\n [title]=\"uploadButtonText() | translate\"\n [attr.aria-label]=\"uploadButtonText() | translate\"\n (click)=\"retryUpload(file)\"\n >\n <si-icon [icon]=\"icons.elementRedo\" />\n </button>\n }\n @if (file.status === 'added' || file.status === 'error' || file.status === 'invalid') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-ghost\"\n [title]=\"removeButtonText() | translate\"\n [attr.aria-label]=\"removeButtonText() | translate\"\n (click)=\"removeFile($index)\"\n >\n <si-icon [icon]=\"icons.elementDelete\" />\n </button>\n }\n @if (file.status === 'uploading' || file.status === 'queued') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-tertiary\"\n [title]=\"cancelButtonText() | translate\"\n [attr.aria-label]=\"cancelButtonText() | translate\"\n (click)=\"cancelUpload(file)\"\n >\n <si-icon [icon]=\"icons.elementCancel\" />\n </button>\n }\n @if (file.status === 'success') {\n <si-status-icon class=\"icon mx-2\" status=\"success\" />\n }\n </div>\n </div>\n }\n</div>\n\n@if (!autoUpload()) {\n <div class=\"buttons text-end\">\n <button\n type=\"button\"\n class=\"btn btn-secondary me-4\"\n [disabled]=\"pending || !files.length\"\n (click)=\"reset()\"\n >{{ clearButtonText() | translate }}</button\n >\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n [disabled]=\"!uploadEnabled\"\n (click)=\"fileUpload()\"\n >{{ uploadButtonText() | translate }}</button\n >\n </div>\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { NgModule } from '@angular/core';\n\nimport { SiFileDropzoneComponent } from './si-file-dropzone.component';\nimport { SiFileUploadDirective } from './si-file-upload.directive';\nimport { SiFileUploaderComponent } from './si-file-uploader.component';\n\n@NgModule({\n imports: [SiFileDropzoneComponent, SiFileUploaderComponent, SiFileUploadDirective],\n exports: [SiFileDropzoneComponent, SiFileUploaderComponent, SiFileUploadDirective]\n})\nexport class SiFileUploaderModule {}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-file-uploader.model';\nexport * from './si-file-dropzone.component';\nexport * from './si-file-uploader.component';\nexport * from './si-file-uploader.module';\nexport * from './si-file-upload.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;AAAA;;;AAGG;;ACHH;;;AAGG;AAmBH;;;;;;;;;;;;;;;;;AAiBG;MAUU,qBAAqB,CAAA;AAChC;;;;;;;AAOG;AACM,IAAA,iBAAiB,GAAG,KAAK,CAChC,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,gEAAA,CAAkE,CAAC,6DACrF;AAED;;;;;;;AAOG;AACM,IAAA,oBAAoB,GAAG,KAAK,CACnC,CAAC,CACC,MACE,SAAS,CAAA,CAAA,8EAAA,CAAgF,CAC5F,gEACF;AAED;;;AAGG;IACM,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAEjC;;AAEG;IACM,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAEtC;;;;;AAKG;IACM,QAAQ,GAAG,KAAK,CAAC,KAAK,qDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAEjE;;;;AAIG;IACM,eAAe,GAAG,KAAK,CAAC,KAAK,4DAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAExE;;;AAGG;IACM,UAAU,GAAG,MAAM,EAAgB;AAE5C;;;AAGG;IACM,UAAU,GAAG,MAAM,EAAgB;AAE5C;;AAEG;IACM,SAAS,GAAG,MAAM,EAAmB;AAE7B,IAAA,UAAU,GAAG,MAAM,EAAC,UAA4B,EAAC;IAC1D,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE;AACrC,IAAA,YAAY,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC;AAE7E,IAAA,aAAa,CAAC,KAAY,EAAA;AAClC,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,MAA0B;AACrD,QAAA,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC;IACtC;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,KAAsB,EAAA;AAChC,QAAA,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE;YAClB;QACF;QAEA,MAAM,QAAQ,GAAiB,EAAE;QACjC,MAAM,UAAU,GAAiB,EAAE;;AAGnC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAChD,YAAA,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;YAEzB,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,IAAI,UAAU,CAAC,SAAS,EAAE;AAC3D,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAA6B,CAAC;YACpD;AAAO,iBAAA,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO,EAAE;AACxC,gBAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;YAC7B;QACF;AAEA,QAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACvB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC7D,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;QAChC;AAEA,QAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;YACzB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC/D,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;QAClC;QAEA,IAAI,CAAC,KAAK,EAAE;IACd;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,KAA2B,EAAA;QACrC,MAAM,QAAQ,GAAiB,EAAE;QACjC,IAAI,cAAc,GAAG,CAAC;AAEtB,QAAA,MAAM,gBAAgB,GAAG,CAAC,IAAqB,KAAU;AACvD,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACd,gBAAA,IAA4B,CAAC,IAAI,CAAC,IAAI,IAAG;oBACxC,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AAC5C,oBAAA,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;oBAEzB,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,IAAI,UAAU,CAAC,SAAS,EAAE;AAC3D,wBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAA6B,CAAC;oBACpD;AAEA,oBAAA,IAAI,EAAE,cAAc,KAAK,CAAC,EAAE;AAC1B,wBAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACvB,4BAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;wBAChC;AACA,wBAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC;AAC7D,wBAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AACzB,4BAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;wBAClC;wBACA,IAAI,CAAC,KAAK,EAAE;oBACd;AACF,gBAAA,CAAC,CAAC;YACJ;AAAO,iBAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AAC3B,gBAAA,MAAM,SAAS,GAAI,IAAiC,CAAC,YAAY,EAAE;AACnE,gBAAA,SAAS,CAAC,WAAW,CAAC,OAAO,IAAG;AAC9B,oBAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AAC3B,wBAAA,cAAc,EAAE;wBAChB,gBAAgB,CAAC,KAAK,CAAC;oBACzB;AACA,oBAAA,IAAI,EAAE,cAAc,KAAK,CAAC,EAAE;AAC1B,wBAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACvB,4BAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;wBAChC;AACA,wBAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC;AAC7D,wBAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AACzB,4BAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;wBAClC;wBACA,IAAI,CAAC,KAAK,EAAE;oBACd;AACF,gBAAA,CAAC,CAAC;YACJ;AACF,QAAA,CAAC;;;AAID,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE;YACxC,IAAI,IAAI,EAAE;AACR,gBAAA,cAAc,EAAE;gBAChB,gBAAgB,CAAC,IAAI,CAAC;YACxB;QACF;IACF;AAEA;;AAEG;IACH,KAAK,GAAA;QACH,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE;IAC1C;AAEA;;AAEG;IACH,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE;IACvC;AAEQ,IAAA,cAAc,CAAC,IAAU,EAAA;AAC/B,QAAA,MAAM,UAAU,GAAe;YAC7B,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,IAAI;YACJ,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;AACtC,YAAA,QAAQ,EAAE,CAAC;AACX,YAAA,MAAM,EAAE;SACT;;AAED,QAAA,MAAM,GAAG,GAAG,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;AACvD,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;AACnD,YAAA,UAAU,CAAC,MAAM,GAAG,SAAS;AAC7B,YAAA,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACjD;AAAO,aAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACrD,YAAA,UAAU,CAAC,MAAM,GAAG,SAAS;AAC7B,YAAA,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,oBAAoB,EAAE;QACpD;AACA,QAAA,OAAO,UAAU;IACnB;AAEQ,IAAA,cAAc,CAAC,IAAY,EAAA;AACjC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;AACtC,QAAA,OAAO,CAAC,WAAW,IAAI,IAAI,IAAI,WAAW;IAC5C;IAEQ,cAAc,CAAC,QAA4B,EAAE,GAAuB,EAAA;AAC1E,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;QAC5B,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,IAAI;QACb;QACA,IAAI,QAAQ,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE;AAC/C,YAAA,OAAO,KAAK;QACd;;QAEA,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,IAAG;;YAE9C,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE;YACrF,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,gBAAgB,EAAE,GAAG,CAAC;;YAGvD,IAAI,QAAQ,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAC1C,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC;YACxC;YACA,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,aAAa,CAAC;AACpC,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,gBAAgB,CAAC,GAAW,EAAA;QAC1B,OAAO,qBAAqB,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC;IACrE;AAEA,IAAA,OAAO,cAAc,CAAC,GAAW,EAAE,SAA6B,EAAA;AAC9D,QAAA,MAAM,YAAY,GAAG,SAAS,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC;QAC9F,IAAI,MAAM,GAAG,GAAG;AAChB,QAAA,IAAI,GAAG,IAAI,aAAa,EAAE;YACxB,GAAG,IAAI,aAAa;YACpB,MAAM,GAAG,IAAI;QACf;AAAO,aAAA,IAAI,GAAG,IAAI,SAAS,EAAE;YAC3B,GAAG,IAAI,SAAS;YAChB,MAAM,GAAG,IAAI;QACf;AAAO,aAAA,IAAI,GAAG,IAAI,KAAK,EAAE;YACvB,GAAG,IAAI,KAAK;YACZ,MAAM,GAAG,IAAI;QACf;QACA,OAAO,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM;IAC1C;uGA/PW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,iCAAA,EAAA,sBAAA,EAAA,iCAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBATjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kCAAkC;AAC5C,oBAAA,IAAI,EAAE;AACJ,wBAAA,eAAe,EAAE,UAAU;AAC3B,wBAAA,YAAY,EAAE,iCAAiC;AAC/C,wBAAA,wBAAwB,EAAE,+BAA+B;AACzD,wBAAA,UAAU,EAAE;AACb;AACF,iBAAA;;;AChDD;;;AAGG;MAwBU,uBAAuB,CAAA;AAClC;;;;;;;AAOG;AACM,IAAA,oBAAoB,GAAG,KAAK,CACnC,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,+CAAA,CAAiD,CAAC,gEACpE;AACD;;;;;;;AAOG;AACM,IAAA,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,2CAAA,CAA6C,CAAC,0DAAC;AAChG;;;;;;;AAOG;AACM,IAAA,eAAe,GAAG,KAAK,CAC9B,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,8DAAA,CAAgE,CAAC,2DACnF;AACD;;;;;;;AAOG;AACM,IAAA,UAAU,GAAG,KAAK,CACzB,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,wEAAA,CAA0E,CAAC,sDAC7F;AACD;;;;;;;AAOG;AACM,IAAA,iBAAiB,GAAG,KAAK,CAChC,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,gEAAA,CAAkE,CAAC,6DACrF;AACD;;;;;;;AAOG;AACM,IAAA,oBAAoB,GAAG,KAAK,CACnC,CAAC,CACC,MACE,SAAS,CAAA,CAAA,8EAAA,CAAgF,CAC5F,gEACF;AACD;;;AAGG;IACM,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AACjC;;AAEG;IACM,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AACtC;;;;;AAKG;IACM,QAAQ,GAAG,KAAK,CAAC,KAAK,qDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACjE;;;AAGG;IACM,UAAU,GAAG,MAAM,EAAgB;AAE5C;;AAEG;IACM,SAAS,GAAG,MAAM,EAAmB;AAE9C;;;;AAIG;IACM,eAAe,GAAG,KAAK,CAAC,KAAK,4DAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAErD,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;AACnD,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;AACtC,QAAA,OAAO,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,gBAAgB,CAAC,WAAW,CAAC,GAAG,EAAE;AACpF,IAAA,CAAC,6DAAC;AAEiB,IAAA,KAAK,GAAG,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAE5C,QAAQ,GAAG,KAAK;AAET,IAAA,mBAAmB,GAAG,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC;AAEtE,IAAA,WAAW,CAAC,KAAgB,EAAA;QACpC,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;AAC1B,YAAA,IAAI,CAAC,mBAAmB,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,YAAa,CAAC,KAAK,CAAC;QACnE;aAAO;AACL,YAAA,IAAI,CAAC,mBAAmB,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,YAAa,CAAC,KAAK,CAAC;QACnE;AACA,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;IACvB;AAEU,IAAA,eAAe,CAAC,KAAgB,EAAA;QACxC,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACtB;IAEU,iBAAiB,GAAA;AACzB,QAAA,IAAI,CAAC,mBAAmB,EAAE,CAAC,YAAY,EAAE;IAC3C;AAEU,IAAA,YAAY,CAAC,KAAmB,EAAA;AACxC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B;AAEU,IAAA,WAAW,CAAC,KAAsB,EAAA;AAC1C,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;IAC5B;AAEA;;AAEG;IACH,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE;IACpC;uGAlJW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EA+GwB,qBAAqB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1IjF,08CA4CA,4fDtBY,eAAe,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAmB,qBAAqB,EAAA,QAAA,EAAA,oCAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAtC,eAAe,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAK/B,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAPnC,SAAS;+BACE,kBAAkB,EAAA,OAAA,EACnB,CAAC,eAAe,EAAE,eAAe,EAAE,qBAAqB,CAAC,EAAA,eAAA,EAGjD,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,08CAAA,EAAA,MAAA,EAAA,CAAA,ocAAA,CAAA,EAAA;qwCAiHW,qBAAqB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE1IjF;;;AAGG;MA0FU,uBAAuB,CAAA;AAClC;;;;;;;AAOG;AACM,IAAA,oBAAoB,GAAG,KAAK,CACnC,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,+CAAA,CAAiD,CAAC,gEACpE;AACD;;;;;;;AAOG;AACM,IAAA,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,2CAAA,CAA6C,CAAC,0DAAC;AAChG;;;;;;;AAOG;AACM,IAAA,eAAe,GAAG,KAAK,CAC9B,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,8DAAA,CAAgE,CAAC,2DACnF;AACD;;;;;;;AAOG;AACM,IAAA,mBAAmB,GAAG,KAAK,CAClC,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,4DAAA,CAA8D,CAAC,+DACjF;AACD;;;;;;;AAOG;AACM,IAAA,UAAU,GAAG,KAAK,CACzB,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,wEAAA,CAA0E,CAAC,sDAC7F;AACD;;;;;;;AAOG;AACM,IAAA,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,iCAAA,CAAmC,CAAC,4DAAC;AACxF;;;;;;;AAOG;AACM,IAAA,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,+BAAA,CAAiC,CAAC,2DAAC;AACrF;;;;;;;AAOG;AACM,IAAA,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,uCAAA,CAAyC,CAAC,yDAAC;AAC3F;;;;;;;AAOG;AACM,IAAA,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,iCAAA,CAAmC,CAAC,4DAAC;AACxF;;;;;;;AAOG;AACM,IAAA,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,iCAAA,CAAmC,CAAC,4DAAC;AACxF;;;;;;;AAOG;AACM,IAAA,gBAAgB,GAAG,KAAK,CAC/B,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,qDAAA,CAAuD,CAAC,4DAC1E;AACD;;;;;;;AAOG;AACM,IAAA,iBAAiB,GAAG,KAAK,CAChC,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,+CAAA,CAAiD,CAAC,6DACpE;AACD;;;;AAIG;IACM,aAAa,GAAG,KAAK,CAAC,KAAK,0DAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACtE;;;;;;;AAOG;AACM,IAAA,iBAAiB,GAAG,KAAK,CAChC,CAAC,CAAC,MAAM,SAAS,CAAA,CAAA,gEAAA,CAAkE,CAAC,6DACrF;AACD;;;;;;;AAOG;AACM,IAAA,oBAAoB,GAAG,KAAK,CACnC,CAAC,CACC,MACE,SAAS,CAAA,CAAA,8EAAA,CAAgF,CAC5F,gEACF;AACD;;;;;;;;;;;;;AAaG;IACM,YAAY,GAAG,KAAK,CAAmB;QAC9C,OAAO,EAAE,IAAI,WAAW,CAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;AAC1D,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,GAAG,EAAE,EAAE;AACP,QAAA,SAAS,EAAE,aAAa;AACxB,QAAA,YAAY,EAAE;AACf,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AACF;;;AAGG;IACM,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AACjC;;;;AAIG;IACM,WAAW,GAAG,KAAK,CAA8B,SAAS,wDACjE,SAAS,EAAE,eAAe,EAAA,CAC1B;AACF;;;;AAIG;IACM,QAAQ,GAAG,KAAK,CAAC,EAAE,qDAAI,SAAS,EAAE,eAAe,EAAA,CAAG;AAC7D;;;;AAIG;IACM,oBAAoB,GAAG,KAAK,CAAC,CAAC,iEAAI,SAAS,EAAE,eAAe,EAAA,CAAG;AACxE;;;;AAIG;IACM,OAAO,GAAG,KAAK,CAAC,CAAC,oDAAI,SAAS,EAAE,eAAe,EAAA,CAAG;AAC3D;;;;AAIG;IACM,UAAU,GAAG,KAAK,CAAC,KAAK,uDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACnE;;;;AAIG;IACM,aAAa,GAAG,KAAK,CAAC,KAAK,0DAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAEtE;;;;;;;;;AASG;IACM,eAAe,GAAG,KAAK,CAAC,KAAK,4DAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAExE;;AAEG;IACM,cAAc,GAAG,MAAM,EAAc;AAE9C;;;AAGG;IACM,eAAe,GAAG,MAAM,EAAoB;AAErD;;AAEG;IACM,YAAY,GAAG,MAAM,EAAgB;IAE3B,KAAK,GAAG,QAAQ,CAAC;QAClC,aAAa;QACb,aAAa;QACb,eAAe;QACf;AACD,KAAA,CAAC;IACQ,KAAK,GAAoB,EAAE;IAC3B,OAAO,GAAG,CAAC;IACb,SAAS,GAAG,CAAC;IACX,aAAa,GAAG,KAAK;IACrB,eAAe,GAAG,KAAK;AAEhB,IAAA,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAA0B,UAAU,CAAC;AAC3E,IAAA,KAAK,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACjC,IAAI,GAAI,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEtD,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,aAAa,EAAE;YAC7C,IAAI,CAAC,YAAY,EAAE;QACrB;IACF;AAEU,IAAA,WAAW,CAAC,KAAmB,EAAA;AACvC,QAAA,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE;YAClB;QACF;AAEA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;;QAEhC,IAAI,QAAQ,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AACvC,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QACnB;AAEA,QAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YACxC,IAAI,SAAS,EAAE;;AAEb,gBAAA,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ,EAAE;AACrE,oBAAA,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC;gBAChC;gBACA;YACF;AAEA,YAAA,MAAM,MAAM,GAAG,QAAQ,GAAG,CAAC,IAAI,QAAQ;AACvC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,KAAK,OAAO;AACrC,YAAA,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE;AACpB,gBAAA,IAAI,CAAC,eAAe,GAAG,IAAI;gBAC3B;YACF;iBAAO,IAAI,KAAK,EAAE;AAChB,gBAAA,QAAQ,EAAE;YACZ;AACA,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACvB;QAEA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAE/D,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAE1C,IAAI,CAAC,YAAY,EAAE;;AAGnB,QAAA,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAEzB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;;AAErB,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,YAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACxB;IACF;AAEU,IAAA,UAAU,CAAC,KAAa,EAAA;AAChC,QAAA,IAAI,KAAK,IAAI,CAAC,EAAE;YACd,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AAC3B,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;AAC1C,YAAA,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE;YACvB,IAAI,CAAC,YAAY,EAAE;QACrB;IACF;AAEU,IAAA,YAAY,CAAC,IAAmB,EAAA;AACxC,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;AAC/B,YAAA,IAAI,CAAC,YAAY,GAAG,SAAS;YAC7B,IAAI,CAAC,SAAS,EAAE;QAClB;QACA,IAAI,CAAC,OAAO,EAAE;AACd,QAAA,IAAI,CAAC,MAAM,GAAG,OAAO;AACrB,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;QACjB,IAAI,CAAC,YAAY,EAAE;QAEnB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI;AACjD,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;YACvB,MAAM;YACN,QAAQ;YACR,IAAI;YACJ,QAAQ;YACR,IAAI,EAAE,IAAI,CAAC;AACZ,SAAA,CAAC;IACJ;AAEU,IAAA,WAAW,CAAC,IAAgB,EAAA;AACpC,QAAA,IAAI,CAAC,MAAM,GAAG,OAAO;QACrB,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IAC7B;AAEA;;AAEG;IACH,KAAK,CAAC,IAAI,GAAG,IAAI,EAAA;AACf,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;AACtD,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE;AACf,QAAA,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE;QACvB,IAAI,CAAC,YAAY,EAAE;QACnB,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B;IACF;AAEA;;AAEG;IACH,UAAU,CAAC,OAAO,GAAG,IAAI,EAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACvB;QACF;AACA,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAC1B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC;IACpC;IAEQ,QAAQ,CAAC,KAAmB,EAAE,OAAgB,EAAA;AACpD,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,EAAE;gBACpE;YACF;YACA,IAAI,CAAC,OAAO,EAAE;AACd,YAAA,IAAI,CAAC,MAAM,GAAG,QAAQ;QACxB;QACA,IAAI,CAAC,YAAY,EAAE;IACrB;IAEQ,YAAY,GAAA;QAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE;YAC1F,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1B,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE;gBAC5B,IAAI,CAAC,SAAS,EAAE;AAChB,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAC1B;QACF;IACF;AAEQ,IAAA,aAAa,CAAC,IAAmB,EAAA;AACvC,QAAA,IAAI,QAA8B;AAClC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;AAClC,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AACtB,YAAA,QAAQ,GAAG,IAAI,QAAQ,EAAE;AAEzB,YAAA,IAAI,MAAM,CAAC,gBAAgB,EAAE;AAC3B,gBAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;AACjD,oBAAA,QAAS,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,gBAAiB,CAAC,GAAG,CAAC,CAAC;AACtD,gBAAA,CAAC,CAAC;YACJ;;AAEA,YAAA,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;QAC7D;QACA,MAAM,OAAO,GACX,MAAM,CAAC,OAAO,YAAY,WAAW,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;AAE1F,QAAA,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE;YAC5E,OAAO;YACP,YAAY,EAAE,MAAM,CAAC,YAAY;AACjC,YAAA,cAAc,EAAE;AACjB,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,MAAM,GAAG,WAAW;AACzB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AAC1B,QAAA,IAAI,CAAC,aAAa,GAAG,SAAS;AAE9B,QAAA,MAAM,cAAc,GAClB,MAAM,CAAC,OAAO;aACb,IAAI,CAAC,IAAI,GAAG,CAAC,CAAuB,KAAK,IAAI,CAAC,IAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QAC9E,IAAI,CAAC,cAAc,EAAE;YACnB;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC,GAAG;aACnC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAC1B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC;AAClD,YAAA,KAAK,EAAE,CAAC,KAAwB,KAAK,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC;YACxE,QAAQ,EAAE,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI;AAC/C,SAAA,CAAC;IACN;;AAGQ,IAAA,WAAW,CAAC,IAAgB,EAAA;AAClC,QAAA,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,KAAK,EAAE;YACnC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACtF,gBAAA,OAAO,UAAU;YACnB;QACF;AACA,QAAA,OAAO,IAAI;IACb;IAEQ,iBAAiB,CAAC,IAAmB,EAAE,SAA6B,EAAA;AAC1E,QAAA,IAAI,SAAS,YAAY,YAAY,EAAE;AACrC,YAAA,IAAI,CAAC,eAAe,GAAG,SAAkC;QAC3D;AAAO,aAAA,IAAI,SAAS,CAAC,IAAI,KAAK,aAAa,CAAC,cAAc,IAAI,SAAS,CAAC,KAAK,EAAE;AAC7E,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC;AACtE,YAAA,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QAC3B;IACF;IAEQ,iBAAiB,CAAC,IAAmB,EAAE,KAAwB,EAAA;AACrE,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;AACzD,QAAA,IAAI,CAAC,MAAM,GAAG,OAAO;AACrB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACzC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE;AAC5D,YAAA,IAAI,CAAC,aAAa,GAAG,CAAA,EAAG,KAAK,CAAC,MAAM,CAAA,EAAA,EAAK,KAAK,CAAC,UAAU,CAAA,CAAE;QAC7D;AACA,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;IAC1B;AAEQ,IAAA,oBAAoB,CAAC,IAAmB,EAAA;AAC9C,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;AAClF,QAAA,IAAI,CAAC,MAAM,GAAG,SAAS;AACvB,QAAA,IAAI,CAAC,QAAQ,GAAG,GAAG;AACnB,QAAA,IAAI,CAAC,eAAe,GAAG,SAAS;AAChC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;AACrB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QACpB;AACA,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;IAC1B;AAEQ,IAAA,aAAa,CAAC,IAAmB,EAAA;AACvC,QAAA,IAAI,CAAC,YAAY,GAAG,SAAS;QAC7B,IAAI,CAAC,OAAO,EAAE;QACd,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,YAAY,EAAE;QACnB,IAAI,CAAC,YAAY,EAAE;IACrB;AAEQ,IAAA,OAAO,CAAC,IAAmB,EAAA;QACjC,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,YAAA,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;YACzB,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,gBAAA,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;YAC3B,CAAC,EAAE,GAAG,CAAC;AACP,YAAA,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QAC3B,CAAC,EAAE,IAAI,CAAC;IACV;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,aAAa;YAChB,CAAC,IAAI,CAAC,aAAa,EAAE;gBACrB,CAAC,IAAI,CAAC,OAAO;gBACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC;AACpE,QAAA,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE;AAC/D,YAAA,IAAI,CAAC,eAAe,GAAG,KAAK;QAC9B;IACF;IAEQ,UAAU,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAS,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACzF;uGA/fW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7FpC,wrIAyHA,EAAA,MAAA,EAAA,CAAA,iZAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtCI,qBAAqB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,uBAAuB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,eAAe,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,6BAA6B,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,SAAA,EAAA,SAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC7B,sBAAsB,8HACtB,eAAe,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAKN,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAbnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,OAAA,EACnB;wBACP,qBAAqB;wBACrB,uBAAuB;wBACvB,eAAe;wBACf,6BAA6B;wBAC7B,sBAAsB;wBACtB;AACD,qBAAA,EAAA,QAAA,EAAA,wrIAAA,EAAA,MAAA,EAAA,CAAA,iZAAA,CAAA,EAAA;6yFAqQuE,UAAU,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE9VpF;;;AAGG;MAWU,oBAAoB,CAAA;uGAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;wGAApB,oBAAoB,EAAA,OAAA,EAAA,CAHrB,uBAAuB,EAAE,uBAAuB,EAAE,qBAAqB,CAAA,EAAA,OAAA,EAAA,CACvE,uBAAuB,EAAE,uBAAuB,EAAE,qBAAqB,CAAA,EAAA,CAAA;wGAEtE,oBAAoB,EAAA,OAAA,EAAA,CAHrB,uBAAuB,EAAE,uBAAuB,CAAA,EAAA,CAAA;;2FAG/C,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJhC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,uBAAuB,EAAE,uBAAuB,EAAE,qBAAqB,CAAC;AAClF,oBAAA,OAAO,EAAE,CAAC,uBAAuB,EAAE,uBAAuB,EAAE,qBAAqB;AAClF,iBAAA;;;ACbD;;;AAGG;;ACHH;;AAEG;;;;"}
1
+ {"version":3,"file":"siemens-element-ng-file-uploader.mjs","sources":["../../../../projects/element-ng/file-uploader/si-file-uploader.model.ts","../../../../projects/element-ng/file-uploader/si-file-upload.directive.ts","../../../../projects/element-ng/file-uploader/si-file-dropzone.component.ts","../../../../projects/element-ng/file-uploader/si-file-dropzone.component.html","../../../../projects/element-ng/file-uploader/si-file-uploader.component.ts","../../../../projects/element-ng/file-uploader/si-file-uploader.component.html","../../../../projects/element-ng/file-uploader/si-file-uploader.module.ts","../../../../projects/element-ng/file-uploader/index.ts","../../../../projects/element-ng/file-uploader/siemens-element-ng-file-uploader.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\n\nimport { TranslatableString } from '@siemens/element-translate-ng/translate';\n\n/** */\nexport interface UploadFile {\n status: 'added' | 'invalid' | 'queued' | 'uploading' | 'success' | 'error';\n file: File;\n fileName: string;\n size: string;\n errorText?: TranslatableString;\n progress: number;\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport {\n Directive,\n ElementRef,\n inject,\n input,\n LOCALE_ID,\n booleanAttribute,\n output\n} from '@angular/core';\nimport { t, TranslatableString } from '@siemens/element-translate-ng/translate';\n\nimport { UploadFile } from './si-file-uploader.model';\n\nexport interface FileUploadError extends UploadFile {\n status: 'invalid';\n errorText: TranslatableString;\n}\n\n/**\n * Directive for handling file uploads with validation for file type and size.\n *\n * @example\n * ```html\n * <input\n * #fileInput\n * type=\"file\"\n * class=\"d-none\"\n * siFileUpload\n * [accept]=\"accept()\"\n * [maxFileSize]=\"maxFileSize()\"\n * [multiple]=\"true\"\n * (validFiles)=\"onFilesAdded($event)\"\n * (fileError)=\"onFileError($event)\"\n * />\n * ```\n */\n@Directive({\n selector: 'input[type=\"file\"][siFileUpload]',\n host: {\n '[attr.accept]': 'accept()',\n '[multiple]': 'directoryUpload() || multiple()',\n '[attr.webkitdirectory]': 'directoryUpload() ? \"\" : null',\n '(change)': 'onInputChange($event)'\n }\n})\nexport class SiFileUploadDirective {\n /**\n * Text or translation key of message title if incorrect file type is dragged / dropped.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n * ```\n */\n readonly errorTextFileType = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n );\n\n /**\n * Message or translation key if file exceeds the maximum file size limit.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`)\n * ```\n */\n readonly errorTextFileMaxSize = input(\n t(\n () =>\n $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`\n )\n );\n\n /**\n * Define which file types are suggested in file browser.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr-accept\n */\n readonly accept = input<string>();\n\n /**\n * Define maximal allowed file size in bytes.\n */\n readonly maxFileSize = input<number>();\n\n /**\n * Defines whether the file input allows selecting multiple files.\n * When {@link directoryUpload} is enabled, this will have no effect.\n *\n * @defaultValue false\n */\n readonly multiple = input(false, { transform: booleanAttribute });\n\n /**\n * Enable directory upload.\n *\n * @defaultValue false\n */\n readonly directoryUpload = input(false, { transform: booleanAttribute });\n\n /**\n * Event emitted when valid files are added.\n * Invalid files (due to size or type) will be ignored and instead the {@link fileError} event will be emitted.\n */\n readonly validFiles = output<UploadFile[]>();\n\n /**\n * Event emitted when valid files are added.\n * Also includes invalid files, but with status 'invalid' and an errorText describing why they were ignored.\n */\n readonly filesAdded = output<UploadFile[]>();\n\n /**\n * Event emitted when file validation errors occur, including files that were ignored due to size or type.\n */\n readonly fileError = output<FileUploadError>();\n\n private readonly elementRef = inject(ElementRef<HTMLInputElement>);\n private locale = inject(LOCALE_ID).toString();\n private numberFormat = new Intl.NumberFormat(this.locale, { maximumFractionDigits: 2 });\n\n protected onInputChange(event: Event): void {\n const inputElement = event.target as HTMLInputElement;\n this.handleFiles(inputElement.files);\n }\n\n /**\n * Handle files from input or drag and drop\n */\n handleFiles(files: FileList | null): void {\n if (!files?.length) {\n return;\n }\n\n const newFiles: UploadFile[] = [];\n const validFiles: UploadFile[] = [];\n\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < files.length; i++) {\n const uploadFile = this.makeUploadFile(files[i]);\n newFiles.push(uploadFile);\n\n if (uploadFile.status === 'invalid' && uploadFile.errorText) {\n this.fileError.emit(uploadFile as FileUploadError);\n } else if (uploadFile.status === 'added') {\n validFiles.push(uploadFile);\n }\n }\n\n if (newFiles.length > 0) {\n newFiles.sort((a, b) => a.fileName.localeCompare(b.fileName));\n this.filesAdded.emit(newFiles);\n }\n\n if (validFiles.length > 0) {\n validFiles.sort((a, b) => a.fileName.localeCompare(b.fileName));\n this.validFiles.emit(validFiles);\n }\n\n this.reset();\n }\n\n /**\n * Handle directory entries for drag and drop\n */\n handleItems(items: DataTransferItemList): void {\n const newFiles: UploadFile[] = [];\n let pendingEntries = 0;\n\n const traverseFileTree = (item: FileSystemEntry): void => {\n if (item.isFile) {\n (item as FileSystemFileEntry).file(file => {\n const uploadFile = this.makeUploadFile(file);\n newFiles.push(uploadFile);\n\n if (uploadFile.status === 'invalid' && uploadFile.errorText) {\n this.fileError.emit(uploadFile as FileUploadError);\n }\n\n if (--pendingEntries === 0) {\n if (newFiles.length > 0) {\n this.filesAdded.emit(newFiles);\n }\n const validFiles = newFiles.filter(f => f.status === 'added');\n if (validFiles.length > 0) {\n this.filesAdded.emit(validFiles);\n }\n this.reset();\n }\n });\n } else if (item.isDirectory) {\n const dirReader = (item as FileSystemDirectoryEntry).createReader();\n dirReader.readEntries(entries => {\n for (const entry of entries) {\n pendingEntries++;\n traverseFileTree(entry);\n }\n if (--pendingEntries === 0) {\n if (newFiles.length > 0) {\n this.filesAdded.emit(newFiles);\n }\n const validFiles = newFiles.filter(f => f.status === 'added');\n if (validFiles.length > 0) {\n this.filesAdded.emit(validFiles);\n }\n this.reset();\n }\n });\n }\n };\n\n // items is not an array but of type DataTransferItemList\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < items.length; i++) {\n const item = items[i].webkitGetAsEntry();\n if (item) {\n pendingEntries++;\n traverseFileTree(item);\n }\n }\n }\n\n /**\n * Reset the file input value\n */\n reset(): void {\n this.elementRef.nativeElement.value = '';\n }\n\n /**\n * Trigger the file input click\n */\n triggerClick(): void {\n this.elementRef.nativeElement.click();\n }\n\n private makeUploadFile(file: File): UploadFile {\n const uploadFile: UploadFile = {\n fileName: file.name,\n file,\n size: this.fileSizeToString(file.size),\n progress: 0,\n status: 'added'\n };\n // use MIME type of file if set. Otherwise fall back to file name ending\n const ext = '.' + uploadFile.file.name.split('.').pop();\n if (!this.verifyFileType(uploadFile.file.type, ext)) {\n uploadFile.status = 'invalid';\n uploadFile.errorText = this.errorTextFileType();\n } else if (!this.verifyFileSize(uploadFile.file.size)) {\n uploadFile.status = 'invalid';\n uploadFile.errorText = this.errorTextFileMaxSize();\n }\n return uploadFile;\n }\n\n private verifyFileSize(size: number): boolean {\n const maxFileSize = this.maxFileSize();\n return !maxFileSize || size <= maxFileSize;\n }\n\n private verifyFileType(fileType: string | undefined, ext: string | undefined): boolean {\n const accept = this.accept();\n if (!accept) {\n return true;\n }\n if (fileType === undefined && ext === undefined) {\n return false;\n }\n // Spec says that comma is the delimiter for filetypes. Also allow pipe for compatibility\n return accept.split(/,|\\|/).some(acceptedType => {\n // convert accept glob into regex (example: images/* --> images/.*)\n const acceptedRegexStr = acceptedType.replace(/\\./g, '\\\\.').replace('*', '.*').trim();\n const acceptedRegex = new RegExp(acceptedRegexStr, 'i');\n\n // if fileType is set and accepted type looks like a MIME type, match that otherwise extension\n if (fileType && acceptedType.includes('/')) {\n return !!fileType.match(acceptedRegex);\n }\n return !!ext?.match(acceptedRegex);\n });\n }\n\n fileSizeToString(num: number): string {\n return SiFileUploadDirective.formatFileSize(num, this.numberFormat);\n }\n\n static formatFileSize(num: number, formatter?: Intl.NumberFormat): string {\n const numberFormat = formatter ?? new Intl.NumberFormat('en-US', { maximumFractionDigits: 2 });\n let suffix = 'B';\n if (num >= 1_073_741_824) {\n num /= 1_073_741_824;\n suffix = 'GB';\n } else if (num >= 1_048_576) {\n num /= 1_048_576;\n suffix = 'MB';\n } else if (num >= 1_024) {\n num /= 1_024;\n suffix = 'KB';\n }\n return numberFormat.format(num) + suffix;\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n viewChild\n} from '@angular/core';\nimport { elementUpload } from '@siemens/element-icons';\nimport { addIcons, SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\n\nimport { SiFileUploadDirective, FileUploadError } from './si-file-upload.directive';\nimport { UploadFile } from './si-file-uploader.model';\n\n@Component({\n selector: 'si-file-dropzone',\n imports: [SiIconComponent, SiTranslatePipe, SiFileUploadDirective],\n templateUrl: './si-file-dropzone.component.html',\n styleUrl: './si-file-dropzone.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SiFileDropzoneComponent {\n /**\n * Text or translation key of the input file selector (is combined with the `uploadTextRest`).\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n * ```\n */\n readonly uploadTextFileSelect = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n );\n /**\n * Text or translation key of the drag&drop field (is combined with the `uploadTextFileSelect`).\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`)\n * ```\n */\n readonly uploadDropText = input(t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`));\n /**\n * Text or translation key for max file size.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Max. {{maxFileSize}} upload size.`)\n * ```\n */\n readonly maxFileSizeText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Max. {{maxFileSize}} upload size.`)\n );\n /**\n * Text or translation key for accepted types.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types: {{accept}}.`)\n * ```\n */\n readonly acceptText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types: {{accept}}.`)\n );\n /**\n * Text or translation key of message title if incorrect file type is dragged / dropped.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n * ```\n */\n readonly errorTextFileType = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n );\n /**\n * Message or translation key if file exceeds the maximum file size limit.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`)\n * ```\n */\n readonly errorTextFileMaxSize = input(\n t(\n () =>\n $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`\n )\n );\n /**\n * Define which file types are suggested in file browser.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr-accept\n */\n readonly accept = input<string>();\n /**\n * Define maximal allowed file size in bytes.\n */\n readonly maxFileSize = input<number>();\n /**\n * Defines whether the file input allows selecting multiple files.\n * When {@link directoryUpload} is enabled, this will have no effect.\n *\n * @defaultValue false\n */\n readonly multiple = input(false, { transform: booleanAttribute });\n /**\n * Event emitted when valid files are added.\n * Invalid files are also included here, but with status 'invalid' and an errorText describing why they were ignored.\n */\n readonly filesAdded = output<UploadFile[]>();\n\n /**\n * Event emitted when file validation errors occur, including files that were ignored due to size or type.\n */\n readonly fileError = output<FileUploadError>();\n\n /**\n * Enable directory upload.\n *\n * @defaultValue false\n */\n readonly directoryUpload = input(false, { transform: booleanAttribute });\n\n protected readonly maxFileSizeString = computed(() => {\n const maxFileSize = this.maxFileSize();\n return maxFileSize ? this.fileUploadDirective().fileSizeToString(maxFileSize) : '';\n });\n\n protected readonly icons = addIcons({ elementUpload });\n\n protected dragOver = false;\n\n private readonly fileUploadDirective = viewChild.required(SiFileUploadDirective);\n\n protected dropHandler(event: DragEvent): void {\n event.preventDefault();\n if (this.directoryUpload()) {\n this.fileUploadDirective().handleItems(event.dataTransfer!.items);\n } else {\n this.fileUploadDirective().handleFiles(event.dataTransfer!.files);\n }\n this.dragOver = false;\n }\n\n protected dragOverHandler(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.dragOver = true;\n }\n\n protected inputEnterHandler(): void {\n this.fileUploadDirective().triggerClick();\n }\n\n protected onFilesAdded(files: UploadFile[]): void {\n this.filesAdded.emit(files);\n }\n\n protected onFileError(error: FileUploadError): void {\n this.fileError.emit(error);\n }\n\n /**\n * Reset all the files inside the native file input (and therefore the dropzone).\n */\n reset(): void {\n this.fileUploadDirective().reset();\n }\n}\n","<div\n class=\"drag-and-drop rounded p-6\"\n [class.drag-over]=\"dragOver\"\n (drop)=\"dropHandler($event)\"\n (dragover)=\"dragOverHandler($event)\"\n (dragleave)=\"dragOver = false\"\n>\n <si-icon class=\"mb-6 si-display-bold\" [icon]=\"icons.elementUpload\" />\n <span class=\"drag-and-drop-description si-h5 d-flex\">\n <span>{{ uploadDropText() | translate }}</span>\n &nbsp;\n <label class=\"select-file si-h5 mb-0\">\n <span tabindex=\"0\" (keydown.enter)=\"inputEnterHandler()\">{{\n uploadTextFileSelect() | translate\n }}</span>\n <input\n #fileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"d-none\"\n siFileUpload\n [accept]=\"accept()\"\n [maxFileSize]=\"maxFileSize()\"\n [multiple]=\"multiple()\"\n [directoryUpload]=\"directoryUpload()\"\n [errorTextFileType]=\"errorTextFileType()\"\n [errorTextFileMaxSize]=\"errorTextFileMaxSize()\"\n (filesAdded)=\"onFilesAdded($event)\"\n (fileError)=\"onFileError($event)\"\n (cancel)=\"$event.stopPropagation()\"\n />\n </label>\n </span>\n @if (maxFileSize() || accept()) {\n <div class=\"allowed si-caption mt-6 text-center\">\n @if (maxFileSize()) {\n {{ maxFileSizeText() | translate: { maxFileSize: maxFileSizeString() } }}\n }\n @if (accept()) {\n {{ acceptText() | translate: { accept: accept() } }}\n }\n </div>\n }\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport {\n HttpClient,\n HttpErrorResponse,\n HttpEvent,\n HttpEventType,\n HttpHeaders,\n HttpRequest,\n HttpResponse\n} from '@angular/common/http';\nimport {\n booleanAttribute,\n ChangeDetectorRef,\n Component,\n inject,\n input,\n numberAttribute,\n OnChanges,\n output,\n SimpleChanges,\n viewChild\n} from '@angular/core';\nimport { elementCancel, elementDelete, elementDocument, elementRedo } from '@siemens/element-icons';\nimport { addIcons, SiIconComponent, SiStatusIconComponent } from '@siemens/element-ng/icon';\nimport { SiInlineNotificationComponent } from '@siemens/element-ng/inline-notification';\nimport { SiProgressbarComponent } from '@siemens/element-ng/progressbar';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\nimport { Observable, Subscription } from 'rxjs';\nimport { retry } from 'rxjs/operators';\n\nimport { SiFileDropzoneComponent } from './si-file-dropzone.component';\nimport { UploadFile } from './si-file-uploader.model';\n\n/**\n * The FileUploadResult is emitted at completion of the file uploading\n * via the `uploadCompleted` emitter. On success the Http `response` from\n * the backend is provided and on failure, the `error` object is available.\n */\nexport interface FileUploadResult {\n file: string;\n response?: HttpResponse<unknown>;\n error?: Error;\n}\n\nexport interface FileUploadConfig {\n headers: HttpHeaders | string | Record<string, string | number | (string | number)[]> | Headers;\n method: 'POST' | 'PUT' | 'PATCH';\n url: string;\n /** Form field name for the uploaded file. */\n fieldName: string;\n /**\n * Additional form fields added in the HTTP request.\n *\n * @example\n * ```json\n * { upload_user: 'Reiner Zufall', expiry_date: ' 21.12.2012' }\n * ```\n */\n additionalFields?: Record<string, string>;\n /** Specify the server response type */\n responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n /** A function to modify the HTTP request sent on the consumer side. */\n handler?: (req: HttpRequest<unknown>) => Observable<HttpEvent<unknown>>;\n /**\n * When `true`, the file will be sent directly w/o the use of `FormData`.\n * You will also need to set the `Content-Type` header when sending binary. See: {@link headers}\n */\n sendBinary?: boolean;\n}\n\ninterface ExtUploadFile extends UploadFile {\n httpErrorText?: string;\n subscription?: Subscription;\n successResponse?: HttpResponse<unknown>;\n fadeOut?: boolean;\n}\n\n@Component({\n selector: 'si-file-uploader',\n imports: [\n SiStatusIconComponent,\n SiFileDropzoneComponent,\n SiIconComponent,\n SiInlineNotificationComponent,\n SiProgressbarComponent,\n SiTranslatePipe\n ],\n templateUrl: './si-file-uploader.component.html',\n styleUrl: './si-file-uploader.component.scss'\n})\nexport class SiFileUploaderComponent implements OnChanges {\n /**\n * Text of the link to open the file select dialog (follows `uploadDropText`).\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n * ```\n */\n readonly uploadTextFileSelect = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n );\n /**\n * Text instructing a user to drop the files inside the dropzone.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`)\n * ```\n */\n readonly uploadDropText = input(t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`));\n /**\n * Text to describe the maximum file size.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Max. {{maxFileSize}} upload size.`)\n * ```\n */\n readonly maxFileSizeText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Max. {{maxFileSize}} upload size.`)\n );\n /**\n * Error message shown when the maximum number of files are reached.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.MAX_FILE_REACHED:Max. {{maxFiles}} files`)\n * ```\n */\n readonly maxFilesReachedText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.MAX_FILE_REACHED:Max. {{maxFiles}} files`)\n );\n /**\n * Text for the accepted file types.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types: {{accept}}.`)\n * ```\n */\n readonly acceptText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types: {{accept}}.`)\n );\n /**\n * Text used inside the upload button.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD:Upload`)\n * ```\n */\n readonly uploadButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD:Upload`));\n /**\n * Text used inside the clear button.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.CLEAR:Clear`)\n * ```\n */\n readonly clearButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.CLEAR:Clear`));\n /**\n * Text shown during the file upload.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOADING:Uploading`)\n * ```\n */\n readonly uploadingText = input(t(() => $localize`:@@SI_FILE_UPLOADER.UPLOADING:Uploading`));\n /**\n * Text shown to remove a file from the file list. Required for a11y.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.REMOVE:Remove`)\n * ```\n */\n readonly removeButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.REMOVE:Remove`));\n /**\n * Text of cancel button. Shown during upload. Required for a11y.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.CANCEL:Cancel`)\n * ```\n */\n readonly cancelButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.CANCEL:Cancel`));\n /**\n * Text shown if the upload was successful.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_COMPLETED:Upload completed`)\n * ```\n */\n readonly successTextTitle = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_COMPLETED:Upload completed`)\n );\n /**\n * Text shown if the upload failed.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_FAILED:Upload failed`)\n * ```\n */\n readonly errorUploadFailed = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_FAILED:Upload failed`)\n );\n /**\n * On failed upload, show the error received from the server.\n *\n * @defaultValue false\n */\n readonly showHttpError = input(false, { transform: booleanAttribute });\n /**\n * Text shown to indicate that an incorrect file type was added to file list.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n * ```\n */\n readonly errorTextFileType = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n );\n /**\n * Message or translation key if file exceeds the maximum file size limit.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`)\n * ```\n */\n readonly errorTextFileMaxSize = input(\n t(\n () =>\n $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`\n )\n );\n /**\n * Config for HTTP request to upload file.\n *\n * @defaultValue\n * ```\n * {\n * headers: new HttpHeaders({ 'Accept': 'application/json' }),\n * method: 'POST',\n * url: '',\n * fieldName: 'upload_file',\n * responseType: 'json'\n * }\n * ```\n */\n readonly uploadConfig = input<FileUploadConfig>({\n headers: new HttpHeaders({ 'Accept': 'application/json' }),\n method: 'POST',\n url: '',\n fieldName: 'upload_file',\n responseType: 'json'\n });\n /**\n * Define which file types are suggested in file browser.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr-accept\n */\n readonly accept = input<string>();\n /**\n * Define maximal allowed file size in bytes.\n *\n * @defaultValue undefined\n */\n readonly maxFileSize = input<number | undefined, unknown>(undefined, {\n transform: numberAttribute\n });\n /**\n * Define maximal allowed number of files.\n * When {@link directoryUpload} is enabled, this will have no effect.\n * @defaultValue 10\n */\n readonly maxFiles = input(10, { transform: numberAttribute });\n /**\n * Maximum number of concurrent uploads.\n *\n * @defaultValue 3\n */\n readonly maxConcurrentUploads = input(3, { transform: numberAttribute });\n /**\n * Numbers of retries for failed uploads.\n *\n * @defaultValue 0\n */\n readonly retries = input(0, { transform: numberAttribute });\n /**\n * Auto-upload mode - automatically start upload once files are added.\n *\n * @defaultValue false\n */\n readonly autoUpload = input(false, { transform: booleanAttribute });\n /**\n * Disable the upload button.\n *\n * @defaultValue false\n */\n readonly disableUpload = input(false, { transform: booleanAttribute });\n\n /**\n * Enable directory upload mode.\n * When enabled, the file input will accept directories and upload all files within as a flat list.\n * The hierarchy of the directory will not be preserved.\n * The `maxFiles` property will have no effect when `directoryUpload` is enabled.\n *\n * **Note:** This feature is not yet available for safari (iOS)\n *\n * @defaultValue false\n */\n readonly directoryUpload = input(false, { transform: booleanAttribute });\n\n /**\n * Emits when a user press cancel during upload. The event provides the file details.\n */\n readonly uploadCanceled = output<UploadFile>();\n\n /**\n * Output callback event will provide you if upload is finished. If an error\n * occurred it will be emitted.\n */\n readonly uploadCompleted = output<FileUploadResult>();\n\n /**\n * Output which fires whenever new files are added to or removed from the uploader.\n */\n readonly filesChanges = output<UploadFile[]>();\n\n protected readonly icons = addIcons({\n elementCancel,\n elementDelete,\n elementDocument,\n elementRedo\n });\n protected files: ExtUploadFile[] = [];\n protected pending = 0;\n private uploading = 0;\n protected uploadEnabled = false;\n protected maxFilesReached = false;\n\n private readonly dropZone = viewChild.required<SiFileDropzoneComponent>('dropZone');\n private cdRef = inject(ChangeDetectorRef);\n private http? = inject(HttpClient, { optional: true });\n\n ngOnChanges(changes: SimpleChanges<this>): void {\n if (changes.maxFiles || changes.disableUpload) {\n this.updateStates();\n }\n }\n\n protected handleFiles(files: UploadFile[]): void {\n if (!files?.length) {\n return;\n }\n\n const maxFiles = this.maxFiles();\n // for single-file case, replace exiting file if any\n if (maxFiles === 1 && this.files.length) {\n this.reset(false);\n }\n\n let numValid = this.countValid();\n for (const file of files) {\n const duplicate = this.isDuplicate(file);\n if (duplicate) {\n // in case this is duplicated: reset if already uploaded or not handled yet\n if (duplicate.status !== 'uploading' && duplicate.status !== 'queued') {\n Object.assign(duplicate, file);\n }\n continue;\n }\n\n const canAdd = numValid + 1 <= maxFiles;\n const valid = file.status === 'added';\n if (valid && !canAdd) {\n this.maxFilesReached = true;\n break;\n } else if (valid) {\n numValid++;\n }\n this.files.push(file);\n }\n\n this.files.sort((a, b) => a.fileName.localeCompare(b.fileName));\n\n this.filesChanges.emit(this.files.slice());\n\n this.updateStates();\n\n // needed for drag drop of directory\n this.cdRef.markForCheck();\n\n if (this.autoUpload()) {\n // allow concurrent uploads for auto upload mode.\n this.uploadEnabled = true;\n this.fileUpload(false);\n }\n }\n\n protected removeFile(index: number): void {\n if (index >= 0) {\n this.files.splice(index, 1);\n this.filesChanges.emit(this.files.slice());\n this.dropZone().reset();\n this.updateStates();\n }\n }\n\n protected cancelUpload(file: ExtUploadFile): void {\n if (file.subscription) {\n file.subscription.unsubscribe();\n file.subscription = undefined;\n this.uploading--;\n }\n this.pending--;\n file.status = 'added';\n file.progress = 0;\n this.updateStates();\n\n const { status, fileName, size, progress } = file;\n this.uploadCanceled.emit({\n status,\n fileName,\n size,\n progress,\n file: file.file\n });\n }\n\n protected retryUpload(file: UploadFile): void {\n file.status = 'added';\n this.doUpload([file], true);\n }\n\n /**\n * Reset the state.\n */\n reset(emit = true): void {\n this.files.forEach(f => f.subscription?.unsubscribe());\n this.files = [];\n this.dropZone().reset();\n this.updateStates();\n if (emit) {\n this.filesChanges.emit([]);\n }\n }\n\n /**\n * Uploads the file\n */\n fileUpload(doRetry = true): void {\n if (!this.uploadEnabled) {\n return;\n }\n this.uploadEnabled = false;\n this.doUpload(this.files, doRetry);\n }\n\n private doUpload(files: UploadFile[], doRetry: boolean): void {\n for (const file of files) {\n if (file.status !== 'added' && (!doRetry || file.status !== 'error')) {\n continue;\n }\n this.pending++;\n file.status = 'queued';\n }\n this.processQueue();\n }\n\n private processQueue(): void {\n for (let i = 0; i < this.files.length && this.uploading < this.maxConcurrentUploads(); i++) {\n const file = this.files[i];\n if (file.status === 'queued') {\n this.uploading++;\n this.uploadOneFile(file);\n }\n }\n }\n\n private uploadOneFile(file: ExtUploadFile): void {\n let formData: FormData | undefined;\n const config = this.uploadConfig();\n if (!config.sendBinary) {\n formData = new FormData();\n\n if (config.additionalFields) {\n Object.keys(config.additionalFields).forEach(key => {\n formData!.append(key, config.additionalFields![key]);\n });\n }\n // this needs to be last for AWS\n formData.append(config.fieldName, file.file, file.fileName);\n }\n const headers =\n config.headers instanceof HttpHeaders ? config.headers : new HttpHeaders(config.headers);\n\n const req = new HttpRequest(config.method, config.url, formData ?? file.file, {\n headers,\n responseType: config.responseType,\n reportProgress: true\n });\n\n file.status = 'uploading';\n file.errorText = undefined;\n file.httpErrorText = undefined;\n\n const requestHandler =\n config.handler ??\n (this.http ? (r: HttpRequest<unknown>) => this.http!.request(r) : undefined);\n if (!requestHandler) {\n return;\n }\n\n file.subscription = requestHandler(req)\n .pipe(retry(this.retries()))\n .subscribe({\n next: event => this.handleUploadEvent(file, event),\n error: (error: HttpErrorResponse) => this.handleUploadError(file, error),\n complete: () => this.handleUploadComplete(file)\n });\n }\n\n // this is a light check for duplicate file - name and size only, not content!\n private isDuplicate(file: UploadFile): UploadFile | null {\n for (const uploadFile of this.files) {\n if (uploadFile.file.name === file.file.name && uploadFile.file.size === file.file.size) {\n return uploadFile;\n }\n }\n return null;\n }\n\n private handleUploadEvent(file: ExtUploadFile, httpEvent: HttpEvent<unknown>): void {\n if (httpEvent instanceof HttpResponse) {\n file.successResponse = httpEvent as HttpResponse<unknown>;\n } else if (httpEvent.type === HttpEventType.UploadProgress && httpEvent.total) {\n file.progress = Math.floor((100 * httpEvent.loaded) / httpEvent.total);\n this.cdRef.markForCheck();\n }\n }\n\n private handleUploadError(file: ExtUploadFile, error: HttpErrorResponse): void {\n this.uploadCompleted.emit({ file: file.fileName, error });\n file.status = 'error';\n file.errorText = this.errorUploadFailed();\n if (this.showHttpError() && error.status && error.statusText) {\n file.httpErrorText = `${error.status}: ${error.statusText}`;\n }\n this.oneUploadDone(file);\n }\n\n private handleUploadComplete(file: ExtUploadFile): void {\n this.uploadCompleted.emit({ file: file.fileName, response: file.successResponse });\n file.status = 'success';\n file.progress = 100;\n file.successResponse = undefined;\n if (this.autoUpload()) {\n this.fadeOut(file);\n }\n this.oneUploadDone(file);\n }\n\n private oneUploadDone(file: ExtUploadFile): void {\n file.subscription = undefined;\n this.pending--;\n this.uploading--;\n this.updateStates();\n this.processQueue();\n }\n\n private fadeOut(file: ExtUploadFile): void {\n setTimeout(() => {\n file.fadeOut = true;\n this.cdRef.markForCheck();\n setTimeout(() => {\n this.removeFile(this.files.indexOf(file));\n this.cdRef.markForCheck();\n }, 500);\n this.cdRef.markForCheck();\n }, 3500);\n }\n\n private updateStates(): void {\n this.uploadEnabled =\n !this.disableUpload() &&\n !this.pending &&\n this.files.some(f => f.status === 'added' || f.status === 'error');\n if (this.maxFilesReached && this.countValid() < this.maxFiles()) {\n this.maxFilesReached = false;\n }\n }\n\n private countValid(): number {\n return this.files.reduce<number>((acc, f) => acc + (f.status !== 'invalid' ? 1 : 0), 0);\n }\n}\n","<si-file-dropzone\n #dropZone\n [class]=\"autoUpload() ? 'mb-8' : 'mb-4'\"\n [uploadTextFileSelect]=\"uploadTextFileSelect()\"\n [uploadDropText]=\"uploadDropText()\"\n [multiple]=\"maxFiles() > 1\"\n [directoryUpload]=\"directoryUpload()\"\n [maxFileSizeText]=\"maxFileSizeText()\"\n [acceptText]=\"acceptText()\"\n [errorTextFileType]=\"errorTextFileType()\"\n [errorTextFileMaxSize]=\"errorTextFileMaxSize()\"\n [accept]=\"accept()\"\n [maxFileSize]=\"maxFileSize()\"\n (filesAdded)=\"handleFiles($event)\"\n/>\n\n@if (maxFilesReached) {\n <si-inline-notification\n class=\"mb-4\"\n severity=\"info\"\n [message]=\"maxFilesReachedText()\"\n [translationParams]=\"{ maxFiles: maxFiles() }\"\n />\n}\n\n<div class=\"file-list\">\n @for (file of files; track file) {\n <div [class]=\"`file d-flex ${autoUpload() ? 'mb-8' : 'mb-4'}`\" [class.fade-out]=\"file.fadeOut\">\n <si-icon class=\"icon align-self-center ms-6 me-4\" [icon]=\"icons.elementDocument\" />\n <div class=\"flex-fill overflow-hidden\">\n <div class=\"file-info\">\n <div class=\"file-name text-truncate si-h5\">{{ file.fileName }}</div>\n <div class=\"file-size text-secondary\">{{ file.size }}</div>\n </div>\n @if (file.errorText) {\n <div\n class=\"error text-truncate d-flex align-items-center\"\n [class.text-warning]=\"file.status === 'invalid'\"\n [class.text-danger]=\"file.status === 'error'\"\n >\n <si-status-icon\n class=\"icon-sm my-n2 me-2\"\n [status]=\"file.status === 'invalid' ? 'warning' : 'danger'\"\n />\n {{ file.errorText | translate }}\n @if (file.httpErrorText) {\n : {{ file.httpErrorText }}\n }\n </div>\n } @else {\n <div class=\"position-relative\">\n <div class=\"position-absolute si-caption end-0 mt-n8\">{{ file.progress }} %</div>\n <si-progressbar\n height=\"small\"\n [value]=\"file.progress\"\n [ariaLabel]=\"uploadingText() | translate\"\n />\n </div>\n }\n </div>\n <div class=\"status align-self-center text-nowrap ps-4 pe-6\">\n @if (file.status === 'error') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-tertiary me-4\"\n [disabled]=\"!uploadEnabled\"\n [title]=\"uploadButtonText() | translate\"\n [attr.aria-label]=\"uploadButtonText() | translate\"\n (click)=\"retryUpload(file)\"\n >\n <si-icon [icon]=\"icons.elementRedo\" />\n </button>\n }\n @if (file.status === 'added' || file.status === 'error' || file.status === 'invalid') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-ghost\"\n [title]=\"removeButtonText() | translate\"\n [attr.aria-label]=\"removeButtonText() | translate\"\n (click)=\"removeFile($index)\"\n >\n <si-icon [icon]=\"icons.elementDelete\" />\n </button>\n }\n @if (file.status === 'uploading' || file.status === 'queued') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-tertiary\"\n [title]=\"cancelButtonText() | translate\"\n [attr.aria-label]=\"cancelButtonText() | translate\"\n (click)=\"cancelUpload(file)\"\n >\n <si-icon [icon]=\"icons.elementCancel\" />\n </button>\n }\n @if (file.status === 'success') {\n <si-status-icon class=\"icon mx-2\" status=\"success\" />\n }\n </div>\n </div>\n }\n</div>\n\n@if (!autoUpload()) {\n <div class=\"buttons text-end\">\n <button\n type=\"button\"\n class=\"btn btn-secondary me-4\"\n [disabled]=\"pending || !files.length\"\n (click)=\"reset()\"\n >{{ clearButtonText() | translate }}</button\n >\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n [disabled]=\"!uploadEnabled\"\n (click)=\"fileUpload()\"\n >{{ uploadButtonText() | translate }}</button\n >\n </div>\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { NgModule } from '@angular/core';\n\nimport { SiFileDropzoneComponent } from './si-file-dropzone.component';\nimport { SiFileUploadDirective } from './si-file-upload.directive';\nimport { SiFileUploaderComponent } from './si-file-uploader.component';\n\n@NgModule({\n imports: [SiFileDropzoneComponent, SiFileUploaderComponent, SiFileUploadDirective],\n exports: [SiFileDropzoneComponent, SiFileUploaderComponent, SiFileUploadDirective]\n})\nexport class SiFileUploaderModule {}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-file-uploader.model';\nexport * from './si-file-dropzone.component';\nexport * from './si-file-uploader.component';\nexport * from './si-file-uploader.module';\nexport * from './si-file-upload.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}