ngx-t-forms 2.0.29 → 2.0.31

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 (161) hide show
  1. package/fesm2022/ngx-t-forms-auto-complete-input-element.component-DCKuXHAW.mjs +104 -0
  2. package/fesm2022/ngx-t-forms-auto-complete-input-element.component-DCKuXHAW.mjs.map +1 -0
  3. package/fesm2022/ngx-t-forms-basic-input-input-element.component-Ce4ipSUc.mjs +85 -0
  4. package/fesm2022/ngx-t-forms-basic-input-input-element.component-Ce4ipSUc.mjs.map +1 -0
  5. package/fesm2022/ngx-t-forms-calculated-field-rules.component-C5TPddVe.mjs +643 -0
  6. package/fesm2022/ngx-t-forms-calculated-field-rules.component-C5TPddVe.mjs.map +1 -0
  7. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-CICQaqz6.mjs +97 -0
  8. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-CICQaqz6.mjs.map +1 -0
  9. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-CzisLSIP.mjs +195 -0
  10. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-CzisLSIP.mjs.map +1 -0
  11. package/fesm2022/ngx-t-forms-data-source-picker.component-Dzz_o6fJ.mjs +261 -0
  12. package/fesm2022/ngx-t-forms-data-source-picker.component-Dzz_o6fJ.mjs.map +1 -0
  13. package/fesm2022/ngx-t-forms-date-picker-input-element.component-CYUbVyzP.mjs +85 -0
  14. package/fesm2022/ngx-t-forms-date-picker-input-element.component-CYUbVyzP.mjs.map +1 -0
  15. package/fesm2022/ngx-t-forms-date-range-picker-input-element.component-CmoquQGV.mjs +156 -0
  16. package/fesm2022/ngx-t-forms-date-range-picker-input-element.component-CmoquQGV.mjs.map +1 -0
  17. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-CLUOXreG.mjs +368 -0
  18. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-CLUOXreG.mjs.map +1 -0
  19. package/fesm2022/ngx-t-forms-document-picker.component-qObjcqhE.mjs +704 -0
  20. package/fesm2022/ngx-t-forms-document-picker.component-qObjcqhE.mjs.map +1 -0
  21. package/fesm2022/ngx-t-forms-editor-input-element.component-BLXlfb6F.mjs +294 -0
  22. package/fesm2022/ngx-t-forms-editor-input-element.component-BLXlfb6F.mjs.map +1 -0
  23. package/fesm2022/ngx-t-forms-editor-js-input.component-BQL0AH7H.mjs +240 -0
  24. package/fesm2022/ngx-t-forms-editor-js-input.component-BQL0AH7H.mjs.map +1 -0
  25. package/fesm2022/ngx-t-forms-file-upload-input-element.component-C7mMeEjF.mjs +205 -0
  26. package/fesm2022/ngx-t-forms-file-upload-input-element.component-C7mMeEjF.mjs.map +1 -0
  27. package/fesm2022/ngx-t-forms-form-input-selector.component-C9u8zq9B.mjs +86 -0
  28. package/fesm2022/ngx-t-forms-form-input-selector.component-C9u8zq9B.mjs.map +1 -0
  29. package/fesm2022/ngx-t-forms-form-json-view.component-856Hx1Bg.mjs +22 -0
  30. package/fesm2022/ngx-t-forms-form-json-view.component-856Hx1Bg.mjs.map +1 -0
  31. package/fesm2022/ngx-t-forms-form-payload-projection.component-CDkTuX9S.mjs +179 -0
  32. package/fesm2022/ngx-t-forms-form-payload-projection.component-CDkTuX9S.mjs.map +1 -0
  33. package/fesm2022/ngx-t-forms-form-section-stepper.component-Bs50-nEB.mjs +319 -0
  34. package/fesm2022/ngx-t-forms-form-section-stepper.component-Bs50-nEB.mjs.map +1 -0
  35. package/fesm2022/ngx-t-forms-forms-builder-menu.component-qrhM0jGL.mjs +379 -0
  36. package/fesm2022/ngx-t-forms-forms-builder-menu.component-qrhM0jGL.mjs.map +1 -0
  37. package/fesm2022/ngx-t-forms-geo-location.component-Bosp1UzR.mjs +124 -0
  38. package/fesm2022/ngx-t-forms-geo-location.component-Bosp1UzR.mjs.map +1 -0
  39. package/fesm2022/ngx-t-forms-getInputIcon-B4ADgevZ.mjs +31 -0
  40. package/fesm2022/ngx-t-forms-getInputIcon-B4ADgevZ.mjs.map +1 -0
  41. package/fesm2022/ngx-t-forms-image-capture-input-element.component-C1g7Z0cK.mjs +180 -0
  42. package/fesm2022/ngx-t-forms-image-capture-input-element.component-C1g7Z0cK.mjs.map +1 -0
  43. package/fesm2022/ngx-t-forms-index-dDSobs6A.mjs +2 -0
  44. package/fesm2022/ngx-t-forms-index-dDSobs6A.mjs.map +1 -0
  45. package/fesm2022/ngx-t-forms-input-custom.component-BkbHFAyR.mjs +105 -0
  46. package/fesm2022/ngx-t-forms-input-custom.component-BkbHFAyR.mjs.map +1 -0
  47. package/fesm2022/ngx-t-forms-input-editor.component-BPUOM9kQ.mjs +181 -0
  48. package/fesm2022/ngx-t-forms-input-editor.component-BPUOM9kQ.mjs.map +1 -0
  49. package/fesm2022/{ngx-t-forms-map-mat-options-keys-CbdW82su.mjs → ngx-t-forms-map-mat-options-keys-B6hJ7Io5.mjs} +12 -14
  50. package/fesm2022/ngx-t-forms-map-mat-options-keys-B6hJ7Io5.mjs.map +1 -0
  51. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-c7uZT1sr.mjs +66 -0
  52. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-c7uZT1sr.mjs.map +1 -0
  53. package/fesm2022/ngx-t-forms-mat-slider-editor.component-CTSBrM-j.mjs +211 -0
  54. package/fesm2022/ngx-t-forms-mat-slider-editor.component-CTSBrM-j.mjs.map +1 -0
  55. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-CcYiwx-8.mjs +165 -0
  56. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-CcYiwx-8.mjs.map +1 -0
  57. package/fesm2022/ngx-t-forms-missing-form-configs.component-DrnH8qdG.mjs +38 -0
  58. package/fesm2022/ngx-t-forms-missing-form-configs.component-DrnH8qdG.mjs.map +1 -0
  59. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-C_abEBQ5.mjs +38 -0
  60. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-C_abEBQ5.mjs.map +1 -0
  61. package/fesm2022/ngx-t-forms-mscoa-error-display.component-99DpVSy7.mjs +126 -0
  62. package/fesm2022/ngx-t-forms-mscoa-error-display.component-99DpVSy7.mjs.map +1 -0
  63. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-C0qsMfsq.mjs +336 -0
  64. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-C0qsMfsq.mjs.map +1 -0
  65. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-B1Z-IXSL.mjs +74 -0
  66. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-B1Z-IXSL.mjs.map +1 -0
  67. package/fesm2022/ngx-t-forms-multiple-input-input-element.component-C7y1OGPx.mjs +905 -0
  68. package/fesm2022/ngx-t-forms-multiple-input-input-element.component-C7y1OGPx.mjs.map +1 -0
  69. package/fesm2022/ngx-t-forms-ngx-t-forms-u_kigDid.mjs +19461 -0
  70. package/fesm2022/ngx-t-forms-ngx-t-forms-u_kigDid.mjs.map +1 -0
  71. package/fesm2022/ngx-t-forms-paginated-selection-table-AQZSMmhr.mjs +555 -0
  72. package/fesm2022/ngx-t-forms-paginated-selection-table-AQZSMmhr.mjs.map +1 -0
  73. package/fesm2022/ngx-t-forms-pipeline-generator.component-DmNSc5aw.mjs +748 -0
  74. package/fesm2022/ngx-t-forms-pipeline-generator.component-DmNSc5aw.mjs.map +1 -0
  75. package/fesm2022/ngx-t-forms-record-list-manager.component-CUMMvMch.mjs +358 -0
  76. package/fesm2022/ngx-t-forms-record-list-manager.component-CUMMvMch.mjs.map +1 -0
  77. package/fesm2022/ngx-t-forms-required-inputs.component-Ch2yNcIS.mjs +272 -0
  78. package/fesm2022/ngx-t-forms-required-inputs.component-Ch2yNcIS.mjs.map +1 -0
  79. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-C_aFtdvW.mjs +398 -0
  80. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-C_aFtdvW.mjs.map +1 -0
  81. package/fesm2022/ngx-t-forms-search-field.component-B2ZO7lqO.mjs +38 -0
  82. package/fesm2022/ngx-t-forms-search-field.component-B2ZO7lqO.mjs.map +1 -0
  83. package/fesm2022/ngx-t-forms-section-report.component-BxOhR6C0.mjs +98 -0
  84. package/fesm2022/ngx-t-forms-section-report.component-BxOhR6C0.mjs.map +1 -0
  85. package/fesm2022/ngx-t-forms-select-input-element.component-DbgZdNoe.mjs +150 -0
  86. package/fesm2022/ngx-t-forms-select-input-element.component-DbgZdNoe.mjs.map +1 -0
  87. package/fesm2022/ngx-t-forms-selection-options-editor.component-Dhln81DL.mjs +169 -0
  88. package/fesm2022/ngx-t-forms-selection-options-editor.component-Dhln81DL.mjs.map +1 -0
  89. package/fesm2022/ngx-t-forms-t-workflow-picker.component-leBokXvM.mjs +204 -0
  90. package/fesm2022/ngx-t-forms-t-workflow-picker.component-leBokXvM.mjs.map +1 -0
  91. package/fesm2022/ngx-t-forms-textarea-input-element.component-BEbXJjFA.mjs +95 -0
  92. package/fesm2022/ngx-t-forms-textarea-input-element.component-BEbXJjFA.mjs.map +1 -0
  93. package/fesm2022/ngx-t-forms-toggle-input-element.component-DDErRUJd.mjs +82 -0
  94. package/fesm2022/ngx-t-forms-toggle-input-element.component-DDErRUJd.mjs.map +1 -0
  95. package/fesm2022/ngx-t-forms-validators-config.component-oGjQVGE2.mjs +733 -0
  96. package/fesm2022/ngx-t-forms-validators-config.component-oGjQVGE2.mjs.map +1 -0
  97. package/fesm2022/ngx-t-forms-workflow-adjudication.component-CtU8dECN.mjs +1303 -0
  98. package/fesm2022/ngx-t-forms-workflow-adjudication.component-CtU8dECN.mjs.map +1 -0
  99. package/fesm2022/ngx-t-forms.mjs +2 -1
  100. package/fesm2022/ngx-t-forms.mjs.map +1 -1
  101. package/package.json +20 -18
  102. package/styles/_editor-mixins.scss +62 -0
  103. package/styles/_json-editor-syntax.scss +26 -0
  104. package/styles/_signature-pad.scss +26 -0
  105. package/styles/_tokens.scss +148 -0
  106. package/types/ngx-t-forms.d.ts +1767 -621
  107. package/fesm2022/ngx-t-forms-calculated-field-rules.component-D-SBMdYg.mjs +0 -313
  108. package/fesm2022/ngx-t-forms-calculated-field-rules.component-D-SBMdYg.mjs.map +0 -1
  109. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-1cpszpPN.mjs +0 -191
  110. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-1cpszpPN.mjs.map +0 -1
  111. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-DFdAVWTg.mjs +0 -207
  112. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-DFdAVWTg.mjs.map +0 -1
  113. package/fesm2022/ngx-t-forms-data-source-picker.component-DxORinAD.mjs +0 -204
  114. package/fesm2022/ngx-t-forms-data-source-picker.component-DxORinAD.mjs.map +0 -1
  115. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-DcWS1txl.mjs +0 -289
  116. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-DcWS1txl.mjs.map +0 -1
  117. package/fesm2022/ngx-t-forms-form-input-selector.component-B2QEnvkq.mjs +0 -134
  118. package/fesm2022/ngx-t-forms-form-input-selector.component-B2QEnvkq.mjs.map +0 -1
  119. package/fesm2022/ngx-t-forms-form-json-view.component-DePf44w6.mjs +0 -22
  120. package/fesm2022/ngx-t-forms-form-json-view.component-DePf44w6.mjs.map +0 -1
  121. package/fesm2022/ngx-t-forms-form-section-stepper.component-BTkcSjg7.mjs +0 -270
  122. package/fesm2022/ngx-t-forms-form-section-stepper.component-BTkcSjg7.mjs.map +0 -1
  123. package/fesm2022/ngx-t-forms-forms-builder-menu.component-Wamzf_sq.mjs +0 -345
  124. package/fesm2022/ngx-t-forms-forms-builder-menu.component-Wamzf_sq.mjs.map +0 -1
  125. package/fesm2022/ngx-t-forms-input-editor.component-D4xHO76K.mjs +0 -147
  126. package/fesm2022/ngx-t-forms-input-editor.component-D4xHO76K.mjs.map +0 -1
  127. package/fesm2022/ngx-t-forms-map-mat-options-keys-CbdW82su.mjs.map +0 -1
  128. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-DmTyO9Wi.mjs +0 -105
  129. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-DmTyO9Wi.mjs.map +0 -1
  130. package/fesm2022/ngx-t-forms-mat-slider-editor.component-DZ4TenrI.mjs +0 -109
  131. package/fesm2022/ngx-t-forms-mat-slider-editor.component-DZ4TenrI.mjs.map +0 -1
  132. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-DPyBYE4p.mjs +0 -155
  133. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-DPyBYE4p.mjs.map +0 -1
  134. package/fesm2022/ngx-t-forms-missing-form-configs.component-BRmnwAK6.mjs +0 -28
  135. package/fesm2022/ngx-t-forms-missing-form-configs.component-BRmnwAK6.mjs.map +0 -1
  136. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-D_umeAPL.mjs +0 -43
  137. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-D_umeAPL.mjs.map +0 -1
  138. package/fesm2022/ngx-t-forms-mscoa-error-display.component-CSX2NCNU.mjs +0 -116
  139. package/fesm2022/ngx-t-forms-mscoa-error-display.component-CSX2NCNU.mjs.map +0 -1
  140. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-B6IF8kGg.mjs +0 -296
  141. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-B6IF8kGg.mjs.map +0 -1
  142. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-BPkjsRmH.mjs +0 -83
  143. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-BPkjsRmH.mjs.map +0 -1
  144. package/fesm2022/ngx-t-forms-ngx-t-forms-D9qmig6g.mjs +0 -16844
  145. package/fesm2022/ngx-t-forms-ngx-t-forms-D9qmig6g.mjs.map +0 -1
  146. package/fesm2022/ngx-t-forms-pipeline-generator.component-DBJEyCbd.mjs +0 -613
  147. package/fesm2022/ngx-t-forms-pipeline-generator.component-DBJEyCbd.mjs.map +0 -1
  148. package/fesm2022/ngx-t-forms-record-list-manager.component-Dgs9lNSr.mjs +0 -269
  149. package/fesm2022/ngx-t-forms-record-list-manager.component-Dgs9lNSr.mjs.map +0 -1
  150. package/fesm2022/ngx-t-forms-required-inputs.component-CSIJvSHq.mjs +0 -190
  151. package/fesm2022/ngx-t-forms-required-inputs.component-CSIJvSHq.mjs.map +0 -1
  152. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-CY-JSkGs.mjs +0 -291
  153. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-CY-JSkGs.mjs.map +0 -1
  154. package/fesm2022/ngx-t-forms-section-report.component-12-KdKT6.mjs +0 -156
  155. package/fesm2022/ngx-t-forms-section-report.component-12-KdKT6.mjs.map +0 -1
  156. package/fesm2022/ngx-t-forms-selection-options-editor.component-Be3QAG_L.mjs +0 -186
  157. package/fesm2022/ngx-t-forms-selection-options-editor.component-Be3QAG_L.mjs.map +0 -1
  158. package/fesm2022/ngx-t-forms-t-workflow-picker.component-a4f1r8gH.mjs +0 -187
  159. package/fesm2022/ngx-t-forms-t-workflow-picker.component-a4f1r8gH.mjs.map +0 -1
  160. package/fesm2022/ngx-t-forms-validators-config.component-B3j9Dmgu.mjs +0 -215
  161. package/fesm2022/ngx-t-forms-validators-config.component-B3j9Dmgu.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-t-forms-document-picker.component-qObjcqhE.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/document-picker/document-loader.service.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/document-picker/core/document-picker-reactive-input/document-picker-reactive-input.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/document-picker/core/document-picker-reactive-input/document-picker-reactive-input.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/document-picker/document-picker.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/document-picker/document-picker.component.html"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\r\nimport { Observable, of, throwError } from 'rxjs';\r\nimport { catchError, map, take } from 'rxjs/operators';\r\nimport {\r\n APIDataFetchingConfigurationInterface,\r\n DataSources,\r\n IStoreFunctions,\r\n MongoDbPipeLineConfigInterface\r\n} from 'ngx-t-forms-types';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../injection-tokens';\r\n\r\n/** Sort map: key -> 1 (asc) | -1 (desc) */\r\nexport type DocumentSortMap = Record<string, 1 | -1>;\r\n\r\n/** Default sort when none provided: updatedAt descending. */\r\nexport const DEFAULT_SORT: DocumentSortMap = { updatedAt: -1 };\r\n\r\nexport interface DocumentLoaderParams {\r\n sourceType: DataSources | 'default';\r\n documentsSource: APIDataFetchingConfigurationInterface | MongoDbPipeLineConfigInterface | undefined;\r\n workflowId: string;\r\n parentFormValue: Record<string, any>;\r\n formBuilder: IStoreFunctions;\r\n /** Pagination params for all sources. Required for server-side pagination. */\r\n page?: number;\r\n itemsPerPage?: number;\r\n sort?: DocumentSortMap;\r\n searchKey?: string;\r\n /** Filter object: key is dot-joined path (from primaryIdentifierKey) or '_id'; value is the filter value. */\r\n filter?: Record<string, unknown>;\r\n}\r\n\r\nexport interface DocumentFooterConfig {\r\n totalPages: number;\r\n totalItems: number;\r\n itemsPerPage: number;\r\n currentPage?: number;\r\n /** When present and non-empty, server maintains sort; otherwise use local sort. */\r\n sortBy?: DocumentSortMap;\r\n}\r\n\r\nexport interface LoadDocumentsResult {\r\n documents: Record<string, any>[];\r\n footerConfig?: DocumentFooterConfig;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Abstracts document fetching from different data sources (API, MongoDB, default).\r\n * For default source with getWorkflowDocuments, supports server-side pagination, sort, and search\r\n * (aligned with getTransactionsWithSchema / getWorkflowDocuments).\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class DocumentLoaderService {\r\n private readonly formsConfig = inject(NGX_T_FORMS_CONFIG_TOKEN, { optional: true });\r\n\r\n loadDocuments(params: DocumentLoaderParams): Observable<LoadDocumentsResult> {\r\n const { sourceType, documentsSource, workflowId } = params;\r\n\r\n if (sourceType === DataSources.Api && documentsSource) {\r\n return this.loadFromApi(params);\r\n }\r\n if (sourceType === DataSources.MongoDb && documentsSource) {\r\n return this.loadFromMongoDb(params);\r\n }\r\n if (sourceType === 'default') {\r\n return this.loadFromDefault(workflowId, params);\r\n }\r\n\r\n return of({ documents: [] });\r\n }\r\n\r\n /**\r\n * Normalizes API/MongoDB/default responses to LoadDocumentsResult.\r\n * Extracts documents from formValues, documents, results, or raw array.\r\n * Validates footerConfig. Returns empty documents + error on malformed response.\r\n */\r\n private normalizeToLoadDocumentsResult(response: unknown): LoadDocumentsResult {\r\n if (response == null) {\r\n return { documents: [] };\r\n }\r\n const res = response as Record<string, unknown>;\r\n const rawDocs: unknown = res['formValues'] ?? res['documents'] ?? res['results'] ?? (Array.isArray(response) ? response : undefined);\r\n if (!Array.isArray(rawDocs)) {\r\n return {\r\n documents: [],\r\n error: 'Invalid response format: expected formValues, documents, or results array',\r\n };\r\n }\r\n const documents = this.flattenListDocuments(rawDocs as Record<string, any>[]);\r\n const footerConfig = this.validateFooterConfig(res['footerConfig']);\r\n return { documents, footerConfig };\r\n }\r\n\r\n private validateFooterConfig(fc: unknown): DocumentFooterConfig | undefined {\r\n if (!fc || typeof fc !== 'object') return undefined;\r\n const o = fc as Record<string, unknown>;\r\n const totalPages = o['totalPages'] as number;\r\n const totalItems = o['totalItems'] as number;\r\n const itemsPerPage = o['itemsPerPage'] as number;\r\n if (typeof totalPages !== 'number' || typeof totalItems !== 'number' || typeof itemsPerPage !== 'number') {\r\n return undefined;\r\n }\r\n return {\r\n totalPages,\r\n totalItems,\r\n itemsPerPage,\r\n currentPage: typeof o['currentPage'] === 'number' ? (o['currentPage'] as number) : undefined,\r\n sortBy: (o['sortBy'] && typeof o['sortBy'] === 'object')\r\n ? (o['sortBy'] as DocumentSortMap)\r\n : undefined,\r\n };\r\n }\r\n\r\n private loadFromApi(params: DocumentLoaderParams): Observable<LoadDocumentsResult> {\r\n const { documentsSource, workflowId, parentFormValue, formBuilder } = params;\r\n const config = documentsSource as APIDataFetchingConfigurationInterface;\r\n const missingInputs: string[] = [];\r\n const postData = (config.backEndConfig?.minimumInputRequired ?? []).reduce((acc, curr) => {\r\n if (curr.type === 'default') {\r\n acc[curr.name] = curr.defaultValue;\r\n return acc;\r\n }\r\n if (curr.type === 'mapto' && parentFormValue[curr.name] !== undefined) {\r\n acc[curr.name] = parentFormValue[curr.name];\r\n return acc;\r\n }\r\n missingInputs.push(curr.name);\r\n return acc;\r\n }, {} as Record<string, any>);\r\n postData['workflowId'] = workflowId;\r\n postData['page'] = params.page ?? 1;\r\n postData['itemsPerPage'] = params.itemsPerPage ?? 10;\r\n postData['sort'] = (params.sort && Object.keys(params.sort).length > 0) ? params.sort : DEFAULT_SORT;\r\n postData['searchKey'] = params.searchKey;\r\n if (params.filter && Object.keys(params.filter).length > 0) {\r\n postData['filter'] = params.filter;\r\n }\r\n\r\n if (missingInputs.length > 0) {\r\n return throwError(() => new Error(`Missing inputs: ${missingInputs.join(', ')}`));\r\n }\r\n\r\n return formBuilder.httpPostDataFunction(config.httpEndPoint, postData).pipe(\r\n take(1),\r\n map((response) => this.normalizeToLoadDocumentsResult(response)),\r\n catchError((err) => {\r\n const msg = err?.error?.message ?? (err instanceof Error ? err.message : 'Unknown error');\r\n return of({ documents: [], error: msg });\r\n })\r\n );\r\n }\r\n\r\n private loadFromMongoDb(params: DocumentLoaderParams): Observable<LoadDocumentsResult> {\r\n const { documentsSource, formBuilder } = params;\r\n const config = documentsSource as MongoDbPipeLineConfigInterface;\r\n if (!config.pipeline || config.pipeline.length === 0) {\r\n return throwError(() => new Error('No pipeline found'));\r\n }\r\n if (!config.workflowId) {\r\n return throwError(() => new Error('No workflow id found'));\r\n }\r\n\r\n const paginationParams = {\r\n page: params.page ?? 1,\r\n itemsPerPage: params.itemsPerPage ?? 10,\r\n sort: (params.sort && Object.keys(params.sort).length > 0) ? params.sort : DEFAULT_SORT,\r\n searchKey: params.searchKey,\r\n ...(params.filter && Object.keys(params.filter).length > 0 ? { filter: params.filter } : {}),\r\n };\r\n const runPipeline = formBuilder.runMongoDbPipeLine as (p: unknown[], w: string, opts?: unknown) => Observable<unknown>;\r\n return runPipeline(config.pipeline, config.workflowId, paginationParams).pipe(\r\n take(1),\r\n map((data) => this.normalizeToLoadDocumentsResult(data)),\r\n catchError((err) => {\r\n const msg = err?.error?.message ?? (err instanceof Error ? err.message : 'Unknown error');\r\n return of({ documents: [], error: msg });\r\n })\r\n );\r\n }\r\n\r\n private loadFromDefault(\r\n workflowId: string,\r\n params: DocumentLoaderParams\r\n ): Observable<LoadDocumentsResult> {\r\n // Prefer formBuilder from params; fallback to injected config when params.formBuilder\r\n // lacks getWorkflowDocuments (e.g. form builder preview, test-app, or partial config)\r\n const getWorkflowDocuments =\r\n this.formsConfig?.formBuilder?.getWorkflowDocuments;\r\n\r\n \r\n if (typeof getWorkflowDocuments !== 'function') {\r\n\r\n return of({ documents: [] });\r\n }\r\n const page = params.page ?? 1;\r\n const itemsPerPage = params.itemsPerPage ?? 10;\r\n const sort = (params.sort && Object.keys(params.sort).length > 0) ? params.sort : DEFAULT_SORT;\r\n const searchKey = params.searchKey;\r\n const filter = params.filter;\r\n return getWorkflowDocuments(workflowId, page, itemsPerPage, sort, searchKey, filter).pipe(\r\n take(1),\r\n map((res) => this.normalizeToLoadDocumentsResult(res))\r\n );\r\n }\r\n\r\n /**\r\n * Flatten WorkFlowDocumentInterface list rows so form fields are at top level.\r\n * Matches getSelectedDocument structure so row[col.formControlName] works for all columns.\r\n * Attaches _originalDoc so primaryIdentifierKey can resolve against the original nested structure\r\n * (e.g. { _id, reference, form: { customId } }) when the flattened row has form keys at top level.\r\n */\r\n private flattenListDocuments(docs: Record<string, any>[]): Record<string, any>[] {\r\n return docs.map((doc) => {\r\n const form = doc['form'];\r\n if (!form || typeof form !== 'object') return { ...doc, _originalDoc: doc };\r\n const { form: _f, ...rest } = doc;\r\n return { ...rest, ...form, _originalDoc: doc };\r\n });\r\n }\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\r\nimport { DataSources, FormBuilderFunctions, FormColumnInputs } from 'ngx-t-forms-types';\r\nimport {\r\n DEFAULT_SORT,\r\n DocumentFooterConfig,\r\n DocumentLoaderParams,\r\n DocumentLoaderService,\r\n DocumentSortMap,\r\n} from '../../document-loader.service';\r\nimport { FormControl, FormGroup, NgControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../../injection-tokens';\r\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\r\nimport { DocumentLitsLabelConfigInterfaceValueType, IWorkflowDocumentPickerConfig, IWorkflowDocListCols, TreeNode } from 'ngx-t-forms-types';\r\nimport { catchError, debounceTime, distinctUntilChanged, finalize, map, of, take, tap } from 'rxjs';\r\nimport { FormatDataPipe } from '../../../../../../shared/pipes/format-Data.pipe';\r\nimport { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatSort, MatSortModule } from '@angular/material/sort';\r\nimport { MatTableDataSource } from '@angular/material/table';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { returnMappedPathValue } from '../../../../../../services/core/t-form-section-controller/Functions/getValueFromPathMap';\r\n\r\nconst customInputConfig: BaseCustomInputConfig = {\r\n controlType: 'lib-document-picker-reactive-input',\r\n nextId: 0,\r\n};\r\n\r\n/**\r\n * Document Picker: Link workflow transactions via search, sort, and selection.\r\n *\r\n * User Story: As a Process Coordinator, I want to search, sort, and select specific workflow\r\n * transactions from a paginated list, so that I can accurately link related records.\r\n *\r\n * AC1 Dynamic loading: Reloads when workflowId/inputConfig changes.\r\n * AC2 Search: Refreshes list and resets to page 1 on keyword change; restores full list when cleared.\r\n * AC3 Sort/Pagination: Sort resets to page 1; pagination fetches subset while preserving search/sort.\r\n * AC4 Selection: Selected transaction shown clearly; deselect restores paginated view.\r\n * AC5 Empty/Error: \"No transactions found\" when empty; error state with retry option.\r\n */\r\n@Component({\r\n selector: 'lib-document-picker-reactive-input',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatCardModule,\r\n MatIconModule,\r\n MatProgressSpinnerModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatButtonModule,\r\n MatTooltipModule,\r\n MatTableModule,\r\n MatSortModule,\r\n MatPaginatorModule,\r\n MatDividerModule,\r\n MatCheckboxModule,\r\n MatRadioModule,\r\n FormatDataPipe,\r\n ],\r\n templateUrl: './document-picker-reactive-input.component.html',\r\n styleUrl: './document-picker-reactive-input.component.css',\r\n host: {\r\n '[class.floating]': 'shouldLabelFloat',\r\n '[id]': 'id',\r\n },\r\n providers: [{ provide: MatFormFieldControl, useExisting: DocumentPickerReactiveInputComponent }],\r\n})\r\nexport class DocumentPickerReactiveInputComponent extends BaseCustomInput<unknown | unknown[]> implements AfterViewInit {\r\n readonly formBuilderFunctions = input<FormBuilderFunctions | undefined>(undefined);\r\n readonly searchPlaceholder = input<string>('Search transactions…');\r\n readonly emptyMessage = input<string>('No transactions found');\r\n readonly inputConfig = input<FormColumnInputs | undefined>(undefined);\r\n\r\n readonly searchFormControl = new FormControl('');\r\n readonly dataSource = new MatTableDataSource<Record<string, any>>([]);\r\n\r\n protected readonly sort = viewChild(MatSort);\r\n protected readonly paginator = viewChild(MatPaginator);\r\n\r\n readonly #formsConfig = inject(NGX_T_FORMS_CONFIG_TOKEN);\r\n readonly #documentLoader = inject(DocumentLoaderService);\r\n readonly #cdr = inject(ChangeDetectorRef);\r\n readonly #destroyRef = inject(DestroyRef);\r\n\r\n #pickerConfig: IWorkflowDocumentPickerConfig | undefined;\r\n #lastInputConfig: FormColumnInputs | undefined;\r\n _cols: IWorkflowDocListCols[] = [];\r\n _loadingCols = false;\r\n\r\n /** Documents loaded in memory. For client-side: full list; for server-side: current page only. */\r\n #documentOptions: Record<string, any>[] = [];\r\n\r\n /** Last loaded workflowId/sourceType - only reload when these change. */\r\n #lastLoadedWorkflowId: string | undefined;\r\n #lastLoadedSourceType: DataSources | 'default' | undefined;\r\n\r\n /** Server-side pagination (getWorkflowDocuments). When true, page/sort/search trigger API calls. */\r\n footerConfig: DocumentFooterConfig | undefined;\r\n serverPage = 1;\r\n serverPageSize = 5;\r\n serverSort: DocumentSortMap = { ...DEFAULT_SORT };\r\n\r\n loadingData = false;\r\n dataLoadingError: string | undefined;\r\n selectedDocument: Record<string, any> | undefined = undefined;\r\n\r\n constructor() {\r\n super(\r\n inject(NgControl, { self: true, optional: true }) as NgControl,\r\n inject<ElementRef<HTMLElement>>(ElementRef),\r\n customInputConfig,\r\n );\r\n this.#listenToStateChanges();\r\n this.#setupFilterPredicate();\r\n this.#setupSearchSubscription();\r\n\r\n // Replaces the previous @Input setter side-effect: react to inputConfig changes.\r\n effect(() => {\r\n const value = this.inputConfig();\r\n if (_isEqual(this.#lastInputConfig, value)) return;\r\n this.#lastInputConfig = value;\r\n this.loadCols();\r\n });\r\n }\r\n\r\n get isMultiSelect(): boolean {\r\n return this.inputConfig()?.allowMultipleSelection === true;\r\n }\r\n\r\n get primaryIdentifierKey(): TreeNode[] | string | undefined {\r\n return this.inputConfig()?.workflowPickerConfig?.primaryIdentifierKey;\r\n }\r\n\r\n /**\r\n * Returns the row identifier. Uses returnMappedPathValue when primaryIdentifierKey is set,\r\n * resolving against the original document (row._originalDoc) for nested paths like form.customId,\r\n * since the table row is flattened. Fallback: _id or id.\r\n */\r\n getRowId(row: Record<string, any>): unknown {\r\n const pk = this.primaryIdentifierKey;\r\n if (pk != null && pk !== '') {\r\n const doc = row['_originalDoc'] ?? row;\r\n return returnMappedPathValue(pk as TreeNode[], doc);\r\n }\r\n return row['_id'] ?? row['id'];\r\n }\r\n\r\n /**\r\n * Builds a filter object for the selected value.\r\n * Key: dot-joined path from primaryIdentifierKey (e.g. form.customId) or '_id' when not set.\r\n * Value: the current value.\r\n */\r\n #buildFilterForValue(): Record<string, unknown> | undefined {\r\n const val = this.value;\r\n if (val == null || val === '') return undefined;\r\n const pk = this.primaryIdentifierKey;\r\n let filterKey = '_id';\r\n if (pk != null && pk !== '') {\r\n if (typeof pk === 'string') {\r\n filterKey = pk;\r\n } else if (Array.isArray(pk) && pk.length > 0) {\r\n filterKey = pk\r\n .map((n) => (typeof n === 'object' && n != null && (n).key != null ? String((n).key) : String(n)))\r\n .join('.');\r\n }\r\n }\r\n return { [filterKey]: val };\r\n }\r\n\r\n /** Builds a minimal row from an id for fallback when the row is not in documentOptions/dataSource. */\r\n #buildFallbackRowFromId(id: unknown): Record<string, any> {\r\n const pk = this.primaryIdentifierKey;\r\n if (!pk || !Array.isArray(pk) || pk.length === 0) {\r\n return { _id: id, id };\r\n }\r\n const obj: Record<string, any> = {};\r\n let current: Record<string, any> = obj;\r\n for (let i = 0; i < pk.length; i++) {\r\n const node = pk[i];\r\n const key = typeof node === 'object' && node != null && node.key != null ? String(node.key) : String(node);\r\n const isLast = i === pk.length - 1;\r\n if (isLast) {\r\n current[key] = id;\r\n } else {\r\n current[key] = {};\r\n current = current[key];\r\n }\r\n }\r\n return obj;\r\n }\r\n\r\n /** Returns selected id(s) as strings. Handles value from form/API (string, number, ObjectId, etc.). */\r\n getSelectedIds(): string[] {\r\n const v = this.value;\r\n if (v == null || v === '') return [];\r\n if (Array.isArray(v)) return v.map((x) => (x != null ? String(x) : '')).filter(Boolean);\r\n return [String(v)];\r\n }\r\n\r\n isRowSelected(row: Record<string, any>): boolean {\r\n const id = this.getRowId(row);\r\n return this.getSelectedIds().some((sid) => sid == id || String(id) === sid);\r\n }\r\n\r\n override get empty(): boolean {\r\n const n = this.value;\r\n if (n === null || n === undefined) return true;\r\n if (this.isMultiSelect) {\r\n return Array.isArray(n) && n.length === 0;\r\n }\r\n return n === '';\r\n }\r\n override get shouldLabelFloat(): boolean {\r\n return true;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const sortRef = this.sort();\r\n if (sortRef) {\r\n this.dataSource.sort = sortRef;\r\n sortRef.sortChange.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((s) => {\r\n if (this.footerConfig && s.active && s.direction) {\r\n this.onSortChange(s.active, s.direction as 'asc' | 'desc');\r\n }\r\n });\r\n }\r\n this.#attachPaginatorIfNeeded();\r\n }\r\n\r\n /** Attach paginator when client-side (not server-side). Server-side uses length from footerConfig. */\r\n #attachPaginatorIfNeeded(): void {\r\n if (this.footerConfig) return; // Server-side: paginator length handled by template\r\n const paginatorRef = this.paginator();\r\n if (paginatorRef && this.dataSource.paginator !== paginatorRef) {\r\n this.dataSource.paginator = paginatorRef;\r\n this.#cdr.markForCheck();\r\n }\r\n }\r\n\r\n #setupFilterPredicate(): void {\r\n this.dataSource.filterPredicate = (doc: Record<string, any>, filter: string): boolean => {\r\n const term = filter?.trim();\r\n if (!term) return true;\r\n if (typeof doc !== 'object' || doc === null) return false;\r\n const regex = new RegExp(term.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'), 'i');\r\n return Object.values(doc).some(value =>\r\n typeof value === 'string' && regex.test(value)\r\n );\r\n };\r\n }\r\n\r\n #setupSearchSubscription(): void {\r\n this.searchFormControl.valueChanges.pipe(\r\n debounceTime(400),\r\n map((term) => term?.trim() ?? ''),\r\n distinctUntilChanged((a, b) => a === b),\r\n takeUntilDestroyed(this.#destroyRef),\r\n ).subscribe((filter) => {\r\n if (this.footerConfig) {\r\n this.serverPage = 1;\r\n this.loadDocumentOptions(true);\r\n } else {\r\n this.dataSource.filter = filter;\r\n this.dataSource.paginator?.firstPage();\r\n }\r\n });\r\n }\r\n\r\n get parentFormGroup(): FormGroup | null {\r\n return this.ngControl?.control?.parent as FormGroup;\r\n }\r\n\r\n get displayedColumns(): string[] {\r\n return this._cols.map((col) => col.formControlName);\r\n }\r\n\r\n /** Page index for paginator: server-side uses serverPage; client-side uses paginator's current page. */\r\n get pageIndexForDisplay(): number {\r\n return this.footerConfig ? this.serverPage - 1 : (this.paginator()?.pageIndex ?? 0);\r\n }\r\n\r\n /** Page size for paginator: server-side uses serverPageSize; client-side uses paginator's current size. */\r\n get pageSizeForDisplay(): number {\r\n return this.footerConfig ? this.serverPageSize : (this.paginator()?.pageSize ?? 5);\r\n }\r\n\r\n /** True when server echoes sort in footerConfig; false when sortBy is empty → use local sort. */\r\n get serverMaintainsSort(): boolean {\r\n const sb = this.footerConfig?.sortBy;\r\n return !!(sb && typeof sb === 'object' && Object.keys(sb).length > 0);\r\n }\r\n\r\n /**\r\n * Documents load only when workflowId or documentSourceType changes.\r\n * Search, pagination, sorting operate client-side on already-loaded data.\r\n */\r\n #shouldLoadDocuments(forceRefresh: boolean): boolean {\r\n if (forceRefresh) return true;\r\n const pickerConfig = this.inputConfig()?.workflowPickerConfig;\r\n\r\n const workflowId = pickerConfig?.workflowId ?? '';\r\n const sourceType = (pickerConfig?.documentSourceType as DataSources | 'default') ?? 'default';\r\n if (!workflowId || !sourceType) return false;\r\n return (\r\n this.#lastLoadedWorkflowId !== workflowId || this.#lastLoadedSourceType !== sourceType\r\n );\r\n }\r\n\r\n #listenToStateChanges(): void {\r\n this.stateChanges.pipe(\r\n takeUntilDestroyed(this.#destroyRef),\r\n tap(() => {\r\n if (this.isMultiSelect) {\r\n this.dataSource.data = [...this.#documentOptions];\r\n this.#cdr.markForCheck();\r\n return;\r\n }\r\n const hasValue = !!this.value;\r\n const docIdMatches =\r\n this.selectedDocument != null && this.getRowId(this.selectedDocument) == this.value;\r\n\r\n if (!docIdMatches && hasValue) {\r\n // Use filter so the selected document appears on the first page\r\n this.serverPage = 1;\r\n this.loadDocumentOptions(true);\r\n } else if (!docIdMatches && !hasValue) {\r\n this.restoreDocumentList();\r\n }\r\n }),\r\n ).subscribe();\r\n }\r\n\r\n /** Restore list view from memory (no API call). Use when value is cleared or user deselects. */\r\n restoreDocumentList(): void {\r\n this.selectedDocument = undefined;\r\n this.dataSource.data = [...this.#documentOptions];\r\n this.loadingData = false;\r\n this.dataLoadingError = undefined;\r\n setTimeout(() => this.#attachPaginatorIfNeeded(), 0);\r\n this.#cdr.markForCheck();\r\n }\r\n\r\n loadCols(): void {\r\n const newConfig = this.#lastInputConfig?.workflowPickerConfig;\r\n\r\n if (_isEqual(this.#pickerConfig, newConfig)) return;\r\n\r\n if (!newConfig?.workflowId) {\r\n this.#pickerConfig = newConfig;\r\n this._cols = [];\r\n this.#documentOptions = [];\r\n this.dataSource.data = [];\r\n this.#lastLoadedWorkflowId = undefined;\r\n this.#lastLoadedSourceType = undefined;\r\n this.footerConfig = undefined;\r\n this.serverPage = 1;\r\n this.serverPageSize = 10;\r\n this.serverSort = { ...DEFAULT_SORT };\r\n this.selectedDocument = undefined;\r\n this.dataLoadingError = undefined;\r\n this.#cdr.markForCheck();\r\n return;\r\n }\r\n\r\n this.#pickerConfig = newConfig;\r\n this.#lastLoadedWorkflowId = undefined;\r\n this.#lastLoadedSourceType = undefined;\r\n this.footerConfig = undefined;\r\n this.serverPage = 1;\r\n this._loadingCols = true;\r\n this.#cdr.markForCheck();\r\n\r\n this.#formsConfig.formBuilder.getWorkflowCols(newConfig.workflowId).pipe(\r\n take(1),\r\n tap((cols) => {\r\n this._cols = [\r\n { label: '', formControlName: 'icons' },\r\n { label: 'reference', formControlName: 'reference' },\r\n { label: 'Updated', formControlName: 'updatedAt', type: DocumentLitsLabelConfigInterfaceValueType.date },\r\n ...cols,\r\n { label: '', formControlName: 'actions' },\r\n ];\r\n this.loadDocumentOptions();\r\n }),\r\n catchError(() => {\r\n this._cols = [];\r\n return of([]);\r\n }),\r\n finalize(() => {\r\n this._loadingCols = false;\r\n this.#cdr.markForCheck();\r\n }),\r\n takeUntilDestroyed(this.#destroyRef),\r\n ).subscribe();\r\n }\r\n\r\n /**\r\n * Load documents only when workflowId or documentSourceType changes.\r\n * Called from: loadCols (config change), refreshDocuments (user refresh).\r\n */\r\n loadDocumentOptions(forceRefresh = false): void {\r\n const pickerConfig = this.inputConfig()?.workflowPickerConfig;\r\n const workflowId = pickerConfig?.workflowId ?? '';\r\n const sourceType = (pickerConfig?.documentSourceType as DataSources | 'default') ?? 'default';\r\n const newSource = pickerConfig?.documentsSource;\r\n if (!sourceType) return;\r\n if (!forceRefresh && !this.#shouldLoadDocuments(false)) return;\r\n\r\n this.#lastLoadedWorkflowId = workflowId;\r\n this.#lastLoadedSourceType = sourceType;\r\n this.loadingData = true;\r\n this.dataLoadingError = undefined;\r\n this.#cdr.markForCheck();\r\n\r\n const effectiveSort = (this.serverSort && Object.keys(this.serverSort).length > 0) ? this.serverSort : DEFAULT_SORT;\r\n const filter = !this.isMultiSelect && this.value ? this.#buildFilterForValue() : undefined;\r\n const parentFormValue = {\r\n ...(this.parentFormGroup?.value ?? {}),\r\n page: this.serverPage,\r\n itemsPerPage: this.serverPageSize,\r\n sort: effectiveSort,\r\n searchKey: this.searchFormControl.value?.trim() || undefined,\r\n ...(filter ? { filter } : {}),\r\n };\r\n const params: DocumentLoaderParams = {\r\n sourceType,\r\n documentsSource: newSource,\r\n workflowId,\r\n parentFormValue,\r\n formBuilder: this.#formsConfig.formBuilder,\r\n page: this.serverPage,\r\n itemsPerPage: this.serverPageSize,\r\n sort: effectiveSort,\r\n searchKey: this.searchFormControl.value?.trim() || undefined,\r\n filter,\r\n };\r\n\r\n this.#documentLoader.loadDocuments(params).pipe(\r\n take(1),\r\n tap((result) => {\r\n const documents = result.documents;\r\n this.#documentOptions = documents;\r\n this.footerConfig = result.footerConfig;\r\n this.dataLoadingError = result.error;\r\n if (this.isMultiSelect) {\r\n this.dataSource.data = [...this.#documentOptions];\r\n setTimeout(() => this.#attachPaginatorIfNeeded(), 0);\r\n } else if (this.value) {\r\n const matchingDoc = documents.find((d) => this.getRowId(d) == this.value);\r\n const rowFromCurrent = !matchingDoc && this.dataSource.data?.length\r\n ? this.dataSource.data.find((d) => this.getRowId(d) == this.value)\r\n : null;\r\n const displayDoc = matchingDoc ?? rowFromCurrent ?? this.#buildFallbackRowFromId(this.value);\r\n this.selectedDocument = matchingDoc ?? rowFromCurrent ?? undefined;\r\n this.dataSource.data = [displayDoc];\r\n setTimeout(() => this.#attachPaginatorIfNeeded(), 0);\r\n } else {\r\n this.selectedDocument = undefined;\r\n this.dataSource.data = [...this.#documentOptions];\r\n setTimeout(() => this.#attachPaginatorIfNeeded(), 0);\r\n }\r\n }),\r\n catchError((error) => {\r\n this.dataLoadingError =\r\n error?.error?.message ?? (error instanceof Error ? error.message : 'Unknown error');\r\n this.#documentOptions = [];\r\n this.footerConfig = undefined;\r\n this.dataSource.data = [];\r\n return of({ documents: [] });\r\n }),\r\n finalize(() => {\r\n this.loadingData = false;\r\n this.#cdr.markForCheck();\r\n }),\r\n takeUntilDestroyed(this.#destroyRef),\r\n ).subscribe();\r\n }\r\n\r\n refreshDocuments(): void {\r\n this.#lastLoadedWorkflowId = undefined;\r\n this.#lastLoadedSourceType = undefined;\r\n this.loadDocumentOptions(true);\r\n }\r\n\r\n /** Server-side: handle paginator page/pageSize change. */\r\n onPageChange(event: { pageIndex: number; pageSize: number }): void {\r\n if (!this.footerConfig) return;\r\n this.serverPage = event.pageIndex + 1;\r\n this.serverPageSize = event.pageSize;\r\n this.loadDocumentOptions(true);\r\n }\r\n\r\n /** Server-side: handle sort change. */\r\n onSortChange(active: string, direction: 'asc' | 'desc'): void {\r\n if (!this.footerConfig || !active) return;\r\n this.serverSort = { [active]: direction === 'asc' ? 1 : -1 };\r\n this.serverPage = 1;\r\n this.loadDocumentOptions(true);\r\n }\r\n\r\n clearSearch(): void {\r\n this.searchFormControl.setValue('');\r\n }\r\n\r\n onRadioChange(event: { value: string }): void {\r\n const id = event?.value;\r\n if (id == null) return;\r\n const row =\r\n this.#documentOptions.find((r) => this.getRowId(r) == id) ??\r\n this.dataSource.data.find((r) => this.getRowId(r) == id);\r\n this.selectRow(row ?? this.#buildFallbackRowFromId(id));\r\n }\r\n\r\n /** Handle click on radio: if already selected, deselect (radios don't fire change when re-clicked). */\r\n onRadioClick(row: Record<string, any>, event: MouseEvent): void {\r\n if (this.isRowSelected(row)) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.selectRow(row);\r\n }\r\n }\r\n\r\n /** Handle click on row: toggle selection (select or deselect). Ignores clicks on buttons/controls. */\r\n onRowClick(row: Record<string, any>, event: MouseEvent): void {\r\n const cfg = this.inputConfig();\r\n if (!!cfg?.disabled || !!cfg?.readonly) return;\r\n const target = event.target as HTMLElement;\r\n if (target.closest('button, [mat-icon-button], .mat-mdc-radio-button')) return;\r\n this.selectRow(row);\r\n }\r\n\r\n // Row parameter mirrors `getRowId` / `isRowSelected` which use `Record<string, any>` to match\r\n // the upstream `MatTableDataSource<Record<string, any>>` declaration.\r\n selectRow(row: Record<string, any>): void {\r\n const id = this.getRowId(row);\r\n const idStr = id != null ? String(id) : undefined;\r\n\r\n if (this.isMultiSelect) {\r\n const ids = [...this.getSelectedIds()];\r\n const idx = ids.indexOf(idStr ?? '');\r\n if (idx >= 0) {\r\n ids.splice(idx, 1);\r\n } else if (idStr != null) {\r\n ids.push(idStr);\r\n }\r\n this.value = ids.length ? ids : null;\r\n this.onChange(this.value);\r\n this.onTouched();\r\n this.#cdr.markForCheck();\r\n return;\r\n }\r\n\r\n const isDeselecting = this.isRowSelected(row);\r\n this.selectedDocument = undefined;\r\n this.value = isDeselecting ? null : (idStr ?? null);\r\n this.onChange(this.value);\r\n this.onTouched();\r\n\r\n if (isDeselecting) {\r\n this.serverPage = 1;\r\n this.loadDocumentOptions(true);\r\n }\r\n }\r\n}\r\n","<mat-card class=\"doc-picker-card\">\r\n <header class=\"doc-picker-header\">\r\n @if (!inputConfig()?.disabled && !inputConfig()?.readonly && !selectedDocument && !dataLoadingError) {\r\n <div class=\"doc-picker-toolbar\">\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"doc-picker-search\">\r\n <input matInput [placeholder]=\"searchPlaceholder()\" [formControl]=\"searchFormControl\"\r\n [attr.aria-label]=\"searchPlaceholder()\">\r\n @if (searchFormControl.value) {\r\n <button mat-icon-button matSuffix (click)=\"clearSearch()\" type=\"button\"\r\n aria-label=\"Clear search\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n } @else {\r\n <mat-icon matSuffix>search</mat-icon>\r\n }\r\n </mat-form-field>\r\n @if (isMultiSelect && getSelectedIds().length > 0) {\r\n <span class=\"doc-picker-selection-badge\" role=\"status\" aria-live=\"polite\">\r\n {{ getSelectedIds().length }} selected\r\n </span>\r\n }\r\n </div>\r\n }\r\n </header>\r\n\r\n @if (dataLoadingError) {\r\n <div class=\"doc-picker-error\">\r\n <mat-icon color=\"warn\">error</mat-icon>\r\n <span class=\"doc-picker-error-text\">{{ dataLoadingError }}</span>\r\n @if (!inputConfig()?.disabled && !inputConfig()?.readonly) {\r\n <button mat-stroked-button color=\"warn\" (click)=\"refreshDocuments()\" class=\"doc-picker-retry\"\r\n aria-label=\"Retry loading documents\">\r\n <mat-icon>refresh</mat-icon>\r\n Retry\r\n </button>\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"doc-picker-body\">\r\n @if (!inputConfig()?.disabled && !inputConfig()?.readonly && !selectedDocument) {\r\n <div class=\"doc-picker-helper\">\r\n <mat-icon class=\"doc-picker-helper-icon\" color=\"primary\">info</mat-icon>\r\n <span><strong>{{ isMultiSelect ? 'Link transactions' : 'Link a transaction' }}</strong> — Search or sort to find {{ isMultiSelect ? 'them' : 'one' }}, then {{ isMultiSelect ? 'check the box' : 'select the radio' }} to select {{ isMultiSelect ? 'them' : 'it' }}.</span>\r\n </div>\r\n }\r\n <div class=\"doc-picker-content-area\">\r\n @if (_loadingCols || loadingData) {\r\n <div class=\"doc-picker-loading doc-picker-loading-overlay\">\r\n <mat-spinner [diameter]=\"40\" aria-label=\"Loading documents\"></mat-spinner>\r\n </div>\r\n }\r\n @if (dataSource.filteredData.length === 0 && !loadingData && !_loadingCols) {\r\n <div class=\"doc-picker-empty\">\r\n <mat-icon>folder_open</mat-icon>\r\n <span>{{ emptyMessage() }}</span>\r\n <button mat-stroked-button color=\"warn\" (click)=\"refreshDocuments()\" class=\"doc-picker-retry\"\r\n aria-label=\"Retry loading documents\">\r\n <mat-icon>refresh</mat-icon>\r\n Retry\r\n </button>\r\n </div>\r\n }\r\n @if (dataSource.filteredData.length > 0 && _cols.length > 0) {\r\n @if (isMultiSelect) {\r\n <div class=\"doc-picker-table-wrapper\">\r\n <table mat-table [dataSource]=\"dataSource\" class=\"doc-picker-table\" matSort matSortActive=\"updatedAt\"\r\n matSortDisableClear matSortDirection=\"desc\" role=\"grid\" aria-label=\"Transaction list\">\r\n @for (col of _cols; track col.formControlName) {\r\n <ng-container [matColumnDef]=\"col.formControlName\" [stickyEnd]=\"$last\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header\r\n [disabled]=\"col.formControlName === 'icons' || col.formControlName === 'actions'\"\r\n [class.text-right-align]=\"col.type === 'currency' || col.type === 'number'\"\r\n [class.doc-picker-col-icons]=\"col.formControlName === 'icons'\"\r\n [class.doc-picker-col-actions]=\"col.formControlName === 'actions'\"\r\n [class.doc-picker-col-text]=\"col.formControlName !== 'icons' && col.formControlName !== 'actions' && col.type !== 'currency' && col.type !== 'number'\"\r\n [class.doc-picker-col-numeric]=\"col.type === 'currency' || col.type === 'number'\">\r\n @if (col.formControlName === 'actions') {\r\n <button mat-icon-button (click)=\"refreshDocuments()\" class=\"doc-picker-refresh\"\r\n matTooltip=\"Refresh list\" matTooltipPosition=\"below\" aria-label=\"Refresh document list\">\r\n <mat-icon>sync</mat-icon>\r\n </button>\r\n }@else {\r\n {{ col.label }}\r\n }\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\"\r\n [class.text-right-align]=\"col.type === 'currency' || col.type === 'number'\"\r\n [class.doc-picker-col-icons]=\"col.formControlName === 'icons'\"\r\n [class.doc-picker-col-actions]=\"col.formControlName === 'actions'\"\r\n [class.doc-picker-col-text]=\"col.formControlName !== 'icons' && col.formControlName !== 'actions' && col.type !== 'currency' && col.type !== 'number'\"\r\n [class.doc-picker-col-numeric]=\"col.type === 'currency' || col.type === 'number'\">\r\n @if (col.formControlName === 'icons') {\r\n <mat-icon class=\"doc-picker-row-icon\">description</mat-icon>\r\n } @else if (col.formControlName === 'actions') {\r\n <mat-checkbox\r\n [checked]=\"isRowSelected(row)\"\r\n [disabled]=\"!!inputConfig()?.disabled || !!inputConfig()?.readonly\"\r\n (change)=\"selectRow(row)\"\r\n [matTooltip]=\"isRowSelected(row) ? 'Clear selection' : 'Select ' + (row['reference'] ?? 'document')\"\r\n matTooltipPosition=\"below\"\r\n [attr.aria-label]=\"isRowSelected(row) ? 'Clear selection' : 'Select ' + (row['reference'] ?? 'document')\">\r\n </mat-checkbox>\r\n } @else {\r\n <span class=\"doc-picker-cell-value doc-picker-cell-text\"\r\n [class.doc-picker-cell-selected]=\"isRowSelected(row)\"\r\n [matTooltip]=\"row[col.formControlName] | formatData:col.type\"\r\n matTooltipPosition=\"above\">\r\n {{ row[col.formControlName] | formatData:col.type }}\r\n </span>\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n <tr mat-row class=\"doc-picker-row\" *matRowDef=\"let row; columns: displayedColumns;\"\r\n [class.doc-picker-row-selected]=\"isRowSelected(row)\"\r\n [attr.aria-label]=\"'Row: ' + (row['reference'] ?? 'document')\"\r\n [attr.aria-selected]=\"isRowSelected(row)\"></tr>\r\n </table>\r\n </div>\r\n } @else {\r\n <mat-radio-group [value]=\"value\" (change)=\"onRadioChange($event)\" class=\"doc-picker-radio-group\">\r\n <div class=\"doc-picker-table-wrapper\">\r\n <table mat-table [dataSource]=\"dataSource\" class=\"doc-picker-table\" matSort matSortActive=\"updatedAt\"\r\n matSortDisableClear matSortDirection=\"desc\" role=\"grid\" aria-label=\"Transaction list\">\r\n @for (col of _cols; track col.formControlName) {\r\n <ng-container [matColumnDef]=\"col.formControlName\" [stickyEnd]=\"$last\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header\r\n [disabled]=\"col.formControlName === 'icons' || col.formControlName === 'actions'\"\r\n [class.text-right-align]=\"col.type === 'currency' || col.type === 'number'\"\r\n [class.doc-picker-col-icons]=\"col.formControlName === 'icons'\"\r\n [class.doc-picker-col-actions]=\"col.formControlName === 'actions'\"\r\n [class.doc-picker-col-text]=\"col.formControlName !== 'icons' && col.formControlName !== 'actions' && col.type !== 'currency' && col.type !== 'number'\"\r\n [class.doc-picker-col-numeric]=\"col.type === 'currency' || col.type === 'number'\">\r\n \r\n\r\n @if (col.formControlName === 'actions') {\r\n <button mat-icon-button (click)=\"refreshDocuments()\" class=\"doc-picker-refresh\"\r\n matTooltip=\"Refresh list\" matTooltipPosition=\"below\" aria-label=\"Refresh document list\">\r\n <mat-icon>sync</mat-icon>\r\n </button>\r\n }@else {\r\n {{ col.label }}\r\n }\r\n \r\n </th>\r\n <td mat-cell *matCellDef=\"let row\"\r\n [class.text-right-align]=\"col.type === 'currency' || col.type === 'number'\"\r\n [class.doc-picker-col-icons]=\"col.formControlName === 'icons'\"\r\n [class.doc-picker-col-actions]=\"col.formControlName === 'actions'\"\r\n [class.doc-picker-col-text]=\"col.formControlName !== 'icons' && col.formControlName !== 'actions' && col.type !== 'currency' && col.type !== 'number'\"\r\n [class.doc-picker-col-numeric]=\"col.type === 'currency' || col.type === 'number'\">\r\n @if (col.formControlName === 'icons') {\r\n <mat-icon class=\"doc-picker-row-icon\">description</mat-icon>\r\n } @else if (col.formControlName === 'actions') {\r\n <mat-radio-button\r\n [value]=\"getRowId(row)\"\r\n [disabled]=\"!!inputConfig()?.disabled || !!inputConfig()?.readonly\"\r\n (click)=\"onRadioClick(row, $event)\"\r\n [matTooltip]=\"isRowSelected(row) ? 'Clear selection' : 'Select ' + (row['reference'] ?? 'document')\"\r\n matTooltipPosition=\"below\"\r\n [attr.aria-label]=\"isRowSelected(row) ? 'Clear selection' : 'Select ' + (row['reference'] ?? 'document')\">\r\n </mat-radio-button>\r\n } @else {\r\n <span class=\"doc-picker-cell-value doc-picker-cell-text\"\r\n [class.doc-picker-cell-selected]=\"isRowSelected(row)\"\r\n [matTooltip]=\"row[col.formControlName] | formatData:col.type\"\r\n matTooltipPosition=\"above\">\r\n {{ row[col.formControlName] | formatData:col.type }}\r\n </span>\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n <tr mat-row class=\"doc-picker-row\" *matRowDef=\"let row; columns: displayedColumns;\"\r\n [class.doc-picker-row-selected]=\"isRowSelected(row)\"\r\n [attr.aria-label]=\"'Row: ' + (row['reference'] ?? 'document')\"\r\n [attr.aria-selected]=\"isRowSelected(row)\"\r\n (click)=\"onRowClick(row, $event)\"></tr>\r\n </table>\r\n </div>\r\n </mat-radio-group>\r\n }\r\n }\r\n </div>\r\n </div>\r\n @if (!inputConfig()?.disabled && !inputConfig()?.readonly && !selectedDocument) {\r\n <mat-paginator [pageSizeOptions]=\"[5, 10, 25, 50]\"\r\n [pageSize]=\"pageSizeForDisplay\"\r\n [length]=\"footerConfig ? footerConfig.totalItems : dataSource.filteredData.length\"\r\n [pageIndex]=\"pageIndexForDisplay\"\r\n (page)=\"onPageChange($event)\"\r\n showFirstLastButtons\r\n aria-label=\"Transaction list pagination\" class=\"doc-picker-paginator\"></mat-paginator>\r\n }\r\n }\r\n</mat-card>\r\n\r\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport type { FormBuilderFunctions, ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { DocumentPickerReactiveInputComponent } from './core/document-picker-reactive-input/document-picker-reactive-input.component';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\n\r\n/** Wraps a reactive document-picker control inside a `mat-form-field`. */\r\n@Component({\r\n selector: 'lib-document-picker',\r\n templateUrl: './document-picker.component.html',\r\n styleUrl: './document-picker.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatTooltipModule,\r\n DocumentPickerReactiveInputComponent,\r\n TFormInputStatusComponent,\r\n ],\r\n})\r\nexport class DocumentPickerComponent {\r\n readonly inputConfig = input.required<ITowerStepColumn>();\r\n readonly formGroup = input.required<FormGroup>();\r\n readonly editorMode = input<boolean>(false);\r\n readonly formBuilderFunctions = input<FormBuilderFunctions | undefined>(undefined);\r\n readonly reload = output<void>();\r\n\r\n protected readonly errorMessage = computed(() =>\r\n getInputErrorMessage(this.inputConfig(), this.formGroup()),\r\n );\r\n}\r\n","<form [formGroup]=\"formGroup()\">\r\n @if (inputConfig(); as inputConfig) {\r\n <mat-form-field [appearance]=\"inputConfig.appearance || 'fill'\" subscriptSizing=\"dynamic\">\r\n <mat-label>\r\n {{ inputConfig.label }}\r\n <lib-t-form-input-status [inputConfig]=\"inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n\r\n <lib-document-picker-reactive-input\r\n [disabled]=\"!!inputConfig.disabled\"\r\n [inputConfig]=\"inputConfig\"\r\n [formBuilderFunctions]=\"formBuilderFunctions()\"\r\n [required]=\"inputConfig.required\"\r\n [formControlName]=\"inputConfig.id\"\r\n ></lib-document-picker-reactive-input>\r\n\r\n @if (inputConfig.hintLabel || inputConfig.temporaryHint) {\r\n <mat-hint class=\"inputHint\">\r\n {{ inputConfig.temporaryHint || inputConfig.hintLabel }}\r\n </mat-hint>\r\n }\r\n\r\n @if (!!errorMessage()) {\r\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{ errorMessage() }}</mat-error>\r\n }\r\n\r\n @if (inputConfig.prefixIcon) {\r\n <mat-icon matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n }\r\n\r\n @if (inputConfig.canReload?.canReload) {\r\n <button\r\n mat-icon-button\r\n style=\"margin-right: 4px;\"\r\n matTooltip=\"Click to refresh this field.\"\r\n class=\"input-sync-button\"\r\n (click)=\"inputConfig.canReload.emit()\"\r\n matSuffix\r\n >\r\n <mat-icon style=\"color: var(--mat-sys-primary)\">sync</mat-icon>\r\n </button>\r\n }\r\n\r\n @if (inputConfig.suffixIcon && inputConfig.id !== 'password') {\r\n <mat-icon matSuffix>{{ inputConfig.suffixIcon }}</mat-icon>\r\n }\r\n\r\n @if (inputConfig.prefixText) {\r\n <span matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n }\r\n @if (inputConfig.suffixText) {\r\n <span matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText }}</span>\r\n }\r\n\r\n @if (inputConfig.maxLength && formGroup()) {\r\n <mat-hint align=\"end\">\r\n {{ (formGroup().controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength }}\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n }\r\n</form>\r\n"],"names":["map","take","catchError","i2","i3","i5","i6","i7","i8","i12","i4"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA;AACO,MAAM,YAAY,GAAoB,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE;AAgC9D;;;;AAIG;MAEU,qBAAqB,CAAA;AADlC,IAAA,WAAA,GAAA;QAEmB,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,wBAAwB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAsKpF,IAAA;AApKC,IAAA,aAAa,CAAC,MAA4B,EAAA;QACxC,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,MAAM;QAE1D,IAAI,UAAU,KAAK,WAAW,CAAC,GAAG,IAAI,eAAe,EAAE;AACrD,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QACjC;QACA,IAAI,UAAU,KAAK,WAAW,CAAC,OAAO,IAAI,eAAe,EAAE;AACzD,YAAA,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;QACrC;AACA,QAAA,IAAI,UAAU,KAAK,SAAS,EAAE;YAC5B,OAAO,IAAI,CAAC,eAAe,CAAC,UAAU,EAAG,MAAM,CAAC;QAClD;QAEA,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC9B;AAEA;;;;AAIG;AACK,IAAA,8BAA8B,CAAC,QAAiB,EAAA;AACtD,QAAA,IAAI,QAAQ,IAAI,IAAI,EAAE;AACpB,YAAA,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;QAC1B;QACA,MAAM,GAAG,GAAG,QAAmC;AAC/C,QAAA,MAAM,OAAO,GAAY,GAAG,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC;QACpI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAC3B,OAAO;AACL,gBAAA,SAAS,EAAE,EAAE;AACb,gBAAA,KAAK,EAAE,2EAA2E;aACnF;QACH;QACA,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAgC,CAAC;QAC7E,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACnE,QAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE;IACpC;AAEQ,IAAA,oBAAoB,CAAC,EAAW,EAAA;AACtC,QAAA,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ;AAAE,YAAA,OAAO,SAAS;QACnD,MAAM,CAAC,GAAG,EAA6B;AACvC,QAAA,MAAM,UAAU,GAAG,CAAC,CAAC,YAAY,CAAW;AAC5C,QAAA,MAAM,UAAU,GAAG,CAAC,CAAC,YAAY,CAAW;AAC5C,QAAA,MAAM,YAAY,GAAG,CAAC,CAAC,cAAc,CAAW;AAChD,QAAA,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;AACxG,YAAA,OAAO,SAAS;QAClB;QACA,OAAO;YACL,UAAU;YACV,UAAU;YACV,YAAY;AACZ,YAAA,WAAW,EAAE,OAAO,CAAC,CAAC,aAAa,CAAC,KAAK,QAAQ,GAAI,CAAC,CAAC,aAAa,CAAY,GAAG,SAAS;AAC5F,YAAA,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ;AACrD,kBAAG,CAAC,CAAC,QAAQ;AACb,kBAAE,SAAS;SACd;IACH;AAEQ,IAAA,WAAW,CAAC,MAA4B,EAAA;QAC9C,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,MAAM;QAC5E,MAAM,MAAM,GAAG,eAAwD;QACvE,MAAM,aAAa,GAAa,EAAE;AAClC,QAAA,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,oBAAoB,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAI;AACvF,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE;gBAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY;AAClC,gBAAA,OAAO,GAAG;YACZ;AACA,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE;AACrE,gBAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;AAC3C,gBAAA,OAAO,GAAG;YACZ;AACA,YAAA,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAC7B,YAAA,OAAO,GAAG;QACZ,CAAC,EAAE,EAAyB,CAAC;AAC7B,QAAA,QAAQ,CAAC,YAAY,CAAC,GAAG,UAAU;QACnC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC;QACnC,QAAQ,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,YAAY,IAAI,EAAE;AACpD,QAAA,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,YAAY;AACpG,QAAA,QAAQ,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,SAAS;AACxC,QAAA,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1D,YAAA,QAAQ,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM;QACpC;AAEA,QAAA,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5B,YAAA,OAAO,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAA,gBAAA,EAAmB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE,CAAC,CAAC;QACnF;AAEA,QAAA,OAAO,WAAW,CAAC,oBAAoB,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,IAAI,CACzE,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC,EAChE,UAAU,CAAC,CAAC,GAAG,KAAI;YACjB,MAAM,GAAG,GAAG,GAAG,EAAE,KAAK,EAAE,OAAO,KAAK,GAAG,YAAY,KAAK,GAAG,GAAG,CAAC,OAAO,GAAG,eAAe,CAAC;AACzF,YAAA,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QAC1C,CAAC,CAAC,CACH;IACH;AAEQ,IAAA,eAAe,CAAC,MAA4B,EAAA;AAClD,QAAA,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,MAAM;QAC/C,MAAM,MAAM,GAAG,eAAiD;AAChE,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YACpD,OAAO,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACzD;AACA,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;YACtB,OAAO,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC5D;AAEA,QAAA,MAAM,gBAAgB,GAAG;AACvB,YAAA,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC;AACtB,YAAA,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE;AACvC,YAAA,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,YAAY;YACvF,SAAS,EAAE,MAAM,CAAC,SAAS;AAC3B,YAAA,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;SAC7F;AACD,QAAA,MAAM,WAAW,GAAG,WAAW,CAAC,kBAAsF;AACtH,QAAA,OAAO,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC,IAAI,CAC3E,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC,EACxD,UAAU,CAAC,CAAC,GAAG,KAAI;YACjB,MAAM,GAAG,GAAG,GAAG,EAAE,KAAK,EAAE,OAAO,KAAK,GAAG,YAAY,KAAK,GAAG,GAAG,CAAC,OAAO,GAAG,eAAe,CAAC;AACzF,YAAA,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QAC1C,CAAC,CAAC,CACH;IACH;IAEQ,eAAe,CACrB,UAAkB,EAClB,MAA4B,EAAA;;;QAI5B,MAAM,oBAAoB,GACxB,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,oBAAoB;AAGrD,QAAA,IAAI,OAAO,oBAAoB,KAAK,UAAU,EAAE;YAE9C,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAC9B;AACA,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC;AAC7B,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,EAAE;AAC9C,QAAA,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,YAAY;AAC9F,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS;AAClC,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM;AAC5B,QAAA,OAAO,oBAAoB,CAAC,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,CACvF,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,8BAA8B,CAAC,GAAG,CAAC,CAAC,CACvD;IACH;AAEA;;;;;AAKG;AACK,IAAA,oBAAoB,CAAC,IAA2B,EAAA;AACtD,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;AACtB,YAAA,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC;AACxB,YAAA,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,GAAG,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE;YAC3E,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG;YACjC,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE;AAChD,QAAA,CAAC,CAAC;IACJ;+GAtKW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cADR,MAAM,EAAA,CAAA,CAAA;;4FACnB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACPlC,MAAM,iBAAiB,GAA0B;AAC/C,IAAA,WAAW,EAAE,oCAAoC;AACjD,IAAA,MAAM,EAAE,CAAC;CACV;AAED;;;;;;;;;;;AAWG;AA6BG,MAAO,oCAAqC,SAAQ,eAAoC,CAAA;AAYnF,IAAA,YAAY;AACZ,IAAA,eAAe;AACf,IAAA,IAAI;AACJ,IAAA,WAAW;AAEpB,IAAA,aAAa;AACb,IAAA,gBAAgB;;AAKhB,IAAA,gBAAgB;;AAGhB,IAAA,qBAAqB;AACrB,IAAA,qBAAqB;AAYrB,IAAA,WAAA,GAAA;QACE,KAAK,CACH,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAc,EAC9D,MAAM,CAA0B,UAAU,CAAC,EAC3C,iBAAiB,CAClB;AA3CM,QAAA,IAAA,CAAA,oBAAoB,GAAG,KAAK,CAAmC,SAAS,2FAAC;AACzE,QAAA,IAAA,CAAA,iBAAiB,GAAG,KAAK,CAAS,sBAAsB,wFAAC;AACzD,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAS,uBAAuB,mFAAC;AACrD,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAA+B,SAAS,kFAAC;AAE5D,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC;AACvC,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,kBAAkB,CAAsB,EAAE,CAAC;AAElD,QAAA,IAAA,CAAA,IAAI,GAAG,SAAS,CAAC,OAAO,2EAAC;AACzB,QAAA,IAAA,CAAA,SAAS,GAAG,SAAS,CAAC,YAAY,gFAAC;AAE7C,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAC/C,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAC/C,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAChC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;QAIzC,IAAA,CAAA,KAAK,GAA2B,EAAE;QAClC,IAAA,CAAA,YAAY,GAAG,KAAK;;QAGpB,IAAA,CAAA,gBAAgB,GAA0B,EAAE;QAQ5C,IAAA,CAAA,UAAU,GAAG,CAAC;QACd,IAAA,CAAA,cAAc,GAAG,CAAC;AAClB,QAAA,IAAA,CAAA,UAAU,GAAoB,EAAE,GAAG,YAAY,EAAE;QAEjD,IAAA,CAAA,WAAW,GAAG,KAAK;QAEnB,IAAA,CAAA,gBAAgB,GAAoC,SAAS;QAQ3D,IAAI,CAAC,qBAAqB,EAAE;QAC5B,IAAI,CAAC,qBAAqB,EAAE;QAC5B,IAAI,CAAC,wBAAwB,EAAE;;QAG/B,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;AAChC,YAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC;gBAAE;AAC5C,YAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;YAC7B,IAAI,CAAC,QAAQ,EAAE;AACjB,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,IAAI,aAAa,GAAA;QACf,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,sBAAsB,KAAK,IAAI;IAC5D;AAEA,IAAA,IAAI,oBAAoB,GAAA;QACtB,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,oBAAoB,EAAE,oBAAoB;IACvE;AAEA;;;;AAIG;AACH,IAAA,QAAQ,CAAC,GAAwB,EAAA;AAC/B,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,oBAAoB;QACpC,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,KAAK,EAAE,EAAE;YAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,GAAG;AACtC,YAAA,OAAO,qBAAqB,CAAC,EAAgB,EAAE,GAAG,CAAC;QACrD;QACA,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC;IAChC;AAEA;;;;AAIG;IACH,oBAAoB,GAAA;AAClB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK;AACtB,QAAA,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE;AAAE,YAAA,OAAO,SAAS;AAC/C,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,oBAAoB;QACpC,IAAI,SAAS,GAAG,KAAK;QACrB,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,KAAK,EAAE,EAAE;AAC3B,YAAA,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE;gBAC1B,SAAS,GAAG,EAAE;YAChB;AAAO,iBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,gBAAA,SAAS,GAAG;AACT,qBAAA,GAAG,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;qBAChG,IAAI,CAAC,GAAG,CAAC;YACd;QACF;AACA,QAAA,OAAO,EAAE,CAAC,SAAS,GAAG,GAAG,EAAE;IAC7B;;AAGA,IAAA,uBAAuB,CAAC,EAAW,EAAA;AACjC,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,oBAAoB;AACpC,QAAA,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;AAChD,YAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE;QACxB;QACA,MAAM,GAAG,GAAwB,EAAE;QACnC,IAAI,OAAO,GAAwB,GAAG;AACtC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAClC,YAAA,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;AAClB,YAAA,MAAM,GAAG,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;YAC1G,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,CAAC;YAClC,IAAI,MAAM,EAAE;AACV,gBAAA,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;YACnB;iBAAO;AACL,gBAAA,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;AACjB,gBAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;YACxB;QACF;AACA,QAAA,OAAO,GAAG;IACZ;;IAGA,cAAc,GAAA;AACZ,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK;AACpB,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;AAAE,YAAA,OAAO,EAAE;AACpC,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AACvF,QAAA,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB;AAEA,IAAA,aAAa,CAAC,GAAwB,EAAA;QACpC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC7B,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC;IAC7E;AAEA,IAAA,IAAa,KAAK,GAAA;AAChB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK;AACpB,QAAA,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI;AAC9C,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAC3C;QACA,OAAO,CAAC,KAAK,EAAE;IACjB;AACA,IAAA,IAAa,gBAAgB,GAAA;AAC3B,QAAA,OAAO,IAAI;IACb;IAEA,eAAe,GAAA;AACb,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE;QAC3B,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,OAAO;AAC9B,YAAA,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;AAC5E,gBAAA,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,SAAS,EAAE;oBAChD,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,SAA2B,CAAC;gBAC5D;AACF,YAAA,CAAC,CAAC;QACJ;QACA,IAAI,CAAC,wBAAwB,EAAE;IACjC;;IAGA,wBAAwB,GAAA;QACtB,IAAI,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO;AAC9B,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE;QACrC,IAAI,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,KAAK,YAAY,EAAE;AAC9D,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,YAAY;AACxC,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;QAC1B;IACF;IAEA,qBAAqB,GAAA;QACnB,IAAI,CAAC,UAAU,CAAC,eAAe,GAAG,CAAC,GAAwB,EAAE,MAAc,KAAa;AACtF,YAAA,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,EAAE;AAC3B,YAAA,IAAI,CAAC,IAAI;AAAE,gBAAA,OAAO,IAAI;AACtB,YAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;AAAE,gBAAA,OAAO,KAAK;AACzD,YAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC;YAC7E,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,IAClC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAC/C;AACH,QAAA,CAAC;IACH;IAEA,wBAAwB,GAAA;QACtB,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CACtC,YAAY,CAAC,GAAG,CAAC,EACjBA,KAAG,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EACjC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EACvC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CACrC,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;AACrB,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,gBAAA,IAAI,CAAC,UAAU,GAAG,CAAC;AACnB,gBAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAChC;iBAAO;AACL,gBAAA,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,MAAM;AAC/B,gBAAA,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE;YACxC;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAmB;IACrD;AAEA,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,eAAe,CAAC;IACrD;;AAGA,IAAA,IAAI,mBAAmB,GAAA;QACrB,OAAO,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,IAAI,CAAC,CAAC;IACrF;;AAGA,IAAA,IAAI,kBAAkB,GAAA;QACpB,OAAO,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,IAAI,CAAC,CAAC;IACpF;;AAGA,IAAA,IAAI,mBAAmB,GAAA;AACrB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM;QACpC,OAAO,CAAC,EAAE,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACvE;AAEA;;;AAGG;AACH,IAAA,oBAAoB,CAAC,YAAqB,EAAA;AACxC,QAAA,IAAI,YAAY;AAAE,YAAA,OAAO,IAAI;QAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,oBAAoB;AAE7D,QAAA,MAAM,UAAU,GAAG,YAAY,EAAE,UAAU,IAAI,EAAE;AACjD,QAAA,MAAM,UAAU,GAAI,YAAY,EAAE,kBAA8C,IAAI,SAAS;AAC7F,QAAA,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,KAAK;AAC5C,QAAA,QACE,IAAI,CAAC,qBAAqB,KAAK,UAAU,IAAI,IAAI,CAAC,qBAAqB,KAAK,UAAU;IAE1F;IAEA,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CACpB,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,EACpC,GAAG,CAAC,MAAK;AACP,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC;AACjD,gBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;gBACxB;YACF;AACA,YAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK;YAC7B,MAAM,YAAY,GAChB,IAAI,CAAC,gBAAgB,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,KAAK;AAErF,YAAA,IAAI,CAAC,YAAY,IAAI,QAAQ,EAAE;;AAE7B,gBAAA,IAAI,CAAC,UAAU,GAAG,CAAC;AACnB,gBAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAChC;AAAO,iBAAA,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ,EAAE;gBACrC,IAAI,CAAC,mBAAmB,EAAE;YAC5B;AACF,QAAA,CAAC,CAAC,CACH,CAAC,SAAS,EAAE;IACf;;IAGA,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;QACjC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC;AACjD,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;QACjC,UAAU,CAAC,MAAM,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;AACpD,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;IAC1B;IAEA,QAAQ,GAAA;AACN,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE,oBAAoB;AAE7D,QAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC;YAAE;AAE7C,QAAA,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE;AAC1B,YAAA,IAAI,CAAC,aAAa,GAAG,SAAS;AAC9B,YAAA,IAAI,CAAC,KAAK,GAAG,EAAE;AACf,YAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;AAC1B,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,EAAE;AACzB,YAAA,IAAI,CAAC,qBAAqB,GAAG,SAAS;AACtC,YAAA,IAAI,CAAC,qBAAqB,GAAG,SAAS;AACtC,YAAA,IAAI,CAAC,YAAY,GAAG,SAAS;AAC7B,YAAA,IAAI,CAAC,UAAU,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,cAAc,GAAG,EAAE;AACxB,YAAA,IAAI,CAAC,UAAU,GAAG,EAAE,GAAG,YAAY,EAAE;AACrC,YAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;AACjC,YAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;AACjC,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACxB;QACF;AAEA,QAAA,IAAI,CAAC,aAAa,GAAG,SAAS;AAC9B,QAAA,IAAI,CAAC,qBAAqB,GAAG,SAAS;AACtC,QAAA,IAAI,CAAC,qBAAqB,GAAG,SAAS;AACtC,QAAA,IAAI,CAAC,YAAY,GAAG,SAAS;AAC7B,QAAA,IAAI,CAAC,UAAU,GAAG,CAAC;AACnB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;QAExB,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,eAAe,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CACtEC,MAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,CAAC,IAAI,KAAI;YACX,IAAI,CAAC,KAAK,GAAG;AACX,gBAAA,EAAE,KAAK,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE;AACvC,gBAAA,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE;AACpD,gBAAA,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,IAAI,EAAE,yCAAyC,CAAC,IAAI,EAAE;AACxG,gBAAA,GAAG,IAAI;AACP,gBAAA,EAAE,KAAK,EAAE,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE;aAC1C;YACD,IAAI,CAAC,mBAAmB,EAAE;AAC5B,QAAA,CAAC,CAAC,EACFC,YAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,KAAK,GAAG,EAAE;AACf,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC;AACf,QAAA,CAAC,CAAC,EACF,QAAQ,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AAC1B,QAAA,CAAC,CAAC,EACF,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CACrC,CAAC,SAAS,EAAE;IACf;AAEA;;;AAGG;IACH,mBAAmB,CAAC,YAAY,GAAG,KAAK,EAAA;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,oBAAoB;AAC7D,QAAA,MAAM,UAAU,GAAG,YAAY,EAAE,UAAU,IAAI,EAAE;AACjD,QAAA,MAAM,UAAU,GAAI,YAAY,EAAE,kBAA8C,IAAI,SAAS;AAC7F,QAAA,MAAM,SAAS,GAAG,YAAY,EAAE,eAAe;AAC/C,QAAA,IAAI,CAAC,UAAU;YAAE;QACjB,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;YAAE;AAExD,QAAA,IAAI,CAAC,qBAAqB,GAAG,UAAU;AACvC,QAAA,IAAI,CAAC,qBAAqB,GAAG,UAAU;AACvC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;AACjC,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AAExB,QAAA,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,GAAG,YAAY;QACnH,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,oBAAoB,EAAE,GAAG,SAAS;AAC1F,QAAA,MAAM,eAAe,GAAG;YACtB,IAAI,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC;YACtC,IAAI,EAAE,IAAI,CAAC,UAAU;YACrB,YAAY,EAAE,IAAI,CAAC,cAAc;AACjC,YAAA,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,SAAS;AAC5D,YAAA,IAAI,MAAM,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;SAC9B;AACD,QAAA,MAAM,MAAM,GAAyB;YACnC,UAAU;AACV,YAAA,eAAe,EAAE,SAAS;YAC1B,UAAU;YACV,eAAe;AACf,YAAA,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW;YAC1C,IAAI,EAAE,IAAI,CAAC,UAAU;YACrB,YAAY,EAAE,IAAI,CAAC,cAAc;AACjC,YAAA,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,SAAS;YAC5D,MAAM;SACP;QAED,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAC7CD,MAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,CAAC,MAAM,KAAI;AACb,YAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS;AAClC,YAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;AACjC,YAAA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY;AACvC,YAAA,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,KAAK;AACpC,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBACjD,UAAU,CAAC,MAAM,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;YACtD;AAAO,iBAAA,IAAI,IAAI,CAAC,KAAK,EAAE;gBACrB,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC;gBACzE,MAAM,cAAc,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;sBACzD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK;sBAC/D,IAAI;AACR,gBAAA,MAAM,UAAU,GAAG,WAAW,IAAI,cAAc,IAAI,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC5F,IAAI,CAAC,gBAAgB,GAAG,WAAW,IAAI,cAAc,IAAI,SAAS;gBAClE,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC;gBACnC,UAAU,CAAC,MAAM,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;YACtD;iBAAO;AACL,gBAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;gBACjC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBACjD,UAAU,CAAC,MAAM,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;YACtD;AACF,QAAA,CAAC,CAAC,EACFC,YAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,IAAI,CAAC,gBAAgB;gBACnB,KAAK,EAAE,KAAK,EAAE,OAAO,KAAK,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,eAAe,CAAC;AACrF,YAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;AAC1B,YAAA,IAAI,CAAC,YAAY,GAAG,SAAS;AAC7B,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,EAAE;YACzB,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AAC9B,QAAA,CAAC,CAAC,EACF,QAAQ,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AAC1B,QAAA,CAAC,CAAC,EACF,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CACrC,CAAC,SAAS,EAAE;IACf;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,qBAAqB,GAAG,SAAS;AACtC,QAAA,IAAI,CAAC,qBAAqB,GAAG,SAAS;AACtC,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;IAChC;;AAGA,IAAA,YAAY,CAAC,KAA8C,EAAA;QACzD,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;QACxB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,SAAS,GAAG,CAAC;AACrC,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,QAAQ;AACpC,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;IAChC;;IAGA,YAAY,CAAC,MAAc,EAAE,SAAyB,EAAA;AACpD,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM;YAAE;QACnC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,MAAM,GAAG,SAAS,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;AAC5D,QAAA,IAAI,CAAC,UAAU,GAAG,CAAC;AACnB,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;IAChC;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;IACrC;AAEA,IAAA,aAAa,CAAC,KAAwB,EAAA;AACpC,QAAA,MAAM,EAAE,GAAG,KAAK,EAAE,KAAK;QACvB,IAAI,EAAE,IAAI,IAAI;YAAE;QAChB,MAAM,GAAG,GACP,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACzD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1D,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;IACzD;;IAGA,YAAY,CAAC,GAAwB,EAAE,KAAiB,EAAA;AACtD,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE;YAC3B,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,eAAe,EAAE;AACvB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;QACrB;IACF;;IAGA,UAAU,CAAC,GAAwB,EAAE,KAAiB,EAAA;AACpD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;QAC9B,IAAI,CAAC,CAAC,GAAG,EAAE,QAAQ,IAAI,CAAC,CAAC,GAAG,EAAE,QAAQ;YAAE;AACxC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,IAAI,MAAM,CAAC,OAAO,CAAC,kDAAkD,CAAC;YAAE;AACxE,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;IACrB;;;AAIA,IAAA,SAAS,CAAC,GAAwB,EAAA;QAChC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC7B,QAAA,MAAM,KAAK,GAAG,EAAE,IAAI,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS;AAEjD,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACtC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;AACpC,YAAA,IAAI,GAAG,IAAI,CAAC,EAAE;AACZ,gBAAA,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;YACpB;AAAO,iBAAA,IAAI,KAAK,IAAI,IAAI,EAAE;AACxB,gBAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;YACjB;AACA,YAAA,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI;AACpC,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YACzB,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACxB;QACF;QAEA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC7C,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;AACjC,QAAA,IAAI,CAAC,KAAK,GAAG,aAAa,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC;AACnD,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,SAAS,EAAE;QAEhB,IAAI,aAAa,EAAE;AACjB,YAAA,IAAI,CAAC,UAAU,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;QAChC;IACF;+GA/eW,oCAAoC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAApC,oCAAoC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oCAAA,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,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,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,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,IAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAFpC,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,oCAAoC,EAAE,CAAC,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,MAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAW5D,OAAO,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EACF,YAAY,uFCpGvD,ktZAuMA,EAAA,MAAA,EAAA,CAAA,o6NAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDrII,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,wBAAwB,oOACxB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,cAAc,0hCACd,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,aAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,eAAA,EAAA,OAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,cAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,gBAAgB,8BAChB,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,WAAA,EAAA,IAAA,EAAA,UAAA,EAAA,eAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,eAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,SAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACd,cAAc,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAUL,oCAAoC,EAAA,UAAA,EAAA,CAAA;kBA5BhD,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oCAAoC,EAAA,eAAA,EAC7B,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,mBAAmB;wBACnB,aAAa;wBACb,aAAa;wBACb,wBAAwB;wBACxB,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,gBAAgB;wBAChB,cAAc;wBACd,aAAa;wBACb,kBAAkB;wBAClB,gBAAgB;wBAChB,iBAAiB;wBACjB,cAAc;wBACd,cAAc;qBACf,EAAA,IAAA,EAGK;AACJ,wBAAA,kBAAkB,EAAE,kBAAkB;AACtC,wBAAA,MAAM,EAAE,IAAI;qBACb,EAAA,SAAA,EACU,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAA,oCAAsC,EAAE,CAAC,EAAA,QAAA,EAAA,ktZAAA,EAAA,MAAA,EAAA,CAAA,o6NAAA,CAAA,EAAA;AAW5D,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,OAAO,wFACF,YAAY,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEzFvD;MAgBa,uBAAuB,CAAA;AAfpC,IAAA,WAAA,GAAA;AAgBW,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,QAAQ,iFAAoB;AAChD,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,QAAQ,+EAAa;AACvC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;AAClC,QAAA,IAAA,CAAA,oBAAoB,GAAG,KAAK,CAAmC,SAAS,2FAAC;QACzE,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;AAEb,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MACzC,oBAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,mFAC3D;AACF,IAAA;+GAVY,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3BpC,g0EA8DA,EAAA,MAAA,EAAA,CAAA,0IAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED5CI,mBAAmB,q6BACnB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,oCAAoC,qKACpC,yBAAyB,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGhB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAfnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,eAAA,EAGd,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,mBAAmB;wBACnB,kBAAkB;wBAClB,aAAa;wBACb,eAAe;wBACf,gBAAgB;wBAChB,oCAAoC;wBACpC,yBAAyB;AAC1B,qBAAA,EAAA,QAAA,EAAA,g0EAAA,EAAA,MAAA,EAAA,CAAA,0IAAA,CAAA,EAAA;;;;;"}
@@ -0,0 +1,294 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, ElementRef, input, output, viewChild, PLATFORM_ID, Input, ChangeDetectionStrategy, Component, computed } from '@angular/core';
3
+ import * as i1 from '@angular/forms';
4
+ import { NgControl, ReactiveFormsModule } from '@angular/forms';
5
+ import * as i2 from '@angular/material/form-field';
6
+ import { MatFormFieldControl, MatFormFieldModule } from '@angular/material/form-field';
7
+ import * as i3 from '@angular/material/icon';
8
+ import { MatIconModule } from '@angular/material/icon';
9
+ import * as i1$1 from '@angular/material/button';
10
+ import { MatButtonModule } from '@angular/material/button';
11
+ import * as i5 from '@angular/material/tooltip';
12
+ import { MatTooltipModule } from '@angular/material/tooltip';
13
+ import { RichTextEditorType } from 'ngx-t-forms-types';
14
+ import { B as BaseCustomInput, _ as _isEqual, m as getInputErrorMessage, n as TFormInputStatusComponent } from './ngx-t-forms-ngx-t-forms-u_kigDid.mjs';
15
+ import { EditorJsInputComponent } from './ngx-t-forms-editor-js-input.component-BQL0AH7H.mjs';
16
+ import { isPlatformBrowser } from '@angular/common';
17
+
18
+ const svg = (body) => `<svg viewBox="0 0 18 18">${body}</svg>`;
19
+ /**
20
+ * Word-like table toolkit backed by Quill's native table module. Each control degrades to a
21
+ * no-op when the caret is outside a table, so the buttons are always safe to press.
22
+ */
23
+ const QUILL_TABLE_CONTROLS = [
24
+ {
25
+ format: 'table-insert',
26
+ title: 'Insert table (3×3)',
27
+ icon: svg('<rect class="ql-stroke" fill="none" x="3" y="4" width="12" height="10" rx="1"></rect><line class="ql-stroke" x1="3" y1="7.3" x2="15" y2="7.3"></line><line class="ql-stroke" x1="3" y1="10.6" x2="15" y2="10.6"></line><line class="ql-stroke" x1="7" y1="4" x2="7" y2="14"></line><line class="ql-stroke" x1="11" y1="4" x2="11" y2="14"></line>'),
28
+ run: table => table.insertTable(3, 3),
29
+ },
30
+ {
31
+ format: 'table-row',
32
+ title: 'Insert row below',
33
+ icon: svg('<rect class="ql-stroke" fill="none" x="3" y="3" width="12" height="6" rx="1"></rect><line class="ql-stroke" x1="9" y1="11" x2="9" y2="15"></line><line class="ql-stroke" x1="7" y1="13" x2="11" y2="13"></line>'),
34
+ run: table => table.insertRowBelow(),
35
+ },
36
+ {
37
+ format: 'table-column',
38
+ title: 'Insert column right',
39
+ icon: svg('<rect class="ql-stroke" fill="none" x="3" y="3" width="6" height="12" rx="1"></rect><line class="ql-stroke" x1="13" y1="6" x2="13" y2="12"></line><line class="ql-stroke" x1="11" y1="9" x2="15" y2="9"></line>'),
40
+ run: table => table.insertColumnRight(),
41
+ },
42
+ {
43
+ format: 'table-delete-row',
44
+ title: 'Delete row',
45
+ icon: svg('<rect class="ql-stroke" fill="none" x="3" y="3" width="12" height="6" rx="1"></rect><line class="ql-stroke" x1="7" y1="13" x2="11" y2="13"></line>'),
46
+ run: table => table.deleteRow(),
47
+ },
48
+ {
49
+ format: 'table-delete-column',
50
+ title: 'Delete column',
51
+ icon: svg('<rect class="ql-stroke" fill="none" x="3" y="3" width="6" height="12" rx="1"></rect><line class="ql-stroke" x1="11" y1="9" x2="15" y2="9"></line>'),
52
+ run: table => table.deleteColumn(),
53
+ },
54
+ {
55
+ format: 'table-delete',
56
+ title: 'Delete table',
57
+ icon: svg('<rect class="ql-stroke" fill="none" x="3" y="3" width="12" height="12" rx="1"></rect><line class="ql-stroke" x1="5.5" y1="5.5" x2="12.5" y2="12.5"></line><line class="ql-stroke" x1="12.5" y1="5.5" x2="5.5" y2="12.5"></line>'),
58
+ run: table => table.deleteTable(),
59
+ },
60
+ ];
61
+ /**
62
+ * Human-readable tooltips for the built-in controls, keyed by the button's CSS selector.
63
+ * Quill ships no titles of its own, so these make the toolbar self-explanatory.
64
+ */
65
+ const QUILL_BUILTIN_TITLES = {
66
+ '.ql-bold': 'Bold',
67
+ '.ql-italic': 'Italic',
68
+ '.ql-underline': 'Underline',
69
+ '.ql-strike': 'Strikethrough',
70
+ '.ql-blockquote': 'Quote',
71
+ '.ql-code-block': 'Code block',
72
+ '.ql-link': 'Insert link',
73
+ '.ql-image': 'Insert image',
74
+ '.ql-video': 'Embed video',
75
+ '.ql-clean': 'Clear formatting',
76
+ '.ql-list[value="ordered"]': 'Numbered list',
77
+ '.ql-list[value="bullet"]': 'Bulleted list',
78
+ '.ql-list[value="check"]': 'Checklist',
79
+ '.ql-script[value="sub"]': 'Subscript',
80
+ '.ql-script[value="super"]': 'Superscript',
81
+ '.ql-indent[value="-1"]': 'Decrease indent',
82
+ '.ql-indent[value="+1"]': 'Increase indent',
83
+ '.ql-direction[value="rtl"]': 'Right-to-left',
84
+ '.ql-color': 'Text colour',
85
+ '.ql-background': 'Highlight colour',
86
+ '.ql-align': 'Alignment',
87
+ '.ql-header': 'Heading',
88
+ '.ql-font': 'Font',
89
+ '.ql-size': 'Font size',
90
+ };
91
+ /**
92
+ * Comprehensive, logically grouped "snow" toolbar — headings/fonts, inline styling, colour,
93
+ * scripts, lists, indentation/alignment, blocks, media and a native table toolkit.
94
+ */
95
+ const TOOLBAR_CONTAINER = [
96
+ [{ header: [1, 2, 3, 4, 5, 6, false] }, { font: [] }, { size: ['small', false, 'large', 'huge'] }],
97
+ ['bold', 'italic', 'underline', 'strike'],
98
+ [{ color: [] }, { background: [] }],
99
+ [{ script: 'sub' }, { script: 'super' }],
100
+ [{ list: 'ordered' }, { list: 'bullet' }, { list: 'check' }],
101
+ [{ indent: '-1' }, { indent: '+1' }, { align: [] }, { direction: 'rtl' }],
102
+ ['blockquote', 'code-block'],
103
+ ['link', 'image', 'video'],
104
+ QUILL_TABLE_CONTROLS.map(control => control.format),
105
+ ['clean']
106
+ ];
107
+ /**
108
+ * Builds the toolbar handler map for the custom table buttons.
109
+ *
110
+ * These MUST be supplied in the toolbar config (not added later via `addHandler`): Quill's
111
+ * toolbar skips attaching a click listener to any button whose format is neither a registered
112
+ * blot nor already present in `handlers` at construction time. A late `addHandler` sets the
113
+ * handler but never re-attaches the listener, so the button stays inert.
114
+ */
115
+ const buildTableHandlers = () => {
116
+ const handlers = {};
117
+ for (const control of QUILL_TABLE_CONTROLS) {
118
+ handlers[control.format] = function tableHandler() {
119
+ const table = this.quill.getModule('table');
120
+ // Native table ops bail when there is no selection; force focus + a range first.
121
+ this.quill.getSelection(true);
122
+ control.run(table);
123
+ };
124
+ }
125
+ return handlers;
126
+ };
127
+ /**
128
+ * Builds a ready-to-use `QuillOptions` for a "snow" editor with the native table module
129
+ * enabled and the custom table-button handlers wired into the toolbar config.
130
+ *
131
+ * Browser-only by construction: callers MUST instantiate Quill behind an
132
+ * `isPlatformBrowser(...)` guard because Quill touches `document` at construction time.
133
+ */
134
+ const buildQuillOptions = (payload) => ({
135
+ theme: 'snow',
136
+ readOnly: payload.readOnly,
137
+ placeholder: payload.placeholder ?? "Let's write something amazing...",
138
+ modules: {
139
+ toolbar: {
140
+ container: TOOLBAR_CONTAINER,
141
+ handlers: buildTableHandlers()
142
+ },
143
+ table: true,
144
+ history: { delay: 1000, maxStack: 100, userOnly: true },
145
+ clipboard: { matchVisual: false }
146
+ }
147
+ });
148
+ /**
149
+ * Quill's empty document is a single trailing newline op. Treat that — and a literally
150
+ * empty op-list — as "no value" so `required` validation behaves intuitively.
151
+ */
152
+ const isEmptyQuillDocument = (ops) => ops.length === 0 || (ops.length === 1 && ops[0]?.insert === '\n');
153
+
154
+ /// <reference path="../../../../../../../types/quill.d.ts" />
155
+ const customInputConfig = {
156
+ controlType: 'lib-quill-input',
157
+ nextId: 0
158
+ };
159
+ /**
160
+ * Quill ("snow" theme) rich-text editor wired into Angular Material's form-field as a
161
+ * custom `MatFormFieldControl`. The full Quill setup — toolbar, formats, history — lives in
162
+ * `quill.config.ts`; this component owns lifecycle, SSR gating and value round-tripping.
163
+ */
164
+ class QuillInputComponent extends BaseCustomInput {
165
+ #platformId;
166
+ #changeHandler;
167
+ constructor() {
168
+ super(inject(NgControl, { optional: true, self: true }), inject(ElementRef), customInputConfig);
169
+ this.inputConfig = input.required(...(ngDevMode ? [{ debugName: "inputConfig" }] : /* istanbul ignore next */ []));
170
+ this.valueChanged = output();
171
+ this.editorHost = viewChild.required('editorHost');
172
+ this.#platformId = inject(PLATFORM_ID);
173
+ this._value = undefined;
174
+ }
175
+ get empty() {
176
+ const n = this.value;
177
+ return n === null || n === undefined;
178
+ }
179
+ get shouldLabelFloat() {
180
+ return true;
181
+ }
182
+ set value(value) {
183
+ if (!_isEqual(this._value, value)) {
184
+ this._value = value;
185
+ this.onChange(value);
186
+ this.stateChanges.next();
187
+ }
188
+ }
189
+ get value() {
190
+ return this._value;
191
+ }
192
+ async ngAfterViewInit() {
193
+ if (!isPlatformBrowser(this.#platformId))
194
+ return;
195
+ // Browser-only dynamic load — see the Trap 16 comment at the top of this file. The
196
+ // CSS import injects Quill's global theme styles (Quill's runtime DOM is not view-scoped).
197
+ const [{ default: Quill, Delta }] = await Promise.all([
198
+ import('quill'),
199
+ import('quill/dist/quill.snow.css')
200
+ ]);
201
+ const config = this.inputConfig();
202
+ this.editor = new Quill(this.editorHost().nativeElement, buildQuillOptions({
203
+ readOnly: config.readonly || false,
204
+ placeholder: config.placeholder
205
+ }));
206
+ const initial = this.value;
207
+ if (initial?.ops?.length) {
208
+ this.editor.setContents(new Delta(initial.ops), 'silent');
209
+ }
210
+ this.#decorateToolbar();
211
+ this.#changeHandler = () => this.contentChangedSaveValue();
212
+ this.editor.on('text-change', this.#changeHandler);
213
+ }
214
+ /**
215
+ * Quill ships no icons for custom buttons and no tooltips for any button. Inject themeable
216
+ * SVG icons (their `ql-stroke` paths inherit the toolbar colour) and `title` tooltips so the
217
+ * toolbar reads clearly in both light and dark mode.
218
+ */
219
+ #decorateToolbar() {
220
+ const root = this._elementRef.nativeElement;
221
+ for (const control of QUILL_TABLE_CONTROLS) {
222
+ const button = root.querySelector(`.ql-${control.format}`);
223
+ if (!button)
224
+ continue;
225
+ button.innerHTML = control.icon;
226
+ button.setAttribute('title', control.title);
227
+ }
228
+ for (const [selector, title] of Object.entries(QUILL_BUILTIN_TITLES)) {
229
+ root.querySelectorAll(selector).forEach(el => el.setAttribute('title', title));
230
+ }
231
+ }
232
+ contentChangedSaveValue() {
233
+ if (!this.editor)
234
+ return;
235
+ const ops = this.editor.getContents().ops;
236
+ const value = isEmptyQuillDocument(ops) ? undefined : { ops };
237
+ this.value = value;
238
+ this.onChange(value);
239
+ console.error('Quill content changed, new value:', value);
240
+ this.valueChanged.emit(value);
241
+ }
242
+ ngOnDestroy() {
243
+ this.stateChanges.complete();
244
+ if (this.editor && this.#changeHandler) {
245
+ this.editor.off('text-change', this.#changeHandler);
246
+ }
247
+ this.editor = undefined;
248
+ }
249
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: QuillInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
250
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.12", type: QuillInputComponent, isStandalone: true, selector: "lib-quill-input", inputs: { inputConfig: { classPropertyName: "inputConfig", publicName: "inputConfig", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { valueChanged: "valueChanged" }, host: { properties: { "class.floating": "shouldLabelFloat", "id": "id" } }, providers: [{ provide: MatFormFieldControl, useExisting: QuillInputComponent }], viewQueries: [{ propertyName: "editorHost", first: true, predicate: ["editorHost"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "\n<div class=\"quill-host\">\n <div #editorHost></div>\n</div>\n", styles: [".quill-host{border:solid 1px var(--mat-sys-outline-variant, var(--mat-app-outline));border-radius:6px;background:var(--mat-sys-surface-container-low, var(--mat-app-surface-container-low))}.quill-host ::ng-deep .ql-toolbar.ql-snow{border:none;border-bottom:solid 1px var(--mat-sys-outline-variant, var(--mat-app-outline));background:var(--mat-sys-surface-container, var(--mat-app-surface-container));padding:8px 10px;border-radius:6px 6px 0 0}.quill-host ::ng-deep .ql-container.ql-snow{border:none;border-radius:0 0 6px 6px;font-family:var(--mat-sys-body-large-font, inherit)}.quill-host ::ng-deep .ql-toolbar.ql-snow .ql-formats{margin-right:10px;padding-right:10px;border-right:1px solid var(--mat-sys-outline-variant, var(--mat-app-outline))}.quill-host ::ng-deep .ql-toolbar.ql-snow .ql-formats:last-child{border-right:none;padding-right:0}.quill-host ::ng-deep .ql-snow .ql-stroke,.quill-host ::ng-deep .ql-snow .ql-stroke-miter{stroke:var(--mat-sys-on-surface-variant, var(--mat-app-on-surface))}.quill-host ::ng-deep .ql-snow .ql-fill,.quill-host ::ng-deep .ql-snow .ql-stroke.ql-fill{fill:var(--mat-sys-on-surface-variant, var(--mat-app-on-surface))}.quill-host ::ng-deep .ql-snow .ql-picker{color:var(--mat-sys-on-surface-variant, var(--mat-app-on-surface))}.quill-host ::ng-deep .ql-toolbar.ql-snow button,.quill-host ::ng-deep .ql-toolbar.ql-snow .ql-picker-label{border-radius:4px;transition:background-color .12s ease}.quill-host ::ng-deep .ql-toolbar.ql-snow button:hover,.quill-host ::ng-deep .ql-toolbar.ql-snow button:focus,.quill-host ::ng-deep .ql-toolbar.ql-snow .ql-picker-label:hover{background-color:var(--mat-sys-surface-container-highest, var(--mat-app-surface-container-high))}.quill-host ::ng-deep .ql-snow.ql-toolbar button.ql-active,.quill-host ::ng-deep .ql-snow .ql-picker-label.ql-active,.quill-host ::ng-deep .ql-snow .ql-picker-item.ql-selected,.quill-host ::ng-deep .ql-snow.ql-toolbar button:hover,.quill-host ::ng-deep .ql-snow .ql-picker-item:hover{color:var(--mat-sys-primary, var(--mat-app-primary))}.quill-host ::ng-deep .ql-snow.ql-toolbar button:hover .ql-stroke,.quill-host ::ng-deep .ql-snow.ql-toolbar button:focus .ql-stroke,.quill-host ::ng-deep .ql-snow.ql-toolbar button.ql-active .ql-stroke,.quill-host ::ng-deep .ql-snow .ql-picker-label:hover .ql-stroke,.quill-host ::ng-deep .ql-snow .ql-picker-label.ql-active .ql-stroke,.quill-host ::ng-deep .ql-snow .ql-picker-item:hover .ql-stroke,.quill-host ::ng-deep .ql-snow .ql-picker-item.ql-selected .ql-stroke{stroke:var(--mat-sys-primary, var(--mat-app-primary))}.quill-host ::ng-deep .ql-snow.ql-toolbar button:hover .ql-fill,.quill-host ::ng-deep .ql-snow.ql-toolbar button.ql-active .ql-fill,.quill-host ::ng-deep .ql-snow .ql-picker-label:hover .ql-fill,.quill-host ::ng-deep .ql-snow .ql-picker-label.ql-active .ql-fill{fill:var(--mat-sys-primary, var(--mat-app-primary))}.quill-host ::ng-deep .ql-snow .ql-picker-options{background-color:var(--mat-sys-surface-container-high, var(--mat-app-surface-container-high));border-color:var(--mat-sys-outline-variant, var(--mat-app-outline));border-radius:6px;box-shadow:0 4px 12px #0000002e;color:var(--mat-sys-on-surface, var(--mat-app-on-surface))}.quill-host ::ng-deep .ql-snow .ql-picker.ql-expanded .ql-picker-label{border-color:var(--mat-sys-outline-variant, var(--mat-app-outline));color:var(--mat-sys-primary, var(--mat-app-primary))}.quill-host ::ng-deep .ql-editor{min-height:300px;font-size:.9375rem;line-height:1.7;color:var(--mat-sys-on-surface, var(--mat-app-on-surface))}.quill-host ::ng-deep .ql-editor.ql-blank:before{color:var(--mat-sys-on-surface-variant, var(--mat-app-on-surface));font-style:normal;opacity:.7}.quill-host ::ng-deep .ql-editor a{color:var(--mat-sys-primary, var(--mat-app-primary))}.quill-host ::ng-deep .ql-editor blockquote{border-left-color:var(--mat-sys-outline, var(--mat-app-outline));color:var(--mat-sys-on-surface-variant, var(--mat-app-on-surface))}.quill-host ::ng-deep .ql-editor pre.ql-syntax,.quill-host ::ng-deep .ql-editor code{background-color:var(--mat-sys-surface-container-highest, var(--mat-app-surface-container-high));color:var(--mat-sys-on-surface, var(--mat-app-on-surface));border-radius:4px}.quill-host ::ng-deep .ql-editor table{border-collapse:collapse}.quill-host ::ng-deep .ql-editor td{border:1px solid var(--mat-sys-outline-variant, var(--mat-app-outline));padding:6px 10px}.quill-host ::ng-deep .ql-snow .ql-tooltip{background-color:var(--mat-sys-surface-container-high, var(--mat-app-surface-container-high));border-color:var(--mat-sys-outline-variant, var(--mat-app-outline));border-radius:6px;box-shadow:0 4px 12px #0000002e;color:var(--mat-sys-on-surface, var(--mat-app-on-surface))}.quill-host ::ng-deep .ql-snow .ql-tooltip input[type=text]{background-color:var(--mat-sys-surface-container-low, var(--mat-app-surface-container-low));border-color:var(--mat-sys-outline-variant, var(--mat-app-outline));color:var(--mat-sys-on-surface, var(--mat-app-on-surface));border-radius:4px}.quill-host ::ng-deep .ql-snow .ql-tooltip a.ql-action,.quill-host ::ng-deep .ql-snow .ql-tooltip a.ql-preview{color:var(--mat-sys-primary, var(--mat-app-primary))}.quill-host ::ng-deep .ql-snow .ql-tooltip a.ql-remove{color:var(--mat-sys-error, var(--mat-app-error))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
251
+ }
252
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: QuillInputComponent, decorators: [{
253
+ type: Component,
254
+ args: [{ selector: 'lib-quill-input', imports: [], host: {
255
+ '[class.floating]': 'shouldLabelFloat',
256
+ '[id]': 'id'
257
+ }, providers: [{ provide: MatFormFieldControl, useExisting: QuillInputComponent }], changeDetection: ChangeDetectionStrategy.OnPush, template: "\n<div class=\"quill-host\">\n <div #editorHost></div>\n</div>\n", styles: [".quill-host{border:solid 1px var(--mat-sys-outline-variant, var(--mat-app-outline));border-radius:6px;background:var(--mat-sys-surface-container-low, var(--mat-app-surface-container-low))}.quill-host ::ng-deep .ql-toolbar.ql-snow{border:none;border-bottom:solid 1px var(--mat-sys-outline-variant, var(--mat-app-outline));background:var(--mat-sys-surface-container, var(--mat-app-surface-container));padding:8px 10px;border-radius:6px 6px 0 0}.quill-host ::ng-deep .ql-container.ql-snow{border:none;border-radius:0 0 6px 6px;font-family:var(--mat-sys-body-large-font, inherit)}.quill-host ::ng-deep .ql-toolbar.ql-snow .ql-formats{margin-right:10px;padding-right:10px;border-right:1px solid var(--mat-sys-outline-variant, var(--mat-app-outline))}.quill-host ::ng-deep .ql-toolbar.ql-snow .ql-formats:last-child{border-right:none;padding-right:0}.quill-host ::ng-deep .ql-snow .ql-stroke,.quill-host ::ng-deep .ql-snow .ql-stroke-miter{stroke:var(--mat-sys-on-surface-variant, var(--mat-app-on-surface))}.quill-host ::ng-deep .ql-snow .ql-fill,.quill-host ::ng-deep .ql-snow .ql-stroke.ql-fill{fill:var(--mat-sys-on-surface-variant, var(--mat-app-on-surface))}.quill-host ::ng-deep .ql-snow .ql-picker{color:var(--mat-sys-on-surface-variant, var(--mat-app-on-surface))}.quill-host ::ng-deep .ql-toolbar.ql-snow button,.quill-host ::ng-deep .ql-toolbar.ql-snow .ql-picker-label{border-radius:4px;transition:background-color .12s ease}.quill-host ::ng-deep .ql-toolbar.ql-snow button:hover,.quill-host ::ng-deep .ql-toolbar.ql-snow button:focus,.quill-host ::ng-deep .ql-toolbar.ql-snow .ql-picker-label:hover{background-color:var(--mat-sys-surface-container-highest, var(--mat-app-surface-container-high))}.quill-host ::ng-deep .ql-snow.ql-toolbar button.ql-active,.quill-host ::ng-deep .ql-snow .ql-picker-label.ql-active,.quill-host ::ng-deep .ql-snow .ql-picker-item.ql-selected,.quill-host ::ng-deep .ql-snow.ql-toolbar button:hover,.quill-host ::ng-deep .ql-snow .ql-picker-item:hover{color:var(--mat-sys-primary, var(--mat-app-primary))}.quill-host ::ng-deep .ql-snow.ql-toolbar button:hover .ql-stroke,.quill-host ::ng-deep .ql-snow.ql-toolbar button:focus .ql-stroke,.quill-host ::ng-deep .ql-snow.ql-toolbar button.ql-active .ql-stroke,.quill-host ::ng-deep .ql-snow .ql-picker-label:hover .ql-stroke,.quill-host ::ng-deep .ql-snow .ql-picker-label.ql-active .ql-stroke,.quill-host ::ng-deep .ql-snow .ql-picker-item:hover .ql-stroke,.quill-host ::ng-deep .ql-snow .ql-picker-item.ql-selected .ql-stroke{stroke:var(--mat-sys-primary, var(--mat-app-primary))}.quill-host ::ng-deep .ql-snow.ql-toolbar button:hover .ql-fill,.quill-host ::ng-deep .ql-snow.ql-toolbar button.ql-active .ql-fill,.quill-host ::ng-deep .ql-snow .ql-picker-label:hover .ql-fill,.quill-host ::ng-deep .ql-snow .ql-picker-label.ql-active .ql-fill{fill:var(--mat-sys-primary, var(--mat-app-primary))}.quill-host ::ng-deep .ql-snow .ql-picker-options{background-color:var(--mat-sys-surface-container-high, var(--mat-app-surface-container-high));border-color:var(--mat-sys-outline-variant, var(--mat-app-outline));border-radius:6px;box-shadow:0 4px 12px #0000002e;color:var(--mat-sys-on-surface, var(--mat-app-on-surface))}.quill-host ::ng-deep .ql-snow .ql-picker.ql-expanded .ql-picker-label{border-color:var(--mat-sys-outline-variant, var(--mat-app-outline));color:var(--mat-sys-primary, var(--mat-app-primary))}.quill-host ::ng-deep .ql-editor{min-height:300px;font-size:.9375rem;line-height:1.7;color:var(--mat-sys-on-surface, var(--mat-app-on-surface))}.quill-host ::ng-deep .ql-editor.ql-blank:before{color:var(--mat-sys-on-surface-variant, var(--mat-app-on-surface));font-style:normal;opacity:.7}.quill-host ::ng-deep .ql-editor a{color:var(--mat-sys-primary, var(--mat-app-primary))}.quill-host ::ng-deep .ql-editor blockquote{border-left-color:var(--mat-sys-outline, var(--mat-app-outline));color:var(--mat-sys-on-surface-variant, var(--mat-app-on-surface))}.quill-host ::ng-deep .ql-editor pre.ql-syntax,.quill-host ::ng-deep .ql-editor code{background-color:var(--mat-sys-surface-container-highest, var(--mat-app-surface-container-high));color:var(--mat-sys-on-surface, var(--mat-app-on-surface));border-radius:4px}.quill-host ::ng-deep .ql-editor table{border-collapse:collapse}.quill-host ::ng-deep .ql-editor td{border:1px solid var(--mat-sys-outline-variant, var(--mat-app-outline));padding:6px 10px}.quill-host ::ng-deep .ql-snow .ql-tooltip{background-color:var(--mat-sys-surface-container-high, var(--mat-app-surface-container-high));border-color:var(--mat-sys-outline-variant, var(--mat-app-outline));border-radius:6px;box-shadow:0 4px 12px #0000002e;color:var(--mat-sys-on-surface, var(--mat-app-on-surface))}.quill-host ::ng-deep .ql-snow .ql-tooltip input[type=text]{background-color:var(--mat-sys-surface-container-low, var(--mat-app-surface-container-low));border-color:var(--mat-sys-outline-variant, var(--mat-app-outline));color:var(--mat-sys-on-surface, var(--mat-app-on-surface));border-radius:4px}.quill-host ::ng-deep .ql-snow .ql-tooltip a.ql-action,.quill-host ::ng-deep .ql-snow .ql-tooltip a.ql-preview{color:var(--mat-sys-primary, var(--mat-app-primary))}.quill-host ::ng-deep .ql-snow .ql-tooltip a.ql-remove{color:var(--mat-sys-error, var(--mat-app-error))}\n"] }]
258
+ }], ctorParameters: () => [], propDecorators: { inputConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "inputConfig", required: true }] }], valueChanged: [{ type: i0.Output, args: ["valueChanged"] }], editorHost: [{ type: i0.ViewChild, args: ['editorHost', { isSignal: true }] }], value: [{
259
+ type: Input
260
+ }] } });
261
+
262
+ /**
263
+ * Wraps a configurable rich-text editor inside a `mat-form-field`, selecting the concrete
264
+ * editor (EditorJS or Quill) from the column's `richTextEditorLibrary`, with shared
265
+ * label / hint / error / suffix / prefix metadata from the column.
266
+ */
267
+ class EditorInputElementComponent {
268
+ constructor() {
269
+ this.inputConfig = input.required(...(ngDevMode ? [{ debugName: "inputConfig" }] : /* istanbul ignore next */ []));
270
+ this.formGroup = input.required(...(ngDevMode ? [{ debugName: "formGroup" }] : /* istanbul ignore next */ []));
271
+ this.reload = output();
272
+ /** Editor-library enum exposed for `@switch` in the template. */
273
+ this.editorType = RichTextEditorType;
274
+ this.errorMessage = computed(() => getInputErrorMessage(this.inputConfig(), this.formGroup()), ...(ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []));
275
+ }
276
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: EditorInputElementComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
277
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: EditorInputElementComponent, isStandalone: true, selector: "lib-editor-input-element", inputs: { inputConfig: { classPropertyName: "inputConfig", publicName: "inputConfig", isSignal: true, isRequired: true, transformFunction: null }, formGroup: { classPropertyName: "formGroup", publicName: "formGroup", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { reload: "reload" }, ngImport: i0, template: "<form [formGroup]=\"formGroup()\">\n @if (inputConfig(); as inputConfig) {\n <mat-form-field [appearance]=\"inputConfig.appearance || 'fill'\" subscriptSizing=\"dynamic\">\n <mat-label>\n {{ inputConfig.label }}\n <lib-t-form-input-status [inputConfig]=\"inputConfig\"></lib-t-form-input-status>\n </mat-label>\n\n @switch (inputConfig.richTextEditorLibrary) {\n @case (editorType.Quill) {\n <lib-quill-input\n [inputConfig]=\"inputConfig\"\n [formControlName]=\"inputConfig.id\"\n [required]=\"inputConfig.required\"\n ></lib-quill-input>\n }\n @case (editorType.EditorJS) {\n <lib-editor-js-input\n [inputConfig]=\"inputConfig\"\n [formControlName]=\"inputConfig.id\"\n [required]=\"inputConfig.required\"\n ></lib-editor-js-input>\n }\n }\n\n @if (inputConfig.hintLabel || inputConfig.temporaryHint) {\n <mat-hint class=\"inputHint\">\n {{ inputConfig.temporaryHint || inputConfig.hintLabel }}\n </mat-hint>\n }\n\n @if (!!errorMessage()) {\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{ errorMessage() }}</mat-error>\n }\n\n @if (inputConfig.prefixIcon) {\n <mat-icon matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\n }\n\n @if (inputConfig.canReload?.canReload) {\n <button\n mat-icon-button\n style=\"margin-right: 4px;\"\n matTooltip=\"Click to refresh this field.\"\n class=\"input-sync-button\"\n (click)=\"inputConfig.canReload.emit()\"\n matSuffix\n >\n <mat-icon style=\"color: var(--mat-sys-primary)\">sync</mat-icon>\n </button>\n }\n\n @if (inputConfig.suffixIcon && inputConfig.id !== 'password') {\n <mat-icon matSuffix>{{ inputConfig.suffixIcon }}</mat-icon>\n }\n\n @if (inputConfig.prefixText) {\n <span matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\n }\n @if (inputConfig.suffixText) {\n <span matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText }}</span>\n }\n\n @if (inputConfig.maxLength && formGroup()) {\n <mat-hint align=\"end\">\n {{ (formGroup().controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength }}\n </mat-hint>\n }\n </mat-form-field>\n }\n</form>\n", styles: ["mat-form-field{width:100%!important}mat-form-field .input-sync-button{display:none}mat-form-field:hover .input-sync-button{display:inline-block}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: TFormInputStatusComponent, selector: "lib-t-form-input-status", inputs: ["inputConfig"] }, { kind: "component", type: EditorJsInputComponent, selector: "lib-editor-js-input", inputs: ["inputConfig", "value"], outputs: ["valueChanged"] }, { kind: "component", type: QuillInputComponent, selector: "lib-quill-input", inputs: ["inputConfig", "value"], outputs: ["valueChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
278
+ }
279
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: EditorInputElementComponent, decorators: [{
280
+ type: Component,
281
+ args: [{ selector: 'lib-editor-input-element', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
282
+ ReactiveFormsModule,
283
+ MatFormFieldModule,
284
+ MatIconModule,
285
+ MatButtonModule,
286
+ MatTooltipModule,
287
+ TFormInputStatusComponent,
288
+ EditorJsInputComponent,
289
+ QuillInputComponent,
290
+ ], template: "<form [formGroup]=\"formGroup()\">\n @if (inputConfig(); as inputConfig) {\n <mat-form-field [appearance]=\"inputConfig.appearance || 'fill'\" subscriptSizing=\"dynamic\">\n <mat-label>\n {{ inputConfig.label }}\n <lib-t-form-input-status [inputConfig]=\"inputConfig\"></lib-t-form-input-status>\n </mat-label>\n\n @switch (inputConfig.richTextEditorLibrary) {\n @case (editorType.Quill) {\n <lib-quill-input\n [inputConfig]=\"inputConfig\"\n [formControlName]=\"inputConfig.id\"\n [required]=\"inputConfig.required\"\n ></lib-quill-input>\n }\n @case (editorType.EditorJS) {\n <lib-editor-js-input\n [inputConfig]=\"inputConfig\"\n [formControlName]=\"inputConfig.id\"\n [required]=\"inputConfig.required\"\n ></lib-editor-js-input>\n }\n }\n\n @if (inputConfig.hintLabel || inputConfig.temporaryHint) {\n <mat-hint class=\"inputHint\">\n {{ inputConfig.temporaryHint || inputConfig.hintLabel }}\n </mat-hint>\n }\n\n @if (!!errorMessage()) {\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{ errorMessage() }}</mat-error>\n }\n\n @if (inputConfig.prefixIcon) {\n <mat-icon matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\n }\n\n @if (inputConfig.canReload?.canReload) {\n <button\n mat-icon-button\n style=\"margin-right: 4px;\"\n matTooltip=\"Click to refresh this field.\"\n class=\"input-sync-button\"\n (click)=\"inputConfig.canReload.emit()\"\n matSuffix\n >\n <mat-icon style=\"color: var(--mat-sys-primary)\">sync</mat-icon>\n </button>\n }\n\n @if (inputConfig.suffixIcon && inputConfig.id !== 'password') {\n <mat-icon matSuffix>{{ inputConfig.suffixIcon }}</mat-icon>\n }\n\n @if (inputConfig.prefixText) {\n <span matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\n }\n @if (inputConfig.suffixText) {\n <span matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText }}</span>\n }\n\n @if (inputConfig.maxLength && formGroup()) {\n <mat-hint align=\"end\">\n {{ (formGroup().controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength }}\n </mat-hint>\n }\n </mat-form-field>\n }\n</form>\n", styles: ["mat-form-field{width:100%!important}mat-form-field .input-sync-button{display:none}mat-form-field:hover .input-sync-button{display:inline-block}\n"] }]
291
+ }], propDecorators: { inputConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "inputConfig", required: true }] }], formGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "formGroup", required: true }] }], reload: [{ type: i0.Output, args: ["reload"] }] } });
292
+
293
+ export { EditorInputElementComponent };
294
+ //# sourceMappingURL=ngx-t-forms-editor-input-element.component-BLXlfb6F.mjs.map