jupiter-dynamic-forms 1.18.1 → 1.18.3
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.
- package/dist/core/dynamic-form.d.ts.map +1 -1
- package/dist/core/filter-roles-dialog.d.ts +2 -0
- package/dist/core/filter-roles-dialog.d.ts.map +1 -1
- package/dist/core/form-field.d.ts.map +1 -1
- package/dist/index.js +122 -124
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +191 -79
- package/dist/index.mjs.map +1 -1
- package/dist/schema/xbrl-types.d.ts +1 -0
- package/dist/schema/xbrl-types.d.ts.map +1 -1
- package/dist/utils/type-input-mapping.d.ts +2 -0
- package/dist/utils/type-input-mapping.d.ts.map +1 -1
- package/dist/utils/xbrl-form-builder.d.ts +1 -1
- package/dist/utils/xbrl-form-builder.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../node_modules/@lit/reactive-element/decorators/custom-element.js","../node_modules/@lit/reactive-element/css-tag.js","../node_modules/@lit/reactive-element/reactive-element.js","../node_modules/@lit/reactive-element/decorators/property.js","../node_modules/@lit/reactive-element/decorators/state.js","../src/utils/validation.ts","../src/utils/xbrl-form-builder.ts","../src/utils/i18n.ts","../src/services/DraftStorageService.ts","../src/utils/fact-matcher.ts","../src/utils/xbrl-validation.ts","../src/utils/type-input-mapping.ts","../src/core/form-field.ts","../src/core/concept-tree.ts","../src/core/add-column-dialog.ts","../src/core/form-section.ts","../src/core/advanced-filter.ts","../src/core/filter-roles-dialog.ts","../src/core/dynamic-form.ts","../src/index.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer((()=>{customElements.define(t,e)})):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce(((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1]),t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet));else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach((t=>t(this)))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach((t=>t.hostConnected?.()))}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach((t=>t.hostDisconnected?.()))}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i){if(void 0!==t){const e=this.constructor,h=this[t];if(i??=e.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(e._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach((t=>t.hostUpdate?.())),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach((t=>t.hostUpdated?.())),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach((t=>this._$ET(t,this[t]))),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.1\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","import{defaultConverter as t,notEqual as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:t,reflect:!1,hasChanged:e},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","import { ValidationRule, ValidationError, FieldType } from '../schema/types';\n\nexport class FormValidator {\n /**\n * Validates a field value against its validation rules\n */\n static validateField(\n fieldId: string,\n conceptId: string,\n columnId: string,\n value: any,\n fieldType: FieldType,\n rules: ValidationRule[] = []\n ): ValidationError[] {\n const errors: ValidationError[] = [];\n\n for (const rule of rules) {\n const error = this.validateRule(fieldId, conceptId, columnId, value, fieldType, rule);\n if (error) {\n errors.push(error);\n }\n }\n\n return errors;\n }\n\n /**\n * Validates a single rule against a value\n */\n private static validateRule(\n fieldId: string,\n conceptId: string,\n columnId: string,\n value: any,\n _fieldType: FieldType,\n rule: ValidationRule\n ): ValidationError | null {\n const isEmpty = value === null || value === undefined || value === '';\n\n switch (rule.type) {\n case 'required':\n if (isEmpty) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'min':\n if (!isEmpty && typeof value === 'number' && value < rule.value) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'max':\n if (!isEmpty && typeof value === 'number' && value > rule.value) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'minLength':\n if (!isEmpty && typeof value === 'string' && value.length < rule.value) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'maxLength':\n if (!isEmpty && typeof value === 'string' && value.length > rule.value) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'pattern':\n if (!isEmpty && typeof value === 'string') {\n const regex = new RegExp(rule.value);\n if (!regex.test(value)) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n }\n break;\n\n case 'email':\n if (!isEmpty && typeof value === 'string') {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n }\n break;\n\n case 'url':\n if (!isEmpty && typeof value === 'string') {\n try {\n new URL(value);\n } catch {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n }\n break;\n\n case 'custom':\n // Custom validation would be handled by consuming application\n break;\n\n default:\n console.warn(`Unknown validation rule type: ${rule.type}`);\n }\n\n return null;\n }\n\n /**\n * Creates a validation error object\n */\n private static createError(\n fieldId: string,\n conceptId: string,\n columnId: string,\n rule: ValidationRule\n ): ValidationError {\n return {\n fieldId,\n conceptId,\n columnId,\n message: rule.message,\n severity: rule.severity || 'error',\n rule\n };\n }\n\n /**\n * Validates data type conversion\n */\n static validateDataType(value: any, fieldType: FieldType): { valid: boolean; convertedValue?: any; error?: string } {\n if (value === null || value === undefined || value === '') {\n return { valid: true, convertedValue: value };\n }\n\n switch (fieldType) {\n case 'number':\n case 'decimal':\n case 'currency':\n case 'percentage': {\n const numValue = Number(value);\n if (isNaN(numValue)) {\n return { valid: false, error: 'Invalid number format' };\n }\n return { valid: true, convertedValue: numValue };\n }\n\n case 'date': {\n const dateValue = new Date(value);\n if (isNaN(dateValue.getTime())) {\n return { valid: false, error: 'Invalid date format' };\n }\n return { valid: true, convertedValue: dateValue.toISOString().split('T')[0] };\n }\n\n case 'datetime': {\n const datetimeValue = new Date(value);\n if (isNaN(datetimeValue.getTime())) {\n return { valid: false, error: 'Invalid datetime format' };\n }\n return { valid: true, convertedValue: datetimeValue.toISOString() };\n }\n\n case 'boolean':\n if (typeof value === 'boolean') {\n return { valid: true, convertedValue: value };\n }\n if (typeof value === 'string') {\n const boolValue = value.toLowerCase();\n if (boolValue === 'true' || boolValue === '1') {\n return { valid: true, convertedValue: true };\n }\n if (boolValue === 'false' || boolValue === '0') {\n return { valid: true, convertedValue: false };\n }\n }\n return { valid: false, error: 'Invalid boolean format' };\n\n case 'text':\n case 'textarea':\n case 'email':\n case 'url':\n case 'tel':\n return { valid: true, convertedValue: String(value) };\n\n case 'select':\n case 'multiselect':\n return { valid: true, convertedValue: value };\n\n default:\n return { valid: true, convertedValue: value };\n }\n }\n\n /**\n * Formats value for display based on field type\n */\n static formatValue(value: any, fieldType: FieldType, locale = 'en-US'): string {\n if (value === null || value === undefined) return '';\n\n switch (fieldType) {\n case 'number':\n return new Intl.NumberFormat(locale).format(Number(value));\n\n case 'decimal':\n return new Intl.NumberFormat(locale, { \n minimumFractionDigits: 2,\n maximumFractionDigits: 2 \n }).format(Number(value));\n\n case 'currency':\n return new Intl.NumberFormat(locale, { \n style: 'currency',\n currency: 'USD' // Should be configurable\n }).format(Number(value));\n\n case 'percentage':\n return new Intl.NumberFormat(locale, { \n style: 'percent',\n minimumFractionDigits: 2\n }).format(Number(value) / 100);\n\n case 'date':\n return new Date(value).toLocaleDateString(locale);\n\n case 'datetime':\n return new Date(value).toLocaleString(locale);\n\n default:\n return String(value);\n }\n }\n}\n","import { \n XBRLFormInput, \n XBRLPresentationRole,\n XBRLPresentationConcept,\n XBRLLabel,\n XBRLHypercubeData,\n XBRLHypercubeRole\n} from '../schema/xbrl-types';\nimport {\n XBRLFormSchema,\n FormSection,\n FormField,\n FormColumn,\n ConceptTree,\n ConceptMetadata,\n FieldType\n} from '../schema/types';\n\n/**\n * XBRL Form B private static assignColumnIdsToConceptFields(conceptTree: ConceptTree, columnIds: string[]): void {\n // Filter fields to only keep those that match available columns\n conceptTree.fields = conceptTree.fields.filter(field => {\n return columnIds.includes(field.columnId);\n });\n\n // Recursively process children\n if (conceptTree.children) {\n conceptTree.children.forEach(child => {\n this.assignColumnIdsToConceptFields(child, columnIds);\n });\n }\n }ransforms XBRL taxonomy data into Jupiter Dynamic Form schemas\n * Updated to handle actual presentation.json structure with roles\n */\nexport class XBRLFormBuilder {\n \n /**\n * Format period range for display - shows only year when both dates are in same year\n * @param startDate - Period start date in YYYY-MM-DD format\n * @param endDate - Period end date in YYYY-MM-DD format\n * @returns Formatted period string (e.g., \"2025\" or \"2025-01-01 / 2026-12-31\")\n */\n private static formatPeriodDisplay(startDate: string, endDate: string): string {\n if (!startDate || !endDate) {\n return `${startDate} / ${endDate}`;\n }\n \n const startYear = startDate.substring(0, 4);\n const endYear = endDate.substring(0, 4);\n \n // If both dates are in the same year, show only the year\n if (startYear === endYear) {\n return startYear;\n }\n \n // Otherwise, show the full date range\n return `${startDate} / ${endDate}`;\n }\n \n /**\n * Create unique concept ID by combining original ID with preferred label suffix\n * This handles cases where the same concept appears multiple times with different labels\n */\n private static createUniqueConceptId(concept: XBRLPresentationConcept, sectionId?: string): string {\n let baseId = concept.id;\n \n // Add preferred label suffix if exists\n if (concept.preferredLabel && concept.preferredLabel.trim() !== '') {\n // Extract the last part of the role URL as suffix\n const roleMatch = concept.preferredLabel.match(/\\/([^\\/]+)$/);\n const roleSuffix = roleMatch ? roleMatch[1] : concept.preferredLabel.replace(/[^a-zA-Z0-9]/g, '_');\n baseId = `${concept.id}_${roleSuffix}`;\n }\n \n // Add section context to avoid conflicts across roles\n if (sectionId) {\n // Create a short hash of the section ID to keep concept IDs manageable\n const sectionHash = this.createSectionHash(sectionId);\n return `${baseId}__${sectionHash}`;\n }\n \n return baseId;\n }\n \n /**\n * Create a short hash from section ID for concept uniqueness\n */\n private static createSectionHash(sectionId: string): string {\n // Simple hash to create a short identifier from the section ID\n let hash = 0;\n for (let i = 0; i < sectionId.length; i++) {\n const char = sectionId.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(36).substr(0, 6);\n }\n\n private static _extractDocumentationLabels(labels: XBRLLabel[]): { [lang: string]: string } {\n const result: { [lang: string]: string } = {};\n const docRole = 'http://www.xbrl.org/2003/role/documentation';\n labels.filter(l => l.role === docRole).forEach(l => { result[l.lang] = l.label; });\n return result;\n }\n\n /**\n * Build form schema from XBRL input data\n * Creates accordion sections for each presentation role\n * @param xbrlInput - XBRL taxonomy data\n * @param periodStartDate - Start date for the reporting period\n * @param periodEndDate - End date for the reporting period\n * @param language - ISO language code for labels (e.g., 'en', 'nl', 'de')\n * @param periodPreferences - User preferences for which period columns to show per role\n */\n static buildFormSchema(\n xbrlInput: XBRLFormInput, \n periodStartDate?: string, \n periodEndDate?: string,\n language: string = 'en',\n periodPreferences?: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }>\n ): XBRLFormSchema {\n if (!xbrlInput.presentation || xbrlInput.presentation.length === 0) {\n throw new Error('XBRL presentation data is required');\n }\n\n // Use the first entrypoint (typically there's only one)\n const presentationData = xbrlInput.presentation[0];\n \n // Extract hypercube data for dimension processing\n const hypercubeData = xbrlInput.hypercubes?.[0]; // Use first entrypoint\n \n // Extract datatypes for validation (handle both array and wrapped formats)\n const datatypes = Array.isArray(xbrlInput.datatypes) \n ? xbrlInput.datatypes \n : xbrlInput.datatypes?.concepts || [];\n \n const sections: FormSection[] = [];\n\n // Create a form section for each presentation role (using natural order from XBRL data)\n presentationData.roles.forEach(role => {\n const section = this.buildSectionFromRole(role, periodStartDate, periodEndDate, hypercubeData, language, periodPreferences);\n \n // CRITICAL: Attach datatypes to section for XBRL validation\n if (datatypes && datatypes.length > 0) {\n section.datatypes = datatypes;\n console.log(`✅ [buildFormSchema] Attached ${datatypes.length} datatypes to section ${section.id}`);\n } else {\n console.warn(`⚠️ [buildFormSchema] No datatypes available for section ${section.id}`);\n }\n \n // Post-process fields to assign correct column IDs based on generated columns\n this.assignFieldColumnIds(section);\n \n sections.push(section);\n });\n\n return {\n formId: `xbrl-form-${Date.now()}`,\n title: `XBRL Form - ${this.extractEntityName(presentationData.entrypoint)}`,\n description: `Dynamic form generated from XBRL taxonomy data`,\n version: '1.0.0',\n sections: sections\n };\n }\n\n /**\n * Extract section title from role name (remove role number prefix)\n * Handle missing role property gracefully by using role ID as fallback\n */\n private static buildSectionFromRole(\n role: XBRLPresentationRole, \n periodStartDate?: string, \n periodEndDate?: string,\n hypercubeData?: XBRLHypercubeData,\n language: string = 'en',\n periodPreferences?: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean; dimensionSelections?: any[] }>\n ): FormSection {\n // Extract section title from role name (remove role number prefix)\n // Handle missing role property by falling back to role ID\n const title = this.extractRoleTitle(role.role || role.id || 'Unknown Role');\n \n // Analyze period types in this role first to determine consistent column strategy\n const nonAbstractConcepts = this.getAllNonAbstractConcepts(role);\n const periodTypes = new Set(\n nonAbstractConcepts\n .filter(concept => concept.periodType)\n .map(concept => concept.periodType)\n );\n\n // Find matching hypercube role for dimension processing\n let hypercubeRole = hypercubeData?.roles.find(hr => hr.roleId === role.id);\n \n if (hypercubeRole) {\n //console.log(`🏷️ Found matching hypercube role \"${role.id}\"`);\n } else {\n //console.log(`❌ No hypercube role found for \"${role.id}\"`);\n }\n \n // Filter hypercube dimensions based on user selections\n const rolePreferences = periodPreferences?.[role.id];\n if (hypercubeRole && rolePreferences?.dimensionSelections && rolePreferences.dimensionSelections.length > 0) {\n console.log(`🔍 Filtering dimensions for role ${role.id} based on user selections`);\n hypercubeRole = this.filterHypercubeDimensionsBySelection(hypercubeRole, rolePreferences.dimensionSelections);\n }\n \n // Generate appropriate columns based on concept period types and hypercube dimensions FIRST\n const columns = this.generateDefaultColumnsForRole(role, periodStartDate || '2025-01-01', periodEndDate || '2025-12-31', hypercubeRole, nonAbstractConcepts, periodTypes, rolePreferences);\n\n // Extract column IDs for field creation\n const availableColumnIds = columns.map(col => col.id);\n //console.log(`📋 Available column IDs for role \"${role.id}\":`, availableColumnIds);\n \n\n \n const roleInfo = { periodTypes, availableColumnIds, availableColumns: columns };\n const conceptTrees: ConceptTree[] = [];\n const conceptIdOccurrences = new Map<string, number>();\n\n // Process root concepts and build tree structure with knowledge of available columns\n if (role.presentationLinkbase?.concepts) {\n role.presentationLinkbase.concepts.forEach(concept => {\n const conceptTree = this.buildConceptTree(concept, 0, periodStartDate, periodEndDate, roleInfo, role.id, language, conceptIdOccurrences);\n if (conceptTree) {\n conceptTrees.push(conceptTree);\n }\n });\n }\n\n // JDF-021: When the current role has no hypercube dimensions (either no entry at all,\n // or entry exists but items array is empty), check if any other role contains the same\n // concept with typed dimensions. If exactly one such role exists, annotate each field\n // with crossRoleTypedMembers so the Edit Period dialog can show the typed member inputs.\n if ((!hypercubeRole || !hypercubeRole.items?.length) && hypercubeData) {\n conceptTrees.forEach(conceptTree =>\n this.applyCrossRoleDimensions(conceptTree, role.id, hypercubeData, language)\n );\n }\n\n return {\n id: role.id,\n title: title,\n description: role.description || `Section for ${title}`,\n concepts: conceptTrees,\n columns: columns,\n expanded: false,\n metadata: {\n roleURI: role.roleURI,\n originalRole: role.role\n },\n showPeriodControl: periodTypes.size > 1,\n showPreviousYear: (role as any).showPreviousYear === true, // Read from presentation.json\n instant: (role as any).instant === true, // Read from presentation.json\n duration: (role as any).duration === true // Read from presentation.json\n };\n }\n\n /**\n * Build concept tree from XBRL presentation concept\n */\n private static buildConceptTree(\n concept: XBRLPresentationConcept,\n level: number,\n periodStartDate?: string,\n periodEndDate?: string,\n roleInfo?: { periodTypes: Set<string>, availableColumnIds?: string[], availableColumns?: FormColumn[] },\n sectionId?: string,\n language: string = 'en',\n conceptIdOccurrences?: Map<string, number>,\n ancestorPeriodHint?: 'start' | 'end'\n ): ConceptTree | null {\n const label = this.getPreferredLabel(concept.labels, language, concept.preferredLabel);\n\n // Determine the period hint to pass down to children based on this concept's preferredLabel.\n // Children of a periodStartLabel parent share the same instant context (start of period).\n // Children of a periodEndLabel parent share the end-of-period context (or pass through inherited hint).\n const childPeriodHint: 'start' | 'end' | undefined =\n concept.preferredLabel?.includes('periodStartLabel') ? 'start'\n : concept.preferredLabel?.includes('periodEndLabel') ? 'end'\n : ancestorPeriodHint;\n\n // Build fields for this concept (if not abstract)\n const fields: FormField[] = [];\n if (!concept.elementAbstract) {\n // Use available column IDs if provided, otherwise fall back to period-based logic\n let columnIds: string[] = [];\n\n if (roleInfo?.availableColumnIds && roleInfo.availableColumnIds.length > 0) {\n // Use all available columns - period type filtering removed since columns are now merged\n // Each field has its own period controls, so all concepts (instant/duration) can appear in the same column\n columnIds = roleInfo.availableColumnIds;\n } else {\n // Fallback to single default column\n // Since columns are now merged, we use 'duration' as the unified column ID\n columnIds = ['duration'];\n }\n\n // Create fields for appropriate column IDs, using each column's own period dates\n // so that previous-year columns get 2024 dates instead of the current year's dates.\n columnIds.forEach(columnId => {\n const column = roleInfo?.availableColumns?.find(c => c.id === columnId);\n const colStartDate = column?.periodStartDate || periodStartDate;\n const colEndDate = column?.periodEndDate || periodEndDate;\n const field = this.createFieldFromConcept(concept, colStartDate, colEndDate, columnId, ancestorPeriodHint, language);\n if (field) fields.push(field);\n });\n }\n\n // Process children recursively, propagating the period hint derived from this concept\n const children: ConceptTree[] = [];\n if (concept.children && concept.children.length > 0) {\n concept.children.forEach(child => {\n const childTree = this.buildConceptTree(child, level + 1, periodStartDate, periodEndDate, roleInfo, sectionId, language, conceptIdOccurrences, childPeriodHint);\n if (childTree) {\n children.push(childTree);\n }\n });\n }\n\n // Check if this concept should be included in the tree\n // For abstract concepts: only include if they have fields OR have children with content\n // For non-abstract concepts: always include if they have fields\n const hasContent = fields.length > 0 || children.length > 0;\n \n if (!hasContent) {\n // Abstract concept with no fields and no children with content - omit from tree\n return null;\n }\n\n let conceptId = this.createUniqueConceptId(concept, sectionId);\n if (conceptIdOccurrences) {\n const count = conceptIdOccurrences.get(conceptId) ?? 0;\n conceptIdOccurrences.set(conceptId, count + 1);\n if (count > 0) {\n conceptId = `${conceptId}__occ${count + 1}`;\n }\n }\n\n const conceptMetadata: ConceptMetadata = {\n conceptName: concept.conceptName,\n type: concept.type,\n substitutionGroup: concept.substitutionGroup,\n periodType: concept.periodType as 'instant' | 'duration',\n balance: concept.balance,\n documentationLabels: this._extractDocumentationLabels(concept.labels)\n };\n\n return {\n id: conceptId,\n originalConceptId: concept.id, // Store original for submission data\n name: concept.conceptName,\n label: label,\n description: `${concept.conceptName} (${concept.type})`,\n type: concept.type, // XBRL concept type for input field rendering\n level: level,\n children: children,\n fields: fields,\n conceptMetadata,\n facts: (concept as any).facts || [], // Pass facts array from presentation concept for pre-population\n collapsed: level > 0, // Collapse nested levels by default\n abstract: concept.elementAbstract,\n periodType: concept.periodType as 'instant' | 'duration',\n balance: concept.balance, // Pass through balance attribute from XBRL data\n preferredLabel: concept.preferredLabel // Pass through for period date calculation in manual columns\n };\n }\n\n /**\n * Create form field from XBRL concept\n */\n private static createFieldFromConcept(\n concept: XBRLPresentationConcept,\n periodStartDate?: string,\n periodEndDate?: string,\n forcedColumnId?: string,\n ancestorPeriodHint?: 'start' | 'end',\n language: string = 'en'\n ): FormField | null {\n const fieldType = this.mapXBRLTypeToFieldType(concept.type);\n const label = this.getPreferredLabel(concept.labels, language, concept.preferredLabel);\n\n // Determine appropriate column ID based on concept's period type or forced value\n let columnId: string;\n \n if (forcedColumnId) {\n // Use the forced column ID if provided\n columnId = forcedColumnId;\n } else {\n // Always use 'duration' column since we merged instant and duration into one column per year\n // Each field now has its own period controls, so no need for separate columns\n columnId = 'duration';\n } const field: FormField = {\n id: `${concept.id}_${columnId}_field`,\n conceptId: concept.id,\n columnId: columnId,\n type: fieldType,\n label: label,\n placeholder: `Enter ${label.toLowerCase()}`,\n required: false, // Will be determined by validation rules\n disabled: concept.elementAbstract,\n defaultValue: null,\n // Add period information - each field has its own period (defaults from column)\n periodType: (concept.periodType === 'instant' || concept.periodType === 'duration') ? concept.periodType : undefined, // Validate and set the period type\n periodStartDate: periodStartDate || '2025-01-01',\n periodEndDate: periodEndDate || '2025-12-31',\n periodInstantDate: concept.periodType === 'instant'\n ? (concept.preferredLabel?.includes('periodStartLabel') || ancestorPeriodHint === 'start'\n ? this.subtractOneDay(periodStartDate || '2025-01-01')\n : (periodEndDate || periodStartDate || '2025-01-01'))\n : undefined\n };\n\n // Debug: Log field creation for specific concepts\n if (concept.id === 'nl-cd_DescriptionLocationNL__a64trl') {\n console.log(`🏗️ [Field Creation] Concept: ${concept.id}, periodType from concept: ${concept.periodType}, Field periodType: ${field.periodType}, ColumnId: ${columnId}`);\n }\n\n return field;\n }\n\n /**\n * Map XBRL data type to form field type\n */\n private static mapXBRLTypeToFieldType(xbrlType: string): FieldType {\n const typeMap: Record<string, FieldType> = {\n 'xbrli:stringItemType': 'text',\n 'xbrli:monetaryItemType': 'currency',\n 'xbrli:integerItemType': 'number',\n 'xbrli:decimalItemType': 'decimal',\n 'xbrli:percentItemType': 'percentage',\n 'xbrli:dateItemType': 'date',\n 'xbrli:booleanItemType': 'boolean',\n 'dtr-types:domainItemType': 'select',\n 'bw2-titel9:chamberOfCommerceRegistrationNumberItemType': 'text'\n };\n\n return typeMap[xbrlType] || 'text';\n }\n\n /**\n * Get preferred label from labels array with language support\n * @param labels - Array of XBRL labels\n * @param language - ISO language code (e.g., 'en', 'nl', 'de')\n */\n private static getPreferredLabel(\n labels: XBRLLabel[],\n language: string = 'en',\n preferredRole?: string\n ): string {\n if (!labels || labels.length === 0) return 'Unnamed Concept';\n\n // Filter labels by language\n const languageLabels = labels.filter(l => l.lang === language);\n \n // If no labels found for the specified language, fall back to all labels\n const labelsToSearch = languageLabels.length > 0 ? languageLabels : labels;\n\n // First priority: match arc-level preferred role (e.g. totalLabel/periodStartLabel)\n // for the requested language, then across all labels.\n if (preferredRole) {\n const roleSpecificInLanguage = languageLabels.find(l => l.role === preferredRole);\n if (roleSpecificInLanguage) return roleSpecificInLanguage.label;\n\n const roleSpecificAnyLanguage = labels.find(l => l.role === preferredRole);\n if (roleSpecificAnyLanguage) return roleSpecificAnyLanguage.label;\n }\n\n // Try to find preferred label\n const preferred = labelsToSearch.find(l => l.preferredLabel);\n if (preferred) return preferred.label;\n\n // Try to find standard label\n const standard = labelsToSearch.find(l => l.role === 'http://www.xbrl.org/2003/role/label');\n if (standard) return standard.label;\n\n // Try to find terse label\n const terse = labelsToSearch.find(l => l.role === 'http://www.xbrl.org/2003/role/terseLabel');\n if (terse) return terse.label;\n\n // Return first available label from language-specific labels or fallback to any label\n return labelsToSearch.length > 0 ? labelsToSearch[0].label : labels[0].label;\n }\n\n /**\n * Assign appropriate column IDs to fields based on section's generated columns\n */\n private static assignFieldColumnIds(section: FormSection): void {\n if (!section.columns || section.columns.length === 0) {\n return;\n }\n\n // Get available column IDs\n const columnIds = section.columns.map(col => col.id);\n \n // Process all fields in all concept trees\n section.concepts.forEach(conceptTree => {\n this.assignColumnIdsToConceptFields(conceptTree, columnIds);\n });\n }\n\n /**\n * Recursively assign column IDs to fields in a concept tree\n */\n private static assignColumnIdsToConceptFields(conceptTree: ConceptTree, columnIds: string[]): void {\n // Filter fields to only keep those that match available columns\n conceptTree.fields = conceptTree.fields.filter(field => {\n return columnIds.includes(field.columnId);\n });\n\n // Process children recursively\n if (conceptTree.children) {\n conceptTree.children.forEach(child => {\n this.assignColumnIdsToConceptFields(child, columnIds);\n });\n }\n }\n\n /**\n * Count total fields in a concept tree recursively\n */\n private static countFieldsInTree(conceptTree: ConceptTree): number {\n let count = conceptTree.fields.length;\n if (conceptTree.children) {\n conceptTree.children.forEach(child => {\n count += this.countFieldsInTree(child);\n });\n }\n return count;\n }\n\n /**\n * Get all non-abstract concepts from a role recursively\n */\n static getAllNonAbstractConcepts(role: XBRLPresentationRole): XBRLPresentationConcept[] {\n const nonAbstractConcepts: XBRLPresentationConcept[] = [];\n \n if (role.presentationLinkbase?.concepts) {\n role.presentationLinkbase.concepts.forEach(concept => {\n this.collectNonAbstractConcepts(concept, nonAbstractConcepts);\n });\n }\n \n return nonAbstractConcepts;\n }\n\n /**\n * Recursively collect non-abstract concepts from a concept tree\n */\n private static collectNonAbstractConcepts(\n concept: XBRLPresentationConcept, \n collection: XBRLPresentationConcept[]\n ): void {\n // Add this concept if it's not abstract\n if (!concept.elementAbstract) {\n collection.push(concept);\n }\n \n // Recursively process children\n if (concept.children && concept.children.length > 0) {\n concept.children.forEach(child => {\n this.collectNonAbstractConcepts(child, collection);\n });\n }\n }\n\n /**\n * Filter hypercube dimensions to only include selected members\n */\n private static filterHypercubeDimensionsBySelection(\n hypercubeRole: any,\n dimensionSelections: Array<{ dimensionId: string; selectedMemberIds: string[] }>\n ): any {\n // Create a deep copy to avoid mutating original data\n const filteredRole = JSON.parse(JSON.stringify(hypercubeRole));\n \n if (!filteredRole.items || filteredRole.items.length === 0) {\n return filteredRole;\n }\n \n // Filter each item's dimensions\n filteredRole.items.forEach((item: any) => {\n if (!item.dimensions) return;\n \n item.dimensions = item.dimensions.map((dimension: any) => {\n // Find selection for this dimension\n const selection = dimensionSelections.find(s => s.dimensionId === dimension.id);\n \n if (!selection || !selection.selectedMemberIds || selection.selectedMemberIds.length === 0) {\n // No selection for this dimension, keep all members\n return dimension;\n }\n \n // Filter members to only include selected ones\n const filteredDimension = { ...dimension };\n filteredDimension.members = this.filterMembersBySelection(dimension.members, selection.selectedMemberIds);\n \n console.log(` ✅ Filtered dimension ${dimension.id}: ${dimension.members?.length || 0} → ${filteredDimension.members?.length || 0} members`);\n \n return filteredDimension;\n });\n });\n \n return filteredRole;\n }\n\n /**\n * Recursively filter dimension members to only include selected IDs\n */\n private static filterMembersBySelection(members: any[], selectedIds: string[]): any[] {\n if (!members || !Array.isArray(members)) return [];\n \n const filtered: any[] = [];\n \n members.forEach(member => {\n // Check if this member is selected\n if (selectedIds.includes(member.id)) {\n // Include this member (without children for now to avoid nested selection complexity)\n filtered.push({\n ...member,\n children: [] // Reset children as we're doing flat selection\n });\n }\n \n // Also check children recursively\n if (member.children && member.children.length > 0) {\n const filteredChildren = this.filterMembersBySelection(member.children, selectedIds);\n filtered.push(...filteredChildren);\n }\n });\n \n return filtered;\n }\n\n /**\n * Find typed dimension members from another role that shares the same concept.\n * Called when the current role has no hypercube dimensions.\n * Returns typed member info only when EXACTLY ONE other role matches.\n */\n private static findCrossRoleDimensions(\n conceptId: string,\n currentRoleId: string,\n hypercubeData: XBRLHypercubeData,\n language: string = 'en'\n ): Array<{ axisId: string; axisLabel: string; typedMemberId: string; memberLabel: string }> | null {\n const matchingRoles: XBRLHypercubeRole[] = [];\n\n for (const role of hypercubeData.roles) {\n if (role.roleId === currentRoleId) continue;\n\n for (const item of role.items) {\n if (!item.conceptIds?.includes(conceptId)) continue;\n // Only consider items with at least one typed dimension\n if (!item.dimensions?.some(d => d.typedMember)) continue;\n matchingRoles.push(role);\n break; // one match per role is enough\n }\n }\n\n if (matchingRoles.length !== 1) return null;\n\n const matchingRole = matchingRoles[0];\n const item = matchingRole.items.find(i => i.conceptIds?.includes(conceptId));\n if (!item) return null;\n\n const result: Array<{ axisId: string; axisLabel: string; typedMemberId: string; memberLabel: string }> = [];\n\n for (const dimension of item.dimensions) {\n if (!dimension.typedMember) continue;\n\n const labelObj =\n dimension.labels.find(l => l.lang === language) ||\n dimension.labels.find(l => l.lang === 'en') ||\n dimension.labels[0];\n const axisLabel = labelObj?.label || dimension.id;\n\n result.push({\n axisId: dimension.id,\n axisLabel,\n typedMemberId: dimension.typedMember.id,\n memberLabel: axisLabel\n });\n }\n\n return result.length > 0 ? result : null;\n }\n\n /**\n * Recursively walk a concept tree and set crossRoleTypedMembers on every field\n * whose concept appears in exactly one other hypercube role with typed dimensions.\n */\n private static applyCrossRoleDimensions(\n conceptTree: ConceptTree,\n currentRoleId: string,\n hypercubeData: XBRLHypercubeData,\n language: string\n ): void {\n if (!conceptTree.abstract && conceptTree.fields && conceptTree.fields.length > 0) {\n const crossRoleTypedMembers = this.findCrossRoleDimensions(\n conceptTree.originalConceptId,\n currentRoleId,\n hypercubeData,\n language\n );\n if (crossRoleTypedMembers) {\n conceptTree.fields.forEach(field => {\n field.crossRoleTypedMembers = crossRoleTypedMembers;\n });\n }\n }\n conceptTree.children?.forEach(child =>\n this.applyCrossRoleDimensions(child, currentRoleId, hypercubeData, language)\n );\n }\n\n /**\n * Generate default columns based on period types of non-abstract concepts in a role\n */\n static generateDefaultColumnsForRole(\n role: XBRLPresentationRole, \n periodStartDate: string, \n periodEndDate: string,\n hypercubeRole?: XBRLHypercubeRole,\n nonAbstractConcepts?: XBRLPresentationConcept[],\n rolePeriodTypes?: Set<string>,\n periodPreferences?: { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }\n ): FormColumn[] {\n // Use pre-calculated values if provided, otherwise calculate them\n const concepts = nonAbstractConcepts || this.getAllNonAbstractConcepts(role);\n const periodTypes = rolePeriodTypes || new Set(\n concepts\n .filter(concept => concept.periodType) // Only concepts with period type\n .map(concept => concept.periodType)\n );\n \n //console.log(`📊 Analyzing role \"${role.role}\" with ${concepts.length} non-abstract concepts`);\n \n if (concepts.length === 0) {\n // No non-abstract concepts, return single default column\n //console.log('📊 No non-abstract concepts found, using default column');\n return [{\n id: 'default',\n title: 'Value',\n description: 'Default value column',\n type: 'base',\n order: 0,\n removable: false\n }];\n }\n \n // Check for hypercube dimensions and generate appropriate columns\n let dimensionColumns: FormColumn[] = [];\n if (hypercubeRole?.items?.length === 1) {\n const item = hypercubeRole.items[0];\n \n \n if (item.dimensions.length === 1) {\n // Single dimension - existing logic\n dimensionColumns = this.generateSingleDimensionColumns(item.dimensions[0], periodStartDate, periodEndDate, periodTypes);\n } else if (item.dimensions.length > 1) {\n // Multiple dimensions - generate combination columns\n dimensionColumns = this.generateMultiDimensionColumns(item.dimensions, periodStartDate, periodEndDate, periodTypes);\n }\n \n // Filter columns based on period preferences\n if (periodPreferences) {\n dimensionColumns = this.filterColumnsByPeriodPreferences(dimensionColumns, periodPreferences);\n }\n } else if (hypercubeRole?.items?.length && hypercubeRole.items.length > 1) {\n //console.log(`⚠️ Multiple items found (${hypercubeRole.items.length}), skipping for now`);\n }\n \n // Analyze period types (use the pre-calculated or newly calculated set)\n //console.log(`📅 Found period types: ${Array.from(periodTypes).join(', ')}`);\n \n const columns: FormColumn[] = [];\n \n // If we have dimension columns, use them\n if (dimensionColumns.length > 0) {\n columns.push(...dimensionColumns);\n } else {\n // Create ONE column per year regardless of period types\n // Since each field now has its own period controls, we don't need separate columns for duration/instant\n if (periodTypes.size === 0) {\n // No period types specified, use single default column\n columns.push({\n id: 'default',\n title: this.formatPeriodDisplay(periodStartDate, periodEndDate),\n description: '',\n type: 'base',\n order: 0,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n } else {\n // Create single column for all period types (duration and instant combined)\n columns.push({\n id: 'duration',\n title: this.formatPeriodDisplay(periodStartDate, periodEndDate),\n description: '',\n type: 'base',\n order: 0,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n }\n }\n \n //console.log(`📊 Generated ${columns.length} columns for role \"${role.role}\":`, columns.map(c => c.title));\n \n // Apply period preferences filter if provided\n let filteredColumns = columns;\n if (periodPreferences) {\n filteredColumns = this.filterColumnsByPeriodPreferences(columns, periodPreferences);\n }\n \n // Generate previous year columns if requested\n if (periodPreferences?.showPreviousYear) {\n const previousYearColumns = this.generatePreviousYearColumns(filteredColumns, periodStartDate, periodEndDate);\n filteredColumns = [...filteredColumns, ...previousYearColumns];\n }\n \n return filteredColumns;\n }\n\n /**\n * Calculate previous year date by subtracting one year\n */\n private static getPreviousYearDate(dateString: string): string {\n try {\n const date = new Date(dateString);\n date.setFullYear(date.getFullYear() - 1);\n return date.toISOString().split('T')[0];\n } catch (error) {\n console.error(`Error calculating previous year for date ${dateString}:`, error);\n return dateString;\n }\n }\n\n private static subtractOneDay(dateString: string): string {\n try {\n const date = new Date(dateString);\n date.setDate(date.getDate() - 1);\n return date.toISOString().split('T')[0];\n } catch (error) {\n console.error(`Error subtracting one day from date ${dateString}:`, error);\n return dateString;\n }\n }\n\n /**\n * Generate previous year columns based on current year columns\n */\n private static generatePreviousYearColumns(\n currentYearColumns: FormColumn[],\n periodStartDate: string,\n periodEndDate: string\n ): FormColumn[] {\n const previousYearColumns: FormColumn[] = [];\n const prevStartDate = this.getPreviousYearDate(periodStartDate);\n const prevEndDate = this.getPreviousYearDate(periodEndDate);\n\n currentYearColumns.forEach((column, index) => {\n // Create a previous year version of each column\n let prevTitle = column.title; // Keep original title (dimension labels)\n let prevDescription = '';\n let prevId = '';\n\n // Determine the description and ID based on column type\n if (column.dimensionData) {\n // Column has dimensions - keep the title (dimension labels), update description (date)\n prevTitle = column.title; // Keep dimension labels like \"Commercial\" or \"Commercial | Separate\"\n \n // Update description with previous year dates (always use period range now)\n prevDescription = this.formatPeriodDisplay(prevStartDate, prevEndDate);\n prevId = `${column.id}_prev`;\n } else {\n // Column has no dimensions - always use period range format now\n prevTitle = this.formatPeriodDisplay(prevStartDate, prevEndDate);\n prevDescription = '';\n prevId = `duration_prev_${index}`;\n }\n\n previousYearColumns.push({\n ...column,\n id: prevId,\n title: prevTitle,\n description: prevDescription,\n order: column.order + 100, // Place after current year columns\n removable: false, // User explicitly chose this via filter dialog\n periodStartDate: prevStartDate, // Set previous year start date\n periodEndDate: prevEndDate, // Set previous year end date\n dimensionData: column.dimensionData ? {\n ...column.dimensionData,\n dimensionId: `${column.dimensionData.dimensionId}_prev`\n } : undefined\n });\n });\n\n return previousYearColumns;\n }\n\n /**\n * Filter columns based on user's period preferences\n */\n private static filterColumnsByPeriodPreferences(\n columns: FormColumn[],\n preferences: { showDuration: boolean; showInstant: boolean; showPreviousYear?: boolean }\n ): FormColumn[] {\n return columns.filter(column => {\n // Check if column is duration or instant based on its ID or dimensionData\n const isDuration = column.id.includes('duration') || \n column.dimensionData?.dimensionId?.includes('duration');\n const isInstant = column.id.includes('instant') || \n column.dimensionData?.dimensionId?.includes('instant');\n \n // If column is neither duration nor instant, keep it (default columns)\n if (!isDuration && !isInstant) {\n return true;\n }\n \n // Filter based on preferences\n if (isDuration && !preferences.showDuration) {\n return false;\n }\n if (isInstant && !preferences.showInstant) {\n return false;\n }\n \n return true;\n });\n }\n\n /**\n * Generate columns for single dimension scenarios\n */\n private static generateSingleDimensionColumns(\n dimension: any, \n periodStartDate: string, \n periodEndDate: string, \n periodTypes: Set<string>\n ): FormColumn[] {\n // //console.log(`📊 Processing single dimension:`, {\n // id: dimension.id,\n // conceptName: dimension.conceptName,\n // hasMembers: !!(dimension.members && Array.isArray(dimension.members)),\n // membersCount: dimension.members?.length || 0,\n // hasTypedMember: !!dimension.typedMember,\n // typedMemberId: dimension.typedMember?.id\n // });\n\n // Handle typed dimensions (no explicit members)\n if (dimension.typedMember && (!dimension.members || dimension.members.length === 0)) {\n //console.log(`🔤 Processing typed dimension: ${dimension.id} with typed member: ${dimension.typedMember.id}`);\n \n const axisLabel = dimension.labels.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n \n const dimensionInfo = {\n axisId: dimension.id,\n axisLabel,\n typedMemberId: dimension.typedMember.id,\n dimensionKey: `${axisLabel} | [Typed Input]`,\n dimensionIdKey: `${dimension.id}|[typed]`\n };\n \n //console.log(`🔤 Generated typed dimension info:`, dimensionInfo);\n \n const columns: FormColumn[] = [];\n \n if (periodTypes.size === 0) {\n columns.push({\n id: 'typed-default',\n title: axisLabel,\n description: 'Typed dimension input column',\n type: 'dimension',\n dimensionData: {\n dimensionId: 'typed-default',\n axisId: dimensionInfo.axisId,\n memberId: '[typed]',\n memberValue: 'Typed Input',\n memberLabel: 'Typed Input',\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey,\n hasTypedMembers: true,\n typedMemberId: dimensionInfo.typedMemberId,\n typedMembers: [{\n axisId: dimensionInfo.axisId,\n axisLabel: dimensionInfo.axisLabel,\n typedMemberId: dimensionInfo.typedMemberId,\n memberLabel: dimensionInfo.axisLabel\n }]\n },\n order: 0,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n } else if (periodTypes.size === 1 && periodTypes.has('instant')) {\n columns.push({\n id: 'typed-instant',\n title: `${axisLabel} `,\n description: periodEndDate,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'typed-instant',\n axisId: dimensionInfo.axisId,\n memberId: '[typed]',\n memberValue: 'Typed Input',\n memberLabel: 'Typed Input',\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey,\n hasTypedMembers: true,\n typedMemberId: dimensionInfo.typedMemberId,\n typedMembers: [{\n axisId: dimensionInfo.axisId,\n axisLabel: dimensionInfo.axisLabel,\n typedMemberId: dimensionInfo.typedMemberId,\n memberLabel: dimensionInfo.axisLabel\n }]\n },\n order: 0,\n removable: false,\n periodStartDate: periodEndDate,\n periodEndDate: periodEndDate\n });\n } else if (periodTypes.size === 1 && periodTypes.has('duration')) {\n columns.push({\n id: 'typed-duration',\n title: `${axisLabel} `,\n description: this.formatPeriodDisplay(periodStartDate, periodEndDate),\n type: 'dimension',\n dimensionData: {\n dimensionId: 'typed-duration',\n axisId: dimensionInfo.axisId,\n memberId: '[typed]',\n memberValue: 'Typed Input',\n memberLabel: 'Typed Input',\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey,\n hasTypedMembers: true,\n typedMemberId: dimensionInfo.typedMemberId,\n typedMembers: [{\n axisId: dimensionInfo.axisId,\n axisLabel: dimensionInfo.axisLabel,\n typedMemberId: dimensionInfo.typedMemberId,\n memberLabel: dimensionInfo.axisLabel\n }]\n },\n order: 0,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n } else {\n // All period types - create only ONE column (field-level period controls handle the rest)\n columns.push({\n id: 'typed-duration',\n title: `${axisLabel} `,\n description: this.formatPeriodDisplay(periodStartDate, periodEndDate),\n type: 'dimension',\n dimensionData: {\n dimensionId: 'typed-duration',\n axisId: dimensionInfo.axisId,\n memberId: '[typed]',\n memberValue: 'Typed Input',\n memberLabel: 'Typed Input',\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey,\n hasTypedMembers: true,\n typedMemberId: dimensionInfo.typedMemberId,\n typedMembers: [{\n axisId: dimensionInfo.axisId,\n axisLabel: dimensionInfo.axisLabel,\n typedMemberId: dimensionInfo.typedMemberId,\n memberLabel: dimensionInfo.axisLabel\n }]\n },\n order: 0,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n }\n \n //console.log(`🔤 Generated ${columns.length} typed dimension columns`);\n return columns;\n }\n\n // Handle explicit dimensions (existing logic)\n if (!dimension.members || !Array.isArray(dimension.members)) {\n //console.log(`⚠️ Dimension ${dimension.id} has no members defined and no typed member, skipping column generation`);\n return [];\n }\n\n // //console.log(`📊 Found single dimension:`, {\n // id: dimension.id,\n // conceptName: dimension.conceptName,\n // membersCount: dimension.members.length\n // });\n \n if (dimension.members.length === 0) {\n return [];\n }\n \n const axisLabel = dimension.labels.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n const firstMember = dimension.members[0];\n const memberLabel = firstMember.labels.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || firstMember.conceptName;\n \n const dimensionInfo = {\n axisId: dimension.id,\n axisLabel,\n memberId: firstMember.id,\n memberLabel,\n dimensionKey: `${axisLabel} | ${memberLabel}`,\n dimensionIdKey: `${dimension.id} | ${firstMember.id}`\n };\n \n //console.log(`📊 Generated dimension info:`, dimensionInfo);\n \n const columns: FormColumn[] = [];\n \n if (periodTypes.size === 0) {\n columns.push({\n id: 'default',\n title: dimensionInfo.memberLabel,\n description: 'Default value column',\n type: 'dimension',\n dimensionData: {\n dimensionId: 'default',\n axisId: dimensionInfo.axisId,\n memberId: dimensionInfo.memberId,\n memberValue: dimensionInfo.memberLabel,\n memberLabel: dimensionInfo.memberLabel,\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey\n },\n order: 0,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n } else if (periodTypes.size === 1 && periodTypes.has('instant')) {\n columns.push({\n id: 'instant',\n title: `${dimensionInfo.memberLabel}`,\n description: periodEndDate,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'instant',\n axisId: dimensionInfo.axisId,\n memberId: dimensionInfo.memberId,\n memberValue: dimensionInfo.memberLabel,\n memberLabel: dimensionInfo.memberLabel,\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey\n },\n order: 0,\n removable: false,\n periodStartDate: periodEndDate,\n periodEndDate: periodEndDate\n });\n } else if (periodTypes.size === 1 && periodTypes.has('duration')) {\n columns.push({\n id: 'duration',\n title: `${dimensionInfo.memberLabel}`,\n description: `${periodStartDate} / ${periodEndDate}`,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'duration',\n axisId: dimensionInfo.axisId,\n memberId: dimensionInfo.memberId,\n memberValue: dimensionInfo.memberLabel,\n memberLabel: dimensionInfo.memberLabel,\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey\n },\n order: 0,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n } else {\n // All period types - create only ONE column (field-level period controls handle the rest)\n columns.push({\n id: 'duration',\n title: `${dimensionInfo.memberLabel}`,\n description: this.formatPeriodDisplay(periodStartDate, periodEndDate),\n type: 'dimension',\n dimensionData: {\n dimensionId: 'duration',\n axisId: dimensionInfo.axisId,\n memberId: dimensionInfo.memberId,\n memberValue: dimensionInfo.memberLabel,\n memberLabel: dimensionInfo.memberLabel,\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey\n },\n order: 0,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n }\n \n return columns;\n }\n\n /**\n * Generate columns for multi-dimension scenarios - creates combinations of all dimension members\n */\n private static generateMultiDimensionColumns(\n dimensions: any[], \n periodStartDate: string, \n periodEndDate: string, \n periodTypes: Set<string>\n ): FormColumn[] {\n //console.log(`📊 Processing ${dimensions.length} dimensions for multi-dimensional columns`);\n // console.log(`🔍 [DEBUG] Input dimensions:`, dimensions.map(d => ({\n // id: d.id,\n // label: d.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label,\n // membersCount: d.members?.length || 0,\n // hasTypedMember: !!d.typedMember\n // })));\n \n // Detect typed members for header indication\n const hasTypedMembers = dimensions.some(dimension => dimension.typedMember);\n if (hasTypedMembers) {\n //console.log(`🔤 Found typed members in dimensions - will indicate in column headers`);\n }\n \n // Filter out dimensions without members (but keep typed dimensions)\n const validDimensions = dimensions.filter(dimension => {\n // Keep dimensions with typed members even if they don't have domain members\n if (dimension.typedMember) {\n //console.log(`🔤 Keeping typed dimension: ${dimension.id} with typed member: ${dimension.typedMember.id}`);\n return true;\n }\n // Keep dimensions with domain members\n if (dimension.members && Array.isArray(dimension.members) && dimension.members.length > 0) {\n //console.log(`📂 Keeping domain dimension: ${dimension.id} with ${dimension.members.length} members`);\n return true;\n }\n // Skip dimensions without any members\n //console.log(`⚠️ Skipping dimension ${dimension.id} - no members or typed member defined`);\n return false;\n });\n\n if (validDimensions.length === 0) {\n //console.log(`⚠️ No valid dimensions with members found, skipping multi-dimensional column generation`);\n return [];\n }\n \n // Get all dimension information\n const dimensionInfos = validDimensions.map(dimension => {\n const axisLabel = dimension.labels.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n \n // Handle typed dimensions differently\n if (dimension.typedMember) {\n return {\n id: dimension.id,\n axisLabel,\n isTyped: true,\n typedMemberId: dimension.typedMember.id,\n members: [{\n id: '[typed]',\n label: `${axisLabel}`\n }]\n };\n }\n \n // Handle domain dimensions (existing logic)\n const allMembers = this.getAllDimensionMembers(dimension.members);\n \n return {\n id: dimension.id,\n axisLabel,\n isTyped: false,\n members: allMembers.map(member => ({\n id: member.id,\n label: member.labels.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || member.conceptName\n }))\n };\n });\n \n // Generate all combinations of dimension members\n const combinations = this.generateDimensionCombinations(dimensionInfos);\n //console.log(`📊 Generated ${combinations.length} dimension combinations`);\n // //console.log(`🔍 [DEBUG] Generated combinations:`, combinations.map(combo => ({\n // memberLabels: combo.map((c: any) => c.memberLabel),\n // axisIds: combo.map((c: any) => c.axisId),\n // memberIds: combo.map((c: any) => c.memberId)\n // })));\n \n const columns: FormColumn[] = [];\n \n combinations.forEach((combination: any[], index: number) => {\n // Create column title from combination\n const columnTitle = combination.map((c: any) => c.memberLabel).join(' | ');\n \n // Identify typed and domain members in this combination\n const typedMembers = combination.filter((c: any) => c.isTyped);\n const domainMembers = combination.filter((c: any) => !c.isTyped);\n \n // console.log(`🔍 [Column ${index}] Combination analysis:`, {\n // totalMembers: combination.length,\n // typedMembers: typedMembers.length,\n // domainMembers: domainMembers.length,\n // hasTypedMembers: typedMembers.length > 0,\n // columnTitle: columnTitle,\n // memberLabels: combination.map((c: any) => c.memberLabel),\n // memberIds: combination.map((c: any) => c.memberId)\n // });\n \n // Create dimension data for this combination\n const dimensionData = {\n dimensionId: `multi_${index}`,\n memberValue: columnTitle, // Required field\n memberLabel: columnTitle, // Required field\n combinations: domainMembers.map((c: any) => ({\n axisId: c.axisId,\n axisLabel: c.axisLabel,\n memberId: c.memberId,\n memberLabel: c.memberLabel\n })),\n // Add typed member information for form fields\n typedMembers: typedMembers.map((c: any) => ({\n axisId: c.axisId,\n axisLabel: c.axisLabel,\n typedMemberId: c.typedMemberId,\n memberLabel: c.memberLabel\n })),\n hasTypedMembers: typedMembers.length > 0,\n memberKey: columnTitle,\n dimensionIdKey: [\n ...domainMembers.map((c: any) => `${c.axisId}|${c.memberId}`),\n ...typedMembers.map((c: any) => `${c.axisId}|[typed]`)\n ].join('::')\n };\n \n // console.log(`🔍 [Column ${index}] Final dimension data:`, {\n // dimensionId: dimensionData.dimensionId,\n // memberLabel: dimensionData.memberLabel,\n // dimensionIdKey: dimensionData.dimensionIdKey,\n // combinationsCount: dimensionData.combinations?.length,\n // typedMembersCount: dimensionData.typedMembers?.length\n // });\n \n // Create columns based on period types - always create ONE column per combination\n columns.push({\n id: `duration_${index}`,\n title: `${columnTitle}`,\n description: this.formatPeriodDisplay(periodStartDate, periodEndDate),\n type: 'dimension',\n dimensionData: {\n ...dimensionData,\n dimensionId: `duration_${index}`\n },\n order: index,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n });\n \n //console.log(`📊 Generated ${columns.length} multi-dimensional columns`);\n return columns;\n }\n\n /**\n * Get all members including children recursively\n */\n private static getAllDimensionMembers(members: any[]): any[] {\n if (!members || !Array.isArray(members)) {\n return [];\n }\n\n const allMembers: any[] = [];\n \n members.forEach(member => {\n allMembers.push(member);\n \n if (member.children && member.children.length > 0) {\n allMembers.push(...this.getAllDimensionMembers(member.children));\n }\n });\n \n return allMembers;\n }\n\n /**\n * Generate all combinations of dimension members\n */\n private static generateDimensionCombinations(dimensionInfos: any[]): any[] {\n if (dimensionInfos.length === 0) return [];\n if (dimensionInfos.length === 1) {\n return dimensionInfos[0].members.map((member: any) => [{\n axisId: dimensionInfos[0].id,\n axisLabel: dimensionInfos[0].axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: dimensionInfos[0].isTyped || false,\n typedMemberId: dimensionInfos[0].typedMemberId\n }]);\n }\n \n // Generate combinations recursively\n const [firstDimension, ...restDimensions] = dimensionInfos;\n const restCombinations = this.generateDimensionCombinations(restDimensions);\n \n const combinations: any[] = [];\n \n firstDimension.members.forEach((member: any) => {\n if (restCombinations.length === 0) {\n combinations.push([{\n axisId: firstDimension.id,\n axisLabel: firstDimension.axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: firstDimension.isTyped || false,\n typedMemberId: firstDimension.typedMemberId\n }]);\n } else {\n restCombinations.forEach(restCombination => {\n combinations.push([\n {\n axisId: firstDimension.id,\n axisLabel: firstDimension.axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: firstDimension.isTyped || false,\n typedMemberId: firstDimension.typedMemberId\n },\n ...restCombination\n ]);\n });\n }\n });\n \n return combinations;\n }\n\n /**\n * Format date for display in column headers\n */\n private static formatDateForDisplay(dateString: string): string {\n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n });\n } catch {\n return dateString;\n }\n }\n\n /**\n * Extract entity name from entrypoint URL\n */\n private static extractEntityName(entrypoint: string): string {\n try {\n const url = new URL(entrypoint);\n const pathParts = url.pathname.split('/');\n const filename = pathParts[pathParts.length - 1];\n return filename.replace('.xsd', '').replace(/[^a-zA-Z0-9]/g, ' ').trim() || 'Entity';\n } catch {\n return 'Entity';\n }\n }\n\n /**\n * Extract role title from role string\n * Handles various role formats and missing data gracefully\n */\n private static extractRoleTitle(role: string): string {\n if (!role) return 'Unnamed Section';\n \n // Remove role number prefix like \"[000001] \" and return the title\n const match = role.match(/^\\[[\\d]+\\]\\s*(.+)$/);\n if (match) {\n return match[1].trim();\n }\n \n // If it's clearly a URI (starts with protocol-like pattern), extract a readable name\n if (role.match(/^[a-z]+:[^:]*$/i) || role.match(/^urn:[^:]+:[^:]+/i)) {\n // Extract the last part after the last colon or hyphen for URI-like identifiers\n const parts = role.split(/[:\\-]/);\n const lastPart = parts[parts.length - 1];\n // Convert from snake_case or kebab-case to Title Case\n return lastPart\n .replace(/[_\\-]/g, ' ')\n .replace(/\\b\\w/g, l => l.toUpperCase());\n }\n \n // For regular role titles, return as is (they may contain colons and hyphens as part of the text)\n return role.trim() || 'Unnamed Section';\n }\n\n /**\n * Extract role order from role string\n */\n private static extractRoleOrder(role: string): number {\n const match = role.match(/^\\[([\\d]+)\\]/);\n return match ? parseInt(match[1], 10) : 0;\n }\n\n /**\n * Build columns from XBRL hypercube data (placeholder for now)\n */\n static buildColumnsFromHypercubes(/* _hypercubes: any[] */): any[] {\n // For now, return default column structure\n // This will be expanded when we implement hypercube support\n return [{\n id: 'default',\n label: 'Values',\n type: 'data'\n }];\n }\n}\n","import enTranslations from '../i18n/en.json';\nimport nlTranslations from '../i18n/nl.json';\n\nexport type TranslationKey = string;\n\ninterface Translations {\n [key: string]: any;\n}\n\nconst translations: Record<string, Translations> = {\n en: enTranslations,\n nl: nlTranslations\n};\n\n/**\n * I18n utility class for managing translations\n */\nexport class I18n {\n private static currentLanguage: string = 'en';\n \n /**\n * Set the current language\n * @param language Language code ('en' or 'nl')\n */\n static setLanguage(language: string): void {\n if (translations[language]) {\n this.currentLanguage = language;\n } else {\n console.warn(`Language '${language}' not supported, falling back to 'en'`);\n this.currentLanguage = 'en';\n }\n }\n \n /**\n * Get the current language\n */\n static getLanguage(): string {\n return this.currentLanguage;\n }\n \n /**\n * Translate a key to the current language\n * @param key Translation key in dot notation (e.g., 'form.submit')\n * @param params Optional parameters to replace in the translation\n * @returns Translated string\n */\n static t(key: string, params?: Record<string, string | number>): string {\n const keys = key.split('.');\n let value: any = translations[this.currentLanguage];\n \n // Navigate through the nested object\n for (const k of keys) {\n if (value && typeof value === 'object' && k in value) {\n value = value[k];\n } else {\n console.warn(`Translation key '${key}' not found for language '${this.currentLanguage}'`);\n return key; // Return the key itself as fallback\n }\n }\n \n // If we have parameters, replace them in the string\n if (params && typeof value === 'string') {\n return this.interpolate(value, params);\n }\n \n return value;\n }\n \n /**\n * Interpolate parameters into a string\n * Supports {{paramName}} syntax\n */\n private static interpolate(str: string, params: Record<string, string | number>): string {\n return str.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) => {\n return key in params ? String(params[key]) : match;\n });\n }\n \n /**\n * Check if a translation exists for a key\n */\n static has(key: string): boolean {\n const keys = key.split('.');\n let value: any = translations[this.currentLanguage];\n \n for (const k of keys) {\n if (value && typeof value === 'object' && k in value) {\n value = value[k];\n } else {\n return false;\n }\n }\n \n return value !== undefined;\n }\n \n /**\n * Get all available languages\n */\n static getAvailableLanguages(): string[] {\n return Object.keys(translations);\n }\n}\n\n// Export a convenience function\nexport const t = (key: string, params?: Record<string, string | number>) => I18n.t(key, params);\n","import { \n FormData, \n FormSection, \n FormColumn, \n SubmissionData \n} from '../schema/types';\n\n/**\n * Interface for draft metadata - stores the current form state configuration\n */\nexport interface DraftMetadata {\n savedAt: string; // ISO timestamp\n periodStartDate: string;\n periodEndDate: string;\n language: string;\n reportingLanguage: string;\n selectedRoleIds: Array<{ roleId: string; roleURI: string; order: number }> | string[]; // Enhanced structure with roleURI and order, or legacy string array\n customColumns: CustomColumnMetadata[];\n typedMemberData: { [columnId: string]: { [axisId: string]: string } };\n periodPreferences?: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }>; // Period preferences for each role\n periodData?: { [conceptId: string]: { [columnId: string]: { startDate?: string; endDate?: string; instantDate?: string } } }; // Custom field-level period dates\n unitData?: { [conceptId: string]: { [columnId: string]: string } }; // Custom field-level unit selections\n decimalsData?: { [conceptId: string]: { [columnId: string]: string } }; // Per-fact decimals values\n repeatCounts?: { [conceptId: string]: number }; // Extra repeat row counts per concept (JDF-022)\n roleCompletedStates?: Record<string, boolean>; // Manually marked completed roles\n schemaVersion?: string;\n}\n\n/**\n * Interface for custom column metadata\n */\nexport interface CustomColumnMetadata {\n sectionId: string;\n columnId: string;\n label: string;\n description?: string; // Period display (e.g., \"2025\")\n periodType: 'instant' | 'duration';\n date?: string;\n startDate?: string;\n endDate?: string;\n dimensionData?: any;\n}\n\n/**\n * Interface for complete draft storage\n */\nexport interface DraftStorage {\n formData: SubmissionData; // Same format as submit\n metadata: DraftMetadata;\n version: string; // Storage format version\n}\n\n/**\n * DraftStorageService - Manages saving and loading form drafts\n * \n * Responsibilities:\n * - Save form data to localStorage/sessionStorage\n * - Save form metadata (columns, roles, configuration)\n * - Load saved drafts\n * - Clear draft storage\n * - Validate draft compatibility\n */\nexport class DraftStorageService {\n private readonly DRAFT_DATA_KEY = 'jupiter-form-draft-data';\n private readonly DRAFT_METADATA_KEY = 'jupiter-form-draft-metadata';\n private readonly STORAGE_VERSION = '1.0';\n \n // Use localStorage by default (survives browser restart)\n // Can be switched to sessionStorage if needed\n private _storage: Storage;\n\n constructor(useSessionStorage: boolean = false) {\n this._storage = useSessionStorage ? sessionStorage : localStorage;\n console.log(`💾 DraftStorageService initialized (using ${useSessionStorage ? 'sessionStorage' : 'localStorage'})`);\n }\n\n // ===========================================\n // Public API Methods\n // ===========================================\n\n /**\n * Save complete draft including data and metadata\n */\n saveDraft(\n submissionData: SubmissionData,\n metadata: Omit<DraftMetadata, 'savedAt'>\n ): boolean {\n try {\n const draft: DraftStorage = {\n formData: submissionData,\n metadata: {\n ...metadata,\n savedAt: new Date().toISOString()\n },\n version: this.STORAGE_VERSION\n };\n\n // Save to storage\n this._storage.setItem(this.DRAFT_DATA_KEY, JSON.stringify(draft.formData));\n this._storage.setItem(this.DRAFT_METADATA_KEY, JSON.stringify(draft.metadata));\n\n console.log('✅ Draft saved successfully', {\n entries: submissionData.length,\n timestamp: draft.metadata.savedAt,\n roles: metadata.selectedRoleIds.length,\n customColumns: metadata.customColumns.length\n });\n\n return true;\n } catch (error) {\n console.error('❌ Failed to save draft:', error);\n return false;\n }\n }\n\n /**\n * Load saved draft\n */\n loadDraft(): DraftStorage | null {\n try {\n const dataStr = this._storage.getItem(this.DRAFT_DATA_KEY);\n const metadataStr = this._storage.getItem(this.DRAFT_METADATA_KEY);\n\n if (!dataStr || !metadataStr) {\n console.log('ℹ️ No saved draft found');\n return null;\n }\n\n const formData = JSON.parse(dataStr) as SubmissionData;\n const metadata = JSON.parse(metadataStr) as DraftMetadata;\n\n console.log('✅ Draft loaded successfully', {\n entries: formData.length,\n savedAt: metadata.savedAt,\n roles: metadata.selectedRoleIds.length,\n customColumns: metadata.customColumns.length\n });\n\n return {\n formData,\n metadata,\n version: this.STORAGE_VERSION\n };\n } catch (error) {\n console.error('❌ Failed to load draft:', error);\n return null;\n }\n }\n\n /**\n * Check if a draft exists\n */\n hasDraft(): boolean {\n return this._storage.getItem(this.DRAFT_DATA_KEY) !== null &&\n this._storage.getItem(this.DRAFT_METADATA_KEY) !== null;\n }\n\n /**\n * Get draft metadata only (without full data)\n */\n getDraftMetadata(): DraftMetadata | null {\n try {\n const metadataStr = this._storage.getItem(this.DRAFT_METADATA_KEY);\n if (!metadataStr) return null;\n\n return JSON.parse(metadataStr) as DraftMetadata;\n } catch (error) {\n console.error('❌ Failed to load draft metadata:', error);\n return null;\n }\n }\n\n /**\n * Clear saved draft\n */\n clearDraft(): boolean {\n try {\n this._storage.removeItem(this.DRAFT_DATA_KEY);\n this._storage.removeItem(this.DRAFT_METADATA_KEY);\n console.log('🗑️ Draft cleared successfully');\n return true;\n } catch (error) {\n console.error('❌ Failed to clear draft:', error);\n return false;\n }\n }\n\n /**\n * Get draft age in milliseconds\n */\n getDraftAge(): number | null {\n const metadata = this.getDraftMetadata();\n if (!metadata) return null;\n\n const savedAt = new Date(metadata.savedAt);\n const now = new Date();\n return now.getTime() - savedAt.getTime();\n }\n\n /**\n * Check if draft is older than specified time (in milliseconds)\n */\n isDraftStale(maxAge: number): boolean {\n const age = this.getDraftAge();\n return age !== null && age > maxAge;\n }\n\n /**\n * Extract custom columns from all sections\n */\n extractCustomColumns(allSections: FormSection[]): CustomColumnMetadata[] {\n const customColumns: CustomColumnMetadata[] = [];\n\n allSections.forEach(section => {\n // Check if section has columns\n if (!section.columns || !Array.isArray(section.columns)) {\n return;\n }\n\n section.columns.forEach(column => {\n // Store all columns to preserve exact state\n customColumns.push({\n sectionId: section.id,\n columnId: column.id,\n label: column.title, // FormColumn uses 'title' not 'label'\n description: column.description, // Save description (period display)\n periodType: this._inferPeriodTypeFromColumn(column),\n date: column.periodStartDate, // Use periodStartDate for instant\n startDate: column.periodStartDate,\n endDate: column.periodEndDate,\n dimensionData: column.dimensionData\n });\n });\n });\n\n return customColumns;\n }\n\n /**\n * Infer period type from column data\n */\n private _inferPeriodTypeFromColumn(column: FormColumn): 'instant' | 'duration' {\n // If column has both start and end dates, it's duration\n if (column.periodStartDate && column.periodEndDate) {\n return 'duration';\n }\n // Otherwise default to instant\n return 'instant';\n }\n\n /**\n * Create metadata snapshot from current form state\n */\n createMetadataSnapshot(\n periodStartDate: string,\n periodEndDate: string,\n language: string,\n selectedRoleIds: Array<{ roleId: string; roleURI: string; order: number }> | string[], // Accept both enhanced and legacy formats\n allSections: FormSection[],\n typedMemberData: { [columnId: string]: { [axisId: string]: string } },\n periodPreferences?: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }>,\n periodData?: { [conceptId: string]: { [columnId: string]: { startDate?: string; endDate?: string; instantDate?: string } } },\n unitData?: { [conceptId: string]: { [columnId: string]: string } },\n reportingLanguage: string = 'en',\n repeatCounts?: { [conceptId: string]: number },\n decimalsData?: { [conceptId: string]: { [columnId: string]: string } },\n roleCompletedStates?: Record<string, boolean>\n ): Omit<DraftMetadata, 'savedAt'> {\n return {\n periodStartDate,\n periodEndDate,\n language,\n reportingLanguage,\n selectedRoleIds, // Store enhanced structure (with roleURI and order) or legacy string array\n customColumns: this.extractCustomColumns(allSections),\n typedMemberData,\n periodPreferences,\n periodData,\n unitData,\n decimalsData,\n repeatCounts,\n roleCompletedStates,\n schemaVersion: this.STORAGE_VERSION\n };\n }\n\n /**\n * Validate draft compatibility with current schema\n */\n validateDraftCompatibility(draft: DraftStorage, currentPeriodStart: string, currentPeriodEnd: string): {\n compatible: boolean;\n warnings: string[];\n } {\n const warnings: string[] = [];\n\n // Check if period dates match\n if (draft.metadata.periodStartDate !== currentPeriodStart) {\n warnings.push(`Draft period start (${draft.metadata.periodStartDate}) differs from current (${currentPeriodStart})`);\n }\n\n if (draft.metadata.periodEndDate !== currentPeriodEnd) {\n warnings.push(`Draft period end (${draft.metadata.periodEndDate}) differs from current (${currentPeriodEnd})`);\n }\n\n // Check draft age\n const age = this.getDraftAge();\n if (age && age > 7 * 24 * 60 * 60 * 1000) { // 7 days\n warnings.push(`Draft is ${Math.floor(age / (24 * 60 * 60 * 1000))} days old`);\n }\n\n const compatible = warnings.length === 0;\n\n return { compatible, warnings };\n }\n}\n","/**\n * Fact Matcher Utility\n * \n * Matches XBRL facts to form fields based on contextual information:\n * - Period (duration or instant)\n * - Dimensions (explicit and typed)\n * - Unit (for monetary types)\n */\n\nexport interface XBRLFact {\n name: string;\n value: any;\n period: string; // \"2025-01-01 / 2025-12-31\" or \"2025-12-31\"\n unitMeasure?: string; // e.g., \"iso4217:EUR\"\n contextId: string;\n prefix: string;\n dimensions?: Array<{\n dimensionType: 'explicit' | 'typed';\n dimension: string; // Axis ID (e.g., \"jenv-bw2-dim:BasisOfPreparationAxis\")\n member?: string; // For explicit dimensions (e.g., \"jenv-bw2-dm:CommercialMember\")\n typedMember?: string; // For typed dimensions - member reference\n typedMemberValue?: string; // For typed dimensions - actual value\n }>;\n}\n\nexport interface CellContext {\n conceptId: string;\n columnId: string;\n periodStartDate?: string;\n periodEndDate?: string;\n periodInstantDate?: string;\n periodType?: 'duration' | 'instant';\n unit?: string;\n dimensionData?: {\n dimensionIdKey?: string; // Format: \"axis1|member1::axis2|member2\"\n combinations?: Array<{\n axisId: string;\n memberId: string;\n memberLabel: string;\n }>;\n typedMembers?: Array<{\n axisId: string;\n axisLabel: string;\n typedMemberId: string;\n }>;\n };\n}\n\nexport class FactMatcher {\n /**\n * Find a matching fact for a given cell context\n */\n static findMatchingFact(facts: XBRLFact[], context: CellContext): XBRLFact | null {\n if (!facts || facts.length === 0) {\n return null;\n }\n\n // Filter facts that match the period\n const periodMatchedFacts = facts.filter(fact => \n this.matchesPeriod(fact, context)\n );\n\n if (periodMatchedFacts.length === 0) {\n return null;\n }\n\n // Filter facts that match dimensions\n const dimensionMatchedFacts = periodMatchedFacts.filter(fact =>\n this.matchesDimensions(fact, context)\n );\n\n if (dimensionMatchedFacts.length === 0) {\n return null;\n }\n\n // If multiple facts match, prefer one with matching unit (if applicable)\n if (dimensionMatchedFacts.length > 1 && context.unit) {\n const unitMatchedFact = dimensionMatchedFacts.find(fact =>\n this.matchesUnit(fact, context)\n );\n if (unitMatchedFact) {\n return unitMatchedFact;\n }\n }\n\n // Return first matching fact\n return dimensionMatchedFacts[0];\n }\n\n /**\n * Check if fact period matches cell period\n */\n private static matchesPeriod(fact: XBRLFact, context: CellContext): boolean {\n const factPeriod = this.parsePeriod(fact.period);\n \n // Match instant period\n if (context.periodType === 'instant' && context.periodInstantDate) {\n return factPeriod.isInstant && factPeriod.instantDate === context.periodInstantDate;\n }\n\n // Match duration period\n if (context.periodType === 'duration' && context.periodStartDate && context.periodEndDate) {\n return !factPeriod.isInstant && \n factPeriod.startDate === context.periodStartDate &&\n factPeriod.endDate === context.periodEndDate;\n }\n\n // If no period type specified, try to match by dates\n if (context.periodInstantDate) {\n return factPeriod.isInstant && factPeriod.instantDate === context.periodInstantDate;\n }\n\n if (context.periodStartDate && context.periodEndDate) {\n return !factPeriod.isInstant && \n factPeriod.startDate === context.periodStartDate &&\n factPeriod.endDate === context.periodEndDate;\n }\n\n // No period context to match against\n return true;\n }\n\n /**\n * Check if fact dimensions match cell dimensions\n */\n private static matchesDimensions(fact: XBRLFact, context: CellContext): boolean {\n const factDimensions = fact.dimensions || [];\n const cellDimensions = this.extractDimensionsFromContext(context);\n\n // Debug logging for dimension matching\n const shouldDebug = false; // Set to true to enable detailed logging\n if (shouldDebug) {\n console.log('🔍 [FactMatcher] Dimension Match Check:', {\n factDimensions: factDimensions.map(d => ({\n axis: d.dimension,\n member: d.member,\n normalized: {\n axis: this.normalizeAxisId(d.dimension),\n member: this.normalizeMemberId(d.member || '')\n }\n })),\n cellDimensions: cellDimensions.map(d => ({\n axisId: d.axisId,\n memberId: d.memberId,\n normalized: {\n axis: this.normalizeAxisId(d.axisId),\n member: this.normalizeMemberId(d.memberId)\n }\n }))\n });\n }\n\n // If cell has no dimensions, fact should also have no dimensions\n if (cellDimensions.length === 0) {\n return factDimensions.length === 0;\n }\n\n // If fact has no dimensions but cell has dimensions, no match\n if (factDimensions.length === 0 && cellDimensions.length > 0) {\n return false;\n }\n\n // Both must have same number of dimensions\n if (factDimensions.length !== cellDimensions.length) {\n if (shouldDebug) {\n console.log('❌ [FactMatcher] Dimension count mismatch:', {\n factCount: factDimensions.length,\n cellCount: cellDimensions.length\n });\n }\n return false;\n }\n\n // Check if all cell dimensions are present in fact dimensions\n const allMatch = cellDimensions.every(cellDim => {\n return factDimensions.some(factDim => {\n // Match axis\n const axisMatch = this.normalizeAxisId(factDim.dimension) === this.normalizeAxisId(cellDim.axisId);\n \n if (!axisMatch) {\n return false;\n }\n\n // Match member (explicit)\n if (factDim.dimensionType === 'explicit' && cellDim.memberId) {\n const memberMatch = this.normalizeMemberId(factDim.member || '') === this.normalizeMemberId(cellDim.memberId);\n if (shouldDebug && !memberMatch) {\n console.log('❌ [FactMatcher] Member mismatch:', {\n factMember: factDim.member,\n cellMember: cellDim.memberId,\n factNormalized: this.normalizeMemberId(factDim.member || ''),\n cellNormalized: this.normalizeMemberId(cellDim.memberId)\n });\n }\n return memberMatch;\n }\n\n // Match typed dimension\n if (factDim.dimensionType === 'typed' && cellDim.isTyped) {\n return true; // Typed dimensions match by axis only\n }\n\n return false;\n });\n });\n\n if (shouldDebug) {\n console.log(allMatch ? '✅ [FactMatcher] All dimensions matched' : '❌ [FactMatcher] Some dimensions did not match');\n }\n\n return allMatch;\n }\n\n /**\n * Check if fact unit matches cell unit\n */\n private static matchesUnit(fact: XBRLFact, context: CellContext): boolean {\n if (!context.unit || !fact.unitMeasure) {\n return true; // No unit to match\n }\n\n // Normalize units for comparison (e.g., \"iso4217:EUR\" -> \"EUR\")\n const factUnit = this.normalizeUnit(fact.unitMeasure);\n const cellUnit = this.normalizeUnit(context.unit);\n\n return factUnit === cellUnit;\n }\n\n /**\n * Parse period string into structured format\n */\n private static parsePeriod(period: string): {\n isInstant: boolean;\n instantDate?: string;\n startDate?: string;\n endDate?: string;\n } {\n // Check if it's a duration period (contains \" / \")\n if (period.includes(' / ')) {\n const [startDate, endDate] = period.split(' / ').map(d => d.trim());\n return {\n isInstant: false,\n startDate,\n endDate\n };\n }\n\n // It's an instant period\n return {\n isInstant: true,\n instantDate: period.trim()\n };\n }\n\n /**\n * Extract dimensions from cell context\n */\n private static extractDimensionsFromContext(context: CellContext): Array<{\n axisId: string;\n memberId: string;\n isTyped?: boolean;\n }> {\n if (!context.dimensionData) {\n return [];\n }\n\n const dimensions: Array<{ axisId: string; memberId: string; isTyped?: boolean }> = [];\n\n // Extract from combinations (explicit dimensions)\n if (context.dimensionData.combinations && context.dimensionData.combinations.length > 0) {\n context.dimensionData.combinations.forEach(combo => {\n dimensions.push({\n axisId: combo.axisId,\n memberId: combo.memberId\n });\n });\n }\n\n // Extract from typed members\n if (context.dimensionData.typedMembers && context.dimensionData.typedMembers.length > 0) {\n context.dimensionData.typedMembers.forEach(typed => {\n dimensions.push({\n axisId: typed.axisId,\n memberId: '[typed]',\n isTyped: true\n });\n });\n }\n\n return dimensions;\n }\n\n /**\n * Normalize axis ID for comparison\n * Handles both formats: \"jenv-bw2-dim:BasisOfPreparationAxis\" and \"jenv-bw2-dim_BasisOfPreparationAxis\"\n * Returns: \"BasisOfPreparationAxis\"\n */\n private static normalizeAxisId(axisId: string): string {\n if (!axisId) return '';\n \n // Try colon separator first (fact format)\n if (axisId.includes(':')) {\n const parts = axisId.split(':');\n return parts[1] || parts[0];\n }\n \n // Try underscore separator (hypercube format)\n if (axisId.includes('_')) {\n const parts = axisId.split('_');\n // Find the last part after the last underscore (e.g., \"jenv-bw2-dim_BasisOfPreparationAxis\" -> \"BasisOfPreparationAxis\")\n // But we need to be smarter - the namespace is typically \"prefix-type_\" followed by the actual name\n // Look for pattern: {prefix}-{type}_{ConceptName}\n const lastUnderscoreIndex = axisId.lastIndexOf('_');\n if (lastUnderscoreIndex > 0) {\n return axisId.substring(lastUnderscoreIndex + 1);\n }\n }\n \n // No separator found, return as-is\n return axisId;\n }\n\n /**\n * Normalize member ID for comparison\n * Handles both formats: \"jenv-bw2-dm:CommercialMember\" and \"jenv-bw2-dm_CommercialMember\"\n * Returns: \"CommercialMember\"\n */\n private static normalizeMemberId(memberId: string): string {\n if (!memberId) return '';\n \n // Try colon separator first (fact format)\n if (memberId.includes(':')) {\n const parts = memberId.split(':');\n return parts[1] || parts[0];\n }\n \n // Try underscore separator (hypercube format)\n if (memberId.includes('_')) {\n const lastUnderscoreIndex = memberId.lastIndexOf('_');\n if (lastUnderscoreIndex > 0) {\n return memberId.substring(lastUnderscoreIndex + 1);\n }\n }\n \n // No separator found, return as-is\n return memberId;\n }\n\n /**\n * Normalize unit for comparison\n * Converts \"iso4217:EUR\" to \"EUR\"\n */\n private static normalizeUnit(unit: string): string {\n if (!unit) return '';\n \n // Remove namespace prefix\n const parts = unit.split(':');\n return parts.length > 1 ? parts[1] : parts[0];\n }\n\n /**\n * Extract typed dimension values from facts\n * Returns a map of axis IDs to typed values\n */\n static extractTypedValues(facts: XBRLFact[], context: CellContext): Record<string, string> {\n const typedValues: Record<string, string> = {};\n \n if (!facts || facts.length === 0) {\n return typedValues;\n }\n \n // Find facts that match period and dimensions (excluding typed values)\n const matchedFacts = facts.filter(fact => \n this.matchesPeriod(fact, context) && this.matchesDimensions(fact, context)\n );\n \n // Extract typed values from matched facts\n matchedFacts.forEach(fact => {\n if (fact.dimensions) {\n fact.dimensions.forEach(dim => {\n if (dim.dimensionType === 'typed' && dim.typedMemberValue) {\n // Normalize axis ID for consistent key\n const axisId = this.normalizeAxisId(dim.dimension);\n typedValues[axisId] = dim.typedMemberValue;\n }\n });\n }\n });\n \n return typedValues;\n }\n\n /**\n * Debug helper: Log matching process\n */\n static debugMatch(facts: XBRLFact[], context: CellContext): void {\n console.log('🔍 [FactMatcher] Debug Match');\n console.log(' Context:', {\n conceptId: context.conceptId,\n columnId: context.columnId,\n period: context.periodType === 'instant' \n ? context.periodInstantDate \n : `${context.periodStartDate} / ${context.periodEndDate}`,\n dimensions: this.extractDimensionsFromContext(context)\n });\n console.log(' Facts:', facts.map(f => ({\n value: f.value,\n period: f.period,\n dimensions: f.dimensions?.map(d => `${d.dimension}:${d.member}`)\n })));\n \n const match = this.findMatchingFact(facts, context);\n console.log(' Match Result:', match ? match.value : 'No match');\n }\n}\n","/**\n * XBRL Datatype Validation Utility\n * Validates input values against XBRL datatype validation rules\n */\n\nimport { XBRLDatatype } from '../schema/xbrl-types';\nimport { I18n } from './i18n';\n\nexport interface XBRLValidationResult {\n valid: boolean;\n errors: XBRLValidationError[];\n}\n\nexport interface XBRLValidationError {\n type: 'pattern' | 'minLength' | 'maxLength' | 'length' | 'totalDigits' | 'unit';\n message: string;\n expectedValue?: string | number;\n actualValue?: string | number;\n}\n\nexport interface XBRLDatatypeValidation {\n pattern?: string;\n minLength?: number;\n maxLength?: number;\n length?: number;\n totalDigits?: number;\n}\n\nexport class XBRLValidator {\n /**\n * Validates a value against XBRL datatype validation rules\n * Only validates when value is not blank\n * \n * @param conceptType - The XBRL concept type (e.g., \"nl-types:houseNumberNLItemType\")\n * @param value - The input value to validate\n * @param datatypes - Array of XBRL datatypes from taxonomy\n * @returns Validation result with errors if any\n */\n static validateConceptValue(\n conceptType: string | undefined,\n value: any,\n datatypes?: XBRLDatatype[]\n ): XBRLValidationResult {\n const errors: XBRLValidationError[] = [];\n\n // Skip validation if value is blank\n if (value === null || value === undefined || value === '') {\n return { valid: true, errors: [] };\n }\n\n // Skip validation if no concept type provided\n if (!conceptType || !datatypes || datatypes.length === 0) {\n return { valid: true, errors: [] };\n }\n\n // Find the datatype definition for this concept type\n const datatype = this.findDatatype(conceptType, datatypes);\n if (!datatype || !datatype.validation) {\n // No validation rules found for this datatype\n return { valid: true, errors: [] };\n }\n\n const validation = datatype.validation as XBRLDatatypeValidation;\n const stringValue = String(value);\n\n // 1. Pattern validation - check if value matches regex pattern\n if (validation.pattern) {\n const patternError = this.validatePattern(stringValue, validation.pattern);\n if (patternError) {\n errors.push(patternError);\n }\n }\n\n // 2. Exact length validation - value must have exact length\n if (validation.length !== undefined) {\n const lengthError = this.validateExactLength(stringValue, validation.length);\n if (lengthError) {\n errors.push(lengthError);\n }\n }\n\n // 3. minLength validation - value must be at least this length\n if (validation.minLength !== undefined) {\n const minLengthError = this.validateMinLength(stringValue, validation.minLength);\n if (minLengthError) {\n errors.push(minLengthError);\n }\n }\n\n // 4. maxLength validation - value must not exceed this length\n if (validation.maxLength !== undefined) {\n const maxLengthError = this.validateMaxLength(stringValue, validation.maxLength);\n if (maxLengthError) {\n errors.push(maxLengthError);\n }\n }\n\n // 5. totalDigits validation (for numeric types)\n if (validation.totalDigits !== undefined) {\n const totalDigitsError = this.validateTotalDigits(stringValue, validation.totalDigits);\n if (totalDigitsError) {\n errors.push(totalDigitsError);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n }\n\n /**\n * Finds the datatype definition for a given concept type\n * Handles both exact matches and base type chain resolution\n */\n private static findDatatype(conceptType: string, datatypes: XBRLDatatype[]): XBRLDatatype | undefined {\n // First try exact match\n let datatype = datatypes.find(dt => dt.type === conceptType);\n if (datatype) {\n return datatype;\n }\n\n // If not found, try to resolve through basetype chain\n // This handles cases where validation is defined on a base type\n const visited = new Set<string>();\n let currentType = conceptType;\n\n while (currentType && !visited.has(currentType)) {\n visited.add(currentType);\n datatype = datatypes.find(dt => dt.type === currentType);\n \n if (datatype) {\n // If this datatype has validation, return it\n if ((datatype as any).validation) {\n return datatype;\n }\n // Otherwise, continue up the basetype chain\n currentType = datatype.basetype;\n } else {\n break;\n }\n }\n\n return undefined;\n }\n\n /**\n * Validates that value matches the regex pattern\n */\n private static validatePattern(value: string, pattern: string): XBRLValidationError | null {\n try {\n const regex = new RegExp(`^${pattern}$`);\n if (!regex.test(value)) {\n return {\n type: 'pattern',\n message: I18n.t('xbrlValidation.patternMismatch', { pattern }),\n expectedValue: pattern,\n actualValue: value\n };\n }\n } catch (error) {\n console.error(`Invalid regex pattern: ${pattern}`, error);\n return {\n type: 'pattern',\n message: I18n.t('xbrlValidation.invalidPattern', { pattern }),\n expectedValue: pattern,\n actualValue: value\n };\n }\n return null;\n }\n\n /**\n * Validates that value has exact length\n */\n private static validateExactLength(value: string, requiredLength: number): XBRLValidationError | null {\n if (value.length !== requiredLength) {\n return {\n type: 'length',\n message: I18n.t('xbrlValidation.exactLength', { required: requiredLength, current: value.length }),\n expectedValue: requiredLength,\n actualValue: value.length\n };\n }\n return null;\n }\n\n /**\n * Validates minimum length\n */\n private static validateMinLength(value: string, minLength: number): XBRLValidationError | null {\n if (value.length < minLength) {\n return {\n type: 'minLength',\n message: I18n.t('xbrlValidation.minLength', { required: minLength, current: value.length }),\n expectedValue: minLength,\n actualValue: value.length\n };\n }\n return null;\n }\n\n /**\n * Validates maximum length\n */\n private static validateMaxLength(value: string, maxLength: number): XBRLValidationError | null {\n if (value.length > maxLength) {\n return {\n type: 'maxLength',\n message: I18n.t('xbrlValidation.maxLength', { required: maxLength, current: value.length }),\n expectedValue: maxLength,\n actualValue: value.length\n };\n }\n return null;\n }\n\n /**\n * Validates total digits (for numeric values)\n */\n private static validateTotalDigits(value: string, totalDigits: number): XBRLValidationError | null {\n // Remove non-digit characters except decimal point\n const digitsOnly = value.replace(/[^\\d]/g, '');\n\n if (digitsOnly.length > totalDigits) {\n return {\n type: 'totalDigits',\n message: I18n.t('xbrlValidation.totalDigits', { required: totalDigits, current: digitsOnly.length }),\n expectedValue: totalDigits,\n actualValue: digitsOnly.length\n };\n }\n return null;\n }\n\n /**\n * Gets a human-readable summary of validation rules for a concept type\n * Useful for displaying validation hints to users\n */\n static getValidationRulesSummary(conceptType: string | undefined, datatypes?: XBRLDatatype[]): string[] {\n if (!conceptType || !datatypes) {\n return [];\n }\n\n const datatype = this.findDatatype(conceptType, datatypes);\n if (!datatype || !datatype.validation) {\n return [];\n }\n\n const validation = datatype.validation as XBRLDatatypeValidation;\n const rules: string[] = [];\n\n if (validation.pattern) {\n rules.push(I18n.t('xbrlValidation.ruleSummaryPattern', { pattern: validation.pattern }));\n }\n if (validation.length !== undefined) {\n rules.push(I18n.t('xbrlValidation.ruleSummaryExactLength', { required: validation.length }));\n }\n if (validation.minLength !== undefined) {\n rules.push(I18n.t('xbrlValidation.ruleSummaryMinLength', { required: validation.minLength }));\n }\n if (validation.maxLength !== undefined) {\n rules.push(I18n.t('xbrlValidation.ruleSummaryMaxLength', { required: validation.maxLength }));\n }\n if (validation.totalDigits !== undefined) {\n rules.push(I18n.t('xbrlValidation.ruleSummaryTotalDigits', { required: validation.totalDigits }));\n }\n\n return rules;\n }\n}\n","/**\n * Type-to-Input Field Mapping Configuration\n * \n * This module defines the mapping between XBRL concept types and HTML input field types.\n * The mapping determines which UI control should be rendered for each XBRL data type.\n * \n * Usage:\n * 1. Add new type mappings to the TYPE_INPUT_MAP constant\n * 2. Use getInputTypeForConceptType() to get the appropriate field type\n * 3. Mapping is extensible - add more types as needed\n */\n\nimport { XBRLDatatype } from '../schema/xbrl-types';\nimport { I18n } from './i18n';\n\nexport type InputFieldType = \n | 'text'\n | 'textarea'\n | 'number'\n | 'decimal'\n | 'integer'\n | 'currency'\n | 'percentage'\n | 'date'\n | 'datetime'\n | 'email'\n | 'url'\n | 'tel'\n | 'boolean'\n | 'select';\n\nexport interface TypeMapping {\n /** The input field type to render */\n fieldType: InputFieldType;\n /** Optional HTML input type attribute (for input elements) */\n htmlInputType?: string;\n /** Whether to allow decimal values (for number fields) */\n allowDecimals?: boolean;\n /** Minimum allowed value (for number fields) */\n min?: number;\n /** Maximum allowed value (for number fields) */\n max?: number;\n /** Step value for number inputs */\n step?: string | number;\n /** Placeholder text suggestion */\n placeholder?: string;\n /** Enumeration options for dropdown/select fields */\n enumerations?: Array<{\n id: string;\n value: string;\n label?: string;\n }>;\n}\n\n/**\n * Type-to-Input Field Mapping\n * \n * Maps XBRL concept types to appropriate input field configurations.\n * Types are matched in order of specificity (most specific first).\n */\nexport const TYPE_INPUT_MAP: Record<string, TypeMapping> = {\n // ==========================================\n // Dutch XBRL Types (nl-types namespace)\n // ==========================================\n \n // Text area for long-form explanations\n 'nl-types:formattedExplanationItemType': {\n fieldType: 'textarea',\n placeholder: I18n.t('field.enterDetailedExplanation'),\n },\n \n // Monetary values without decimals (whole numbers only)\n 'nl-types:monetaryNoDecimals20ItemType': {\n fieldType: 'number',\n htmlInputType: 'number',\n allowDecimals: false,\n step: 1,\n placeholder: I18n.t('field.enterAmountNoDecimals'),\n },\n \n // ==========================================\n // Standard XBRL Types (xbrli namespace)\n // ==========================================\n \n // Monetary with decimals\n 'xbrli:monetaryItemType': {\n fieldType: 'currency',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 0.01,\n placeholder: I18n.t('field.enterCurrency'),\n },\n \n // String/text types\n 'xbrli:stringItemType': {\n fieldType: 'text',\n htmlInputType: 'text',\n placeholder: I18n.t('field.enterText'),\n },\n \n // Date types\n 'xbrli:dateItemType': {\n fieldType: 'date',\n htmlInputType: 'date',\n },\n \n 'xbrli:dateTimeItemType': {\n fieldType: 'datetime',\n htmlInputType: 'datetime-local',\n },\n \n // Numeric types - integers\n 'xbrli:integerItemType': {\n fieldType: 'integer',\n htmlInputType: 'number',\n allowDecimals: false,\n step: 1,\n placeholder: I18n.t('field.enterWholeNumber'),\n },\n \n 'xbrli:nonNegativeIntegerItemType': {\n fieldType: 'integer',\n htmlInputType: 'number',\n allowDecimals: false,\n min: 0,\n step: 1,\n placeholder: I18n.t('field.enterPositiveNumber'),\n },\n \n 'xbrli:positiveIntegerItemType': {\n fieldType: 'integer',\n htmlInputType: 'number',\n allowDecimals: false,\n min: 1,\n step: 1,\n placeholder: I18n.t('field.enterPositiveNumber'),\n },\n \n // Numeric types - decimals\n 'xbrli:decimalItemType': {\n fieldType: 'decimal',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 'any',\n placeholder: I18n.t('field.enterDecimalValue'),\n },\n \n // Shares (typically whole numbers or with limited decimals)\n 'xbrli:sharesItemType': {\n fieldType: 'number',\n htmlInputType: 'number',\n allowDecimals: true,\n min: 0,\n step: 0.01,\n placeholder: I18n.t('field.enterNumberOfShares'),\n },\n \n 'xbrli:shares': {\n fieldType: 'number',\n htmlInputType: 'number',\n allowDecimals: true,\n min: 0,\n step: 0.01,\n placeholder: I18n.t('field.enterNumberOfShares'),\n },\n \n // Year (gYear)\n 'xbrli:gYearItemType': {\n fieldType: 'number',\n htmlInputType: 'number',\n allowDecimals: false,\n min: 1900,\n max: 2100,\n step: 1,\n placeholder: I18n.t('field.yearFormat'),\n },\n \n // Boolean types\n 'xbrli:booleanItemType': {\n fieldType: 'boolean',\n },\n \n // ==========================================\n // Percentage types\n // ==========================================\n \n 'xbrli:pureItemType': {\n fieldType: 'percentage',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 0.01,\n placeholder: I18n.t('field.enterPercentage'),\n },\n \n 'xbrli:percentItemType': {\n fieldType: 'percentage',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 0.01,\n placeholder: I18n.t('field.enterPercentage'),\n },\n \n // ==========================================\n // Contact/Communication types\n // ==========================================\n \n 'xbrli:emailItemType': {\n fieldType: 'email',\n htmlInputType: 'email',\n placeholder: I18n.t('field.emailPlaceholder'),\n },\n \n 'xbrli:urlItemType': {\n fieldType: 'url',\n htmlInputType: 'url',\n placeholder: I18n.t('field.urlPlaceholder'),\n },\n \n 'xbrli:telephoneItemType': {\n fieldType: 'tel',\n htmlInputType: 'tel',\n placeholder: I18n.t('field.phonePlaceholder'),\n },\n};\n\n/**\n * Get input field configuration for a given XBRL concept type.\n * \n * This method now supports two modes:\n * 1. With datatypes: Uses baseType chain resolution for accurate type determination\n * 2. Without datatypes: Falls back to pattern matching on the concept type name\n * \n * @param conceptType - The XBRL concept type (e.g., \"nl-types:monetaryNoDecimals20ItemType\")\n * @param datatypes - Optional array of XBRL datatypes for baseType chain resolution\n * @returns TypeMapping configuration or default text input\n * \n * @example\n * // With datatypes (preferred - accurate baseType chain resolution)\n * const config = getInputTypeForConceptType('nl-types:monetaryNoDecimals20ItemType', datatypes);\n * \n * // Without datatypes (fallback - pattern matching)\n * const config = getInputTypeForConceptType('nl-types:monetaryNoDecimals20ItemType');\n */\nexport function getInputTypeForConceptType(\n conceptType: string | undefined, \n datatypes?: XBRLDatatype[]\n): TypeMapping {\n if (!conceptType) {\n return {\n fieldType: 'text',\n htmlInputType: 'text',\n placeholder: I18n.t('field.enterValue'),\n };\n }\n \n // NEW: If datatypes are provided, use baseType chain resolution (preferred method)\n if (datatypes && datatypes.length > 0) {\n const baseTypeChain = resolveBaseTypeChain(conceptType, datatypes);\n \n if (baseTypeChain.length > 0) {\n const config = determineInputTypeFromBaseChain(baseTypeChain, datatypes);\n \n // Log for debugging (can be removed in production)\n// console.log(`🔍 [Type Resolution] ${conceptType} → Chain:`, baseTypeChain, '→ Type:', config.fieldType, config.enumerations ? `(${config.enumerations.length} options)` : '');\n \n return config;\n }\n }\n \n // FALLBACK: If no datatypes provided or chain resolution fails, use legacy pattern matching\n console.log(`⚠️ [Type Resolution Fallback] Using pattern matching for: ${conceptType}`);\n \n // Direct match in TYPE_INPUT_MAP\n if (TYPE_INPUT_MAP[conceptType]) {\n return TYPE_INPUT_MAP[conceptType];\n }\n \n // Pattern matching for common suffixes (legacy behavior)\n const lowerType = conceptType.toLowerCase();\n \n // Monetary types\n if (lowerType.includes('monetary')) {\n if (lowerType.includes('nodecimals') || lowerType.includes('no-decimals')) {\n return {\n fieldType: 'number',\n htmlInputType: 'number',\n allowDecimals: false,\n step: 1,\n placeholder: I18n.t('field.enterAmountNoDecimals'),\n };\n }\n return {\n fieldType: 'currency',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 0.01,\n placeholder: I18n.t('field.enterCurrency'),\n };\n }\n \n // Text area types (explanation, description, notes)\n if (lowerType.includes('explanation') || \n lowerType.includes('description') || \n lowerType.includes('notes') ||\n lowerType.includes('formatted')) {\n return {\n fieldType: 'textarea',\n placeholder: I18n.t('field.enterDetailedInformation'),\n };\n }\n \n // Date types\n if (lowerType.includes('date')) {\n if (lowerType.includes('time')) {\n return {\n fieldType: 'datetime',\n htmlInputType: 'datetime-local',\n };\n }\n return {\n fieldType: 'date',\n htmlInputType: 'date',\n };\n }\n \n // Boolean types\n if (lowerType.includes('boolean') || lowerType.includes('bool')) {\n return {\n fieldType: 'boolean',\n };\n }\n \n // Integer types\n if (lowerType.includes('integer') || lowerType.includes('int')) {\n const isNonNegative = lowerType.includes('nonnegative') || lowerType.includes('non-negative');\n const isPositive = lowerType.includes('positive');\n \n return {\n fieldType: 'integer',\n htmlInputType: 'number',\n allowDecimals: false,\n min: isPositive ? 1 : isNonNegative ? 0 : undefined,\n step: 1,\n placeholder: I18n.t('field.enterWholeNumber'),\n };\n }\n \n // Decimal/numeric types\n if (lowerType.includes('decimal') || \n lowerType.includes('numeric') || \n lowerType.includes('number')) {\n return {\n fieldType: 'decimal',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 'any',\n placeholder: I18n.t('field.enterDecimalValue'),\n };\n }\n \n // Percentage types\n if (lowerType.includes('percent') || lowerType.includes('pure')) {\n return {\n fieldType: 'percentage',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 0.01,\n placeholder: I18n.t('field.enterPercentage'),\n };\n }\n \n // Default to text input\n return {\n fieldType: 'text',\n htmlInputType: 'text',\n placeholder: I18n.t('field.enterValue'),\n };\n}\n\n/**\n * Check if a field type should display as a textarea\n */\nexport function isTextareaType(fieldType: InputFieldType): boolean {\n return fieldType === 'textarea';\n}\n\n/**\n * Check if a field type should display as a checkbox\n */\nexport function isCheckboxType(fieldType: InputFieldType): boolean {\n return fieldType === 'boolean';\n}\n\n/**\n * Check if a field type is numeric\n */\nexport function isNumericType(fieldType: InputFieldType): boolean {\n return ['number', 'decimal', 'integer', 'currency', 'percentage'].includes(fieldType);\n}\n\n/**\n * Check if a field type should display as a select dropdown\n */\nexport function isSelectType(fieldType: InputFieldType): boolean {\n return fieldType === 'select';\n}\n\n/**\n * Recursively resolves all baseTypes in the hierarchy by traversing the datatypes chain.\n * Continues to look up baseTypes until finding a datatype with no baseType.\n * \n * @param typeName The initial type name to resolve\n * @param datatypes Array of all available datatypes from XBRL taxonomy\n * @returns Array of all baseTypes in the hierarchy chain (including the original type)\n * \n * @example\n * // For type \"nl-types:monetaryNoDecimals20ItemType\"\n * // Returns: [\"nl-types:monetaryNoDecimals20ItemType\", \"dtr-types:noDecimalsMonetaryItemType\", \"xbrli:monetaryItemType\", \"xbrli:monetary\", \"decimal\"]\n * \n * const baseTypeChain = resolveBaseTypeChain(\"nl-types:monetaryNoDecimals20ItemType\", datatypes);\n */\nexport function resolveBaseTypeChain(\n typeName: string | undefined,\n datatypes: XBRLDatatype[] | undefined\n): string[] {\n const baseTypeChain: string[] = [];\n \n // Handle null/undefined inputs\n if (!typeName) {\n return baseTypeChain;\n }\n \n if (!datatypes || datatypes.length === 0) {\n baseTypeChain.push(typeName);\n return baseTypeChain;\n }\n \n let currentType: string | null = typeName;\n \n // Keep track of visited types to prevent infinite loops\n const visitedTypes = new Set<string>();\n \n while (currentType) {\n // Add current type to the chain\n baseTypeChain.push(currentType);\n \n // Prevent infinite loops in case of circular references\n if (visitedTypes.has(currentType)) {\n console.warn(`Circular reference detected in datatype hierarchy for type: ${currentType}`);\n break;\n }\n visitedTypes.add(currentType);\n \n // Find the datatype in the datatypes array\n const foundDatatype = datatypes.find(dt => dt.type === currentType);\n \n // If datatype not found or has no baseType, we're done\n if (!foundDatatype || !foundDatatype.basetype || foundDatatype.basetype.trim() === '') {\n break;\n }\n \n // Move to the baseType for next iteration\n currentType = foundDatatype.basetype;\n }\n \n return baseTypeChain;\n}\n\n/**\n * Collects enumerations from any type in the baseType chain.\n * Traverses the entire chain and returns the first set of enumerations found.\n * This allows types to inherit enumerations from their base types.\n * \n * @param baseTypeChain Array of types from most specific to most general\n * @param datatypes Array of all available datatypes from XBRL taxonomy\n * @returns Array of enumeration options or undefined if no enumerations found\n * \n * @example\n * const chain = [\"nl-codes:yesNoItemType\", \"xbrli:stringItemType\", \"string\"];\n * const enums = collectEnumerationsFromChain(chain, datatypes);\n * // Returns: [{ id: \"nl-codes_Yes\", value: \"Ja\" }, { id: \"nl-codes_No\", value: \"Nee\" }]\n */\nexport function collectEnumerationsFromChain(\n baseTypeChain: string[],\n datatypes: XBRLDatatype[] | undefined\n): Array<{ id: string; value: string; label?: string }> | undefined {\n if (!baseTypeChain || baseTypeChain.length === 0 || !datatypes || datatypes.length === 0) {\n return undefined;\n }\n \n // Traverse the chain from most specific to most general\n for (const typeName of baseTypeChain) {\n // Find the datatype definition\n const datatype = datatypes.find(dt => dt.type === typeName);\n \n if (datatype && datatype.enumerations && datatype.enumerations.length > 0) {\n // Map enumerations to the format expected by TypeMapping\n return datatype.enumerations.map(enumItem => ({\n id: enumItem.id || enumItem.value, // Use value as fallback if id not present\n value: enumItem.value,\n label: enumItem.value // Use value as display label\n }));\n }\n }\n \n return undefined;\n}\n\n/**\n * Determines the appropriate input type configuration based on the baseType chain.\n * This method centralizes the logic for mapping XBRL type hierarchies to HTML input types.\n * \n * Priority order (checked from most specific to most general):\n * 0. Dropdown/Select for types with enumerations (HIGHEST PRIORITY)\n * 1. Textarea for formatted explanations\n * 2. Date picker for date types\n * 3. Integer input for integer types (no decimals)\n * 4. Decimal input for decimal/numeric types (with decimals)\n * 5. Boolean/checkbox for boolean types\n * 6. Textbox as default fallback\n * \n * @param baseTypeChain Array of types from most specific to most general (from resolveBaseTypeChain)\n * @param datatypes Optional array of XBRL datatypes for enumeration collection\n * @returns TypeMapping configuration for the appropriate input type\n * \n * @example\n * const chain = [\"nl-codes:yesNoItemType\", \"xbrli:stringItemType\", \"string\"];\n * const config = determineInputTypeFromBaseChain(chain, datatypes);\n * // Returns: { fieldType: 'select', enumerations: [{ id: \"nl-codes_Yes\", value: \"Ja\" }, ...] }\n */\nexport function determineInputTypeFromBaseChain(\n baseTypeChain: string[],\n datatypes?: XBRLDatatype[]\n): TypeMapping {\n if (!baseTypeChain || baseTypeChain.length === 0) {\n return {\n fieldType: 'text',\n htmlInputType: 'text',\n placeholder: I18n.t('field.enterValue'),\n };\n }\n \n // PRIORITY 0: Check for enumerations (HIGHEST PRIORITY - must be checked first)\n // If any type in the chain has enumerations, create a dropdown/select\n if (datatypes && datatypes.length > 0) {\n const enumerations = collectEnumerationsFromChain(baseTypeChain, datatypes);\n \n if (enumerations && enumerations.length > 0) {\n return {\n fieldType: 'select',\n enumerations: enumerations,\n placeholder: I18n.t('field.selectOption'),\n };\n }\n }\n \n // Convert chain to lowercase for case-insensitive matching\n const chainLower = baseTypeChain.map(type => type.toLowerCase());\n const chainString = chainLower.join('|'); // For easier contains checks\n \n // Priority 1: Check for formatted explanation (textarea)\n // Must check exact type name first, then patterns\n if (baseTypeChain.some(type => type === 'nl-types:formattedExplanationItemType') ||\n chainString.includes('formattedexplanation') ||\n chainString.includes('formatted') && chainString.includes('explanation')) {\n return {\n fieldType: 'textarea',\n placeholder: I18n.t('field.enterDetailedExplanation'),\n };\n }\n \n // Priority 2: Check for date types (calendar picker)\n if (chainLower.some(type => type.includes('date'))) {\n // Check if it's datetime\n if (chainString.includes('datetime') || chainString.includes('time')) {\n return {\n fieldType: 'datetime',\n htmlInputType: 'datetime-local',\n };\n }\n // Regular date\n return {\n fieldType: 'date',\n htmlInputType: 'date',\n };\n }\n \n // Priority 3: Check for boolean types (checkbox)\n if (chainLower.some(type => type.includes('boolean') || type.includes('bool'))) {\n return {\n fieldType: 'boolean',\n };\n }\n \n // Priority 4: Check for integer types (no decimals)\n // Must come before decimal check\n if (chainLower.some(type => type.includes('integer') || type === 'integer')) {\n const isNonNegative = chainString.includes('nonnegative') || chainString.includes('non-negative');\n const isPositive = chainString.includes('positive');\n \n return {\n fieldType: 'integer',\n htmlInputType: 'number',\n allowDecimals: false,\n min: isPositive ? 1 : isNonNegative ? 0 : undefined,\n step: 1,\n placeholder: I18n.t('field.enterWholeNumber'),\n };\n }\n \n // Priority 5: Check for decimal/numeric types (with decimals)\n if (chainLower.some(type => type.includes('decimal') || type === 'decimal')) {\n // Check if it's monetary (currency)\n if (chainString.includes('monetary') || chainString.includes('currency')) {\n // Check if no decimals explicitly mentioned\n if (chainString.includes('nodecimals') || chainString.includes('no-decimals') || chainString.includes('nodecimals20')) {\n return {\n fieldType: 'number',\n htmlInputType: 'number',\n allowDecimals: false,\n step: 1,\n placeholder: I18n.t('field.enterAmountNoDecimals'),\n };\n }\n \n // Regular monetary with decimals\n return {\n fieldType: 'currency',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 0.01,\n placeholder: I18n.t('field.enterCurrency'),\n };\n }\n \n // Regular decimal number\n return {\n fieldType: 'decimal',\n htmlInputType: 'number',\n allowDecimals: true,\n step: 'any',\n placeholder: I18n.t('field.enterDecimalValue'),\n };\n }\n \n // Priority 6: Check for string types (textbox)\n if (baseTypeChain.some(type => type === 'xbrli:stringItemType') ||\n chainLower.some(type => type === 'string' || type.includes('stringitem'))) {\n return {\n fieldType: 'text',\n htmlInputType: 'text',\n placeholder: I18n.t('field.enterText'),\n };\n }\n \n // Default fallback: textbox\n return {\n fieldType: 'text',\n htmlInputType: 'text',\n placeholder: I18n.t('field.enterValue'),\n };\n}\n","import { LitElement, html, css, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { FormField, ValidationError } from '../schema/types';\nimport { XBRLDatatype } from '../schema/xbrl-types';\nimport { FormValidator } from '../utils/validation';\nimport { XBRLValidator, XBRLValidationError } from '../utils/xbrl-validation';\nimport { getInputTypeForConceptType, isTextareaType, isCheckboxType, isNumericType, resolveBaseTypeChain } from '../utils/type-input-mapping';\nimport { I18n } from '../utils/i18n';\nimport { FactMatcher, XBRLFact } from '../utils/fact-matcher';\n\n@customElement('jupiter-form-field')\nexport class JupiterFormField extends LitElement {\n @property({ type: Object }) field!: FormField;\n @property({ type: String }) conceptId!: string;\n @property({ type: String }) conceptType?: string; // XBRL concept type for input type determination\n @property({ type: Array }) datatypes?: XBRLDatatype[]; // XBRL datatypes for baseType chain resolution\n @property({ type: Array }) defaultUnits: Array<Record<string, string>> = []; // Developer-provided default units per datatype\n @property({ type: String }) columnId!: string;\n @property() value: any = null;\n @property({ type: Boolean }) disabled = false;\n @property({ type: String }) locale = 'en-US';\n @property({ type: Boolean }) hideLabel = false;\n @property({ type: String }) mode: 'inputForm' | 'admin' | 'readonly' = 'inputForm';\n @property({ type: Object }) masterData?: Record<string, any>;\n @property({ type: Array }) facts?: XBRLFact[]; // XBRL facts for pre-populating values based on context\n @property({ type: Object }) column?: any;\n\n // Period properties for field-level period control\n @property({ type: String }) periodStartDate?: string;\n @property({ type: String }) periodEndDate?: string;\n @property({ type: String }) periodInstantDate?: string;\n \n // Unit property for field-level unit selection\n @property({ type: String }) unit?: string;\n\n // Decimals property for XBRL decimals attribute (per-fact value)\n @property({ type: String }) decimals?: string;\n // Global decimals default ('INF' means no default, show blank)\n @property({ type: String }) globalDecimals = 'INF';\n\n // Typed member values for cross-role dimensions (axisId → value)\n @property({ type: Object }) typedMemberValues: Record<string, string> = {};\n\n @state() private _errors: ValidationError[] = [];\n @state() private _xbrlErrors: XBRLValidationError[] = [];\n @state() private _touched = false;\n @state() private _showPeriodPopup = false;\n @state() private _availableUnits: Array<{ id: string; label: string; definition?: string; isDefault?: boolean }> = [];\n @state() private _numericDraftValue: string | null = null;\n\n static styles = css`\n :host {\n display: block;\n margin-bottom: 0px; /* Remove bottom margin for table layout */\n overflow: hidden;\n min-width: 0;\n }\n\n :host([hideLabel]) {\n margin-bottom: 0px;\n }\n\n .field-container {\n position: relative;\n }\n\n .field-label {\n display: block;\n font-weight: 500;\n margin-bottom: 4px;\n color: var(--jupiter-text-primary, #333);\n font-size: 14px;\n }\n\n .field-label.required::after {\n content: ' *';\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .field-wrapper {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n overflow: hidden;\n }\n\n .period-icon-btn {\n background: transparent;\n border: none;\n cursor: pointer;\n font-size: 16px;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: background-color 0.2s;\n opacity: 0.7;\n }\n\n .period-icon-btn:hover {\n background-color: rgba(0, 0, 0, 0.05);\n opacity: 1;\n }\n\n .period-popup-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n }\n\n .period-popup {\n background: var(--bg-color-2, var(--jupiter-card-background, #fff));\n border-radius: 8px;\n padding: 24px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);\n max-width: 800px;\n width: 90%;\n }\n\n .period-popup-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n }\n\n .period-popup-title {\n font-size: 18px;\n font-weight: 600;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n }\n\n .period-popup-close {\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n background: transparent;\n border: none;\n font-size: 24px;\n cursor: pointer;\n padding: 0;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: background-color 0.2s;\n }\n\n .period-popup-close:hover {\n opacity: 0.9;\n }\n\n .period-popup-content {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .period-popup-content .period-controls {\n display: grid;\n grid-template-columns: 200px 1fr;\n gap: 12px;\n align-items: center;\n margin-top: 0;\n }\n\n .period-popup-content .period-controls label {\n font-size: 14px;\n font-weight: 500;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n text-align: right;\n white-space: normal;\n word-break: break-word;\n }\n\n .date-wrapper {\n position: relative;\n width: min-content;\n }\n\n /* hide native icon */\n input[type=\"date\"]::-webkit-calendar-picker-indicator {\n opacity: 0;\n position: absolute;\n right: 10px;\n width: 20px;\n height: 20px;\n cursor: pointer;\n }\n\n .calendar-icon-svg {\n position: absolute;\n right: 3px;\n top: 18px;\n transform: translateY(-50%);\n width: 20px;\n height: 20px;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n pointer-events: none;\n }\n\n .period-popup-content .period-controls input[type=\"date\"] {\n padding: 8px 10px;\n font-size: 14px;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 4px;\n background: var(--bg-color-2, var(--jupiter-card-background, #fff));\n }\n\n .period-popup-content .period-controls input[type=\"date\"]:focus {\n outline: none;\n border-color: var(--jupiter-primary-color, #1976d2);\n box-shadow: 0 0 0 2px var(--jupiter-primary-color-light, rgba(25, 118, 210, 0.2));\n }\n\n .period-popup-content .period-controls .unit-select {\n padding: 8px 10px;\n font-size: 14px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 4px;\n background: var(--bg-color-2, var(--jupiter-input-background, #fff));\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n cursor: pointer;\n }\n\n .period-popup-content .period-controls .unit-select:focus {\n outline: none;\n box-shadow: 0 0 0 2px var(--jupiter-primary-color-light, rgba(25, 118, 210, 0.2));\n }\n\n .period-popup-content .period-controls .unit-select:disabled {\n background: var(--jupiter-disabled-background, #f5f5f5);\n color: var(--jupiter-disabled-text, #999);\n cursor: not-allowed;\n }\n\n .period-popup-content .period-controls .typed-member-input {\n flex: 1;\n padding: 6px 8px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n font-size: 13px;\n font-family: inherit;\n background: var(--jupiter-input-background, #fff);\n }\n\n .period-popup-content .period-controls .typed-member-input:focus {\n outline: none;\n border-color: var(--jupiter-primary-color, #1976d2);\n box-shadow: 0 0 0 2px var(--jupiter-primary-color-light, rgba(25, 118, 210, 0.2));\n }\n\n .period-popup-content .period-controls .typed-member-input:disabled {\n background: var(--jupiter-disabled-background, #f5f5f5);\n color: var(--jupiter-disabled-text, #999);\n cursor: not-allowed;\n }\n\n .field-input {\n width: 100%;\n padding: 6px 8px; /* Reduced padding for table cells */\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 4px;\n font-size: 13px; /* Slightly smaller font for table */\n font-family: inherit;\n background: transparent !important;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n box-sizing: border-box;\n }\n\n .field-input:focus {\n outline: none;\n border-color: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));\n box-shadow: 0 0 0 2px var(--boxShadowColor, var(--jupiter-primary-color-light, rgba(25, 118, 210, 0.2)));\n }\n\n .field-input:disabled {\n background: var(--jupiter-disabled-background, #f5f5f5);\n color: var(--jupiter-disabled-text, #999);\n cursor: not-allowed;\n }\n\n .field-input.error {\n border-color: var(--jupiter-error-color, #d32f2f);\n }\n\n .field-input.warning {\n border-color: var(--jupiter-warning-color, #ff9800);\n }\n\n .field-input.monetary {\n text-align: right;\n }\n\n .field-errors {\n margin-top: 4px;\n }\n\n .field-error {\n display: block;\n font-size: 12px;\n margin-bottom: 2px;\n }\n\n .field-error.error {\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .field-error.warning {\n color: var(--jupiter-warning-color, #ff9800);\n }\n\n .field-error.info {\n color: var(--jupiter-info-color, #2196f3);\n }\n\n select.field-input {\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e\");\n background-position: right 8px center;\n background-repeat: no-repeat;\n background-size: 16px;\n padding-right: 32px;\n }\n\n textarea.field-input {\n resize: vertical;\n min-height: 60px;\n }\n\n .readonly-value {\n display: block;\n padding: 6px 0;\n color: var(--jupiter-text-primary, #333);\n font-size: inherit;\n line-height: 1.4;\n word-break: break-word;\n min-height: 1.4em;\n text-align: left;\n }\n\n .readonly-value.empty {\n color: var(--jupiter-text-secondary, #999);\n font-style: italic;\n }\n\n .readonly-value.monetary {\n text-align: right;\n width: 100%;\n }\n\n .checkbox-container {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .checkbox-container input[type=\"checkbox\"] {\n margin: 0;\n width: auto;\n }\n\n \n\n \n\n .period-controls {\n margin-top: 4px;\n display: flex;\n gap: 8px;\n align-items: center;\n font-size: 12px;\n }\n\n .period-controls label {\n color: var(--jupiter-text-secondary, #666);\n font-weight: 500;\n font-size: 11px;\n margin: 0;\n }\n\n .period-controls input[type=\"date\"] {\n padding: 4px 6px;\n font-size: 11px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 3px;\n width: 120px;\n }\n\n .period-controls input[type=\"date\"]:focus {\n outline: none;\n border-color: var(--jupiter-primary-color, #1976d2);\n }\n\n /* Text dialog trigger — empty state */\n .text-trigger-btn {\n flex: 1;\n min-width: 0;\n padding: 5px 8px;\n border: 1px dashed var(--jupiter-border-color, #bbb);\n border-radius: 4px;\n background: transparent;\n color: var(--jupiter-text-secondary, #888);\n font-size: 12px;\n cursor: pointer;\n text-align: center;\n font-family: inherit;\n box-sizing: border-box;\n }\n\n .text-trigger-btn:hover {\n border-color: var(--jupiter-primary-color, #1976d2);\n color: var(--jupiter-primary-color, #1976d2);\n background: rgba(25, 118, 210, 0.04);\n }\n\n /* Text dialog trigger — filled state */\n .text-filled {\n display: flex;\n align-items: center;\n gap: 4px;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n }\n\n .text-filled-label {\n flex: 1;\n font-size: 13px;\n color: var(--jupiter-text-primary, #333);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n cursor: pointer;\n min-width: 0;\n }\n\n .text-filled-label:hover {\n color: var(--jupiter-primary-color, #1976d2);\n }\n\n .text-edit-btn {\n flex-shrink: 0;\n padding: 2px 7px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 3px;\n background: transparent;\n color: var(--jupiter-text-secondary, #666);\n font-size: 11px;\n cursor: pointer;\n font-family: inherit;\n white-space: nowrap;\n }\n\n .text-edit-btn:hover {\n border-color: var(--jupiter-primary-color, #1976d2);\n color: var(--jupiter-primary-color, #1976d2);\n background: rgba(25, 118, 210, 0.04);\n }\n\n /* Read-only filled text (disabled/inputForm) */\n .text-readonly-label {\n display: block;\n font-size: 13px;\n color: var(--jupiter-text-primary, #333);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n min-width: 0;\n }\n\n .text-readonly-label.empty {\n color: var(--jupiter-text-secondary, #999);\n font-style: italic;\n }\n `;\n\n protected willUpdate(changedProperties: PropertyValues) {\n if (changedProperties.has('value') || changedProperties.has('field')) {\n this._validateField();\n }\n \n // CRITICAL: If unit property changes (from draft restore or parent update), notify parent\n if (changedProperties.has('unit') && this.unit) {\n console.log(`🏷️ [FormField willUpdate] Unit property changed to: ${this.unit}, conceptId: ${this.conceptId}, columnId: ${this.columnId}`);\n // Dispatch unit-change event to ensure parent stores it\n this.dispatchEvent(new CustomEvent('unit-change', {\n detail: {\n fieldId: this.field?.id,\n conceptId: this.conceptId,\n columnId: this.columnId,\n unit: this.unit\n },\n bubbles: true,\n composed: true\n }));\n }\n \n // Debug period date changes\n if (changedProperties.has('field') && this.field) {\n if (this.conceptId.includes('DescriptionLocationNL') || this.columnId.startsWith('col-')) {\n console.log(`📅 [FormField willUpdate] Concept ${this.conceptId}, Column ${this.columnId}: field.periodType=${this.field.periodType}, field.periodStartDate=${this.field.periodStartDate}, field.periodEndDate=${this.field.periodEndDate}, field.periodInstantDate=${this.field.periodInstantDate}`);\n }\n }\n }\n\n private _validateField() {\n if (this.field?.validation) {\n this._errors = FormValidator.validateField(\n this.field.id,\n this.conceptId,\n this.columnId,\n this.value,\n this.field.type,\n this.field.validation\n );\n }\n }\n\n private _isRoundingLevelConcept(): boolean {\n return !!this.conceptId && this.conceptId.includes('DocumentIntendedRoundingLevel');\n }\n\n private _isNumericField(): boolean {\n const typeConfig = getInputTypeForConceptType(this.conceptType, this.datatypes);\n const effectiveFieldType = typeConfig.fieldType || this.field?.type || 'text';\n return isNumericType(effectiveFieldType) || this._getInputType() === 'number';\n }\n\n private _isIntermediateNumericValue(raw: string): boolean {\n return raw === '-' || raw === '.' || raw === '-.';\n }\n\n private _handleInput(event: Event) {\n const target = event.target as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n const oldValue = this.value;\n let value: any = target.value;\n\n // Convert value based on field type\n if (this._isNumericField()) {\n const rawValue = target.value;\n this._numericDraftValue = rawValue;\n\n if (rawValue === '' || this._isIntermediateNumericValue(rawValue)) {\n value = null;\n } else {\n const parsed = Number(rawValue);\n value = Number.isNaN(parsed) ? null : parsed;\n }\n } else if (this.field.type === 'boolean') {\n value = (target as HTMLInputElement).checked;\n this._numericDraftValue = null;\n } else {\n this._numericDraftValue = null;\n }\n\n this.value = value;\n this._touched = true;\n \n this.dispatchEvent(new CustomEvent('field-change', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId,\n value,\n oldValue\n },\n bubbles: true\n }));\n }\n\n private _handleFocus() {\n this.dispatchEvent(new CustomEvent('field-focus', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId\n },\n bubbles: true\n }));\n }\n\n private _handleBlur() {\n if (this._isNumericField() && this._numericDraftValue !== null) {\n const raw = this._numericDraftValue;\n if (raw === '' || this._isIntermediateNumericValue(raw)) {\n this.value = null;\n } else {\n const parsed = Number(raw);\n this.value = Number.isNaN(parsed) ? null : parsed;\n }\n this._numericDraftValue = null;\n }\n\n this._touched = true;\n\n // Perform XBRL datatype validation on blur (only when value is not blank)\n this._validateXBRLDatatype();\n\n // Validate unit selection: if units are available but none selected, add error\n this._validateUnitSelection();\n\n console.log(`🟦 [FormField] Blur event - fieldId: ${this.field.id}, conceptId: ${this.conceptId}, columnId: ${this.columnId}`);\n console.log(`🟦 [FormField] Current _xbrlErrors:`, this._xbrlErrors);\n console.log(`🟦 [FormField] Current value:`, this.value);\n \n this.dispatchEvent(new CustomEvent('field-blur', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId,\n xbrlValidationErrors: this._xbrlErrors\n },\n bubbles: true,\n composed: true // CRITICAL: Allow event to cross Shadow DOM boundaries\n }));\n \n console.log(`🟦 [FormField] Dispatched field-blur event with ${this._xbrlErrors.length} errors`);\n }\n\n /**\n * Checks if the concept type or its baseType chain contains monetary type\n */\n private _isMonetaryType(): boolean {\n if (!this.conceptType || !this.datatypes) {\n return false;\n }\n\n // Check if current type is monetary\n if (this.conceptType.includes('monetary') || this.conceptType.includes('Monetary')) {\n return true;\n }\n\n // Check baseType chain for monetary type\n const baseTypeChain = resolveBaseTypeChain(this.conceptType, this.datatypes);\n return baseTypeChain.some(type => \n type.includes('monetary') || type.includes('Monetary')\n );\n }\n\n /**\n * Prevents non-numeric input in number fields for Firefox compatibility\n * Firefox allows typing any character in type=\"number\" inputs\n */\n private _handleKeyDown(event: KeyboardEvent) {\n const target = event.target as HTMLInputElement;\n \n // Only apply to number inputs\n if (target.type !== 'number') {\n return;\n }\n\n // Allow control keys: backspace, delete, tab, escape, enter, arrows\n const allowedKeys = [\n 'Backspace', 'Delete', 'Tab', 'Escape', 'Enter',\n 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown',\n 'Home', 'End'\n ];\n\n if (allowedKeys.includes(event.key)) {\n return;\n }\n\n // Allow Ctrl/Cmd shortcuts (copy, paste, select all, etc.)\n if (event.ctrlKey || event.metaKey) {\n return;\n }\n\n // Allow negative sign at the start\n if (\n event.key === '-'\n && !target.value.includes('-')\n && (target.selectionStart === 0 || target.selectionStart === null || target.value.length === 0)\n ) {\n return;\n }\n\n // Allow decimal point if not already present\n if (event.key === '.' && !target.value.includes('.')) {\n return;\n }\n\n // Allow digits\n if (event.key >= '0' && event.key <= '9') {\n return;\n }\n\n // Block all other characters\n event.preventDefault();\n }\n\n /**\n * Validates the current value against XBRL datatype validation rules\n * Called on blur event when user loses focus on the input field\n */\n private _validateXBRLDatatype() {\n // Clear previous XBRL validation errors\n this._xbrlErrors = [];\n\n // Skip if value is blank (validation only runs on non-empty values)\n if (this.value === null || this.value === undefined || this.value === '') {\n return;\n }\n\n // Skip if no concept type or datatypes available\n if (!this.conceptType || !this.datatypes || this.datatypes.length === 0) {\n return;\n }\n\n // Perform validation\n const validationResult = XBRLValidator.validateConceptValue(\n this.conceptType,\n this.value,\n this.datatypes\n );\n\n // Store XBRL validation errors\n if (!validationResult.valid) {\n this._xbrlErrors = validationResult.errors;\n \n // Log validation errors for debugging\n console.log(`❌ [FormField] XBRL Validation failed for ${this.conceptId}:`, {\n conceptType: this.conceptType,\n value: this.value,\n errors: this._xbrlErrors\n });\n } else {\n console.log(`✅ [FormField] XBRL Validation passed for ${this.conceptId}`);\n }\n }\n\n /**\n * Validates that a unit is selected when units are available and a value has been entered.\n * Appends a unit error to _xbrlErrors if validation fails.\n * Called after _validateXBRLDatatype() so it can append to existing errors.\n */\n private _validateUnitSelection() {\n // Only validate when a value has been entered\n if (this.value === null || this.value === undefined || this.value === '') {\n return;\n }\n\n // Check if this concept type has available units\n const availableUnits = this._collectUnitsForConceptType();\n if (availableUnits.length === 0) {\n return;\n }\n\n // If a unit is already selected there is nothing to validate\n if (this.unit) return;\n\n // Try to auto-resolve a default unit (same priority logic as _handlePeriodIconClick):\n // Priority 1: unit with isDefault=true (set by defaultUnits input prop via _applyDefaultUnitsToData)\n // Priority 2: single available unit\n const defaultUnit = availableUnits.find(u => u.isDefault === true)\n ?? (availableUnits.length === 1 ? availableUnits[0] : null);\n\n if (defaultUnit) {\n // Silently auto-select the default unit and notify the parent — no error\n this.unit = defaultUnit.id;\n this.dispatchEvent(new CustomEvent('unit-change', {\n detail: { fieldId: this.field.id, conceptId: this.conceptId, columnId: this.columnId, unit: this.unit },\n bubbles: true,\n composed: true\n }));\n console.log(`🎯 [FormField] Auto-selected default unit on blur: ${this.unit} for ${this.conceptId}`);\n return;\n }\n\n // No default unit available and user has not selected one — require selection\n this._xbrlErrors = [\n ...this._xbrlErrors,\n {\n type: 'unit',\n message: I18n.t('validation.unitRequired'),\n expectedValue: availableUnits.map(u => u.label).join(', '),\n actualValue: ''\n }\n ];\n console.log(`❌ [FormField] Unit validation failed for ${this.conceptId}: unit is required but not selected`);\n }\n\n private _handlePeriodIconClick() {\n if (this._isRoundingLevelConcept()) {\n return;\n }\n\n // Collect available units for this concept type\n this._availableUnits = this._collectUnitsForConceptType();\n console.log(`📊 [FormField] Collected ${this._availableUnits.length} units for concept ${this.conceptId}:`, this._availableUnits);\n console.log(`📊 [FormField] Current unit value: ${this.unit}`);\n console.log(`📊 [FormField] ConceptId: ${this.conceptId}, ColumnId: ${this.columnId}`);\n \n // Auto-select unit if no unit is currently set\n if (!this.unit && this._availableUnits.length > 0) {\n let unitToSelect: string | null = null;\n \n // Priority 1: Unit with isDefault=true from XBRL datatype (includes developer overrides)\n const defaultUnit = this._availableUnits.find(u => u.isDefault === true);\n if (defaultUnit) {\n unitToSelect = defaultUnit.id;\n console.log(`🎯 [FormField] Auto-selecting default unit: ${defaultUnit.id} (${defaultUnit.label})`);\n }\n // Priority 2: If only one unit available, select it\n else if (this._availableUnits.length === 1) {\n unitToSelect = this._availableUnits[0].id;\n console.log(`🎯 [FormField] Auto-selecting single available unit: ${unitToSelect}`);\n }\n \n // Set the selected unit and dispatch event\n if (unitToSelect) {\n this.unit = unitToSelect;\n this.dispatchEvent(new CustomEvent('unit-change', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId,\n unit: this.unit\n },\n bubbles: true,\n composed: true\n }));\n }\n }\n // CRITICAL: If unit is already set (from draft or previous selection), ensure parent knows about it\n else if (this.unit) {\n console.log(`📊 [FormField] Unit already set, dispatching unit-change to ensure parent stores it: ${this.unit}`);\n this.dispatchEvent(new CustomEvent('unit-change', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId,\n unit: this.unit\n },\n bubbles: true,\n composed: true\n }));\n }\n \n this._showPeriodPopup = true;\n }\n\n /**\n * Collects units from the concept's type or its basetype chain\n * @returns Array of unit objects with id, label, and isDefault\n */\n private _collectUnitsForConceptType(): Array<{ id: string; label: string; definition?: string; isDefault?: boolean }> {\n if (!this.conceptType || !this.datatypes) {\n return [];\n }\n\n // Use the imported resolveBaseTypeChain function\n const baseTypeChain = resolveBaseTypeChain(this.conceptType, this.datatypes);\n \n console.log(`🔍 [Unit Resolution] Concept: ${this.conceptId}, Type: ${this.conceptType}, BaseType Chain:`, baseTypeChain);\n \n // Search for units in the basetype chain\n for (const typeName of baseTypeChain) {\n const datatype = this.datatypes.find(dt => dt.type === typeName);\n \n if (datatype && datatype.units && Array.isArray(datatype.units) && datatype.units.length > 0) {\n console.log(`✅ [Unit Resolution] Found ${datatype.units.length} units in type: ${typeName}`);\n return datatype.units;\n }\n }\n \n console.log(`ℹ️ [Unit Resolution] No units found for concept ${this.conceptId}`);\n return [];\n }\n\n private _closePeriodPopup() {\n this._showPeriodPopup = false;\n }\n\n private _handleUnitChange(event: Event) {\n const target = event.target as HTMLSelectElement;\n const value = target.value;\n\n console.log(`🏷️ [FormField] Unit change detected: value=${value}, conceptId=${this.conceptId}, columnId=${this.columnId}`);\n console.log(`🏷️ [FormField] Previous unit value: ${this.unit}`);\n\n // Update local unit value\n this.unit = value;\n console.log(`🏷️ [FormField] Updated unit value to: ${this.unit}`);\n\n // Dispatch unit change event\n const eventDetail = {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId,\n unit: this.unit\n };\n console.log(`🏷️ [FormField] Dispatching unit-change event with detail:`, eventDetail);\n \n this.dispatchEvent(new CustomEvent('unit-change', {\n detail: eventDetail,\n bubbles: true,\n composed: true\n }));\n \n console.log(`🏷️ [FormField] unit-change event dispatched`);\n }\n\n private _handleDecimalsChange(event: Event) {\n const raw = (event.target as HTMLInputElement).value.trim();\n // Only allow non-negative integers\n const num = parseFloat(raw);\n const value = raw && !isNaN(num) ? String(Math.abs(num)) : (raw === '' ? '' : raw);\n this.decimals = value || undefined;\n this.dispatchEvent(new CustomEvent('decimals-change', {\n detail: { conceptId: this.conceptId, columnId: this.columnId, decimals: this.decimals },\n bubbles: true,\n composed: true\n }));\n }\n\n private _handlePopupOverlayClick(e: Event) {\n // Close popup if clicking outside the popup content\n if (e.target === e.currentTarget) {\n this._closePeriodPopup();\n }\n }\n\n private _ensureTextDialogStyles() {\n if (document.getElementById('jdf-text-dialog-styles')) return;\n const style = document.createElement('style');\n style.id = 'jdf-text-dialog-styles';\n style.textContent = `\n dialog.jdf-text-entry-dialog {\n border: none; border-radius: 8px; padding: 0;\n max-width: 600px; width: 90vw;\n box-shadow: 0 8px 32px rgba(0,0,0,0.2); overflow: hidden;\n font-family: inherit;\n }\n dialog.jdf-text-entry-dialog::backdrop { background: rgba(0,0,0,0.35); }\n .jdf-text-dialog-header {\n background: #f0f2f5; padding: 14px 20px;\n display: flex; align-items: center; justify-content: space-between;\n border-bottom: 1px solid #ddd;\n }\n .jdf-text-dialog-title {\n font-size: 15px; font-weight: 600; color: #333; margin: 0;\n font-family: inherit; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n }\n .jdf-text-dialog-close {\n flex-shrink: 0; width: 28px; height: 28px; border: none; background: transparent;\n font-size: 20px; line-height: 1; cursor: pointer; color: #666;\n border-radius: 4px; display: flex; align-items: center; justify-content: center;\n padding: 0; font-family: inherit; margin-left: 8px;\n }\n .jdf-text-dialog-close:hover { background: #ddd; color: #333; }\n .jdf-text-dialog-body { padding: 20px 20px 12px; }\n .jdf-text-dialog-textarea {\n width: 100%; min-height: 200px; max-height: 50vh;\n padding: 10px 12px; font-size: 14px; font-family: inherit;\n border: 1px solid #ddd; border-radius: 4px;\n box-sizing: border-box; resize: vertical; line-height: 1.5;\n color: #333; background: #fff;\n }\n .jdf-text-dialog-textarea:focus {\n outline: none; border-color: #1976d2;\n box-shadow: 0 0 0 2px rgba(25,118,210,0.2);\n }\n .jdf-text-dialog-char-count {\n margin-top: 4px; font-size: 12px; color: #888; text-align: right;\n font-family: inherit;\n }\n .jdf-text-dialog-actions {\n display: flex; justify-content: flex-end; gap: 8px;\n padding: 12px 20px 16px; border-top: 1px solid #eee;\n }\n .jdf-text-dialog-cancel {\n padding: 7px 18px; border: 1px solid #ddd; border-radius: 4px;\n background: transparent; color: #555; font-size: 14px;\n cursor: pointer; font-family: inherit;\n }\n .jdf-text-dialog-cancel:hover { background: #f5f5f5; }\n .jdf-text-dialog-save {\n padding: 7px 18px; border: none; border-radius: 4px;\n background: #1976d2; color: #fff; font-size: 14px;\n cursor: pointer; font-family: inherit; font-weight: 500;\n }\n .jdf-text-dialog-save:hover { background: #1565c0; }\n `;\n document.head.appendChild(style);\n }\n\n private _openTextDialog(currentValue: string, fieldLabel: string) {\n this._ensureTextDialogStyles();\n\n // Single-instance guard\n document.getElementById('jdf-text-entry-dialog')?.remove();\n\n const dialog = document.createElement('dialog');\n dialog.id = 'jdf-text-entry-dialog';\n dialog.className = 'jdf-text-entry-dialog';\n dialog.setAttribute('role', 'dialog');\n dialog.setAttribute('aria-modal', 'true');\n dialog.setAttribute('aria-labelledby', 'jdf-text-dialog-title');\n\n dialog.innerHTML = `\n <div class=\"jdf-text-dialog-header\">\n <h3 class=\"jdf-text-dialog-title\" id=\"jdf-text-dialog-title\"></h3>\n <button class=\"jdf-text-dialog-close\" type=\"button\" aria-label=\"Close\">×</button>\n </div>\n <div class=\"jdf-text-dialog-body\">\n <textarea class=\"jdf-text-dialog-textarea\" spellcheck=\"true\"></textarea>\n <div class=\"jdf-text-dialog-char-count\"></div>\n </div>\n <div class=\"jdf-text-dialog-actions\">\n <button class=\"jdf-text-dialog-cancel\" type=\"button\"></button>\n <button class=\"jdf-text-dialog-save\" type=\"button\"></button>\n </div>\n `;\n\n // Safely set dynamic text (no XSS). Strip \"Description of …\" / \"Beschrijving van …\" prefixes.\n const cleanTitle = fieldLabel\n dialog.querySelector('.jdf-text-dialog-title')!.textContent = cleanTitle || fieldLabel;\n dialog.querySelector('.jdf-text-dialog-cancel')!.textContent = I18n.t('field.cancel');\n dialog.querySelector('.jdf-text-dialog-save')!.textContent = I18n.t('field.save');\n\n const textarea = dialog.querySelector('.jdf-text-dialog-textarea') as HTMLTextAreaElement;\n const charCount = dialog.querySelector('.jdf-text-dialog-char-count') as HTMLElement;\n textarea.value = currentValue;\n charCount.textContent = `${currentValue.length} ${I18n.t('field.characters')}`;\n\n textarea.addEventListener('input', () => {\n charCount.textContent = `${textarea.value.length} ${I18n.t('field.characters')}`;\n });\n\n dialog.querySelector('.jdf-text-dialog-close')!.addEventListener('click', () => dialog.close());\n dialog.querySelector('.jdf-text-dialog-cancel')!.addEventListener('click', () => dialog.close());\n\n dialog.querySelector('.jdf-text-dialog-save')!.addEventListener('click', () => {\n const newValue = textarea.value;\n const oldValue = this.value;\n this.value = newValue;\n this._touched = true;\n this.dispatchEvent(new CustomEvent('field-change', {\n detail: { fieldId: this.field.id, conceptId: this.conceptId, columnId: this.columnId, value: newValue, oldValue },\n bubbles: true\n }));\n dialog.close();\n });\n\n // Close on backdrop click\n dialog.addEventListener('click', (ev: MouseEvent) => {\n const rect = dialog.getBoundingClientRect();\n if (ev.clientX < rect.left || ev.clientX > rect.right ||\n ev.clientY < rect.top || ev.clientY > rect.bottom) {\n dialog.close();\n }\n });\n\n dialog.addEventListener('close', () => dialog.remove());\n\n document.body.appendChild(dialog);\n dialog.showModal();\n textarea.focus();\n }\n\n private _renderTextDialogTrigger(effectiveValue: any, effectiveDisabled: boolean) {\n const hasValue = effectiveValue !== null && effectiveValue !== undefined && String(effectiveValue).trim() !== '';\n const displayText = hasValue ? String(effectiveValue) : '';\n\n if (effectiveDisabled) {\n return html`\n <span class=\"text-readonly-label ${hasValue ? '' : 'empty'}\"\n title=\"${displayText}\">${hasValue ? displayText : '—'}</span>\n `;\n }\n\n if (!hasValue) {\n return html`\n <button class=\"text-trigger-btn\" type=\"button\"\n aria-label=\"${I18n.t('field.addText')}\"\n @click=\"${() => this._openTextDialog('', this.field?.label || '')}\">\n + ${I18n.t('field.addText')}\n </button>\n `;\n }\n\n return html`\n <div class=\"text-filled\">\n <span class=\"text-filled-label\" title=\"${displayText}\"\n @click=\"${() => this._openTextDialog(displayText, this.field?.label || '')}\">\n ${displayText}\n </span>\n <button class=\"text-edit-btn\" type=\"button\"\n aria-label=\"${I18n.t('field.editText')}\"\n @click=\"${() => this._openTextDialog(displayText, this.field?.label || '')}\">\n ✎ ${I18n.t('field.editText')}\n </button>\n </div>\n `;\n }\n\n private _handlePeriodChange(event: Event, type: 'start' | 'end' | 'instant') {\n const target = event.target as HTMLInputElement;\n const value = target.value;\n\n console.log(`📅 [FormField] Period change detected: type=${type}, value=${value}, conceptId=${this.conceptId}, columnId=${this.columnId}`);\n\n // Update local period values\n if (type === 'instant') {\n this.periodInstantDate = value;\n } else if (type === 'start') {\n this.periodStartDate = value;\n } else if (type === 'end') {\n this.periodEndDate = value;\n }\n\n console.log(`📅 [FormField] Updated local period values: startDate=${this.periodStartDate}, endDate=${this.periodEndDate}, instantDate=${this.periodInstantDate}`);\n\n // Dispatch period change event with composed:true to cross shadow DOM boundaries\n this.dispatchEvent(new CustomEvent('period-change', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId,\n periodType: this.field.periodType,\n periodStartDate: this.periodStartDate,\n periodEndDate: this.periodEndDate,\n periodInstantDate: this.periodInstantDate,\n unit: this.unit\n },\n bubbles: true,\n composed: true // CRITICAL: Allows event to cross shadow DOM boundaries\n }));\n \n console.log(`🚀 [FormField] Dispatched period-change event with detail:`, {\n conceptId: this.conceptId,\n columnId: this.columnId,\n periodType: this.field.periodType\n });\n }\n\n private _handleCrossRoleTypedMemberChange(event: Event, axisId: string) {\n const value = (event.target as HTMLInputElement).value;\n this.typedMemberValues = { ...this.typedMemberValues, [axisId]: value };\n this.dispatchEvent(new CustomEvent('typed-member-change', {\n detail: {\n columnId: this.columnId,\n conceptId: this.conceptId,\n axisId,\n value\n },\n bubbles: true,\n composed: true\n }));\n }\n\n /**\n * Renders a plain text label for readonly mode instead of an interactive input.\n * Resolves the display value for selects (shows label, not raw id) and\n * booleans (shows Yes/No).\n */\n private _renderReadonlyValue(effectiveValue: any) {\n const typeConfig = getInputTypeForConceptType(this.conceptType, this.datatypes);\n const effectiveFieldType = typeConfig.fieldType || this.field.type || 'text';\n\n let displayValue: string;\n\n if (effectiveFieldType === 'boolean' || isCheckboxType(effectiveFieldType)) {\n // Boolean: show Yes / No\n displayValue = effectiveValue ? I18n.t('form.yes') : I18n.t('form.no');\n } else if (effectiveFieldType === 'select' || this.field.type === 'select') {\n // Select: resolve the label for the stored value\n const selectOptions = typeConfig.enumerations || this.field.options || [];\n const match = selectOptions.find(o => o.value === effectiveValue);\n displayValue = match ? (match.label || match.value) : (effectiveValue ?? '');\n } else {\n displayValue = effectiveValue !== null && effectiveValue !== undefined ? String(effectiveValue) : '';\n }\n\n const isEmpty = displayValue === '' || displayValue === null || displayValue === undefined;\n const isMonetary = this._isMonetaryType();\n return html`<span class=\"readonly-value ${isEmpty ? 'empty' : ''} ${isMonetary ? 'monetary' : ''}\">${isEmpty ? '—' : displayValue}</span>`;\n }\n\n private _renderInput(effectiveValue: any = this.value, effectiveDisabled: boolean = this.disabled) {\n // In readonly mode, render a plain label instead of any input element\n if (this.mode === 'readonly') {\n return this._renderReadonlyValue(effectiveValue);\n }\n\n const hasErrors = this._errors.some(e => e.severity === 'error');\n const hasWarnings = this._errors.some(e => e.severity === 'warning');\n const isMonetary = this._isMonetaryType();\n const cssClass = `field-input ${hasErrors ? 'error' : hasWarnings ? 'warning' : ''} ${isMonetary ? 'monetary' : ''}`;\n\n // Generate unique field identifiers for form submission\n const fieldId = `${this.conceptId}__${this.columnId}`;\n const fieldName = `data[${this.conceptId}][${this.columnId}]`;\n\n // Get type mapping configuration based on concept type with baseType chain resolution\n const typeConfig = getInputTypeForConceptType(this.conceptType, this.datatypes);\n \n // Debug logging\n if (this.conceptType) {\n //console.log(`🔍 [FormField] Concept: ${this.conceptId}, Type: ${this.conceptType}, Config:`, typeConfig);\n }\n \n // Determine which field type to use (from type mapping or field.type)\n const effectiveFieldType = typeConfig.fieldType || this.field.type || 'text';\n \n // Handle textarea — dialog-based entry instead of inline textarea\n if (effectiveFieldType === 'textarea' || isTextareaType(effectiveFieldType)) {\n return this._renderTextDialogTrigger(effectiveValue, effectiveDisabled || this.field.disabled || false);\n }\n\n // Handle select dropdown (from field options OR from type mapping enumerations)\n if (effectiveFieldType === 'select' || this.field.type === 'select') {\n // Use enumerations from type mapping if available, otherwise use field options\n const selectOptions = typeConfig.enumerations || this.field.options || [];\n \n return html`\n <select\n id=\"${fieldId}\"\n name=\"${fieldName}\"\n class=\"${cssClass}\"\n .value=\"${effectiveValue ?? ''}\"\n ?disabled=\"${effectiveDisabled || this.field.disabled}\"\n @change=\"${this._handleInput}\"\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\n >\n <option value=\"\">${typeConfig.placeholder || I18n.t('field.select')}</option>\n ${selectOptions.map(option => {\n // Handle both enumeration format and field option format\n const optionValue = option.value;\n const optionLabel = option.label || option.value;\n const isDisabled = (option as any).disabled || false;\n \n return html`\n <option \n value=\"${optionValue}\"\n ?disabled=\"${isDisabled}\"\n ?selected=\"${effectiveValue === optionValue}\"\n >\n ${optionLabel}\n </option>\n `;\n })}\n </select>\n `;\n }\n\n // Handle checkbox/boolean based on type mapping\n if (effectiveFieldType === 'boolean' || isCheckboxType(effectiveFieldType)) {\n return html`\n <div class=\"checkbox-container\">\n <input\n id=\"${fieldId}\"\n name=\"${fieldName}\"\n type=\"checkbox\"\n class=\"field-input\"\n .checked=\"${Boolean(effectiveValue)}\"\n ?disabled=\"${effectiveDisabled || this.field.disabled}\"\n @change=\"${this._handleInput}\"\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\n />\n <span>${this.field.label}</span>\n </div>\n `;\n }\n\n // Handle all other input types (text, number, date, etc.)\n const inputType = typeConfig.htmlInputType || this._getInputType();\n const step = typeConfig.step !== undefined ? typeConfig.step : \n isNumericType(effectiveFieldType) ? 'any' : undefined;\n const min = typeConfig.min;\n const max = typeConfig.max;\n \n const renderedInputValue = (this._isNumericField() && this._numericDraftValue !== null)\n ? this._numericDraftValue\n : (effectiveValue ?? '');\n\n return html`\n <input\n id=\"${fieldId}\"\n name=\"${fieldName}\"\n type=\"${inputType}\"\n class=\"${cssClass}\"\n .value=\"${renderedInputValue}\"\n ?disabled=\"${effectiveDisabled || this.field.disabled}\"\n placeholder=\"${typeConfig.placeholder || this.field.placeholder || ''}\"\n step=\"${step !== undefined ? step : ''}\"\n min=\"${min !== undefined ? min : ''}\"\n max=\"${max !== undefined ? max : ''}\"\n @input=\"${this._handleInput}\"\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\n @keydown=\"${this._handleKeyDown}\"\n />\n `;\n }\n\n private _getInputType(): string {\n switch (this.field.type) {\n case 'number':\n case 'decimal':\n case 'currency':\n case 'percentage':\n return 'number';\n case 'date':\n return 'date';\n case 'datetime':\n return 'datetime-local';\n case 'email':\n return 'email';\n case 'url':\n return 'url';\n case 'tel':\n return 'tel';\n default:\n return 'text';\n }\n }\n\n /**\n * Extract base concept ID by removing column suffix\n * Example: \"nl-cd_LegalEntityName__4qukyf\" -> \"nl-cd_LegalEntityName\"\n */\n private _extractBaseConceptId(conceptId: string): string {\n // If conceptId contains \"__\", extract everything before the last \"__\"\n const parts = conceptId.split('__');\n if (parts.length > 1) {\n // Remove the last part (column suffix) and rejoin\n return parts.slice(0, -1).join('__');\n }\n return conceptId;\n }\n\n private _renderPeriodControls() {\n // Debug: Log field period info\n if (this.conceptId === 'nl-cd_DescriptionLocationNL__a64trl') {\n console.log(`🔍 [FormField Render] Concept: ${this.conceptId}, ColumnId: ${this.columnId}, Field periodType: ${this.field.periodType}, Field periodStartDate: ${this.field.periodStartDate}, Field periodEndDate: ${this.field.periodEndDate}`);\n }\n\n // Only show period controls if field has period type defined\n if (!this.field.periodType) {\n return html``;\n }\n\n if (this.field.periodType === 'instant') {\n return html`\n <div class=\"period-controls\">\n <label>Date:</label>\n <div class=\"date-wrapper\">\n <input\n type=\"date\"\n .value=\"${this.periodInstantDate || this.field.periodInstantDate || ''}\"\n @change=\"${(e: Event) => this._handlePeriodChange(e, 'instant')}\"\n ?disabled=\"${this.disabled}\"\n />\n <svg class=\"calendar-icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M19 4h-1V2h-2v2H8V2H6v2H5\n a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14\n a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V9h14z\"/>\n </div>\n </div>\n `;\n } else if (this.field.periodType === 'duration') {\n return html`\n <div class=\"period-controls\">\n <label>From:</label>\n <div class=\"date-wrapper\">\n <input\n type=\"date\"\n .value=\"${this.periodStartDate || this.field.periodStartDate || ''}\"\n @change=\"${(e: Event) => this._handlePeriodChange(e, 'start')}\"\n ?disabled=\"${this.disabled}\"\n />\n <svg class=\"calendar-icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M19 4h-1V2h-2v2H8V2H6v2H5\n a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14\n a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V9h14z\"/>\n </div>\n <label>To:</label>\n <div class=\"date-wrapper\">\n <input\n type=\"date\"\n .value=\"${this.periodEndDate || this.field.periodEndDate || ''}\"\n @change=\"${(e: Event) => this._handlePeriodChange(e, 'end')}\"\n ?disabled=\"${this.disabled}\"\n />\n <svg class=\"calendar-icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M19 4h-1V2h-2v2H8V2H6v2H5\n a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14\n a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V9h14z\"/>\n </div>\n </div>\n `;\n }\n\n return html``;\n }\n\n private _renderPeriodPopup() {\n return html`\n <div class=\"period-popup-overlay\" @click=\"${this._handlePopupOverlayClick}\">\n <div class=\"period-popup\" @click=\"${(e: Event) => e.stopPropagation()}\">\n <div class=\"period-popup-header\">\n <div class=\"period-popup-title\">Edit Period</div>\n <button class=\"period-popup-close\" @click=\"${this._closePeriodPopup}\">\n ×\n </button>\n </div>\n \n <div class=\"period-popup-content\">\n ${this.field.periodType === 'instant' ? html`\n <div class=\"period-controls\">\n <label>Date:</label>\n <div class=\"date-wrapper\">\n <input\n type=\"date\"\n .value=\"${this.periodInstantDate || this.field.periodInstantDate || ''}\"\n @change=\"${(e: Event) => this._handlePeriodChange(e, 'instant')}\"\n ?disabled=\"${this.disabled}\"\n />\n <svg class=\"calendar-icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M19 4h-1V2h-2v2H8V2H6v2H5\n a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14\n a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V9h14z\"/>\n </div>\n </div>\n ` : html`\n <div class=\"period-controls\">\n <label>From:</label>\n <div class=\"date-wrapper\">\n <input\n type=\"date\"\n .value=\"${this.periodStartDate || this.field.periodStartDate || ''}\"\n @change=\"${(e: Event) => this._handlePeriodChange(e, 'start')}\"\n ?disabled=\"${this.disabled}\"\n />\n <svg class=\"calendar-icon-svg\" viewBox=\"0 0 24 24\">\n <path\n fill=\"currentColor\"\n d=\"M19 4h-1V2h-2v2H8V2H6v2H5\n a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14\n a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V9h14z\"/>\n </div>\n </div>\n <div class=\"period-controls\">\n <label>To:</label>\n <div class=\"date-wrapper\">\n <input\n type=\"date\"\n .value=\"${this.periodEndDate || this.field.periodEndDate || ''}\"\n @change=\"${(e: Event) => this._handlePeriodChange(e, 'end')}\"\n ?disabled=\"${this.disabled}\"\n />\n <svg class=\"calendar-icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M19 4h-1V2h-2v2H8V2H6v2H5\n a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14\n a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V9h14z\"/>\n </div>\n </div>\n `}\n \n ${this._availableUnits.length > 0 ? html`\n <div class=\"period-controls\">\n <label>Unit:</label>\n <select\n .value=\"${this.unit || ''}\"\n @change=\"${this._handleUnitChange}\"\n ?disabled=\"${this.disabled}\"\n class=\"unit-select\"\n >\n <option value=\"\">Select Unit</option>\n ${this._availableUnits.map(unit => html`\n <option value=\"${unit.id}\" ?selected=\"${this.unit === unit.id}\">\n ${unit.label || unit.id}\n </option>\n `)}\n </select>\n </div>\n ` : ''}\n\n ${this._isMonetaryType() ? html`\n <div class=\"period-controls\">\n <label>${I18n.t('field.scale')}:</label>\n <input\n type=\"number\"\n min=\"0\"\n class=\"typed-member-input\"\n placeholder=\"Leave blank for INF\"\n .value=\"${(this.decimals !== undefined && this.decimals !== null && this.decimals !== '')\n ? this.decimals\n : (this.globalDecimals !== 'INF' ? this.globalDecimals : '')}\"\n @input=\"${this._handleDecimalsChange}\"\n ?disabled=\"${this.disabled}\"\n />\n </div>\n ` : ''}\n\n ${this.field.crossRoleTypedMembers && this.field.crossRoleTypedMembers.length > 0 ? html`\n ${this.field.crossRoleTypedMembers.map(tm => html`\n <div class=\"period-controls\">\n <label>${tm.axisLabel}:</label>\n <input\n type=\"text\"\n class=\"typed-member-input\"\n .value=\"${this.typedMemberValues[tm.axisId] || ''}\"\n @input=\"${(e: Event) => this._handleCrossRoleTypedMemberChange(e, tm.axisId)}\"\n ?disabled=\"${this.disabled}\"\n />\n </div>\n `)}\n ` : ''}\n </div>\n </div>\n </div>\n `;\n }\n\n render() {\n // Add defensive check\n if (!this.field) {\n console.error('[FormField] No field provided!', { conceptId: this.conceptId, columnId: this.columnId });\n return html`<div>Error: No field data</div>`;\n }\n \n const showLabel = !this.hideLabel && this.field.type !== 'boolean';\n const hasPeriodControl = this.field.periodType && (this.field.periodType === 'instant' || this.field.periodType === 'duration');\n \n // Extract base concept ID (remove column suffix if present)\n // conceptId may be \"nl-cd_LegalEntityName__4qukyf\" but masterData uses \"nl-cd_LegalEntityName\"\n const baseConceptId = this._extractBaseConceptId(this.conceptId);\n \n // Check if this field should be pre-populated based on masterData\n const isPredefinedValue = this.mode !== 'admin' && this.masterData && baseConceptId in this.masterData;\n const isRoundingLevelLocked = this._isRoundingLevelConcept();\n \n // Check if we should pre-populate from facts (XBRL instance data)\n let factValue: any = null;\n if (this.facts && this.facts.length > 0 && !isPredefinedValue) {\n const cellContext = {\n conceptId: baseConceptId,\n columnId: this.columnId,\n periodStartDate: this.periodStartDate || this.field.periodStartDate,\n periodEndDate: this.periodEndDate || this.field.periodEndDate,\n periodInstantDate: this.periodInstantDate || this.field.periodInstantDate,\n periodType: this.field.periodType,\n unit: this.unit,\n dimensionData: this.column?.dimensionData\n };\n \n // Debug logging for facts with dimensions\n const shouldDebugDimensions = baseConceptId.includes('BalanceSheet') || \n baseConceptId.includes('CostsIncorporation') ||\n baseConceptId.includes('Assets');\n \n if (shouldDebugDimensions && this.facts.length > 0) {\n console.log('🔍 [FormField] Attempting fact match for concept with dimensions:', {\n conceptId: baseConceptId,\n columnId: this.columnId,\n factsCount: this.facts.length,\n cellContext: {\n period: cellContext.periodType === 'instant' \n ? cellContext.periodInstantDate \n : `${cellContext.periodStartDate} / ${cellContext.periodEndDate}`,\n dimensionData: cellContext.dimensionData\n },\n facts: this.facts.map(f => ({\n value: f.value,\n period: f.period,\n dimensions: f.dimensions?.map(d => `${d.dimension}:${d.member}`)\n }))\n });\n }\n \n const matchedFact = FactMatcher.findMatchingFact(this.facts, cellContext);\n if (matchedFact) {\n factValue = matchedFact.value;\n \n // Debug log for fact matching\n if (shouldDebugDimensions || baseConceptId.includes('StreetName')) {\n console.log('✅ [FormField] Fact matched:', {\n conceptId: baseConceptId,\n columnId: this.columnId,\n factValue: matchedFact.value,\n period: matchedFact.period,\n dimensions: matchedFact.dimensions?.map(d => `${d.dimension}:${d.member}`)\n });\n }\n } else if (shouldDebugDimensions && this.facts.length > 0) {\n console.log('❌ [FormField] No fact match found for:', {\n conceptId: baseConceptId,\n columnId: this.columnId,\n factsAvailable: this.facts.length\n });\n }\n }\n \n // Determine effective value with priority: masterData > currentValue (draft/user input) > facts\n // Draft-restored values (this.value) must take priority over initial JSON facts so that\n // saving a draft and refreshing shows the saved value, not the original fact value.\n const hasUserValue = this.value !== null && this.value !== undefined;\n const effectiveValue = isPredefinedValue \n ? this.masterData![baseConceptId] \n : (hasUserValue ? this.value : factValue);\n \n // Only disable for masterData, not for facts (facts should remain editable)\n const effectiveDisabled = isPredefinedValue || isRoundingLevelLocked || this.disabled || this.mode === 'readonly';\n\n return html`\n <div class=\"field-container\">\n ${showLabel ? html`\n <label class=\"field-label ${this.field.required ? 'required' : ''}\">\n ${this.field.label}\n </label>\n ` : ''}\n \n <div class=\"field-wrapper\">\n ${this._renderInput(effectiveValue, effectiveDisabled)}\n \n ${hasPeriodControl && this.mode !== 'readonly' && !isRoundingLevelLocked ? html`\n <button\n class=\"period-icon-btn\"\n type=\"button\"\n @click=\"${this._handlePeriodIconClick}\"\n title=\"Edit period\"\n >\n 📅\n </button>\n ` : ''}\n </div>\n \n ${this._errors.length > 0 && this._touched ? html`\n <div class=\"field-errors\">\n ${this._errors.map(error => html`\n <span class=\"field-error ${error.severity}\">\n ${error.message}\n </span>\n `)}\n </div>\n ` : ''}\n \n ${this._xbrlErrors.length > 0 && this._touched ? html`\n <div class=\"field-errors\">\n ${this._xbrlErrors.map(error => html`\n <span class=\"field-error error\">\n ${error.message}\n </span>\n `)}\n </div>\n ` : ''}\n </div>\n \n ${this._showPeriodPopup ? this._renderPeriodPopup() : ''}\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { ConceptTree, FormColumn, FormField } from '../schema/types';\nimport { XBRLDatatype } from '../schema/xbrl-types';\nimport { I18n } from '../utils/i18n';\nimport './form-field';\n\n@customElement('jupiter-concept-tree')\nexport class JupiterConceptTree extends LitElement {\n @property({ type: Object }) concept!: ConceptTree;\n @property({ type: Array }) columns: FormColumn[] = [];\n @property({ type: Object }) formData: Record<string, any> = {};\n @property({ type: Object }) periodData: Record<string, Record<string, any>> = {};\n @property({ type: Object }) unitData: Record<string, Record<string, string>> = {};\n @property({ type: Object }) decimalsData: Record<string, Record<string, string>> = {};\n @property({ type: String }) globalDecimals = 'INF';\n @property({ type: Array }) defaultUnits: Array<Record<string, string>> = [];\n @property({ type: Boolean }) disabled = false;\n @property({ type: String }) locale = 'en-US';\n @property({ type: Set }) expandedConcepts: Set<string> = new Set();\n @property({ type: Array }) datatypes?: XBRLDatatype[];\n @property({ type: String }) mode: 'inputForm' | 'admin' | 'readonly' = 'inputForm';\n @property({ type: Object }) masterData?: Record<string, any>;\n @property({ type: Array }) facts?: Array<any>; // XBRL facts for pre-populating values\n @property({ type: Object }) typedMemberData: Record<string, Record<string, string>> = {};\n @property({ type: Boolean }) showAddButton = false;\n @property({ type: Boolean }) showRemoveButton = false;\n @property({ type: String }) highlightType?: 'total' | 'member';\n @property({ type: String }) highlightColumnId?: string;\n @property({ type: Object }) calculationErrorKeys?: Set<string>;\n @property({ type: String }) language = 'en';\n\n @state() private _expanded = true;\n\n static styles = css`\n :host {\n /* Component renders table cells directly */\n display: contents;\n }\n\n .concept-name-cell {\n vertical-align: top;\n padding: 2px 4px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-bottom: none;\n background: var(--jupiter-concept-background, #f8f9fa);\n position: sticky;\n left: 0;\n z-index: 1;\n width: 300px;\n min-width: 300px;\n max-width: 300px;\n }\n\n .concept-name-cell.abstract {\n background: var(--bg-color-1, var(--jupiter-abstract-background, #f0f2f5));\n font-weight: 600;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n }\n\n .concept-name-cell.leaf {\n background: var(--bg-color-2, var(--jupiter-leaf-background, #fff));\n font-weight: 400;\n }\n\n .concept-content {\n display: flex;\n align-items: center;\n min-height: 28px;\n font-size: 13px;\n line-height: 1.3;\n width: 100%;\n overflow: hidden;\n }\n\n .concept-indent {\n width: calc(var(--level, 0) * 16px);\n flex-shrink: 0;\n }\n\n .concept-toggle {\n width: 14px;\n height: 14px;\n margin-right: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n transition: transform 0.2s ease;\n cursor: pointer;\n }\n\n .concept-toggle.expanded {\n transform: rotate(90deg);\n }\n\n .concept-toggle.no-children {\n visibility: hidden;\n }\n\n .concept-label {\n flex: 1;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n cursor: pointer;\n word-wrap: break-word;\n overflow-wrap: break-word;\n hyphens: auto;\n line-height: 1.3;\n min-width: 0; /* Allows flex item to shrink below content size */\n }\n\n .concept-balance {\n margin-left: 8px;\n font-size: 11px;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 3px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n flex-shrink: 0;\n }\n\n .concept-balance.debit {\n color: #d32f2f;\n background: rgba(211, 47, 47, 0.1);\n border: 1px solid rgba(211, 47, 47, 0.3);\n }\n\n .concept-balance.credit {\n color: #388e3c;\n background: rgba(56, 142, 60, 0.1);\n border: 1px solid rgba(56, 142, 60, 0.3);\n }\n\n .field-cell {\n vertical-align: middle;\n padding: 2px 6px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-bottom: none;\n background: var(--bg-color-2, var(--jupiter-cell-background, #fff));\n min-height: 28px;\n text-align: center;\n min-width: 180px;\n width: 180px;\n }\n\n .field-cell.empty {\n background: var(--bg-color-2, var(--jupiter-empty-cell-background, #f8f9fa));\n }\n\n .field-cell.abstract-row {\n background: var(--bg-color-2, var(--jupiter-abstract-cell-background, #f0f2f5));\n }\n\n /* Children are rendered as separate table rows, not nested */\n .children-wrapper {\n display: none;\n }\n\n .repeat-btn {\n flex-shrink: 0;\n margin-left: 4px;\n width: 20px;\n height: 20px;\n padding: 0;\n border-radius: 3px;\n border: 1px solid var(--jupiter-primary-color, #1976d2);\n color: var(--jupiter-primary-color, #1976d2);\n background: transparent;\n cursor: pointer;\n font-size: 14px;\n line-height: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .repeat-btn:hover {\n background: var(--jupiter-primary-color, #1976d2);\n color: #fff;\n }\n\n .repeat-btn.remove {\n border-color: var(--jupiter-error-color, #d32f2f);\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .repeat-btn.remove:hover {\n background: var(--jupiter-error-color, #d32f2f);\n color: #fff;\n }\n\n .field-cell.highlight-total {\n background: rgba(25, 118, 210, 0.15);\n }\n\n .field-cell.highlight-member {\n background: rgba(25, 118, 210, 0.07);\n }\n\n .field-cell.calc-error {\n box-shadow: inset 0 0 0 2px var(--jupiter-error-color, #d32f2f);\n }\n\n .concept-info-btn {\n flex-shrink: 0;\n width: 22px;\n height: 22px;\n border-radius: 50%;\n border: 1px solid var(--jupiter-border-color, #cfd8dc);\n background: var(--jupiter-card-background, #fff);\n color: var(--jupiter-primary-color, #1976d2);\n font-size: 13px;\n font-weight: 700;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.15s, background 0.15s, color 0.15s, border-color 0.15s, box-shadow 0.15s;\n padding: 0;\n margin-left: 4px;\n line-height: 1;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n pointer-events: auto;\n }\n\n .concept-content:hover .concept-info-btn,\n .concept-info-btn:hover,\n .concept-info-btn:focus-visible {\n opacity: 1;\n }\n\n .concept-info-btn:hover {\n background: var(--jupiter-primary-color, #1976d2);\n color: #fff;\n border-color: var(--jupiter-primary-color, #1976d2);\n box-shadow: 0 2px 6px rgba(25, 118, 210, 0.25);\n }\n\n .concept-info-btn:focus-visible {\n outline: none;\n border-color: var(--jupiter-primary-color, #1976d2);\n box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.25);\n opacity: 1;\n }\n\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this._expanded = this.expandedConcepts.has(this.concept.id);\n }\n\n willUpdate(changedProperties: Map<string, unknown>) {\n super.willUpdate(changedProperties);\n if (changedProperties.has('expandedConcepts')) {\n this._expanded = this.expandedConcepts.has(this.concept.id);\n }\n }\n\n private _toggleExpanded() {\n this._expanded = !this._expanded;\n \n this.dispatchEvent(new CustomEvent('concept-expand', {\n detail: {\n conceptId: this.concept.id,\n expanded: this._expanded\n },\n bubbles: true\n }));\n }\n\n private _getFieldForColumn(columnId: string): FormField | undefined {\n return this.concept.fields?.find(field => field.columnId === columnId);\n }\n\n private _getFieldValue(field: FormField): any {\n return this.formData[this.concept.id]?.[field.columnId];\n }\n\n private _handleFieldChange(event: CustomEvent) {\n event.stopPropagation();\n // Re-dispatch with updated detail\n this.dispatchEvent(new CustomEvent('field-change', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _handleAddRepeat() {\n this.dispatchEvent(new CustomEvent('add-concept-repeat', {\n detail: { conceptId: this.concept.id },\n bubbles: true,\n composed: true\n }));\n }\n\n private _handleRemoveRepeat() {\n this.dispatchEvent(new CustomEvent('remove-concept-repeat', {\n detail: { conceptId: this.concept.id },\n bubbles: true,\n composed: true\n }));\n }\n\n private _handleFieldFocus(event: CustomEvent) {\n event.stopPropagation();\n this.dispatchEvent(new CustomEvent('field-focus', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _handlePeriodChange(event: CustomEvent) {\n console.log(`🌲 [ConceptTree] Received period-change event:`, event.detail);\n event.stopPropagation();\n // Forward period change event to parent with composed:true for shadow DOM\n this.dispatchEvent(new CustomEvent('period-change', {\n detail: event.detail,\n bubbles: true,\n composed: true // CRITICAL: Allows event to cross shadow DOM boundaries\n }));\n console.log(`🌲 [ConceptTree] Forwarded period-change event to form-section`);\n }\n\n private _getDocLabel(): string {\n const meta = this.concept.conceptMetadata;\n if (!meta) return '';\n const lang = this.language || this.locale.split('-')[0];\n return meta.documentationLabels[lang] || meta.documentationLabels['en'] || meta.documentationLabels['nl'] || '';\n }\n\n private _escapeHtml(str: string): string {\n return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n }\n\n private _ensureDialogStyles() {\n if (document.getElementById('jdf-concept-info-dialog-styles')) return;\n const style = document.createElement('style');\n style.id = 'jdf-concept-info-dialog-styles';\n style.textContent = `\n dialog.jdf-concept-info-dialog {\n border: none; border-radius: 8px; padding: 0;\n max-width: 480px; width: 90vw;\n box-shadow: 0 8px 32px rgba(0,0,0,0.2); overflow: hidden;\n }\n dialog.jdf-concept-info-dialog::backdrop { background: rgba(0,0,0,0.35); }\n .jdf-dialog-header {\n background: #f0f2f5; padding: 14px 20px;\n display: flex; align-items: center; justify-content: space-between;\n border-bottom: 1px solid #ddd;\n }\n .jdf-dialog-title { font-size: 15px; font-weight: 600; color: #333; margin: 0; font-family: inherit; }\n .jdf-dialog-close-btn {\n width: 28px; height: 28px; border: none; background: transparent;\n font-size: 20px; line-height: 1; cursor: pointer; color: #666;\n border-radius: 4px; display: flex; align-items: center; justify-content: center;\n padding: 0; font-family: inherit;\n }\n .jdf-dialog-close-btn:hover { background: #ddd; color: #333; }\n .jdf-dialog-body { padding: 20px; }\n .jdf-info-table { width: 100%; border-collapse: collapse; font-size: 14px; font-family: inherit; }\n .jdf-info-table tr:not(:last-child) td { border-bottom: 1px solid #f0f0f0; }\n .jdf-info-table td { padding: 9px 4px; vertical-align: top; }\n .jdf-info-label { font-weight: 600; color: #666; width: 40%; white-space: nowrap; padding-right: 16px; }\n .jdf-info-value { color: #333; word-break: break-all; }\n .jdf-info-value.doc-text { font-style: italic; color: #555; line-height: 1.5; word-break: normal; }\n .jdf-period-pill { display: inline-block; padding: 2px 8px; border-radius: 10px; font-size: 12px; font-weight: 600; }\n .jdf-period-pill.instant { background: rgba(25,118,210,0.1); color: #1565c0; border: 1px solid rgba(25,118,210,0.3); }\n .jdf-period-pill.duration { background: rgba(56,142,60,0.1); color: #2e7d32; border: 1px solid rgba(56,142,60,0.3); }\n .jdf-balance-pill { display: inline-block; padding: 2px 8px; border-radius: 10px; font-size: 12px; font-weight: 600; text-transform: capitalize; }\n .jdf-balance-pill.debit { background: rgba(211,47,47,0.1); color: #c62828; border: 1px solid rgba(211,47,47,0.3); }\n .jdf-balance-pill.credit { background: rgba(56,142,60,0.1); color: #2e7d32; border: 1px solid rgba(56,142,60,0.3); }\n `;\n document.head.appendChild(style);\n }\n\n private _openInfoDialog(e: Event) {\n e.stopPropagation();\n this._ensureDialogStyles();\n\n const meta = this.concept.conceptMetadata;\n const docLabel = this._getDocLabel();\n const periodType = meta?.periodType || this.concept.periodType;\n const balance = meta?.balance || this.concept.balance;\n\n const periodLabel = periodType === 'instant' ? I18n.t('conceptInfo.instant') : I18n.t('conceptInfo.duration');\n\n const rows: Array<{ label: string; valueHtml: string; isDoc?: boolean }> = [\n { label: I18n.t('conceptInfo.conceptName'), valueHtml: this._escapeHtml(meta?.conceptName || this.concept.name) },\n { label: I18n.t('conceptInfo.type'), valueHtml: this._escapeHtml(meta?.type || this.concept.type || '—') },\n ];\n if (meta?.substitutionGroup) {\n rows.push({ label: I18n.t('conceptInfo.substitutionGroup'), valueHtml: this._escapeHtml(meta.substitutionGroup) });\n }\n rows.push({ label: I18n.t('conceptInfo.periodType'), valueHtml: `<span class=\"jdf-period-pill ${periodType}\">${this._escapeHtml(periodLabel)}</span>` });\n if (balance) {\n rows.push({ label: I18n.t('conceptInfo.balance'), valueHtml: `<span class=\"jdf-balance-pill ${balance}\">${this._escapeHtml(balance)}</span>` });\n }\n if (docLabel) {\n rows.push({ label: I18n.t('conceptInfo.documentation'), valueHtml: this._escapeHtml(docLabel), isDoc: true });\n }\n\n const rowsHtml = rows.map(r => `\n <tr>\n <td class=\"jdf-info-label\">${this._escapeHtml(r.label)}</td>\n <td class=\"jdf-info-value${r.isDoc ? ' doc-text' : ''}\">${r.valueHtml}</td>\n </tr>\n `).join('');\n\n const dialog = document.createElement('dialog');\n dialog.className = 'jdf-concept-info-dialog';\n dialog.innerHTML = `\n <div class=\"jdf-dialog-header\">\n <h3 class=\"jdf-dialog-title\">${this._escapeHtml(I18n.t('conceptInfo.title'))}</h3>\n <button class=\"jdf-dialog-close-btn\" type=\"button\" aria-label=\"${this._escapeHtml(I18n.t('conceptInfo.close'))}\">×</button>\n </div>\n <div class=\"jdf-dialog-body\">\n <table class=\"jdf-info-table\">${rowsHtml}</table>\n </div>\n `;\n\n document.body.appendChild(dialog);\n\n dialog.querySelector('.jdf-dialog-close-btn')?.addEventListener('click', () => dialog.close());\n\n dialog.addEventListener('click', (ev: MouseEvent) => {\n const rect = dialog.getBoundingClientRect();\n if (ev.clientX < rect.left || ev.clientX > rect.right ||\n ev.clientY < rect.top || ev.clientY > rect.bottom) {\n dialog.close();\n }\n });\n\n dialog.addEventListener('close', () => document.body.removeChild(dialog));\n\n dialog.showModal();\n }\n\n render() {\n const hasChildren = this.concept.children && this.concept.children.length > 0;\n const level = this.concept.level || 0;\n const isAbstract = this.concept.abstract || false;\n\n return html`\n <!-- Concept Name Cell (Left Column) -->\n <td class=\"concept-name-cell ${isAbstract ? 'abstract' : (hasChildren ? '' : 'leaf')}\">\n <div class=\"concept-content\" style=\"--level: ${level}\">\n <div class=\"concept-indent\"></div>\n <div class=\"concept-toggle ${hasChildren ? (this._expanded ? 'expanded' : '') : 'no-children'}\"\n @click=\"${this._toggleExpanded}\">\n ${hasChildren ? '▶' : ''}\n </div>\n <div class=\"concept-label\"\n @click=\"${this._toggleExpanded}\"\n title=\"${this.concept.id}${this.concept.description ? ' - ' + this.concept.description : ''}\">\n ${this.concept.label}\n </div>\n ${this.concept.balance ? html`\n <div class=\"concept-balance ${this.concept.balance}\">${this.concept.balance}</div>\n ` : ''}\n <button class=\"concept-info-btn\" type=\"button\" title=\"${I18n.t('conceptInfo.title')}\"\n @click=\"${this._openInfoDialog}\">ℹ</button>\n ${this.showAddButton ? html`\n <button class=\"repeat-btn\" type=\"button\" title=\"Add row\"\n @click=\"${this._handleAddRepeat}\">+</button>\n ` : ''}\n ${this.showRemoveButton ? html`\n <button class=\"repeat-btn remove\" type=\"button\" title=\"Remove row\"\n @click=\"${this._handleRemoveRepeat}\">−</button>\n ` : ''}\n </div>\n </td>\n\n <!-- Input Field Cells (Period Columns) - Only for non-abstract concepts -->\n ${this.columns.map(column => {\n const field = this._getFieldForColumn(column.id);\n const shouldShowField = !isAbstract && field;\n\n // Get stored unit and decimals for this field\n const storedUnit = this.unitData?.[this.concept.id]?.[column.id];\n const storedDecimals = this.decimalsData?.[this.concept.id]?.[column.id];\n\n return html`\n <td class=\"field-cell ${!shouldShowField ? 'empty' : ''} ${isAbstract ? 'abstract-row' : ''} ${this.highlightType && column.id === this.highlightColumnId ? 'highlight-' + this.highlightType : ''} ${this.calculationErrorKeys?.has(`${this.concept.id}__${column.id}`) ? 'calc-error' : ''}\">\n ${shouldShowField ? html`\n <jupiter-form-field\n .field=\"${field}\"\n .conceptId=\"${this.concept.id}\"\n .conceptType=\"${this.concept.type}\"\n .datatypes=\"${this.datatypes}\"\n .defaultUnits=\"${this.defaultUnits}\"\n .columnId=\"${column.id}\"\n .value=\"${this._getFieldValue(field)}\"\n .unit=\"${storedUnit || ''}\"\n .decimals=\"${storedDecimals}\"\n .globalDecimals=\"${this.globalDecimals}\"\n .periodStartDate=\"${field.periodStartDate || column.periodStartDate}\"\n .periodEndDate=\"${field.periodEndDate || column.periodEndDate}\"\n .periodInstantDate=\"${field.periodInstantDate || (field.periodType === 'instant' ? (field.periodEndDate || field.periodStartDate) : undefined)}\"\n .disabled=\"${this.disabled}\"\n .locale=\"${this.locale}\"\n .hideLabel=\"${true}\"\n .mode=\"${this.mode}\"\n .masterData=\"${this.masterData}\"\n .facts=\"${this.facts}\"\n .column=\"${column}\"\n .typedMemberValues=\"${this.typedMemberData[`${this.concept.id}__${column.id}`] || {}}\"\n @field-change=\"${this._handleFieldChange}\"\n @field-focus=\"${this._handleFieldFocus}\"\n @period-change=\"${this._handlePeriodChange}\"\n ></jupiter-form-field>\n ` : ''}\n </td>\n `;\n })}\n\n `;\n }\n}\n","import { LitElement, html, css, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { I18n } from '../utils/i18n';\n\nexport interface AddColumnRequest {\n periodType: 'duration' | 'instant' | 'mixed';\n startDate?: string;\n endDate?: string;\n instantDate?: string;\n selectedDimensions?: DimensionSelection[];\n}\n\nexport interface DimensionSelection {\n axisId: string;\n axisLabel: string;\n memberId?: string;\n memberLabel?: string;\n isTyped?: boolean;\n typedValue?: string;\n}\n\nexport interface AvailableDimension {\n id: string;\n conceptName: string;\n axisLabel: string;\n members?: AvailableDimensionMember[];\n typedMember?: {\n id: string;\n dataType: string;\n };\n}\n\nexport interface AvailableDimensionMember {\n id: string;\n label: string;\n}\n\n@customElement('jupiter-add-column-dialog')\nexport class JupiterAddColumnDialog extends LitElement {\n @property({ type: String }) periodType: 'duration' | 'instant' | 'mixed' = 'duration';\n @property({ type: Boolean }) open = false;\n @property({ type: Array }) availableDimensions: AvailableDimension[] = [];\n @property({ type: String }) periodStartDate = '';\n @property({ type: String }) periodEndDate = '';\n\n @state() private _startDate = '';\n @state() private _endDate = '';\n @state() private _instantDate = '';\n @state() private _selectedType: 'duration' | 'instant' = 'duration';\n @state() private _selectedDimensions: Map<string, DimensionSelection> = new Map();\n\n updated(changedProperties: PropertyValues) {\n if (changedProperties.has('open') && this.open) {\n // Reset form when dialog opens\n this._resetForm();\n }\n \n if (changedProperties.has('availableDimensions')) {\n //////console.log(`🎯 Add Column Dialog received ${this.availableDimensions.length} dimensions:`, this.availableDimensions.map(d => d.axisLabel));\n }\n }\n\n static styles = css`\n :host {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.5);\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.3s ease, visibility 0.3s ease;\n }\n\n :host([open]) {\n opacity: 1;\n visibility: visible;\n }\n\n .dialog {\n background: var(--bg-color-2, var(--jupiter-card-background, #fff));\n border-radius: 8px;\n padding: 24px;\n min-width: 400px;\n max-width: 500px;\n max-height: 90vh;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n transform: scale(0.9);\n transition: transform 0.3s ease;\n display: flex;\n flex-direction: column;\n }\n\n :host([open]) .dialog {\n transform: scale(1);\n }\n\n .dialog-header {\n margin-bottom: 20px;\n flex-shrink: 0;\n }\n\n .dialog-title {\n font-size: 20px;\n font-weight: 600;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n margin: 0 0 8px 0;\n }\n\n .dialog-description {\n font-size: 14px;\n color: var(--jupiter-text-secondary, #666);\n margin: 0;\n }\n\n .dialog-content {\n margin-bottom: 24px;\n flex: 1;\n overflow-y: auto;\n max-height: calc(90vh - 160px);\n }\n\n .date-wrapper {\n position: relative;\n width: min-content;\n }\n\n /* hide native icon */\n input[type=\"date\"]::-webkit-calendar-picker-indicator {\n opacity: 0;\n position: absolute;\n right: 10px;\n width: 20px;\n height: 20px;\n cursor: pointer;\n }\n \n .calendar-icon-svg {\n position: absolute;\n right: 3px;\n top: 18px;\n transform: translateY(-50%);\n width: 20px;\n height: 20px;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n pointer-events: none;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group.date-row {\n display: flex;\n gap: 12px;\n }\n\n .form-group.date-row .date-field {\n flex: 1;\n }\n\n .form-label {\n display: block;\n font-weight: 500;\n margin-bottom: 6px;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n font-size: 14px;\n }\n\n .form-label.required::after {\n content: ' *';\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .form-input {\n width: 100%;\n box-sizing: border-box;\n padding: 10px 12px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 4px;\n font-size: 14px;\n font-family: inherit;\n transition: border-color 0.2s ease;\n background-color: transparent;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n }\n\n // .form-input:focus {\n // outline: none;\n // border-color: var(--jupiter-primary-color, #007bff);\n // box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\n // }\n\n select.form-input {\n cursor: pointer;\n background-color: white;\n }\n\n .dialog-actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n flex-shrink: 0;\n border-top: 1px solid var(--jupiter-border-color, #ddd);\n padding-top: 16px;\n margin-top: 16px;\n }\n\n .btn {\n padding: 10px 20px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s ease;\n }\n\n .btn-cancel {\n color: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));\n border: 1px solid var(--buttonBgColor, var(--jupiter-primary-color, #1976d2)) !important;\n background: transparent;\n }\n\n .btn-cancel:hover {\n opacity: 0.9;\n }\n\n .btn-primary {\n background: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));\n color: var(--buttonTextColor, white);\n }\n\n .btn-primary:hover {\n opacity: 0.9;\n }\n\n // .btn-primary:disabled {\n // background: var(--jupiter-disabled-background, #ccc);\n // cursor: not-allowed;\n // }\n\n /* Dimension Selection Styles */\n .dimensions-section {\n margin-top: 20px;\n padding-top: 20px;\n border-top: 1px solid var(--jupiter-border-color, #ddd);\n }\n\n .dimensions-section h3 {\n margin: 0 0 16px 0;\n font-size: 16px;\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n }\n\n .dimension-item {\n margin-bottom: 16px;\n padding: 16px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n background: var(--jupiter-card-background, #fafafa);\n }\n\n .dimension-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n }\n\n .dimension-checkbox {\n margin: 0;\n }\n\n .dimension-label {\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n flex: 1;\n }\n\n .dimension-details {\n margin-left: 24px;\n }\n\n .member-selection {\n margin-top: 12px;\n }\n\n .member-selection label {\n display: block;\n margin-bottom: 4px;\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n }\n\n .typed-input {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n font-size: 14px;\n }\n\n .member-list {\n max-height: 120px;\n overflow-y: auto;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n padding: 8px;\n }\n\n .member-option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n }\n\n .member-option input[type=\"radio\"] {\n margin: 0;\n }\n\n .member-option label {\n margin: 0;\n font-size: 13px;\n color: var(--jupiter-text-primary, #333);\n cursor: pointer;\n }\n\n .no-dimensions {\n text-align: center;\n color: var(--jupiter-text-secondary, #666);\n font-style: italic;\n padding: 20px;\n }\n\n .form-description {\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n margin: 0 0 12px 0;\n line-height: 1.4;\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this._resetForm();\n }\n\n willUpdate(changedProperties: Map<string, unknown>) {\n super.willUpdate(changedProperties);\n if (changedProperties.has('open') && this.open) {\n this._resetForm();\n }\n }\n\n private _handleCancel() {\n this.open = false;\n this.dispatchEvent(new CustomEvent('dialog-cancel', { bubbles: true }));\n }\n\n private _handleConfirm() {\n if (!this._isFormValid()) return;\n\n // For mixed sections, always use 'duration' since columns show both instant and duration concepts\n const request: AddColumnRequest = {\n periodType: this.periodType === 'mixed' ? 'duration' : this.periodType\n };\n\n if (this.periodType === 'instant') {\n request.instantDate = this._instantDate;\n } else {\n // Mixed and duration both use start/end dates\n request.startDate = this._startDate;\n request.endDate = this._endDate;\n }\n\n // Add selected dimensions\n if (this._selectedDimensions.size > 0) {\n request.selectedDimensions = Array.from(this._selectedDimensions.values());\n }\n\n this.dispatchEvent(new CustomEvent('column-add', {\n detail: request,\n bubbles: true\n }));\n }\n\n private _isFormValid(): boolean {\n // Mixed sections always use duration date fields (start/end)\n if (this.periodType === 'mixed' || this.periodType === 'duration') {\n return !!this._startDate && !!this._endDate && this._startDate <= this._endDate;\n } else if (this.periodType === 'instant') {\n return !!this._instantDate;\n }\n return false;\n }\n\n private _handleStartDateChange(e: Event) {\n this._startDate = (e.target as HTMLInputElement).value;\n }\n\n private _handleEndDateChange(e: Event) {\n this._endDate = (e.target as HTMLInputElement).value;\n }\n\n private _handleSelectedTypeChange(e: Event) {\n this._selectedType = (e.target as HTMLSelectElement).value as 'duration' | 'instant';\n }\n\n private _handleInstantDateChange(e: Event) {\n this._instantDate = (e.target as HTMLInputElement).value;\n }\n\n private _handleDimensionToggle(dimensionId: string, event: Event) {\n const checkbox = event.target as HTMLInputElement;\n \n if (checkbox.checked) {\n const dimension = this.availableDimensions.find(d => d.id === dimensionId);\n if (dimension) {\n const selection: DimensionSelection = {\n axisId: dimension.id,\n axisLabel: dimension.axisLabel,\n isTyped: !!(dimension.typedMember && (!dimension.members || dimension.members.length === 0))\n };\n \n this._selectedDimensions.set(dimensionId, selection);\n }\n } else {\n this._selectedDimensions.delete(dimensionId);\n }\n \n this.requestUpdate();\n }\n\n private _handleMemberSelection(dimensionId: string, memberId: string, memberLabel: string) {\n const existing = this._selectedDimensions.get(dimensionId);\n if (existing) {\n existing.memberId = memberId;\n existing.memberLabel = memberLabel;\n this._selectedDimensions.set(dimensionId, existing);\n this.requestUpdate();\n }\n }\n\n private _handleTypedValueChange(dimensionId: string, event: Event) {\n const input = event.target as HTMLInputElement;\n const existing = this._selectedDimensions.get(dimensionId);\n if (existing) {\n existing.typedValue = input.value;\n this._selectedDimensions.set(dimensionId, existing);\n }\n }\n\n private _resetForm() {\n this._startDate = this.periodStartDate || '';\n this._endDate = this.periodEndDate || '';\n this._instantDate = this.periodEndDate || this.periodStartDate || '';\n this._selectedType = this.periodType === 'instant' ? 'instant' : 'duration';\n this._selectedDimensions.clear();\n \n // Auto-select dimensions with only one member\n this._autoSelectSingleMemberDimensions();\n \n this.requestUpdate();\n }\n\n private _autoSelectSingleMemberDimensions() {\n this.availableDimensions.forEach(dimension => {\n // Auto-select dimensions with domain members (like filter-roles-dialog does)\n if (dimension.members && dimension.members.length > 0) {\n // Auto-select the first member by default (or all if required)\n // Following the pattern from filter-roles-dialog: auto-select ALL members by default\n const member = dimension.members[0]; // Select first member as default\n const selection: DimensionSelection = {\n axisId: dimension.id,\n axisLabel: dimension.axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: false\n };\n this._selectedDimensions.set(dimension.id, selection);\n console.log(`🎯 Auto-selected default member: ${dimension.axisLabel} -> ${member.label}`);\n }\n // Auto-select typed dimensions (no domain members, only typed input)\n else if (dimension.typedMember && (!dimension.members || dimension.members.length === 0)) {\n const selection: DimensionSelection = {\n axisId: dimension.id,\n axisLabel: dimension.axisLabel,\n isTyped: true\n // Note: typedValue will be entered in column header, not here\n };\n this._selectedDimensions.set(dimension.id, selection);\n console.log(`🎯 Auto-selected typed dimension: ${dimension.axisLabel} (value will be entered in column header)`);\n }\n });\n }\n\n render() {\n if (!this.open) return html``;\n\n const isValid = this._isFormValid();\n\n return html`\n <div class=\"dialog\" @click=\"${(e: Event) => e.stopPropagation()}\">\n <div class=\"dialog-header\">\n <h2 class=\"dialog-title\">${I18n.t('column.addColumn')}</h2>\n\n </div>\n\n <div class=\"dialog-content\">\n ${this.periodType === 'instant' ? html`\n <div class=\"form-group\">\n <label class=\"form-label required\">${I18n.t('column.instantDate')}</label>\n <div class=\"date-wrapper\">\n <input \n type=\"date\" \n class=\"form-input\"\n .value=\"${this._instantDate}\"\n @change=\"${this._handleInstantDateChange}\"\n required\n />\n <svg class=\"calendar-icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M19 4h-1V2h-2v2H8V2H6v2H5\n a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14\n a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V9h14z\"/>\n </div>\n </div>\n ` : html`\n <div class=\"form-group date-row\">\n <div class=\"date-field\">\n <label class=\"form-label required\">${I18n.t('column.startPeriodDate')}</label>\n <div class=\"date-wrapper\">\n <input \n type=\"date\" \n class=\"form-input\"\n .value=\"${this._startDate}\"\n @change=\"${this._handleStartDateChange}\"\n required\n />\n <svg class=\"calendar-icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M19 4h-1V2h-2v2H8V2H6v2H5\n a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14\n a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V9h14z\"/>\n </div>\n </div>\n <div class=\"date-field\">\n <label class=\"form-label required\">${I18n.t('column.endPeriodDate')}</label>\n <div class=\"date-wrapper\">\n <input \n type=\"date\" \n class=\"form-input\"\n .value=\"${this._endDate}\"\n @change=\"${this._handleEndDateChange}\"\n required\n />\n <svg class=\"calendar-icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M19 4h-1V2h-2v2H8V2H6v2H5\n a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14\n a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V9h14z\"/>\n </div>\n </div>\n </div>\n `}\n\n <!-- Dimensions Section -->\n ${this.availableDimensions.length > 0 ? html`\n <div class=\"dimensions-section\">\n <h3>${I18n.t('column.availableDimensions')}</h3>\n <p class=\"form-description\">${I18n.t('column.dimensionsDescription')}</p>\n \n ${this.availableDimensions.map(dimension => {\n const isSelected = this._selectedDimensions.has(dimension.id);\n const selection = this._selectedDimensions.get(dimension.id);\n const isTypedDimension = !!(dimension.typedMember && (!dimension.members || dimension.members.length === 0));\n \n return html`\n <div class=\"dimension-item\">\n <div class=\"dimension-header\">\n <input \n type=\"checkbox\" \n class=\"dimension-checkbox\"\n .checked=\"${isSelected}\"\n @change=\"${(e: Event) => this._handleDimensionToggle(dimension.id, e)}\"\n id=\"dim-${dimension.id}\"\n />\n <label for=\"dim-${dimension.id}\" class=\"dimension-label\">\n ${dimension.axisLabel || dimension.conceptName}\n </label>\n </div>\n \n ${isSelected ? html`\n <div class=\"dimension-details\">\n ${isTypedDimension ? html`\n <!-- Typed Dimension Input -->\n <div class=\"member-selection\">\n <label>${I18n.t('column.enterValue')} ${dimension.conceptName}:</label>\n <input\n type=\"text\"\n class=\"typed-input\"\n .value=\"${selection?.typedValue || ''}\"\n @input=\"${(e: Event) => this._handleTypedValueChange(dimension.id, e)}\"\n placeholder=\"${I18n.t('column.enterValuePlaceholder')}\"\n />\n </div>\n ` : html`\n <!-- Domain Members Selection -->\n ${dimension.members && dimension.members.length > 0 ? html`\n <div class=\"member-selection\">\n <label>${I18n.t('column.selectMember')}</label>\n <div class=\"member-list\">\n ${dimension.members.map(member => html`\n <div class=\"member-option\">\n <input\n type=\"radio\"\n name=\"member-${dimension.id}\"\n .checked=\"${selection?.memberId === member.id}\"\n @change=\"${() => this._handleMemberSelection(dimension.id, member.id, member.label)}\"\n id=\"member-${dimension.id}-${member.id}\"\n />\n <label for=\"member-${dimension.id}-${member.id}\">\n ${member.label}\n </label>\n </div>\n `)}\n </div>\n </div>\n ` : html`\n <p class=\"form-description\">${I18n.t('column.noMembersAvailable')}</p>\n `}\n `}\n </div>\n ` : ''}\n </div>\n `;\n })}\n </div>\n ` : ''}\n </div>\n\n <div class=\"dialog-actions\">\n <button class=\"btn btn-cancel\" @click=\"${this._handleCancel}\">\n ${I18n.t('column.cancel')}\n </button>\n <button \n class=\"btn btn-primary\" \n ?disabled=\"${!isValid}\"\n @click=\"${this._handleConfirm}\"\n >\n ${I18n.t('column.addColumn')}\n </button>\n </div>\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { FormSection, FormColumn, ConceptTree } from '../schema/types';\nimport { I18n } from '../utils/i18n';\nimport './concept-tree';\nimport './add-column-dialog';\nimport { AddColumnRequest, AvailableDimension } from './add-column-dialog';\n\n@customElement('jupiter-form-section')\nexport class JupiterFormSection extends LitElement {\n @property({ type: Object }) section!: FormSection;\n @property({ type: Array }) columns: FormColumn[] = [];\n @property({ type: Array }) datatypes?: any[]; // XBRL datatypes for baseType chain resolution\n @property({ type: Object }) formData: Record<string, any> = {};\n @property({ type: Object }) periodData: Record<string, Record<string, any>> = {};\n @property({ type: Object }) unitData: Record<string, Record<string, string>> = {};\n @property({ type: Object }) decimalsData: Record<string, Record<string, string>> = {};\n @property({ type: String }) globalDecimals = 'INF';\n @property({ type: Object }) typedMemberData: Record<string, Record<string, string>> = {};\n @property({ type: Object }) repeatCounts: { [conceptId: string]: number } = {};\n @property({ type: Array }) defaultUnits: Array<Record<string, string>> = [];\n @property({ type: Boolean }) disabled = false;\n @property({ type: Boolean }) collapsible = true;\n @property({ type: String }) locale = 'en-US';\n @property({ type: Boolean }) isFirstSection = false;\n @property({ type: Array }) availableDimensions: AvailableDimension[] = [];\n @property({ type: Boolean }) hideHeader = false;\n @property({ type: String }) mode: 'inputForm' | 'admin' | 'readonly' = 'inputForm';\n @property({ type: Boolean }) showFactsOnly = false;\n @property({ type: Object }) conceptMatchIds?: Set<string>;\n @property({ type: Object }) masterData?: Record<string, any>;\n @property({ type: String }) periodStartDate = '';\n @property({ type: String }) periodEndDate = '';\n @property({ type: String }) language = 'en';\n\n @state() private _expanded = true;\n @state() private _showAddColumnDialog = false;\n @state() private _sectionPeriodType: 'duration' | 'instant' | 'mixed' = 'duration';\n @state() private _openMenuColumnId: string | null = null;\n @state() private _insertAfterColumnId: string | null = null;\n\n static styles = css`\n :host {\n display: block;\n margin-bottom: 16px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .section-header {\n background: var(--jupiter-section-header-background, #f0f2f5);\n padding: 16px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n cursor: pointer;\n user-select: none;\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .section-header:hover {\n background: var(--jupiter-section-header-hover-background, #e4e7ea);\n }\n\n .section-header.not-collapsible {\n cursor: default;\n }\n\n .section-header.not-collapsible:hover {\n background: var(--jupiter-section-header-background, #f0f2f5);\n }\n\n .section-title {\n font-size: 18px;\n font-weight: 600;\n color: var(--jupiter-text-primary, #333);\n margin: 0;\n }\n\n .section-description {\n font-size: 14px;\n color: var(--jupiter-text-secondary, #666);\n margin: 4px 0 0 0;\n }\n\n .section-toggle {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n transition: transform 0.2s ease;\n color: var(--jupiter-text-secondary, #666);\n }\n\n .section-toggle.expanded {\n transform: rotate(90deg);\n }\n\n .section-toggle.hidden {\n visibility: hidden;\n }\n\n .section-header-controls {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .section-content {\n display: block;\n transition: max-height 0.3s ease;\n overflow: hidden;\n }\n\n .section-content.collapsed {\n display: none;\n }\n\n .table-container {\n overflow-x: auto;\n }\n\n .form-table {\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n border-spacing: 0;\n background: var(--jupiter-table-background, #fff);\n }\n\n .table-header {\n background: var(--jupiter-header-background, #f8f9fa);\n position: sticky;\n top: 0;\n z-index: 1;\n }\n\n .header-row {\n /* Table row - no special display needed */\n }\n\n .header-cell:first-child {\n border-radius: 6px 0 0 0;\n }\n .header-cell:last-child {\n border-radius: 0 6px 0 0;\n }\n\n .header-cell {\n padding: 8px 12px;\n text-align: left;\n font-weight: 600;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n background: var(--bg-color-1, var(--jupiter-header-background, #f8f9fa));\n min-width: 180px;\n width: 180px;\n font-size: 14px;\n vertical-align: middle;\n position: relative;\n overflow: visible;\n }\n\n .header-cell.concept-column {\n width: 300px;\n min-width: 300px;\n max-width: 300px;\n position: sticky;\n left: 0;\n z-index: 2;\n }\n\n .header-cell.removable {\n position: relative;\n }\n\n .column-menu-icon {\n position: absolute;\n top: 8px;\n right: 0px;\n width: 24px;\n height: 24px;\n background: transparent;\n color: var(--jupiter-text-secondary, #666);\n border: none;\n font-size: 20px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n transition: all 0.2s ease;\n line-height: 1;\n font-weight: bold;\n padding: 0;\n border-radius: 4px;\n }\n\n .column-menu-icon:hover {\n background: var(--jupiter-background-light, #f0f0f0);\n color: var(--jupiter-text-primary, #333);\n }\n\n .column-context-menu {\n position: absolute;\n top: 32px;\n right: 4px;\n background: var(--bg-color-2, var(--jupiter-card-background, #fff));\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 4px;\n // box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n min-width: 150px;\n padding: 4px 0;\n }\n\n .column-context-menu-item {\n padding: 8px 16px;\n cursor: pointer;\n font-size: 14px;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n transition: background 0.2s ease;\n border: none;\n background: transparent;\n width: 100%;\n text-align: left;\n display: block;\n }\n\n .column-context-menu-item:hover {\n opacity: 0.9;\n }\n\n .column-context-menu-item.remove {\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .column-context-menu-item.remove:hover {\n background: var(--jupiter-error-light, #ffebee);\n }\n\n /* Column header content styling */\n .column-header-content {\n display: flex;\n flex-direction: column;\n gap: 8px;\n align-items: center;\n }\n\n .column-title {\n text-align: center;\n }\n\n /* Typed member header input styles */\n .typed-members-header {\n display: flex;\n flex-direction: column;\n gap: 4px;\n width: 100%;\n padding: 8px;\n background: var(--jupiter-typed-member-header-background, #f8f9fa);\n border-radius: 4px;\n border: 1px solid var(--jupiter-border-color, #e0e0e0);\n }\n\n .typed-member-header-input {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .typed-member-header-label {\n font-size: 11px;\n font-weight: 500;\n color: var(--jupiter-text-secondary, #666);\n text-align: left;\n }\n\n .typed-member-header-field {\n width: 96%;\n padding: 4px 6px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 3px;\n font-size: 12px;\n background: var(--jupiter-input-background, #fff);\n color:#000;\n }\n\n .typed-member-header-field:focus {\n outline: none;\n border-color: var(--jupiter-primary-color, #1976d2);\n box-shadow: 0 0 0 1px var(--jupiter-primary-color, #1976d2);\n }\n\n .typed-member-header-field::placeholder {\n color: var(--jupiter-text-placeholder, #999);\n font-size: 11px;\n }\n\n .empty-section {\n padding: 24px;\n text-align: center;\n color: var(--jupiter-text-secondary, #666);\n font-style: italic;\n }\n `;\n\n private _boundFieldBlur = (e: Event) => {\n this._clearHighlights();\n };\n\n connectedCallback() {\n super.connectedCallback();\n this._expanded = this.section.expanded !== false;\n this._determinePeriodType();\n this._checkAndExpandFirstSection();\n // Close menu when clicking outside\n document.addEventListener('click', () => this._closeColumnMenu());\n // Clear highlights when a field loses focus\n this.addEventListener('field-blur', this._boundFieldBlur);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener('click', () => this._closeColumnMenu());\n this.removeEventListener('field-blur', this._boundFieldBlur);\n }\n \n updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n // Check if this became the first section or if section/isFirstSection properties changed\n if (changedProperties.has('isFirstSection') || changedProperties.has('section')) {\n this._checkAndExpandFirstSection();\n }\n\n if (changedProperties.has('section') && this.section?.concepts) {\n this._buildTotalMaps(this.section.concepts);\n }\n }\n \n private _checkAndExpandFirstSection() {\n // If this is the first section, expand it and its tree by default\n if (this.isFirstSection && this.section && this.section.concepts) {\n this._expanded = true;\n // Use setTimeout to ensure the DOM is ready for tree expansion\n setTimeout(() => {\n this._expandAllTrees();\n console.log('🎯 First section detected - expanded section and tree by default');\n }, 0);\n }\n }\n\n private _determinePeriodType() {\n // Get all non-abstract concepts\n const nonAbstractConcepts = this._getAllNonAbstractConcepts(this.section.concepts);\n \n if (nonAbstractConcepts.length === 0) {\n this._sectionPeriodType = 'duration';\n console.log(`📊 Section ${this.section.id}: No concepts, defaulting to duration`);\n return;\n }\n\n // Check period types\n const periodTypes = new Set(nonAbstractConcepts.map(c => c.periodType).filter(Boolean));\n \n //console.log(`🏷️ Section ${this.section.id}: Found period types:`, Array.from(periodTypes));\n // console.log(`📝 Section ${this.section.id}: Non-abstract concepts and their period types:`, \n // nonAbstractConcepts.map(c => ({ name: c.name, periodType: c.periodType, abstract: c.abstract }))\n // );\n \n if (periodTypes.size === 0) {\n this._sectionPeriodType = 'duration';\n // console.log(`📊 Section ${this.section.id}: No period types defined, defaulting to duration`);\n } else if (periodTypes.size === 1) {\n const singleType = Array.from(periodTypes)[0];\n this._sectionPeriodType = singleType === 'instant' ? 'instant' : 'duration';\n // console.log(`📊 Section ${this.section.id}: Single period type '${singleType}', setting to '${this._sectionPeriodType}'`);\n } else {\n this._sectionPeriodType = 'mixed';\n //console.log(`📊 Section ${this.section.id}: Mixed period types, setting to 'mixed'`);\n }\n \n //console.log(`✅ Section ${this.section.id}: Final period type: ${this._sectionPeriodType}`);\n }\n\n private _getAllNonAbstractConcepts(concepts: ConceptTree[]): ConceptTree[] {\n const result: ConceptTree[] = [];\n \n for (const concept of concepts) {\n if (!concept.abstract) {\n result.push(concept);\n }\n if (concept.children) {\n result.push(...this._getAllNonAbstractConcepts(concept.children));\n }\n }\n \n return result;\n }\n\n private _toggleExpanded() {\n if (!this.collapsible) return;\n \n this._expanded = !this._expanded;\n \n // When expanding the accordion, also expand all trees\n if (this._expanded) {\n this._expandAllTrees();\n }\n \n this.dispatchEvent(new CustomEvent('section-expand', {\n detail: {\n sectionId: this.section.id,\n expanded: this._expanded\n },\n bubbles: true\n }));\n }\n\n private _handleRemoveColumn(columnId: string) {\n this._openMenuColumnId = null; // Close menu\n this.dispatchEvent(new CustomEvent('column-remove', {\n detail: { \n columnId,\n sectionId: this.section.id \n },\n bubbles: true\n }));\n }\n\n private _toggleColumnMenu(columnId: string, event: Event) {\n event.stopPropagation();\n this._openMenuColumnId = this._openMenuColumnId === columnId ? null : columnId;\n }\n\n private _closeColumnMenu() {\n this._openMenuColumnId = null;\n }\n\n private _handleAddColumnFromMenu(columnId: string, event: Event) {\n event.stopPropagation();\n this._openMenuColumnId = null; // Close menu\n this._insertAfterColumnId = columnId; // Track after which column to insert\n this._handleAddColumn();\n }\n\n private _handleAddColumn() {\n // Determine period type specifically for this add column action\n const buttonPeriodType = this._determineButtonPeriodType();\n \n // Override the section period type for this dialog\n this._sectionPeriodType = buttonPeriodType;\n this._showAddColumnDialog = true;\n }\n\n private _determineButtonPeriodType(): 'duration' | 'instant' | 'mixed' {\n // Get all non-abstract concepts in the section (not just those with fields)\n // This ensures we correctly identify mixed period sections even when some concepts\n // don't have fields in the default column due to period type filtering\n const allNonAbstractConcepts = this._getAllNonAbstractConcepts(this.section.concepts);\n \n if (allNonAbstractConcepts.length === 0) {\n return 'duration';\n }\n\n // Check period types of all non-abstract concepts in the section\n const periodTypes = new Set(\n allNonAbstractConcepts\n .map(c => c.periodType)\n .filter(periodType => periodType !== undefined && periodType !== null)\n );\n \n if (periodTypes.size === 0) {\n return 'duration';\n } else if (periodTypes.size === 1) {\n const singleType = Array.from(periodTypes)[0];\n return singleType === 'instant' ? 'instant' : 'duration';\n } else {\n return 'mixed';\n }\n }\n\n private _getConceptsWithFields(concepts: ConceptTree[]): ConceptTree[] {\n const result: ConceptTree[] = [];\n \n for (const concept of concepts) {\n // Include concepts that have fields and are not abstract\n if (!concept.abstract && concept.fields && concept.fields.length > 0) {\n result.push(concept);\n }\n \n // Recursively check children\n if (concept.children) {\n result.push(...this._getConceptsWithFields(concept.children));\n }\n }\n \n return result;\n }\n\n private _handleDialogCancel() {\n this._showAddColumnDialog = false;\n }\n\n private _handleColumnAdd(event: CustomEvent<AddColumnRequest>) {\n event.stopPropagation();\n this._showAddColumnDialog = false;\n \n // Dispatch event to parent component with the column request and position info\n this.dispatchEvent(new CustomEvent('column-add-request', {\n detail: {\n sectionId: this.section.id,\n columnRequest: event.detail,\n insertAfterColumnId: this._insertAfterColumnId // Include position info\n },\n bubbles: true\n }));\n \n // Reset the insert position\n this._insertAfterColumnId = null;\n }\n\n private _handleFieldChange(event: CustomEvent) {\n event.stopPropagation();\n this.dispatchEvent(new CustomEvent('field-change', {\n detail: event.detail,\n bubbles: true,\n composed: true\n }));\n }\n\n private _handlePeriodChange(event: CustomEvent) {\n console.log(`📋 [FormSection] Received period-change event:`, event.detail);\n event.stopPropagation();\n // Forward period change event to parent (dynamic-form) with composed:true\n this.dispatchEvent(new CustomEvent('period-change', {\n detail: event.detail,\n bubbles: true,\n composed: true // CRITICAL: Allows event to cross shadow DOM boundaries\n }));\n console.log(`📋 [FormSection] Forwarded period-change event to dynamic-form`);\n }\n\n private _flattenConcepts(concepts: ConceptTree[], expanded: Set<string> = new Set()): ConceptTree[] {\n const result: ConceptTree[] = [];\n \n for (const concept of concepts) {\n result.push(concept);\n \n // If concept is expanded and has children, include them\n if (concept.children && concept.children.length > 0 && expanded.has(concept.id)) {\n const childrenFlattened = this._flattenConcepts(concept.children, expanded);\n result.push(...childrenFlattened);\n }\n }\n \n return result;\n }\n\n @state() private _expandedConcepts = new Set<string>();\n @state() private _allTreeExpanded = false;\n @state() private _highlightMap: Map<string, { type: 'total' | 'member'; columnId: string }> = new Map();\n @state() private _calculationErrorKeys: Set<string> = new Set(); // \"${conceptId}__${columnId}\"\n private _totalChildrenMap: Map<string, string[]> = new Map();\n private _memberParentMap: Map<string, string> = new Map();\n private _totalConceptMap: Map<string, ConceptTree> = new Map();\n private _totalChildConceptsMap: Map<string, ConceptTree[]> = new Map();\n\n /**\n * Returns true when every column cell for a concept has no value.\n * Used in readonly mode to hide fully-blank rows.\n */\n private _isConceptRowBlank(concept: ConceptTree): boolean {\n for (const column of this.columns) {\n const value = this.formData[concept.id]?.[column.id];\n if (value !== null && value !== undefined && value !== '') {\n return false;\n }\n }\n return true;\n }\n\n private _getAllConceptIds(concepts: ConceptTree[]): string[] {\n const result: string[] = [];\n \n for (const concept of concepts) {\n if (concept.children && concept.children.length > 0) {\n result.push(concept.id);\n result.push(...this._getAllConceptIds(concept.children));\n }\n }\n \n return result;\n }\n\n private _expandAllTrees() {\n const allConceptIds = this._getAllConceptIds(this.section.concepts || []);\n this._expandedConcepts = new Set([...this._expandedConcepts, ...allConceptIds]);\n this._allTreeExpanded = true;\n }\n\n private _collapseAllTrees() {\n this._expandedConcepts = new Set();\n this._allTreeExpanded = false;\n }\n\n private _handleConceptExpand(event: CustomEvent) {\n event.stopPropagation();\n const { conceptId, expanded } = event.detail;\n\n const next = new Set(this._expandedConcepts);\n if (expanded) {\n next.add(conceptId);\n } else {\n next.delete(conceptId);\n }\n this._expandedConcepts = next;\n\n const allConceptIds = this._getAllConceptIds(this.section.concepts || []);\n this._allTreeExpanded = allConceptIds.length > 0 && allConceptIds.every(id => next.has(id));\n\n this.dispatchEvent(new CustomEvent('concept-expand', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _buildTotalMaps(concepts: ConceptTree[]): void {\n this._totalChildrenMap.clear();\n this._memberParentMap.clear();\n this._totalConceptMap.clear();\n this._totalChildConceptsMap.clear();\n this._traverseTotalGroups(concepts);\n }\n\n private _traverseTotalGroups(concepts: ConceptTree[]): void {\n for (let i = 0; i < concepts.length; i++) {\n const concept = concepts[i];\n if (concept.preferredLabel?.includes('totalLabel')) {\n if (concept.children?.length) {\n // JDF-026: total has explicit children\n const childIds = concept.children.map(c => c.id);\n this._totalChildrenMap.set(concept.id, childIds);\n this._totalConceptMap.set(concept.id, concept);\n this._totalChildConceptsMap.set(concept.id, concept.children);\n for (const childId of childIds) {\n this._memberParentMap.set(childId, concept.id);\n }\n } else {\n // JDF-030: total has no children — siblings ABOVE/BEFORE it on the same level are its members.\n // Stop at the nearest preceding totalLabel sibling so each group is isolated.\n let lastTotalIdx = -1;\n for (let j = i - 1; j >= 0; j--) {\n if (concepts[j].preferredLabel?.includes('totalLabel')) {\n lastTotalIdx = j;\n break;\n }\n }\n const siblings = concepts.slice(lastTotalIdx + 1, i);\n if (siblings.length > 0) {\n const siblingIds = siblings.map(s => s.id);\n this._totalChildrenMap.set(concept.id, siblingIds);\n this._totalConceptMap.set(concept.id, concept);\n this._totalChildConceptsMap.set(concept.id, siblings);\n for (const siblingId of siblingIds) {\n this._memberParentMap.set(siblingId, concept.id);\n }\n }\n }\n }\n if (concept.children?.length) {\n this._traverseTotalGroups(concept.children);\n }\n }\n }\n\n private _runCalculationCheck(conceptId: string, columnId: string): void {\n const isSelfTotal = this._totalConceptMap.has(conceptId);\n const totalConceptId = isSelfTotal ? conceptId : this._memberParentMap.get(conceptId);\n if (!totalConceptId) return;\n\n const totalConcept = this._totalConceptMap.get(totalConceptId)!;\n const totalRaw = this.formData[totalConceptId]?.[columnId];\n const errorKey = `${totalConceptId}__${columnId}`;\n\n if (totalRaw === null || totalRaw === undefined || totalRaw === '') {\n if (this._calculationErrorKeys.has(errorKey)) {\n const next = new Set(this._calculationErrorKeys);\n next.delete(errorKey);\n this._calculationErrorKeys = next;\n }\n return;\n }\n\n const totalValue = parseFloat(totalRaw);\n if (isNaN(totalValue)) return;\n\n const children = this._totalChildConceptsMap.get(totalConceptId) || [];\n const childData = children.map(child => ({\n value: this.formData[child.id]?.[columnId],\n balance: child.balance\n }));\n\n const isValid = JupiterFormSection._checkTotal(totalValue, childData, totalConcept.balance);\n\n const next = new Set(this._calculationErrorKeys);\n if (!isValid) {\n next.add(errorKey);\n } else {\n next.delete(errorKey);\n }\n this._calculationErrorKeys = next;\n }\n\n private static _checkTotal(\n totalValue: number,\n children: Array<{ value: any; balance?: 'debit' | 'credit' }>,\n totalBalance?: 'debit' | 'credit'\n ): boolean {\n let calculatedSum = 0;\n let hasAnyValue = false;\n for (const child of children) {\n const val = parseFloat(child.value);\n if (isNaN(val)) continue;\n hasAnyValue = true;\n const weight = (!totalBalance || !child.balance || totalBalance === child.balance) ? 1 : -1;\n calculatedSum += weight * val;\n }\n if (!hasAnyValue) return true;\n return Math.abs(calculatedSum - totalValue) < 0.01;\n }\n\n\n private _handleFieldFocusForHighlight(event: CustomEvent): void {\n const conceptId: string = event.detail?.conceptId;\n const columnId: string = event.detail?.columnId;\n if (!conceptId || !columnId) return;\n\n const newMap = new Map<string, { type: 'total' | 'member'; columnId: string }>();\n const isSelfTotal = this._totalChildrenMap.has(conceptId);\n\n if (isSelfTotal) {\n // Focused concept is itself a total: highlight only its own group, ignore any parent total.\n newMap.set(conceptId, { type: 'total', columnId });\n for (const childId of this._totalChildrenMap.get(conceptId)!) {\n newMap.set(childId, { type: 'member', columnId });\n }\n } else {\n // Focused concept is a plain member: highlight the parent total and all its siblings.\n const parentId = this._memberParentMap.get(conceptId);\n if (parentId) {\n newMap.set(parentId, { type: 'total', columnId });\n for (const siblingId of this._totalChildrenMap.get(parentId)!) {\n newMap.set(siblingId, { type: 'member', columnId });\n }\n }\n }\n\n this._highlightMap = newMap;\n }\n\n private _clearHighlights(): void {\n if (this._highlightMap.size > 0) {\n this._highlightMap = new Map();\n }\n }\n\n private _getTypedMemberHeaderValue(columnId: string, axisId: string): string {\n // Get typed member value from the dedicated typed member data structure\n return this.typedMemberData[columnId]?.[axisId] || '';\n }\n\n private _handleTypedMemberHeaderChange(event: Event, columnId: string, axisId: string) {\n const target = event.target as HTMLInputElement;\n const value = target.value;\n \n console.log(`🔍 [FormSection] Typed member header change: columnId=${columnId}, axisId=${axisId}, value=${value}`);\n \n // Dispatch typed member change event (matches what dynamic form expects)\n this.dispatchEvent(new CustomEvent('typed-member-change', {\n detail: {\n columnId: columnId,\n axisId: axisId,\n value: value\n },\n bubbles: true\n }));\n }\n\n private _handleAddRepeat(event: CustomEvent) {\n event.stopPropagation();\n this.dispatchEvent(new CustomEvent('add-concept-repeat', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _handleRemoveRepeat(event: CustomEvent) {\n event.stopPropagation();\n this.dispatchEvent(new CustomEvent('remove-concept-repeat', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n /** Build the list of <tr> template results for a single flattened concept, including any repeat instances. */\n private _renderConceptRows(concept: ConceptTree) {\n const isRepeatable = this.mode !== 'readonly' &&\n !concept.abstract &&\n concept.fields?.some(f => (f as any).crossRoleTypedMembers?.length > 0);\n const repeatCount = isRepeatable ? (this.repeatCounts[concept.id] || 0) : 0;\n\n const sharedProps = (instanceConcept: ConceptTree, opts: { showAdd?: boolean; showRemove?: boolean }) => html`\n <jupiter-concept-tree\n .concept=\"${instanceConcept}\"\n .columns=\"${this.columns}\"\n .datatypes=\"${this.datatypes}\"\n .formData=\"${this.formData}\"\n .periodData=\"${this.periodData}\"\n .unitData=\"${this.unitData}\"\n .decimalsData=\"${this.decimalsData}\"\n .globalDecimals=\"${this.globalDecimals}\"\n .defaultUnits=\"${this.defaultUnits}\"\n .disabled=\"${this.disabled}\"\n .locale=\"${this.locale}\"\n .language=\"${this.language}\"\n .expandedConcepts=\"${this._expandedConcepts}\"\n .mode=\"${this.mode}\"\n .masterData=\"${this.masterData}\"\n .facts=\"${instanceConcept.facts}\"\n .typedMemberData=\"${this.typedMemberData}\"\n .showAddButton=\"${opts.showAdd || false}\"\n .showRemoveButton=\"${opts.showRemove || false}\"\n .highlightType=\"${this._highlightMap.get(instanceConcept.id)?.type}\"\n .highlightColumnId=\"${this._highlightMap.get(instanceConcept.id)?.columnId}\"\n .calculationErrorKeys=\"${this._calculationErrorKeys}\"\n @field-change=\"${this._handleFieldChange}\"\n @field-focus=\"${this._handleFieldFocusForHighlight}\"\n @period-change=\"${this._handlePeriodChange}\"\n @concept-expand=\"${this._handleConceptExpand}\"\n @add-concept-repeat=\"${this._handleAddRepeat}\"\n @remove-concept-repeat=\"${this._handleRemoveRepeat}\"\n ></jupiter-concept-tree>\n `;\n\n const rows = [html`\n <tr>${sharedProps(concept, { showAdd: isRepeatable })}</tr>\n `];\n\n for (let n = 1; n <= repeatCount; n++) {\n const instanceConcept: ConceptTree = {\n ...concept,\n id: `${concept.id}__repeat_${n}`,\n label: '',\n children: [],\n abstract: false\n };\n rows.push(html`\n <tr>${sharedProps(instanceConcept, { showRemove: true })}</tr>\n `);\n }\n\n return rows;\n }\n\n render() {\n if (!this.section.concepts || this.section.concepts.length === 0) {\n return html`\n <div class=\"section-header ${!this.collapsible ? 'not-collapsible' : ''}\" \n @click=\"${this._toggleExpanded}\">\n <div>\n <h3 class=\"section-title\">${this.section.title}</h3>\n ${this.section.description ? html`\n <p class=\"section-description\">${this.section.description}</p>\n ` : ''}\n </div>\n <div class=\"section-header-controls\">\n <div class=\"section-toggle ${this.collapsible ? (this._expanded ? 'expanded' : '') : 'hidden'}\">\n ${this.collapsible ? '▶' : ''}\n </div>\n </div>\n </div>\n \n <div class=\"section-content ${!this._expanded ? 'collapsed' : ''}\">\n <div class=\"empty-section\">\n No concepts defined for this section.\n </div>\n </div>\n `;\n }\n\n return html`\n ${!this.hideHeader ? html`\n <div class=\"section-header ${!this.collapsible ? 'not-collapsible' : ''}\" \n @click=\"${this._toggleExpanded}\">\n <div>\n <h3 class=\"section-title\">${this.section.title}</h3>\n ${this.section.description ? html`\n <p class=\"section-description\">${this.section.description}</p>\n ` : ''}\n </div>\n <div class=\"section-header-controls\">\n <div class=\"section-toggle ${this.collapsible ? (this._expanded ? 'expanded' : '') : 'hidden'}\">\n ${this.collapsible ? '▶' : ''}\n </div>\n </div>\n </div>\n ` : ''}\n\n <div class=\"section-content ${!this._expanded ? 'collapsed' : ''}\">\n <div class=\"table-container\">\n <table class=\"form-table\">\n <thead class=\"table-header\">\n <tr class=\"header-row\">\n <th class=\"header-cell concept-column\"></th>\n ${this.columns.map(column => html`\n <th class=\"header-cell ${column.removable ? 'removable' : ''}\">\n <div class=\"column-header-content\">\n <div class=\"column-title\">\n ${column.title}\n ${column.description ? html`<div style=\"font-weight: normal; font-size: 12px; color: var(--jupiter-text-secondary, #666);\">${column.description}</div>` : ''}\n </div>\n \n <!-- Typed member input fields in column header -->\n ${column.dimensionData?.hasTypedMembers ? html`\n <div class=\"typed-members-header\">\n ${column.dimensionData?.typedMembers?.map((typedMember: any) => html`\n <div class=\"typed-member-header-input\">\n ${this.mode === 'readonly' ? html`\n <span class=\"typed-member-header-field\" style=\"display:block;padding:4px 0;\">\n ${this._getTypedMemberHeaderValue(column.id, typedMember.axisId) || '—'}\n </span>\n ` : html`\n <input\n type=\"text\"\n class=\"typed-member-header-field\"\n placeholder=\"${I18n.t('section.enterPlaceholder')} ${typedMember.axisLabel}\"\n .value=\"${this._getTypedMemberHeaderValue(column.id, typedMember.axisId)}\"\n @input=\"${(e: Event) => this._handleTypedMemberHeaderChange(e, column.id, typedMember.axisId)}\"\n />\n `}\n </div>\n `)}\n </div>\n ` : ''}\n </div>\n \n <!-- Column menu icon (hidden in readonly mode) -->\n ${this.mode !== 'readonly' ? html`\n <div\n class=\"column-menu-icon\"\n @click=\"${(e: Event) => this._toggleColumnMenu(column.id, e)}\"\n title=\"${I18n.t('column.columnOptions')}\"\n >⋮</div>\n\n <!-- Context menu -->\n ${this._openMenuColumnId === column.id ? html`\n <div class=\"column-context-menu\">\n <button\n class=\"column-context-menu-item\"\n @click=\"${(e: Event) => this._handleAddColumnFromMenu(column.id, e)}\"\n >\n ${I18n.t('column.addColumn')}\n </button>\n ${column.removable ? html`\n <button\n class=\"column-context-menu-item remove\"\n @click=\"${(e: Event) => {\n e.stopPropagation();\n this._handleRemoveColumn(column.id);\n }}\"\n >\n ${I18n.t('column.removeColumn')}\n </button>\n ` : ''}\n </div>\n ` : ''}\n ` : ''}\n </th>\n `)}\n </tr>\n </thead>\n <tbody class=\"table-body\">\n ${this._flattenConcepts(this.section.concepts, this._expandedConcepts)\n .filter(concept => {\n if (this.conceptMatchIds?.size && !this.conceptMatchIds.has(concept.originalConceptId)) return false;\n if (this.mode === 'readonly' || this.showFactsOnly) return !this._isConceptRowBlank(concept);\n return true;\n })\n .flatMap(concept => this._renderConceptRows(concept))}\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- Add Column Dialog -->\n <jupiter-add-column-dialog\n .periodType=\"${this._sectionPeriodType}\"\n ?open=\"${this._showAddColumnDialog}\"\n .availableDimensions=\"${this.availableDimensions}\"\n .periodStartDate=\"${this.periodStartDate}\"\n .periodEndDate=\"${this.periodEndDate}\"\n @dialog-cancel=\"${this._handleDialogCancel}\"\n @column-add=\"${this._handleColumnAdd}\"\n ></jupiter-add-column-dialog>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { I18n } from '../utils/i18n';\n\n@customElement('jupiter-advanced-filter')\nexport class JupiterAdvancedFilter extends LitElement {\n @property({ type: Boolean }) showFactsOnly = false;\n @property({ type: String }) conceptSearchText = '';\n\n @state() private _localConceptSearchText = '';\n\n static styles = css`\n :host {\n display: block;\n font-family: var(--jupiter-font-family, system-ui, -apple-system, sans-serif);\n }\n\n .filter-options {\n padding: 24px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .filter-option {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 6px;\n transition: background-color 0.2s ease;\n }\n\n .filter-option.clickable {\n cursor: pointer;\n }\n\n .filter-option.clickable:hover {\n background: var(--menuBgColorLighter, var(--jupiter-hover-background, #f5f5f5));\n }\n\n .filter-option input[type=\"checkbox\"] {\n margin-top: 2px;\n width: 16px;\n height: 16px;\n cursor: pointer;\n flex-shrink: 0;\n }\n\n .filter-option-body {\n flex: 1;\n }\n\n .filter-option-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n cursor: pointer;\n user-select: none;\n }\n\n .filter-option-description {\n font-size: 13px;\n color: var(--primaryTextColor, var(--jupiter-text-secondary, #666));\n margin: 4px 0 0 0;\n line-height: 1.5;\n }\n\n .concept-search-input-wrapper {\n position: relative;\n margin-top: 10px;\n }\n\n .concept-search-input {\n width: 100%;\n box-sizing: border-box;\n padding: 8px 36px 8px 10px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 4px;\n font-size: 13px;\n font-family: inherit;\n background: transparent;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n transition: border-color 0.2s ease;\n }\n\n .concept-search-input::placeholder {\n color: var(--primaryTextColor, var(--jupiter-text-secondary, #999));\n }\n\n .concept-search-clear {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n cursor: pointer;\n padding: 2px 4px;\n border-radius: 2px;\n color: var(--jupiter-text-secondary, #666);\n font-size: 16px;\n line-height: 1;\n transition: color 0.2s ease;\n }\n\n .concept-search-clear:hover {\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n }\n `;\n\n updated(changedProperties: Map<string, any>) {\n if (changedProperties.has('conceptSearchText') && this.conceptSearchText !== this._localConceptSearchText) {\n this._localConceptSearchText = this.conceptSearchText;\n }\n }\n\n private _handleShowFactsOnlyChange(e: Event) {\n const checked = (e.target as HTMLInputElement).checked;\n this.dispatchEvent(new CustomEvent('filter-change', {\n detail: { showFactsOnly: checked, conceptSearchText: this._localConceptSearchText },\n bubbles: true,\n composed: true\n }));\n }\n\n private _handleConceptSearchInput(e: Event) {\n this._localConceptSearchText = (e.target as HTMLInputElement).value;\n this.dispatchEvent(new CustomEvent('filter-change', {\n detail: { showFactsOnly: this.showFactsOnly, conceptSearchText: this._localConceptSearchText },\n bubbles: true,\n composed: true\n }));\n }\n\n private _clearConceptSearch() {\n this._localConceptSearchText = '';\n const input = this.shadowRoot?.querySelector('.concept-search-input') as HTMLInputElement;\n if (input) {\n input.value = '';\n input.focus();\n }\n this.dispatchEvent(new CustomEvent('filter-change', {\n detail: { showFactsOnly: this.showFactsOnly, conceptSearchText: '' },\n bubbles: true,\n composed: true\n }));\n }\n\n render() {\n return html`\n <div class=\"filter-options\">\n <label class=\"filter-option clickable\">\n <input\n type=\"checkbox\"\n .checked=\"${this.showFactsOnly}\"\n @change=\"${this._handleShowFactsOnlyChange}\"\n />\n <div class=\"filter-option-body\">\n <div class=\"filter-option-label\">${I18n.t('filter.showFactsOnly')}</div>\n <p class=\"filter-option-description\">${I18n.t('filter.showFactsOnlyDescription')}</p>\n </div>\n </label>\n\n <div class=\"filter-option\">\n <div class=\"filter-option-body\">\n <div class=\"filter-option-label\">${I18n.t('filter.searchByConcept')}</div>\n <p class=\"filter-option-description\">${I18n.t('filter.searchByConceptDescription')}</p>\n <div class=\"concept-search-input-wrapper\">\n <input\n type=\"text\"\n class=\"concept-search-input\"\n placeholder=\"${I18n.t('filter.searchByConceptPlaceholder')}\"\n .value=\"${this._localConceptSearchText}\"\n @input=\"${this._handleConceptSearchInput}\"\n />\n ${this._localConceptSearchText ? html`\n <button\n class=\"concept-search-clear\"\n @click=\"${this._clearConceptSearch}\"\n title=\"${I18n.t('filter.clearSearch')}\"\n >×</button>\n ` : ''}\n </div>\n </div>\n </div>\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { FormSection, ConceptTree } from '../schema/types';\nimport { I18n } from '../utils/i18n';\nimport './advanced-filter';\n\nexport interface FilterRolesRequest {\n availableRoles: FormSection[];\n currentSelectedRoles: string[];\n}\n\nexport interface DimensionMemberSelection {\n dimensionId: string;\n dimensionLabel: string;\n selectedMemberIds: string[]; // Array of selected member IDs\n}\n\nexport interface RolePeriodPreferences {\n [roleId: string]: {\n showDuration: boolean;\n showInstant: boolean;\n showPreviousYear: boolean;\n dimensionSelections?: DimensionMemberSelection[]; // Optional dimension member selections\n };\n}\n\n@customElement('jupiter-filter-roles-dialog')\nexport class JupiterFilterRolesDialog extends LitElement {\n @property({ type: Boolean, reflect: true }) open = false;\n @property({ type: Array }) availableRoles: FormSection[] = [];\n @property({ type: Array }) selectedRoleIds: string[] = [];\n @property({ type: Object }) periodPreferences: RolePeriodPreferences = {};\n @property({ type: String }) mode: 'inputForm' | 'admin' | 'readonly' = 'inputForm';\n @property({ type: Object }) hypercubeData: any = null; // XBRL hypercube data for dimensions\n @property({ type: Boolean }) showFactsOnly = false;\n @property({ type: String }) conceptSearchText = '';\n\n @state() private _tempSelectedRoles = new Set<string>();\n @state() private _searchQuery = '';\n @state() private _filteredRoles: FormSection[] = [];\n @state() private _tempPeriodPreferences: RolePeriodPreferences = {};\n @state() private _selectedAvailableRole: string | null = null;\n @state() private _selectedChosenRole: string | null = null;\n @state() private _chosenSearchQuery = '';\n @state() private _draggedRoleId: string | null = null;\n @state() private _dragOverRoleId: string | null = null;\n @state() private _chosenRoleOrder: string[] = [];\n @state() private _showAdvancedFilter = false;\n @state() private _showFactsOnly = false;\n @state() private _conceptSearchText = '';\n\n static styles = css`\n :host {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 10000;\n display: none;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.5);\n font-family: var(--jupiter-font-family, system-ui, -apple-system, sans-serif);\n }\n\n :host([open]) {\n display: flex;\n }\n\n .dialog {\n background: var(--jupiter-background, #fff);\n border-radius: 8px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n \n width: 90vw;\n max-height: 80vh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .dialog-header {\n padding: 20px 24px 16px;\n border-bottom: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n display: flex;\n align-items: center;\n gap: 12px;\n background: var(--bg-color-1, var(--jupiter-header-background, #f8f9fa));\n }\n\n .dialog-title {\n font-size: 18px;\n font-weight: 600;\n margin: 0;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n flex: 1;\n }\n\n .filter-icon {\n width: 20px;\n height: 20px;\n fill: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));\n }\n\n .close-button {\n background: none;\n border: none;\n font-size: 24px;\n cursor: pointer;\n padding: 4px;\n color: var(--primaryTextColor, var(--jupiter-text-secondary, #666));\n border-radius: 4px;\n transition: background-color 0.2s ease;\n }\n\n .close-button:hover {\n opacity: 0.9;\n }\n\n .dialog-content {\n background: var(--bg-color-2, var(--jupiter-form-content-background, #fff));\n flex: 1;\n overflow-y: auto;\n padding: 20px 24px;\n }\n\n .description {\n color: var(--primaryTextColor, var(--secondaryTextColor, var(--jupiter-text-secondary, #666))) ;\n font-size: 14px;\n margin: 0 0 20px 0;\n line-height: 1.5;\n }\n\n .selection-controls {\n display: flex;\n gap: 12px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n }\n\n .search-container {\n margin-bottom: 16px;\n position: relative;\n }\n\n .search-input {\n width: stretch;\n padding: 10px 40px 10px 12px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 4px;\n font-size: 14px;\n font-family: inherit;\n background: transparent;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n transition: border-color 0.2s ease;\n }\n\n // .search-input:focus {\n // outline: none;\n // border-color: var(--jupiter-primary-color, #1976d2);\n // box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.1);\n // }\n\n .search-input::placeholder {\n color: var(--primaryTextColor, var(--jupiter-text-secondary, #666));\n }\n\n .search-icon {\n position: absolute;\n right: 12px;\n top: 50%;\n transform: translateY(-50%);\n width: 16px;\n height: 16px;\n fill: var(--jupiter-text-secondary, #666);\n pointer-events: none;\n }\n\n .clear-search {\n position: absolute;\n right: 12px;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n cursor: pointer;\n padding: 2px;\n border-radius: 2px;\n color: var(--jupiter-text-secondary, #666);\n font-size: 16px;\n line-height: 1;\n transition: color 0.2s ease;\n }\n\n .clear-search:hover {\n color: var(--jupiter-text-primary, #333);\n }\n\n .search-results-info {\n font-size: 12px;\n color: var(--jupiter-text-secondary, #666);\n margin-bottom: 8px;\n text-align: center;\n }\n\n .no-results {\n text-align: center;\n padding: 40px 20px;\n color: var(--jupiter-text-secondary, #666);\n font-style: italic;\n }\n\n mark {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: 500;\n }\n\n .selection-control {\n background: none;\n border: 1px solid var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));\n color: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));\n padding: 6px 12px;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .selection-control:hover {\n opacity: 0.9;\n }\n\n .roles-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n max-height: 300px;\n overflow-y: auto;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 4px;\n padding: 12px;\n }\n\n .role-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 8px;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n }\n\n .role-item:hover {\n background: var(--menuBgColorLighter, var(--jupiter-hover-background, #f5f5f5));\n }\n\n .role-checkbox {\n margin-top: 2px;\n cursor: pointer;\n }\n \n .role-info * {\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333)) !important;\n }\n\n .role-info {\n flex: 1;\n min-width: 0;\n }\n\n .role-title {\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n margin: 0 0 4px 0;\n word-wrap: break-word;\n line-height: 1.3;\n }\n\n .role-description {\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n margin: 0;\n line-height: 1.4;\n word-break: break-all; /* Allow URI breaking */\n }\n\n .role-description:last-child {\n margin-bottom: 4px;\n }\n\n .period-controls {\n margin-top: 8px;\n padding: 8px;\n background: var(--bg-color-1, var(--jupiter-background-light, #f8f9fa));\n border-radius: 4px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #e0e0e0));\n }\n\n .period-controls-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n margin: 0 0 6px 0;\n }\n\n .period-checkboxes {\n display: flex;\n gap: 16px;\n flex-wrap: wrap;\n }\n\n .period-checkbox-item {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .period-checkbox {\n cursor: pointer;\n }\n\n .period-checkbox-label {\n font-size: 13px;\n color: var(--jupiter-text-primary, #333);\n cursor: pointer;\n user-select: none;\n }\n\n .dimension-section {\n margin-top: 12px;\n padding: 8px;\n background: var(--jupiter-background, #fff);\n border-radius: 4px;\n border: 1px solid var(--jupiter-border-color, #e0e0e0);\n }\n\n .dimension-header {\n font-size: 12px;\n font-weight: 600;\n color: var(--jupiter-primary-color, #1976d2);\n margin: 0 0 8px 0;\n padding-bottom: 4px;\n border-bottom: 1px solid var(--jupiter-border-color, #e0e0e0);\n }\n\n .dimension-group {\n margin-bottom: 12px;\n }\n\n .dimension-group:last-child {\n margin-bottom: 0;\n }\n\n .dimension-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--jupiter-text-secondary, #666);\n margin: 0 0 6px 0;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .dimension-members {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding-left: 8px;\n }\n\n .member-checkbox-item {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 2px 0;\n }\n\n .member-checkbox {\n cursor: pointer;\n flex-shrink: 0;\n }\n\n .member-checkbox-label {\n font-size: 12px;\n color: var(--jupiter-text-primary, #333);\n cursor: pointer;\n user-select: none;\n line-height: 1.3;\n }\n\n .member-select-controls {\n display: flex;\n gap: 8px;\n margin-top: 6px;\n padding-left: 8px;\n }\n\n .member-select-btn {\n background: none;\n border: 1px solid var(--jupiter-border-color, #ddd);\n color: var(--jupiter-text-secondary, #666);\n padding: 2px 8px;\n border-radius: 3px;\n font-size: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .member-select-btn:hover {\n background: var(--jupiter-hover-background, #f5f5f5);\n border-color: var(--jupiter-primary-color, #1976d2);\n color: var(--jupiter-primary-color, #1976d2);\n }\n\n .no-dimensions-message {\n font-size: 11px;\n color: var(--jupiter-text-secondary, #999);\n font-style: italic;\n padding: 4px 8px;\n }\n\n .selected-count {\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n margin-top: 16px;\n text-align: center;\n }\n\n .dialog-actions {\n padding: 16px 24px;\n border-top: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n background: var(--bg-color-2, var(--jupiter-form-actions-background, #f8f9fa));\n }\n\n .dialog-actions button {\n padding: 10px 20px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s ease;\n }\n\n .btn-primary {\n background: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));\n color: var(--buttonTextColor, white);\n }\n\n .btn-primary:hover:not(:disabled) {\n opacity: 0.9;\n }\n\n .btn-secondary {\n color: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));\n border: 1px solid var(--buttonBgColor, var(--jupiter-primary-color, #1976d2)) !important;\n background: transparent;\n }\n\n .btn-secondary:hover:not(:disabled) {\n opacity: 0.9;\n }\n\n button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n /* Picklist Styles for Admin Mode */\n .picklist-container {\n display: flex;\n gap: 16px;\n height: 500px;\n }\n\n .picklist-panel {\n flex: 1;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n overflow: hidden;\n }\n\n .picklist-header {\n padding: 12px;\n background: var(--jupiter-background-light, #f8f9fa);\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n font-weight: 600;\n color: var(--jupiter-text-primary, #333);\n font-size: 14px;\n }\n\n .picklist-search {\n padding: 12px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n }\n\n .picklist-list {\n flex: 1;\n overflow-y: auto;\n padding: 8px;\n }\n\n .picklist-item {\n padding: 10px 12px;\n margin-bottom: 4px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--jupiter-background, #fff);\n }\n\n .picklist-item:hover {\n background: var(--jupiter-hover-background, #f5f5f5);\n border-color: var(--jupiter-primary-color, #1976d2);\n }\n\n .picklist-item.selected {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n border-color: var(--jupiter-primary-color, #1976d2);\n }\n\n .picklist-item.dragging {\n opacity: 0.5;\n cursor: move;\n }\n\n .picklist-item.drag-over {\n border-top: 3px solid var(--jupiter-primary-color, #1976d2);\n margin-top: 3px;\n }\n\n .picklist-item[draggable=\"true\"] {\n cursor: move;\n }\n\n .picklist-item-label {\n font-weight: 500;\n font-size: 14px;\n margin-bottom: 4px;\n }\n\n .picklist-item-value {\n font-size: 11px;\n opacity: 0.8;\n word-break: break-all;\n }\n\n .picklist-controls {\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 8px;\n padding: 0 8px;\n }\n\n .picklist-button {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 14px;\n transition: background-color 0.2s ease;\n }\n\n .picklist-button:hover:not(:disabled) {\n background: var(--jupiter-primary-color-dark, #1565c0);\n }\n\n .picklist-button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n .picklist-count {\n padding: 8px 12px;\n font-size: 12px;\n color: var(--jupiter-text-secondary, #666);\n background: var(--jupiter-background-light, #f8f9fa);\n border-top: 1px solid var(--jupiter-border-color, #ddd);\n text-align: center;\n }\n\n .btn-text {\n background: none;\n border: none;\n color: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));\n padding: 10px 8px;\n font-size: 14px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n margin-right: auto;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n }\n\n .btn-text:hover {\n background: var(--menuBgColorLighter, var(--jupiter-hover-background, #f5f5f5));\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this._initializeTempSelection();\n this._initializePeriodPreferences();\n }\n\n updated(changedProperties: Map<string, any>) {\n if (changedProperties.has('selectedRoleIds') || changedProperties.has('open')) {\n this._initializeTempSelection();\n }\n if (changedProperties.has('availableRoles') || changedProperties.has('_searchQuery')) {\n this._updateFilteredRoles();\n }\n if (changedProperties.has('availableRoles') || changedProperties.has('periodPreferences') || changedProperties.has('open')) {\n this._initializePeriodPreferences();\n }\n if (changedProperties.has('open')) {\n if (!this.open) {\n this._showAdvancedFilter = false;\n } else {\n this._showFactsOnly = this.showFactsOnly;\n this._conceptSearchText = this.conceptSearchText;\n }\n }\n }\n\n private _updateFilteredRoles() {\n if (!this._searchQuery.trim()) {\n // Use natural order from XBRL data\n this._filteredRoles = [...this.availableRoles];\n return;\n }\n\n const query = this._searchQuery.toLowerCase().trim();\n const filtered = this.availableRoles.filter(role => {\n // Search in role title\n const titleMatch = role.title.toLowerCase().includes(query);\n \n // Search in role ID\n const idMatch = role.id.toLowerCase().includes(query);\n \n // Search in role description if available\n const descriptionMatch = role.description?.toLowerCase().includes(query) || false;\n \n // Search in roleURI if available (from metadata or if stored separately)\n // For now, we'll search in the title for URI-like patterns or check if role has URI-like structure\n const uriMatch = this._searchInRoleURI(role, query);\n \n return titleMatch || idMatch || descriptionMatch || uriMatch;\n });\n\n // Keep natural order for filtered results\n this._filteredRoles = filtered;\n }\n\n private _searchInRoleURI(role: FormSection, query: string): boolean {\n // If the role has metadata that contains roleURI\n if (role.metadata?.roleURI) {\n return role.metadata.roleURI.toLowerCase().includes(query);\n }\n \n // Look for URI patterns in title or ID\n const uriPattern = /https?:\\/\\/[^\\s]+/i;\n const titleHasURI = uriPattern.test(role.title);\n const idHasURI = uriPattern.test(role.id);\n \n if (titleHasURI || idHasURI) {\n return role.title.toLowerCase().includes(query) || role.id.toLowerCase().includes(query);\n }\n \n // If role ID follows URI-like pattern (contains dots, slashes, etc.)\n if (role.id.includes('.') || role.id.includes('/') || role.id.includes(':')) {\n return role.id.toLowerCase().includes(query);\n }\n \n return false;\n }\n\n private _handleSearchInput(event: Event) {\n const input = event.target as HTMLInputElement;\n this._searchQuery = input.value;\n }\n\n private _clearSearch() {\n this._searchQuery = '';\n const searchInput = this.shadowRoot?.querySelector('.search-input') as HTMLInputElement;\n if (searchInput) {\n searchInput.value = '';\n searchInput.focus();\n }\n }\n\n private _handleChosenSearchInput(event: Event) {\n const input = event.target as HTMLInputElement;\n this._chosenSearchQuery = input.value;\n }\n\n private _clearChosenSearch() {\n this._chosenSearchQuery = '';\n const searchInput = this.shadowRoot?.querySelector('.chosen-search-input') as HTMLInputElement;\n if (searchInput) {\n searchInput.value = '';\n searchInput.focus();\n }\n }\n\n private _highlightSearchTerm(text: string): string {\n if (!this._searchQuery.trim()) {\n return text;\n }\n\n const query = this._searchQuery.trim();\n const regex = new RegExp(`(${query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')})`, 'gi');\n return text.replace(regex, '<mark>$1</mark>');\n }\n\n private _renderHighlightedText(text: string) {\n // For compatibility, just return the text without highlighting for now\n return text;\n }\n\n private _getSelectedFilteredCount(): number {\n return this._filteredRoles.filter(role => this._tempSelectedRoles.has(role.id)).length;\n }\n\n private _initializeTempSelection() {\n this._tempSelectedRoles = new Set(this.selectedRoleIds);\n // Initialize chosen role order from selected role IDs\n this._chosenRoleOrder = [...this.selectedRoleIds];\n }\n\n private _initializePeriodPreferences() {\n // Initialize period preferences for all roles, preserving existing preferences\n const preferences: RolePeriodPreferences = {};\n this.availableRoles.forEach(role => {\n // Check if we have existing preferences for this role\n const existingPrefs = this.periodPreferences[role.id];\n \n if (existingPrefs) {\n // Preserve existing user preferences\n preferences[role.id] = { ...existingPrefs };\n } else {\n // Initialize defaults for new roles\n // For mixed-period roles, use preset values from presentation data or detect from concepts\n const hasMixedPeriods = role.showPeriodControl === true;\n \n // Read preset values from role data if available, otherwise detect from concepts\n let showDuration: boolean;\n let showInstant: boolean;\n \n if (role.duration !== undefined || role.instant !== undefined) {\n // Use preset values from presentation.json\n showDuration = role.duration === true;\n showInstant = role.instant === true;\n } else {\n // Fallback: detect from concepts\n showDuration = hasMixedPeriods || this._hasConceptsWithPeriodType(role, 'duration');\n showInstant = hasMixedPeriods || this._hasConceptsWithPeriodType(role, 'instant');\n }\n \n preferences[role.id] = {\n showDuration: showDuration,\n showInstant: showInstant,\n showPreviousYear: role.showPreviousYear === true // Read from role data in presentation.json\n };\n }\n \n // Auto-select ALL dimension members by default (for first time initialization)\n const dimensions = this._getDimensionsForRole(role.id);\n if (dimensions.length > 0 && !existingPrefs?.dimensionSelections) {\n // Only auto-select if there are no existing dimension selections (first time)\n if (!preferences[role.id].dimensionSelections) {\n preferences[role.id].dimensionSelections = [];\n }\n \n dimensions.forEach((dimension: any) => {\n const allMembers = this._getAllDimensionMembers(dimension.members);\n if (allMembers.length > 0) {\n // Auto-select ALL members by default\n const dimensionLabel = dimension.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n const allMemberIds = allMembers.map((m: any) => m.id);\n \n const dimensionSelection = {\n dimensionId: dimension.id,\n dimensionLabel: dimensionLabel,\n selectedMemberIds: allMemberIds\n };\n \n preferences[role.id].dimensionSelections!.push(dimensionSelection);\n console.log(`✅ Auto-selected all ${allMemberIds.length} members for dimension: ${dimensionLabel}`);\n }\n });\n }\n });\n this._tempPeriodPreferences = preferences;\n }\n\n private _hasConceptsWithPeriodType(role: FormSection, periodType: 'instant' | 'duration'): boolean {\n const checkConcepts = (concepts: ConceptTree[]): boolean => {\n return concepts.some(concept => {\n if (!concept.abstract && concept.periodType === periodType) {\n return true;\n }\n if (concept.children) {\n return checkConcepts(concept.children);\n }\n return false;\n });\n };\n return checkConcepts(role.concepts);\n }\n\n private _handlePeriodCheckboxChange(event: Event, roleId: string, periodType: 'duration' | 'instant' | 'previousYear') {\n event.stopPropagation();\n const checkbox = event.target as HTMLInputElement;\n \n const newPreferences = { ...this._tempPeriodPreferences };\n if (!newPreferences[roleId]) {\n newPreferences[roleId] = { showDuration: true, showInstant: true, showPreviousYear: false };\n }\n \n if (periodType === 'duration') {\n newPreferences[roleId].showDuration = checkbox.checked;\n } else if (periodType === 'instant') {\n newPreferences[roleId].showInstant = checkbox.checked;\n } else if (periodType === 'previousYear') {\n newPreferences[roleId].showPreviousYear = checkbox.checked;\n }\n \n this._tempPeriodPreferences = newPreferences;\n this.requestUpdate();\n }\n\n private _handleCheckboxChange(event: Event, roleId: string) {\n const checkbox = event.target as HTMLInputElement;\n const newSelection = new Set(this._tempSelectedRoles);\n \n if (checkbox.checked) {\n newSelection.add(roleId);\n } else {\n newSelection.delete(roleId);\n }\n \n this._tempSelectedRoles = newSelection;\n this.requestUpdate();\n }\n\n private _selectAll() {\n // Select all currently filtered roles\n const newSelection = new Set(this._tempSelectedRoles);\n this._filteredRoles.forEach(role => newSelection.add(role.id));\n this._tempSelectedRoles = newSelection;\n this.requestUpdate();\n }\n\n private _selectNone() {\n // Deselect all currently filtered roles\n const newSelection = new Set(this._tempSelectedRoles);\n this._filteredRoles.forEach(role => newSelection.delete(role.id));\n this._tempSelectedRoles = newSelection;\n this.requestUpdate();\n }\n\n private _selectAllGlobal() {\n // Select all available roles (ignore filter)\n this._tempSelectedRoles = new Set(this.availableRoles.map(role => role.id));\n this.requestUpdate();\n }\n\n private _selectNoneGlobal() {\n // Deselect all roles (ignore filter)\n this._tempSelectedRoles = new Set();\n this.requestUpdate();\n }\n\n private _resetToOriginal() {\n this._tempSelectedRoles = new Set(this.selectedRoleIds);\n this.requestUpdate();\n }\n\n private _handleCancel() {\n this._initializeTempSelection();\n this.dispatchEvent(new CustomEvent('dialog-cancel', {\n bubbles: true\n }));\n }\n\n private _handleApply() {\n // Preserve the user's drag-and-drop order from _chosenRoleOrder.\n // Filter out any roles that were deselected, then append any newly selected\n // roles that somehow aren't in the order list yet (edge-case safety).\n const orderedSelected = this._chosenRoleOrder.filter(id => this._tempSelectedRoles.has(id));\n const notInOrder = Array.from(this._tempSelectedRoles).filter(id => !this._chosenRoleOrder.includes(id));\n this._chosenRoleOrder = [...orderedSelected, ...notInOrder];\n \n // Create ordered roles with roleURI metadata for localStorage persistence\n const orderedRolesWithMetadata = this._chosenRoleOrder.map((roleId, index) => {\n const role = this.availableRoles.find(r => r.id === roleId);\n return {\n roleId: roleId,\n roleURI: role?.metadata?.roleURI || '',\n order: index\n };\n });\n \n console.log('✅ Apply Filter - Enhanced structure being emitted:', orderedRolesWithMetadata);\n console.log('📋 Order array:', this._chosenRoleOrder);\n console.log('📊 Dimension preferences being emitted:', this._tempPeriodPreferences);\n \n this.dispatchEvent(new CustomEvent('roles-filter-apply', {\n detail: { \n selectedRoleIds: orderedRolesWithMetadata,\n periodPreferences: this._tempPeriodPreferences\n },\n bubbles: true\n }));\n }\n\n /**\n * Get dimensions for a specific role from hypercube data\n */\n private _getDimensionsForRole(roleId: string): any[] {\n console.log('🔍 [getDimensionsForRole] Called with roleId:', roleId);\n console.log('🔍 [getDimensionsForRole] hypercubeData exists:', !!this.hypercubeData);\n console.log('🔍 [getDimensionsForRole] hypercubeData type:', typeof this.hypercubeData);\n console.log('🔍 [getDimensionsForRole] hypercubeData value:', this.hypercubeData);\n \n if (!this.hypercubeData) {\n console.error('❌ [getDimensionsForRole] CRITICAL: hypercubeData is null/undefined/false');\n console.error('❌ Parent component must pass hypercubeData property to filter dialog!');\n console.error('❌ Example: <jupiter-filter-roles-dialog .hypercubeData=\"${hypercubeData}\">');\n return [];\n }\n \n // Handle array-wrapped format: [{ roles: [...] }] -> { roles: [...] }\n let hypercubeDataObj = this.hypercubeData;\n if (Array.isArray(this.hypercubeData) && this.hypercubeData.length > 0) {\n console.log('📦 [getDimensionsForRole] Detected array-wrapped format, unwrapping...');\n hypercubeDataObj = this.hypercubeData[0];\n }\n \n console.log('🔍 [getDimensionsForRole] hypercubeDataObj.roles exists:', !!hypercubeDataObj?.roles);\n \n if (!hypercubeDataObj?.roles) {\n console.warn('⚠️ [getDimensionsForRole] No roles found in hypercube data structure');\n console.warn('⚠️ Expected structure: { roles: [...] } or [{ roles: [...] }]');\n return [];\n }\n \n console.log('🔍 [getDimensionsForRole] Available hypercube roles:', \n hypercubeDataObj.roles.map((r: any) => r.roleId)\n );\n \n const hypercubeRole = hypercubeDataObj.roles.find((r: any) => r.roleId === roleId);\n console.log('🔍 [getDimensionsForRole] Found hypercube role:', !!hypercubeRole);\n \n if (!hypercubeRole?.items?.length) {\n console.warn('⚠️ [getDimensionsForRole] No items found in hypercube role for:', roleId);\n return [];\n }\n \n console.log('🔍 [getDimensionsForRole] Items count:', hypercubeRole.items.length);\n \n // Get dimensions from the first item (typically there's only one)\n const dimensions = hypercubeRole.items[0]?.dimensions || [];\n console.log('🔍 [getDimensionsForRole] Total dimensions found:', dimensions.length);\n console.log('🔍 [getDimensionsForRole] Dimension details:', dimensions.map((d: any) => ({\n id: d.id,\n type: d.dimensionType,\n hasMembers: !!(d.members && d.members.length > 0),\n membersCount: d.members?.length || 0\n })));\n \n // Filter to only include explicit dimensions with members (not typed-only dimensions)\n const filtered = dimensions.filter((dim: any) => \n dim.dimensionType === 'explicit' && \n dim.members && \n Array.isArray(dim.members) && \n dim.members.length > 0\n );\n \n console.log('✅ [getDimensionsForRole] Filtered dimensions count:', filtered.length);\n console.log('✅ [getDimensionsForRole] Filtered dimension IDs:', filtered.map((d: any) => d.id));\n \n return filtered;\n }\n\n /**\n * Get all members for a dimension (including nested children)\n */\n private _getAllDimensionMembers(members: any[]): any[] {\n if (!members || !Array.isArray(members)) {\n return [];\n }\n\n const allMembers: any[] = [];\n \n members.forEach(member => {\n allMembers.push(member);\n \n if (member.children && member.children.length > 0) {\n allMembers.push(...this._getAllDimensionMembers(member.children));\n }\n });\n \n return allMembers;\n }\n\n /**\n * Check if dimension has only one member (should be auto-selected and disabled)\n */\n private _isSingleMemberDimension(dimension: any): boolean {\n const allMembers = this._getAllDimensionMembers(dimension.members);\n return allMembers.length === 1;\n }\n\n /**\n * Handle dimension member selection change\n */\n private _handleDimensionMemberChange(event: Event, roleId: string, dimensionId: string, memberId: string) {\n event.stopPropagation();\n const checkbox = event.target as HTMLInputElement;\n \n const newPreferences = { ...this._tempPeriodPreferences };\n if (!newPreferences[roleId]) {\n newPreferences[roleId] = { \n showDuration: true, \n showInstant: true, \n showPreviousYear: false,\n dimensionSelections: []\n };\n }\n \n // Initialize dimensionSelections if not present\n if (!newPreferences[roleId].dimensionSelections) {\n newPreferences[roleId].dimensionSelections = [];\n }\n \n // Find or create dimension selection entry\n let dimensionSelection = newPreferences[roleId].dimensionSelections!.find(\n ds => ds.dimensionId === dimensionId\n );\n \n if (!dimensionSelection) {\n // Get dimension label\n const dimensions = this._getDimensionsForRole(roleId);\n const dimension = dimensions.find((d: any) => d.id === dimensionId);\n const dimensionLabel = dimension?.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimensionId;\n \n dimensionSelection = {\n dimensionId: dimensionId,\n dimensionLabel: dimensionLabel,\n selectedMemberIds: []\n };\n newPreferences[roleId].dimensionSelections!.push(dimensionSelection);\n }\n \n // Update selected members\n if (checkbox.checked) {\n if (!dimensionSelection.selectedMemberIds.includes(memberId)) {\n dimensionSelection.selectedMemberIds.push(memberId);\n }\n } else {\n dimensionSelection.selectedMemberIds = dimensionSelection.selectedMemberIds.filter(\n id => id !== memberId\n );\n }\n \n this._tempPeriodPreferences = newPreferences;\n console.log('📊 Updated dimension selections:', newPreferences[roleId].dimensionSelections);\n this.requestUpdate();\n }\n\n /**\n * Check if a dimension member is selected\n */\n private _isDimensionMemberSelected(roleId: string, dimensionId: string, memberId: string): boolean {\n const preferences = this._tempPeriodPreferences[roleId];\n if (!preferences?.dimensionSelections) {\n return false;\n }\n \n const dimensionSelection = preferences.dimensionSelections.find(\n ds => ds.dimensionId === dimensionId\n );\n \n return dimensionSelection?.selectedMemberIds.includes(memberId) || false;\n }\n\n /**\n * Select all members for a dimension\n */\n private _selectAllDimensionMembers(roleId: string, dimensionId: string) {\n const dimensions = this._getDimensionsForRole(roleId);\n const dimension = dimensions.find((d: any) => d.id === dimensionId);\n if (!dimension) return;\n \n const allMembers = this._getAllDimensionMembers(dimension.members);\n const allMemberIds = allMembers.map((m: any) => m.id);\n \n const newPreferences = { ...this._tempPeriodPreferences };\n if (!newPreferences[roleId]) {\n newPreferences[roleId] = { \n showDuration: true, \n showInstant: true, \n showPreviousYear: false,\n dimensionSelections: []\n };\n }\n \n if (!newPreferences[roleId].dimensionSelections) {\n newPreferences[roleId].dimensionSelections = [];\n }\n \n // Find or create dimension selection entry\n let dimensionSelection = newPreferences[roleId].dimensionSelections!.find(\n ds => ds.dimensionId === dimensionId\n );\n \n if (!dimensionSelection) {\n const dimensionLabel = dimension.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimensionId;\n dimensionSelection = {\n dimensionId: dimensionId,\n dimensionLabel: dimensionLabel,\n selectedMemberIds: []\n };\n newPreferences[roleId].dimensionSelections!.push(dimensionSelection);\n }\n \n dimensionSelection.selectedMemberIds = allMemberIds;\n this._tempPeriodPreferences = newPreferences;\n this.requestUpdate();\n }\n\n /**\n * Deselect all members for a dimension\n */\n private _deselectAllDimensionMembers(roleId: string, dimensionId: string) {\n const newPreferences = { ...this._tempPeriodPreferences };\n if (!newPreferences[roleId]?.dimensionSelections) {\n return;\n }\n \n const dimensionSelection = newPreferences[roleId].dimensionSelections!.find(\n ds => ds.dimensionId === dimensionId\n );\n \n if (dimensionSelection) {\n dimensionSelection.selectedMemberIds = [];\n }\n \n this._tempPeriodPreferences = newPreferences;\n this.requestUpdate();\n }\n\n private _switchToAdvancedFilter() {\n this._showAdvancedFilter = true;\n this._searchQuery = '';\n }\n\n private _switchToFilterRoles() {\n this._showAdvancedFilter = false;\n }\n\n private _handleFilterChange(e: CustomEvent) {\n this._showFactsOnly = e.detail.showFactsOnly;\n this._conceptSearchText = e.detail.conceptSearchText ?? '';\n }\n\n private _handleAdvancedFilterApply() {\n this.dispatchEvent(new CustomEvent('advanced-filter-apply', {\n detail: { showFactsOnly: this._showFactsOnly, conceptSearchText: this._conceptSearchText },\n bubbles: true\n }));\n }\n\n private _handleBackdropClick(event: Event) {\n if (event.target === this) {\n this._handleCancel();\n }\n }\n\n // Picklist methods for admin mode\n private _handleAvailableRoleClick(roleId: string) {\n this._selectedAvailableRole = roleId;\n this._selectedChosenRole = null;\n this.requestUpdate();\n }\n\n private _handleChosenRoleClick(roleId: string) {\n this._selectedChosenRole = roleId;\n this._selectedAvailableRole = null;\n this.requestUpdate();\n }\n\n private _moveToChosen() {\n if (!this._selectedAvailableRole) return;\n \n const newSelection = new Set(this._tempSelectedRoles);\n newSelection.add(this._selectedAvailableRole);\n this._tempSelectedRoles = newSelection;\n \n // Add to order list\n if (!this._chosenRoleOrder.includes(this._selectedAvailableRole)) {\n this._chosenRoleOrder = [...this._chosenRoleOrder, this._selectedAvailableRole];\n }\n \n this._selectedAvailableRole = null;\n this.requestUpdate();\n }\n\n private _moveToAvailable() {\n if (!this._selectedChosenRole) return;\n \n const newSelection = new Set(this._tempSelectedRoles);\n newSelection.delete(this._selectedChosenRole);\n this._tempSelectedRoles = newSelection;\n \n // Remove from order list\n this._chosenRoleOrder = this._chosenRoleOrder.filter(id => id !== this._selectedChosenRole);\n \n this._selectedChosenRole = null;\n this.requestUpdate();\n }\n\n private _moveAllToChosen() {\n const newSelection = new Set(this._tempSelectedRoles);\n this._filteredRoles.forEach(role => {\n newSelection.add(role.id);\n if (!this._chosenRoleOrder.includes(role.id)) {\n this._chosenRoleOrder.push(role.id);\n }\n });\n this._tempSelectedRoles = newSelection;\n this._selectedAvailableRole = null;\n this.requestUpdate();\n }\n\n private _moveAllToAvailable() {\n this._tempSelectedRoles = new Set();\n this._chosenRoleOrder = [];\n this._selectedChosenRole = null;\n this.requestUpdate();\n }\n\n private _getAvailableRoles(): FormSection[] {\n return this._filteredRoles.filter(role => !this._tempSelectedRoles.has(role.id));\n }\n\n private _getChosenRoles(): FormSection[] {\n const chosenRoles = this.availableRoles.filter(role => this._tempSelectedRoles.has(role.id));\n \n // Sort by order in _chosenRoleOrder\n const orderedRoles = this._chosenRoleOrder\n .map(roleId => chosenRoles.find(role => role.id === roleId))\n .filter(role => role !== undefined) as FormSection[];\n \n // Add any roles not in order list (shouldn't happen, but just in case)\n const unorderedRoles = chosenRoles.filter(role => !this._chosenRoleOrder.includes(role.id));\n const allOrderedRoles = [...orderedRoles, ...unorderedRoles];\n \n if (!this._chosenSearchQuery.trim()) {\n return allOrderedRoles;\n }\n \n const query = this._chosenSearchQuery.toLowerCase().trim();\n return allOrderedRoles.filter(role => {\n const titleMatch = role.title.toLowerCase().includes(query);\n const idMatch = role.id.toLowerCase().includes(query);\n const descriptionMatch = role.description?.toLowerCase().includes(query) || false;\n const uriMatch = this._searchInRoleURI(role, query);\n \n return titleMatch || idMatch || descriptionMatch || uriMatch;\n });\n }\n\n // Drag and drop handlers\n private _handleDragStart(event: DragEvent, roleId: string) {\n this._draggedRoleId = roleId;\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', roleId);\n }\n this.requestUpdate();\n }\n\n private _handleDragOver(event: DragEvent, roleId: string) {\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move';\n }\n if (this._draggedRoleId && this._draggedRoleId !== roleId) {\n this._dragOverRoleId = roleId;\n this.requestUpdate();\n }\n }\n\n private _handleDragLeave(event: DragEvent) {\n this._dragOverRoleId = null;\n this.requestUpdate();\n }\n\n private _handleDrop(event: DragEvent, targetRoleId: string) {\n event.preventDefault();\n \n if (!this._draggedRoleId || this._draggedRoleId === targetRoleId) {\n this._draggedRoleId = null;\n this._dragOverRoleId = null;\n this.requestUpdate();\n return;\n }\n \n // Reorder the chosen roles\n const newOrder = [...this._chosenRoleOrder];\n const draggedIndex = newOrder.indexOf(this._draggedRoleId);\n const targetIndex = newOrder.indexOf(targetRoleId);\n \n if (draggedIndex !== -1 && targetIndex !== -1) {\n // Remove dragged item\n newOrder.splice(draggedIndex, 1);\n // Insert at new position (account for removal: if dragging down, target moved up by 1)\n const newTargetIndex = draggedIndex < targetIndex ? targetIndex - 1 : targetIndex;\n newOrder.splice(newTargetIndex, 0, this._draggedRoleId);\n this._chosenRoleOrder = newOrder;\n \n console.log('🔄 Reordered roles:', this._chosenRoleOrder);\n }\n \n this._draggedRoleId = null;\n this._dragOverRoleId = null;\n this.requestUpdate();\n }\n\n private _handleDragEnd(event: DragEvent) {\n this._draggedRoleId = null;\n this._dragOverRoleId = null;\n this.requestUpdate();\n }\n\n render() {\n const selectedCount = this._tempSelectedRoles.size;\n const totalCount = this.availableRoles.length;\n const filteredCount = this._filteredRoles.length;\n const hasSearchQuery = this._searchQuery.trim().length > 0;\n\n return html`\n <div class=\"dialog\" @click=\"${(e: Event) => e.stopPropagation()}\">\n <!-- Dialog Header -->\n <div class=\"dialog-header\">\n <svg class=\"filter-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\"/>\n </svg>\n <h2 class=\"dialog-title\">${I18n.t('filter.title')}</h2>\n <button class=\"close-button\" @click=\"${this._handleCancel}\">×</button>\n </div>\n\n <!-- Dialog Content -->\n <div class=\"dialog-content\">\n ${this.mode === 'admin' ? html`\n <!-- Admin Mode: Picklist Layout -->\n <div class=\"picklist-container\">\n <!-- Available Roles Panel -->\n <div class=\"picklist-panel\">\n <div class=\"picklist-header\">\n ${I18n.t('filter.availableRoles')} (${this._getAvailableRoles().length})\n </div>\n <div class=\"picklist-search\">\n <div class=\"search-container\">\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"${I18n.t('filter.searchPlaceholder')}\"\n .value=\"${this._searchQuery}\"\n @input=\"${this._handleSearchInput}\"\n />\n ${this._searchQuery ? html`\n <button class=\"clear-search\" @click=\"${this._clearSearch}\" title=\"${I18n.t('filter.clearSearch')}\">\n ×\n </button>\n ` : html`\n <svg class=\"search-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"/>\n </svg>\n `}\n </div>\n </div>\n <div class=\"picklist-list\">\n ${this._getAvailableRoles().map(role => html`\n <div \n class=\"picklist-item ${this._selectedAvailableRole === role.id ? 'selected' : ''}\"\n @click=\"${() => this._handleAvailableRoleClick(role.id)}\"\n @dblclick=\"${() => { this._handleAvailableRoleClick(role.id); this._moveToChosen(); }}\"\n >\n <div class=\"picklist-item-label\">${role.title}</div>\n ${role.metadata?.roleURI ? html`\n <div class=\"picklist-item-value\">${role.metadata.roleURI}</div>\n ` : ''}\n </div>\n `)}\n </div>\n <div class=\"picklist-count\">\n ${this._getAvailableRoles().length} ${I18n.t('filter.roleCount')}\n </div>\n </div>\n\n <!-- Control Buttons -->\n <div class=\"picklist-controls\">\n <button \n class=\"picklist-button\"\n @click=\"${this._moveToChosen}\"\n ?disabled=\"${!this._selectedAvailableRole}\"\n title=\"${I18n.t('filter.addSelectedRole')}\"\n >\n ›\n </button>\n <button \n class=\"picklist-button\"\n @click=\"${this._moveAllToChosen}\"\n ?disabled=\"${this._getAvailableRoles().length === 0}\"\n title=\"${I18n.t('filter.addAllRoles')}\"\n >\n »\n </button>\n <button \n class=\"picklist-button\"\n @click=\"${this._moveToAvailable}\"\n ?disabled=\"${!this._selectedChosenRole}\"\n title=\"${I18n.t('filter.removeSelectedRole')}\"\n >\n ‹\n </button>\n <button \n class=\"picklist-button\"\n @click=\"${this._moveAllToAvailable}\"\n ?disabled=\"${this._tempSelectedRoles.size === 0}\"\n title=\"${I18n.t('filter.removeAllRoles')}\"\n >\n «\n </button>\n </div>\n\n <!-- Chosen Roles Panel -->\n <div class=\"picklist-panel\">\n <div class=\"picklist-header\">\n ${I18n.t('filter.chosenRoles')} (${this._tempSelectedRoles.size})\n </div>\n <div class=\"picklist-search\">\n <div class=\"search-container\">\n <input\n type=\"text\"\n class=\"search-input chosen-search-input\"\n placeholder=\"${I18n.t('filter.searchPlaceholder')}\"\n .value=\"${this._chosenSearchQuery}\"\n @input=\"${this._handleChosenSearchInput}\"\n />\n ${this._chosenSearchQuery ? html`\n <button class=\"clear-search\" @click=\"${this._clearChosenSearch}\" title=\"${I18n.t('filter.clearSearch')}\">\n ×\n </button>\n ` : html`\n <svg class=\"search-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"/>\n </svg>\n `}\n </div>\n </div>\n <div class=\"picklist-list\">\n ${this._getChosenRoles().map(role => html`\n <div \n class=\"picklist-item ${this._selectedChosenRole === role.id ? 'selected' : ''} ${this._draggedRoleId === role.id ? 'dragging' : ''} ${this._dragOverRoleId === role.id ? 'drag-over' : ''}\"\n draggable=\"true\"\n @click=\"${() => this._handleChosenRoleClick(role.id)}\"\n @dblclick=\"${() => { this._handleChosenRoleClick(role.id); this._moveToAvailable(); }}\"\n @dragstart=\"${(e: DragEvent) => this._handleDragStart(e, role.id)}\"\n @dragover=\"${(e: DragEvent) => this._handleDragOver(e, role.id)}\"\n @dragleave=\"${(e: DragEvent) => this._handleDragLeave(e)}\"\n @drop=\"${(e: DragEvent) => this._handleDrop(e, role.id)}\"\n @dragend=\"${(e: DragEvent) => this._handleDragEnd(e)}\"\n >\n <div class=\"picklist-item-label\">${role.title}</div>\n ${role.metadata?.roleURI ? html`\n <div class=\"picklist-item-value\">${role.metadata.roleURI}</div>\n ` : ''}\n </div>\n `)}\n </div>\n <div class=\"picklist-count\">\n ${this._tempSelectedRoles.size} ${I18n.t('filter.rolesSelected')}\n </div>\n </div>\n </div>\n ` : this._showAdvancedFilter ? html`\n <jupiter-advanced-filter\n .showFactsOnly=\"${this._showFactsOnly}\"\n .conceptSearchText=\"${this._conceptSearchText}\"\n @filter-change=\"${this._handleFilterChange}\"\n ></jupiter-advanced-filter>\n ` : html`\n <p class=\"description\">\n ${I18n.t('filter.description')}\n </p>\n\n <!-- Search Input -->\n <div class=\"search-container\">\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"${I18n.t('filter.searchPlaceholder')}\"\n .value=\"${this._searchQuery}\"\n @input=\"${this._handleSearchInput}\"\n />\n ${this._searchQuery ? html`\n <button class=\"clear-search\" @click=\"${this._clearSearch}\" title=\"${I18n.t('filter.clearSearch')}\">\n ×\n </button>\n ` : html`\n <svg class=\"search-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"/>\n </svg>\n `}\n </div>\n\n <!-- Search Results Info -->\n ${hasSearchQuery ? html`\n <div class=\"search-results-info\">\n ${I18n.t('filter.showingResults')} ${filteredCount} ${I18n.t('filter.of')} ${totalCount} ${I18n.t('filter.roles')}\n ${filteredCount !== totalCount ? html`${I18n.t('filter.matching')} \"${this._searchQuery}\"` : ''}\n </div>\n ` : ''}\n\n <!-- Selection Controls -->\n <div class=\"selection-controls\">\n ${hasSearchQuery ? html`\n <button class=\"selection-control\" @click=\"${this._selectAll}\">\n ${I18n.t('filter.selectFiltered')} (${filteredCount})\n </button>\n <button class=\"selection-control\" @click=\"${this._selectNone}\">\n ${I18n.t('filter.deselectFiltered')}\n </button>\n <button class=\"selection-control\" @click=\"${this._selectAllGlobal}\">\n ${I18n.t('filter.selectAll')} (${totalCount})\n </button>\n <button class=\"selection-control\" @click=\"${this._selectNoneGlobal}\">\n ${I18n.t('filter.deselectAll')}\n </button>\n ` : html`\n <button class=\"selection-control\" @click=\"${this._selectAll}\">\n ${I18n.t('filter.selectAll')}\n </button>\n <button class=\"selection-control\" @click=\"${this._selectNone}\">\n ${I18n.t('filter.selectNone')}\n </button>\n `}\n <button class=\"selection-control\" @click=\"${this._resetToOriginal}\">\n ${I18n.t('filter.reset')}\n </button>\n </div>\n\n <!-- Roles List -->\n <div class=\"roles-list\">\n ${this._filteredRoles.length === 0 ? html`\n <div class=\"no-results\">\n ${hasSearchQuery ? html`\n ${I18n.t('filter.noRolesFound')} \"${this._searchQuery}\".<br>\n ${I18n.t('filter.tryDifferentSearch')}\n ` : html`\n ${I18n.t('filter.noRolesAvailable')}\n `}\n </div>\n ` : html`\n ${this._filteredRoles.map(role => {\n const isSelected = this._tempSelectedRoles.has(role.id);\n const showPeriodControls = role.showPeriodControl === true;\n const preferences = this._tempPeriodPreferences[role.id] || { showDuration: true, showInstant: true };\n \n // Debug: Log role processing\n console.log('🎨 [Render] Processing role:', role.title, 'ID:', role.id);\n \n const dimensions = this._getDimensionsForRole(role.id);\n const hasDimensions = dimensions.length > 0;\n \n console.log('🎨 [Render] Role:', role.title, '- Has dimensions:', hasDimensions, '- Count:', dimensions.length);\n \n return html`\n <div class=\"role-item\">\n <input\n type=\"checkbox\"\n class=\"role-checkbox\"\n .checked=\"${isSelected}\"\n @change=\"${(e: Event) => this._handleCheckboxChange(e, role.id)}\"\n />\n <div class=\"role-info\">\n <h4 class=\"role-title\">${role.title}</h4>\n ${role.metadata?.roleURI ? html`\n <p class=\"role-description\">${I18n.t('filter.uri')}: ${role.metadata.roleURI}</p>\n ` : ''}\n \n <div class=\"period-controls\">\n <p class=\"period-controls-label\">${I18n.t('filter.additionalOptions')}</p>\n <div class=\"period-checkboxes\">\n <label class=\"period-checkbox-item\">\n <input\n type=\"checkbox\"\n class=\"period-checkbox\"\n .checked=\"${preferences.showPreviousYear}\"\n @change=\"${(e: Event) => this._handlePeriodCheckboxChange(e, role.id, 'previousYear')}\"\n />\n <span class=\"period-checkbox-label\">${I18n.t('filter.showPreviousYear')}</span>\n </label>\n </div>\n </div>\n\n ${hasDimensions ? html`\n <div class=\"dimension-section\">\n <div class=\"dimension-header\">📊 ${I18n.t('filter.dimensionMemberSelection')}</div>\n ${dimensions.map((dimension: any) => {\n const allMembers = this._getAllDimensionMembers(dimension.members);\n\n // Skip dimensions that have no members — nothing to select\n if (allMembers.length === 0) {\n return html``;\n }\n\n const dimensionLabel = dimension.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n const isSingleMember = this._isSingleMemberDimension(dimension);\n\n return html`\n <div class=\"dimension-group\">\n <div class=\"dimension-label\">${dimensionLabel}</div>\n <div class=\"dimension-members\">\n ${allMembers.map((member: any) => {\n const memberLabel = member.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || member.conceptName;\n const isChecked = this._isDimensionMemberSelected(role.id, dimension.id, member.id);\n \n return html`\n <label class=\"member-checkbox-item\">\n <input\n type=\"checkbox\"\n class=\"member-checkbox\"\n .checked=\"${isChecked}\"\n ?disabled=\"${isSingleMember}\"\n @change=\"${(e: Event) => this._handleDimensionMemberChange(e, role.id, dimension.id, member.id)}\"\n />\n <span class=\"member-checkbox-label\">${memberLabel}</span>\n </label>\n `;\n })}\n </div>\n ${!isSingleMember ? html`\n <div class=\"member-select-controls\">\n <button \n class=\"member-select-btn\"\n @click=\"${() => this._selectAllDimensionMembers(role.id, dimension.id)}\"\n >\n ${I18n.t('filter.selectAllMembers')}\n </button>\n <button \n class=\"member-select-btn\"\n @click=\"${() => this._deselectAllDimensionMembers(role.id, dimension.id)}\"\n >\n ${I18n.t('filter.clearMembers')}\n </button>\n </div>\n ` : ''}\n </div>\n `;\n })}\n </div>\n ` : ''}\n </div>\n </div>\n `;\n })}\n `}\n </div>\n `}\n </div>\n\n <!-- Dialog Actions -->\n <div class=\"dialog-actions\">\n ${this.mode !== 'admin' && this.mode !== 'readonly' ? html`\n ${this._showAdvancedFilter ? html`\n <button class=\"btn-text\" @click=\"${this._switchToFilterRoles}\">\n ${I18n.t('filter.backToFilterRoles')}\n </button>\n ` : html`\n <button class=\"btn-text\" @click=\"${this._switchToAdvancedFilter}\">\n ${I18n.t('filter.advancedFilter')}\n </button>\n `}\n ` : ''}\n <button class=\"btn-secondary\" @click=\"${this._handleCancel}\">\n ${I18n.t('filter.cancel')}\n </button>\n ${this._showAdvancedFilter ? html`\n <button class=\"btn-primary\" @click=\"${this._handleAdvancedFilterApply}\">\n ${I18n.t('filter.applyFilter')}\n </button>\n ` : html`\n <button\n class=\"btn-primary\"\n @click=\"${this._handleApply}\"\n ?disabled=\"${selectedCount === 0}\"\n >\n ${I18n.t('filter.applyFilter')} (${selectedCount})\n </button>\n `}\n </div>\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport {\n XBRLFormSchema,\n FormData,\n FormColumn,\n ValidationError,\n FormState,\n ComponentConfig,\n ConceptTree,\n FormField,\n FieldType,\n SubmissionData,\n SubmissionEntry,\n FormSection,\n AxisFilterConfig\n} from '../schema/types';\nimport { XBRLFormInput } from '../schema/xbrl-types';\nimport { FormValidator } from '../utils/validation';\nimport { XBRLFormBuilder } from '../utils/xbrl-form-builder';\nimport { I18n } from '../utils/i18n';\nimport { AddColumnRequest, AvailableDimension } from './add-column-dialog';\nimport { DraftStorageService } from '../services';\nimport { FactMatcher } from '../utils/fact-matcher';\nimport './form-section';\nimport './filter-roles-dialog';\n\n@customElement('jupiter-dynamic-form')\nexport class JupiterDynamicForm extends LitElement {\n @property({ type: Object }) schema?: XBRLFormSchema;\n @property({ type: Object }) xbrlInput?: XBRLFormInput;\n @property({ type: Object }) config: ComponentConfig = {};\n @property({ type: Object }) initialData: FormData = {};\n @property({ type: Boolean }) disabled = false;\n @property({ type: Boolean }) readonly = false;\n @property({ type: String }) periodStartDate = '2025-01-01';\n @property({ type: String }) periodEndDate = '2025-12-31';\n @property({ type: String }) language = 'en';\n @property({ type: String }) reportingLanguage = 'en';\n @property({ type: String }) display: 'accordion' | 'sidePanel' = 'accordion';\n @property({ type: String }) mode: 'inputForm' | 'admin' | 'readonly' = 'inputForm';\n @property({ type: String, attribute: 'submit-button-label' })\n submitButtonLabel?: string;\n // Role filter axes - array following checkboxes.json format.\n // Each entry specifies an axis and its members with available=true/false.\n // Roles are excluded only when the axis is applicable to that role AND none of its\n // members match an available=true entry. Roles without the axis are always included.\n @property({ type: Array })\n roleFilterAxes: AxisFilterConfig[] = [];\n\n // Controls visibility of the 'Last Validation Results' button (shown after validation completes)\n @property({ type: Boolean, attribute: 'show-last-validation-result-btn' })\n showLastValidationResultBtn = false;\n\n // isDraftSaving - when true, shows 'Saving draft' text on the Save Draft button\n @property({ type: Boolean, attribute: 'is-draft-saving' })\n isDraftSaving = false;\n\n // Default unit overrides for specific datatypes\n // Example: [{\"xbrli:monetaryItemType\": \"EUR\"}]\n @property({ type: Array })\n defaultUnits: Array<Record<string, string>> = [];\n\n // Global XBRL decimals attribute applied to all monetary facts ('INF' = no default)\n @property({ type: String })\n decimals = 'INF';\n\n // Master data - allows parent app to provide initial values for specific concepts\n // Example: {\"kvk-nummer\": \"12345678\", \"city\": \"Pune\"}\n // Keys are concept IDs, values are the predefined data\n @property({ type: Object, attribute: 'master-data' })\n masterData?: Record<string, any>;\n\n\n // External draft management - allows parent app to provide and receive draft data\n // These properties work bidirectionally:\n // - INPUT: Parent can set these to restore a saved draft\n // - OUTPUT: On save draft event, parent receives updated JSON data to persist\n @property({ type: Object, attribute: 'dynaforms-metadata' })\n dynaformsMetadata?: any;\n @property({ type: Object, attribute: 'dynaforms-facts' })\n dynaformsFacts?: any;\n\n @state() private _formData: FormData = {};\n @state() private _draftLoaded = false;\n @state() private _draftLoadedAt?: string;\n @state() private _preservedFormData: FormData = {}; // Preserve data for hidden sections\n @state() private _periodData: { [conceptId: string]: { [columnId: string]: { startDate?: string; endDate?: string; instantDate?: string } } } = {}; // Store field-specific periods\n @state() private _preservedPeriodData: { [conceptId: string]: { [columnId: string]: { startDate?: string; endDate?: string; instantDate?: string } } } = {}; // Preserve period data for hidden sections\n @state() private _unitData: { [conceptId: string]: { [columnId: string]: string } } = {}; // Store field-specific units\n @state() private _preservedUnitData: { [conceptId: string]: { [columnId: string]: string } } = {}; // Preserve unit data for hidden sections\n @state() private _decimalsData: { [conceptId: string]: { [columnId: string]: string } } = {}; // Store per-fact decimals values\n @state() private _effectiveMasterData: Record<string, any> | undefined = undefined; // masterData + auto-injected rounding level\n @state() private _typedMemberData: { [columnId: string]: { [axisId: string]: string } } = {};\n @state() private _preservedTypedMemberData: { [columnId: string]: { [axisId: string]: string } } = {}; // Preserve typed data for hidden sections\n @state() private _repeatCounts: { [conceptId: string]: number } = {}; // Extra repeat row counts per concept (JDF-022)\n @state() private _columns: FormColumn[] = [];\n @state() private _errors: ValidationError[] = [];\n @state() private _touched = new Set<string>();\n @state() private _dirty = false;\n @state() private _valid = true;\n @state() private _submitted = false;\n @state() private _xbrlFormErrors: Array<{ sectionId: string; fieldId: string; conceptId: string; columnId: string; value: any; errors: any[] }> = []; // Track validation errors\n @state() private _showErrorPopup = false; // Show error popup when save draft is clicked with errors\n @state() private _submitDisabled = false; // Temporarily disabled while processing a submit\n @state() private _currentSchema?: XBRLFormSchema;\n @state() private _allSections: FormSection[] = [];\n @state() private _selectedRoleIds: Array<{ roleId: string; roleURI: string; order: number }> | string[] = []; // Enhanced structure with roleURI and order, or legacy string array\n @state() private _showFilterDialog = false;\n @state() private _showFactsOnly = false;\n @state() private _conceptSearchText = '';\n @state() private _periodPreferences: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean; dimensionSelections?: Array<{ dimensionId: string; dimensionLabel: string; selectedMemberIds: string[] }> }> = {};\n @state() private _activeSidePanelRoleId: string | null = null;\n @state() private _sidePanelSearchQuery = '';\n @state() private _sidePanelCollapsed = false;\n @state() private _adminRoleConfigs: Record<string, { showPreviousYear: boolean; instant?: boolean; duration?: boolean }> = {};\n @state() private _roleBorderStatuses: Map<string, 'complete' | 'incomplete' | 'untouched' | 'none'> = new Map();\n @state() private _roleCompletedStates: Map<string, boolean> = new Map();\n @state() private _showRoleContextMenu = false;\n @state() private _contextMenuX = 0;\n @state() private _contextMenuY = 0;\n @state() private _contextMenuRoleId: string | null = null;\n @state() private _validationStatus: 'idle' | 'inProgress' | 'complete' = 'idle';\n\n // Draft storage service\n private _draftStorageService!: DraftStorageService;\n private _skipDraftLoading = false; // Flag to skip draft loading during reinitialization\n private _skipPeriodPreferencesRestore = false; // Flag to skip period preferences restoration when intentionally changing filters\n\n // Auto-save draft timer\n private _autoSaveTimer: ReturnType<typeof setInterval> | null = null;\n private _lastAutoSaveSnapshot = ''; // Snapshot of formData used to detect changes\n private _lastSavedDraftSnapshot = ''; // Snapshot of draft payload used to avoid duplicate emits\n\n static styles = css`\n :host {\n display: block;\n font-family: var(--jupiter-font-family, system-ui, -apple-system, sans-serif);\n color: var(--jupiter-text-primary, #333);\n background: var(--jupiter-background, #fff);\n }\n\n .form-container {\n width: 100%;\n max-width: var(--jupiter-max-width, none);\n margin: 0 auto;\n }\n\n .form-header {\n padding: 24px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n background: var(--jupiter-form-header-background, #fff);\n }\n\n .form-title {\n font-size: 24px;\n font-weight: 600;\n margin: 0 0 8px 0;\n color: var(--jupiter-text-primary, #333);\n }\n\n .form-description {\n font-size: 16px;\n color: var(--jupiter-text-secondary, #666);\n margin: 0;\n line-height: 1.5;\n }\n\n .form-actions {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n padding: 16px 24px;\n border-top: 1px solid var(--jupiter-border-color, #ddd);\n background: var(--bg-color-2, var(--jupiter-form-actions-background, #f8f9fa));\n display: flex;\n gap: 12px;\n align-items: center;\n z-index: 1000;\n box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .form-sections {\n padding: 24px;\n padding-bottom: 100px; /* Add space for fixed footer */\n background: var(--bg-color-2);\n }\n\n .validation-summary {\n margin-bottom: 16px;\n padding: 16px;\n border-radius: 4px;\n background: var(--jupiter-error-background, #ffebee);\n border: 1px solid var(--jupiter-error-color, #d32f2f);\n }\n\n .validation-summary-title {\n font-weight: 600;\n color: var(--jupiter-error-color, #d32f2f);\n margin: 0 0 8px 0;\n }\n\n .validation-summary-list {\n margin: 0;\n padding-left: 20px;\n }\n\n .validation-summary-item {\n color: var(--jupiter-error-color, #d32f2f);\n margin-bottom: 4px;\n }\n\n .form-actions button {\n padding: 10px 20px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s ease;\n }\n\n .btn-primary {\n background: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));\n color: var(--buttonTextColor, white);\n }\n\n // .btn-primary:hover:not(:disabled) {\n // background: var(--jupiter-primary-color-dark, #1565c0);\n // }\n\n .btn-secondary {\n color: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));\n border: 1px solid var(--buttonBgColor, var(--jupiter-primary-color, #1976d2)) !important;\n background: transparent;\n }\n\n .btn-secondary:hover:not(:disabled) {\n opacity: 0.9;\n }\n\n .btn-outline {\n background: transparent;\n color: var(--jupiter-primary-color, #1976d2);\n border: 1px solid var(--jupiter-primary-color, #1976d2);\n }\n\n .btn-outline:hover:not(:disabled) {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n }\n\n button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-validate {\n background: var(--jupiter-validate-color, #388e3c);\n color: white;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n }\n\n .btn-validate:hover:not(:disabled) {\n background: var(--jupiter-validate-color-dark, #2e7d32);\n }\n\n .btn-preview {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n }\n .btn-preview:hover:not(:disabled) {\n background: var(--jupiter-primary-color-dark, #1565c0);\n }\n\n\n .validation-spinner {\n display: inline-block;\n width: 14px;\n height: 14px;\n border: 2px solid rgba(255, 255, 255, 0.4);\n border-top-color: white;\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n flex-shrink: 0;\n }\n\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n\n .form-meta {\n display: flex;\n gap: 16px;\n align-items: center;\n font-size: 12px;\n color: var(--jupiter-text-secondary, #666);\n margin-left: auto;\n }\n\n .filter-roles-button {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: transparent;\n border: 1px solid var(--jupiter-primary-color, #1976d2);\n color: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));\n border-radius: 4px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n margin-right: auto;\n }\n\n .filter-roles-button:hover:not(:disabled) {\n opacity: 0.9;\n }\n\n .filter-roles-button .filter-icon {\n width: 16px;\n height: 16px;\n fill: currentColor;\n }\n\n .roles-count {\n display: inline-flex;\n align-items: center;\n background: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));\n color: var(--headerBgColor, white) !important;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n padding: 2px 6px;\n margin-left: 4px;\n min-width: 18px;\n justify-content: center;\n }\n\n .no-roles-message {\n padding: 40px;\n text-align: center;\n color: var(--primaryTextColor, var(--jupiter-text-secondary, #666));\n background: var(--bg-color-2, var(--jupiter-background-light, #f8f9fa));\n border-radius: 8px;\n margin: 20px 0;\n }\n\n .no-roles-message h3 {\n margin: 0 0 16px 0;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n }\n\n .no-roles-message p {\n margin: 8px 0;\n line-height: 1.5;\n }\n\n /* Side Panel Layout Styles */\n .side-panel-layout {\n display: flex;\n height: calc(100vh - 80px); /* Account for footer only */\n gap: 0;\n }\n\n .side-panel-roles-list {\n width: 280px;\n min-width: 280px;\n border-right: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n overflow-y: auto;\n background: var(--bg-color-2, var(--jupiter-background-light, #f8f9fa));\n display: flex;\n flex-direction: column;\n transition: width 0.3s ease, min-width 0.3s ease;\n position: relative;\n }\n\n .side-panel-roles-list.collapsed {\n width: 48px;\n min-width: 48px;\n overflow: visible;\n border-right: 1px solid var(--jupiter-border-color, #ddd);\n }\n\n .side-panel-toggle-btn {\n position: absolute;\n top: 0px;\n right: 0px;\n width: 32px;\n height: 32px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n background: var(--bg-color-2, var(--jupiter-background, #fff));\n color: var(--primaryTextColor);\n\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 100;\n transition: all 0.2s ease;\n }\n\n .side-panel-toggle-btn:hover {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n border-color: var(--jupiter-primary-color, #1976d2);\n }\n\n .side-panel-toggle-btn svg {\n width: 20px;\n height: 20px;\n fill: currentColor;\n transition: transform 0.3s ease;\n }\n\n .side-panel-toggle-btn.collapsed svg {\n transform: rotate(180deg);\n }\n\n .side-panel-search-container {\n position: sticky;\n top: 0;\n z-index: 10;\n background: var(--bg-color-2, var(--jupiter-background, #fff));\n padding: 16px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n }\n\n .side-panel-search-input {\n width: 100%;\n padding: 10px 40px 10px 12px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 4px;\n font-size: 14px;\n font-family: inherit;\n background: transparent;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n transition: border-color 0.2s ease;\n box-sizing: border-box;\n }\n\n // .side-panel-search-input:focus {\n // outline: none;\n // border-color: var(--jupiter-primary-color, #1976d2);\n // box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.1);\n // }\n\n .side-panel-search-input::placeholder {\n color: var(--jupiter-text-secondary, #666);\n }\n\n .side-panel-search-icon {\n position: absolute;\n right: 28px;\n top: 50%;\n transform: translateY(-50%);\n width: 16px;\n height: 16px;\n fill: var(--jupiter-text-secondary, #666);\n pointer-events: none;\n }\n\n .side-panel-clear-search {\n position: absolute;\n right: 28px;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n cursor: pointer;\n padding: 2px;\n border-radius: 2px;\n color: var(--jupiter-text-secondary, #666);\n font-size: 20px;\n line-height: 1;\n transition: color 0.2s ease;\n }\n\n .side-panel-clear-search:hover {\n color: var(--jupiter-text-primary, #333);\n }\n\n .side-panel-search-results-info {\n font-size: 12px;\n padding: 8px 16px;\n text-align: center;\n border-bottom: 1px solid var(--jupiter-border-color, #e0e0e0);\n \n color: var(--primaryTextColor, var(--jupiter-text-secondary, #666));\n background: var(--bg-color-2, var(--jupiter-background-light, #f8f9fa));\n }\n\n .side-panel-no-results {\n padding: 40px 20px;\n text-align: center;\n color: var(--jupiter-text-secondary, #666);\n font-size: 14px;\n line-height: 1.6;\n }\n\n .side-panel-role-item {\n padding: 12px 16px;\n cursor: pointer;\n border-bottom: 1px solid var(--jupiter-border-color, #e0e0e0);\n transition: background-color 0.2s ease;\n font-size: 14px;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n line-height: 1.4;\n }\n\n .side-panel-role-item:hover {\n opacity: 0.9;\n }\n\n .side-panel-role-item.active {\n background: var(--light-color-1, var(--jupiter-primary-color, #1976d2));\n color: white;\n font-weight: 500;\n }\n\n .side-panel-role-item.has-errors {\n border-left: 4px solid var(--jupiter-error-color, #d32f2f);\n }\n\n .side-panel-role-item.has-errors.active {\n border-left: 4px solid var(--jupiter-error-color, #d32f2f);\n }\n\n .side-panel-role-item.has-no-data {\n border-left: 4px solid var(--jupiter-untouched-color, #757575);\n }\n\n .side-panel-role-item.has-no-data.active {\n border-left: 4px solid var(--jupiter-untouched-color, #757575);\n }\n\n .side-panel-role-item.has-empty-fields {\n border-left: 4px solid var(--jupiter-warning-color, #ff9800);\n }\n\n .side-panel-role-item.has-empty-fields.active {\n border-left: 4px solid var(--jupiter-warning-color, #ff9800);\n }\n\n .side-panel-role-item.has-complete-data {\n border-left: 4px solid var(--jupiter-success-color, #4caf50);\n }\n\n .side-panel-role-item.has-complete-data.active {\n border-left: 4px solid var(--jupiter-success-color, #4caf50);\n }\n\n .role-completion-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-top: 1px solid var(--jupiter-border-color, #e0e0e0);\n margin-top: 4px;\n background: var(--jupiter-background, #fff);\n }\n\n .role-completion-row input[type=\"checkbox\"] {\n width: 16px;\n height: 16px;\n cursor: pointer;\n accent-color: var(--jupiter-success-color, #4caf50);\n flex-shrink: 0;\n }\n\n .role-completion-row label {\n font-size: 14px;\n color: var(--jupiter-text-secondary, #555);\n cursor: pointer;\n user-select: none;\n }\n\n .side-panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n background: var(--bg-color-2, var(--jupiter-background, #fff));\n }\n\n .side-panel-content .form-sections {\n padding: 0 24px 24px 24px;\n padding-top: 0;\n }\n\n /* Admin Mode Styles */\n .admin-mode-placeholder {\n padding: 0;\n background: white;\n min-height: 300px;\n }\n\n .admin-mode-container {\n max-width: 1200px;\n margin: 0 auto;\n padding: 24px;\n }\n\n .admin-mode-title {\n font-size: 20px;\n font-weight: 600;\n margin: 0 0 24px 0;\n color: var(--jupiter-text-primary, #333);\n }\n\n .admin-roles-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .admin-role-item {\n display: flex;\n align-items: center;\n padding: 16px;\n background: var(--jupiter-background-light, #f8f9fa);\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 6px;\n transition: background-color 0.2s ease;\n }\n\n .admin-role-item:hover {\n background: var(--jupiter-hover-background, #e8e8e8);\n }\n\n .admin-role-title {\n flex: 1;\n font-size: 14px;\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n }\n\n .admin-role-checkbox {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: 16px;\n }\n\n .admin-role-checkbox input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n }\n\n .admin-role-checkbox label {\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n cursor: pointer;\n user-select: none;\n }\n\n .admin-dimension-section {\n margin-top: 16px;\n padding: 16px;\n background: var(--jupiter-background, #fff);\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 6px;\n }\n\n .admin-dimension-header {\n font-size: 14px;\n font-weight: 600;\n color: var(--jupiter-text-primary, #333);\n margin-bottom: 16px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n }\n\n .admin-dimension-group {\n margin-bottom: 16px;\n }\n\n .admin-dimension-group:last-child {\n margin-bottom: 0;\n }\n\n .admin-dimension-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n margin-bottom: 8px;\n }\n\n .admin-dimension-members {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 8px;\n }\n\n .admin-member-checkbox-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n border-radius: 4px;\n cursor: pointer;\n transition: background-color 0.2s ease;\n }\n\n .admin-member-checkbox-item:hover {\n background: var(--jupiter-hover-background, #f5f5f5);\n }\n\n .admin-member-checkbox {\n width: 16px;\n height: 16px;\n cursor: pointer;\n flex-shrink: 0;\n }\n\n .admin-member-checkbox-label {\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n user-select: none;\n flex: 1;\n }\n\n .admin-member-select-controls {\n display: flex;\n gap: 8px;\n margin-top: 8px;\n }\n\n .admin-member-select-btn {\n padding: 6px 12px;\n font-size: 12px;\n background: var(--jupiter-background-light, #f8f9fa);\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.2s ease;\n color: var(--jupiter-text-secondary, #666);\n }\n\n .admin-member-select-btn:hover {\n background: var(--jupiter-hover-background, #e8e8e8);\n border-color: var(--jupiter-primary-color, #1976d2);\n color: var(--jupiter-primary-color, #1976d2);\n }\n\n .admin-member-select-btn:active {\n transform: translateY(1px);\n }\n\n /* Error Popup Styles */\n .error-popup-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n }\n\n .error-popup {\n background: white;\n border-radius: 8px;\n max-width: 600px;\n width: 90%;\n max-height: 80vh;\n overflow: hidden;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);\n display: flex;\n flex-direction: column;\n }\n\n .error-popup-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 24px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n background: var(--jupiter-section-header-background, #f0f2f5);\n }\n\n .error-popup-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .error-popup-close {\n background: transparent;\n border: none;\n font-size: 28px;\n cursor: pointer;\n padding: 0;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n color: var(--jupiter-text-color, #333);\n transition: background-color 0.2s;\n }\n\n .error-popup-close:hover {\n background-color: rgba(0, 0, 0, 0.05);\n }\n\n .error-popup-content {\n padding: 24px;\n overflow-y: auto;\n flex: 1;\n }\n\n .error-popup-content p {\n margin: 0 0 16px 0;\n color: var(--jupiter-text-primary, #333);\n }\n\n .error-list {\n list-style: none;\n padding: 0;\n margin: 0;\n }\n\n .error-list > li {\n padding: 12px;\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n margin-bottom: 12px;\n }\n\n .error-list > li strong {\n color: var(--jupiter-text-primary, #333);\n font-weight: 600;\n }\n\n .error-list ul {\n margin: 8px 0 0 0;\n padding-left: 20px;\n }\n\n .error-list ul li {\n color: var(--jupiter-error-color, #d32f2f);\n margin: 4px 0;\n }\n\n .error-popup-footer {\n padding: 16px 24px;\n border-top: 1px solid var(--jupiter-border-color, #ddd);\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n }\n\n .error-field-link {\n color: #0066cc;\n text-decoration: underline;\n cursor: pointer;\n font-family: monospace;\n }\n\n .error-field-link:hover {\n color: #0052a3;\n text-decoration: none;\n }\n\n /* Context Menu Styles */\n .role-context-menu {\n position: fixed;\n background: white;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n z-index: 10001;\n min-width: 150px;\n padding: 4px 0;\n }\n\n .context-menu-item {\n padding: 8px 16px;\n cursor: pointer;\n font-size: 14px;\n color: var(--jupiter-text-primary, #333);\n transition: background-color 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .context-menu-item:hover {\n background: var(--jupiter-hover-background, #f5f5f5);\n }\n\n .context-menu-item.danger {\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .context-menu-item.danger:hover {\n background: #ffebee;\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n\n // Listen for period-change events from child components\n this.addEventListener('period-change', (e: Event) => {\n console.log(`🌍 [GLOBAL DynamicForm] Caught period-change event on element:`, e);\n const customEvent = e as CustomEvent;\n console.log(`🌍 [GLOBAL DynamicForm] Event detail:`, customEvent.detail);\n // Call the handler directly since @period-change binding doesn't catch it\n this._handlePeriodChange(customEvent);\n });\n\n // Listen for unit-change events from child components\n this.addEventListener('unit-change', (e: Event) => {\n console.log(`🏷️ [GLOBAL DynamicForm] Caught unit-change event on element:`, e);\n const customEvent = e as CustomEvent;\n console.log(`🏷️ [GLOBAL DynamicForm] Event detail:`, customEvent.detail);\n this._handleUnitChange(customEvent);\n });\n\n // Listen for decimals-change events from child components\n this.addEventListener('decimals-change', (e: Event) => {\n this._handleDecimalsChange(e as CustomEvent);\n });\n\n // Listen for field-blur events to track validation errors\n this.addEventListener('field-blur', (e: Event) => {\n console.log('🚨 [DynamicForm] field-blur event listener triggered!', e);\n const customEvent = e as CustomEvent;\n this._handleFieldBlur(customEvent);\n });\n\n\n // Close context menu when clicking anywhere\n document.addEventListener('click', () => {\n if (this._showRoleContextMenu) {\n this._showRoleContextMenu = false;\n this.requestUpdate();\n }\n });\n\n // Start 30-second auto-save draft timer\n this._autoSaveTimer = setInterval(() => {\n const currentSnapshot = JSON.stringify(this._formData);\n if (this._lastAutoSaveSnapshot === '') {\n this._lastAutoSaveSnapshot = currentSnapshot;\n console.log('ℹ️ [Auto Save] Baseline initialized; no draft save emitted.');\n return;\n }\n\n if (currentSnapshot !== this._lastAutoSaveSnapshot) {\n this._lastAutoSaveSnapshot = currentSnapshot;\n this._handleSaveDraft('auto');\n } else {\n console.log('ℹ️ [Auto Save] No form state change detected; skipping draft save emit.');\n }\n }, 30000);\n\n this._initializeForm();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n if (this._autoSaveTimer !== null) {\n clearInterval(this._autoSaveTimer);\n this._autoSaveTimer = null;\n }\n }\n\n updated(changedProperties: Map<string, any>) {\n // Recompute effective masterData when decimals or masterData changes\n if (changedProperties.has('decimals') || changedProperties.has('masterData')) {\n this._computeEffectiveMasterData();\n }\n\n // Initialize I18n language\n if (changedProperties.has('language')) {\n I18n.setLanguage(this.language);\n }\n\n // Apply default units to datatypes when xbrlInput or defaultUnits changes\n if ((changedProperties.has('xbrlInput') || changedProperties.has('defaultUnits')) && this.xbrlInput && this.defaultUnits && this.defaultUnits.length > 0) {\n this._applyDefaultUnitsToDatatypes();\n }\n\n // Reinitialize form when any of these critical properties change\n if (\n changedProperties.has('xbrlInput') ||\n changedProperties.has('schema') ||\n changedProperties.has('language') ||\n changedProperties.has('periodStartDate') ||\n changedProperties.has('periodEndDate') ||\n changedProperties.has('roleFilterAxes')\n ) {\n this._initializeForm();\n }\n }\n\n /**\n * Apply developer-provided default units to datatypes by setting isDefault=true\n * This allows units to be auto-selected for derived types (e.g., nl-types:monetaryNoDecimals20ItemType)\n */\n private _applyDefaultUnitsToDatatypes() {\n if (!this.xbrlInput?.datatypes || !this.defaultUnits || this.defaultUnits.length === 0) {\n return;\n }\n\n console.log('🔧 [DynamicForm] Applying defaultUnits to datatypes:', this.defaultUnits);\n\n // Iterate through defaultUnits array\n // Handle both wrapped and array formats for datatypes\n const datatypesArray = Array.isArray(this.xbrlInput.datatypes)\n ? this.xbrlInput.datatypes\n : this.xbrlInput.datatypes.concepts;\n\n if (!datatypesArray || datatypesArray.length === 0) {\n console.warn(\"⚠️ [DynamicForm] No datatypes found to apply defaults to\");\n return;\n }\n this.defaultUnits.forEach(defaultUnitMap => {\n // Each entry is like { \"xbrli:monetaryItemType\": \"EUR\" }\n Object.entries(defaultUnitMap).forEach(([datatypeId, unitId]) => {\n // Find the datatype in xbrlInput\n const datatype = datatypesArray.find((dt: any) => dt.type === datatypeId || dt.id === datatypeId) as any;\n if (datatype && datatype.units && datatype.units.length > 0) {\n // Find the unit to set as default\n const targetUnit = datatype.units.find((u: any) => u.id === unitId);\n\n if (targetUnit) {\n // Clear any existing defaults in this datatype\n datatype.units.forEach((u: any) => u.isDefault = false);\n\n // Set the developer-provided default\n targetUnit.isDefault = true;\n console.log(`✅ [DynamicForm] Set isDefault=true for unit \"${unitId}\" in datatype \"${datatypeId}\"`);\n } else {\n console.warn(`⚠️ [DynamicForm] Unit \"${unitId}\" not found in datatype \"${datatypeId}\"`);\n }\n } else {\n console.warn(`⚠️ [DynamicForm] Datatype \"${datatypeId}\" not found or has no units`);\n }\n });\n });\n }\n\n private _initializeForm() {\n // Initialize draft storage service\n if (!this._draftStorageService) {\n this._draftStorageService = new DraftStorageService(false); // Use localStorage\n }\n\n // Generate schema from XBRL input if provided, otherwise use provided schema\n if (this.xbrlInput) {\n try {\n console.log('🔄 Initializing form from XBRL input:', this.xbrlInput);\n console.log('📅 Using period dates:', this.periodStartDate, 'to', this.periodEndDate);\n console.log('🌐 Using language:', this.language);\n\n // Initialize period preferences from presentation data BEFORE building schema\n this._initializePeriodPreferencesFromData();\n\n // Apply axis filter defaults to period preferences (only for roles without saved preferences)\n this._applyAxisFilterToPeriodPreferences();\n\n // In admin mode: auto-enable showPreviousYear for roles that have dimension members (JDF-010)\n this._applyDimensionShowPreviousYear();\n\n console.log('⚙️ Using period preferences:', this._periodPreferences);\n this._currentSchema = XBRLFormBuilder.buildFormSchema(\n this.xbrlInput,\n this.periodStartDate,\n this.periodEndDate,\n this.language,\n this._periodPreferences\n );\n console.log('✅ Generated schema with sections:', this._currentSchema.sections.length);\n\n // Store all sections for filtering\n this._allSections = [...this._currentSchema.sections];\n\n // CRITICAL: Apply custom ordering from _selectedRoleIds to _allSections BEFORE filtering\n // This ensures sections maintain user's preferred order throughout the workflow\n if (Array.isArray(this._selectedRoleIds) &&\n this._selectedRoleIds.length > 0 &&\n typeof this._selectedRoleIds[0] === 'object') {\n\n console.log('🔄 Applying custom role order to _allSections from _selectedRoleIds');\n const enhancedRoles = this._selectedRoleIds as Array<{ roleId: string; roleURI: string; order: number }>;\n\n // Create a map of roleId to order\n const orderMap = new Map<string, number>();\n enhancedRoles.forEach(role => {\n orderMap.set(role.roleId, role.order);\n });\n\n // Sort _allSections by custom order\n this._allSections = [...this._allSections].sort((a, b) => {\n const orderA = orderMap.get(a.id) ?? 999;\n const orderB = orderMap.get(b.id) ?? 999;\n return orderA - orderB;\n });\n\n console.log('✅ Custom order applied to _allSections:', this._allSections.map(s => s.title));\n }\n\n // Initialize selected roles - select all sections by default, narrowed by roleFilterAxes\n if (this._selectedRoleIds.length === 0) {\n // roleFilterAxes controls initial SELECTION only — _allSections stays as the full pool\n // so the filter dialog always shows every role as available.\n const initialSections = (this.roleFilterAxes && this.roleFilterAxes.length > 0)\n ? this._filterRolesByAxisConfig(this._allSections)\n : this._allSections;\n this._selectedRoleIds = initialSections.map(section => section.id);\n console.log(`✅ Auto-selected ${this._selectedRoleIds.length} roles (of ${this._allSections.length} total)`);\n }\n\n // Apply current role filter - this will show empty form if no roles selected\n this._applyRoleFilter();\n\n // Use simple column structure for now\n this._columns = [\n {\n id: 'base',\n title: 'Value',\n description: 'Base values for concepts',\n type: 'base',\n order: 0,\n removable: false\n }\n ];\n } catch (error) {\n console.error('❌ Error building form from XBRL input:', error);\n this._currentSchema = this._getDefaultSchema();\n this._allSections = [];\n this._selectedRoleIds = [];\n this._columns = this._getDefaultColumns();\n }\n } else if (this.schema) {\n this._currentSchema = this.schema;\n this._allSections = [...this.schema.sections];\n this._selectedRoleIds = this._allSections.map(section => section.id);\n this._columns = this._getDefaultColumns();\n } else {\n this._currentSchema = this._getDefaultSchema();\n this._allSections = [];\n this._selectedRoleIds = [];\n this._columns = this._getDefaultColumns();\n }\n\n // Initialize form data\n this._formData = { ...this.initialData };\n if (this.xbrlInput?.initialData) {\n this._formData = { ...this._formData, ...this.xbrlInput.initialData };\n }\n\n // If global decimals is not provided, derive a default from existing\n // rounding-level value present either in facts or preloaded form data.\n this._initializeGlobalDecimalsFromRoundingData();\n\n // Extract typed member values from facts and pre-populate them\n this._extractTypedMembersFromFacts();\n\n // Check for and load saved draft (skip if reinitialization during preference update)\n if (!this._skipDraftLoading) {\n this._loadDraftIfExists().then(() => {\n // After draft is loaded, analyze all roles for initial border status\n this._analyzeAllVisibleRoles();\n }).catch(() => {\n // Even if draft loading fails, analyze roles\n this._analyzeAllVisibleRoles();\n });\n } else {\n console.log('⏭️ Skipping draft loading during preference update');\n // Still analyze roles even when skipping draft loading\n this._analyzeAllVisibleRoles();\n }\n\n // Validate initial data\n this._validateForm();\n }\n\n /**\n * Extract typed dimension values from facts and pre-populate typedMemberData\n * This scans all facts for typed dimensions and sets their values in column headers\n */\n private _extractTypedMembersFromFacts() {\n if (!this._currentSchema?.sections) {\n return;\n }\n\n// console.log('🔍 [DynamicForm] Extracting typed member values from facts');\n\n // Iterate through all sections, concepts, and facts\n this._currentSchema.sections.forEach(section => {\n this._extractTypedMembersFromConcepts(section.concepts || [], section);\n });\n\n console.log('✅ [DynamicForm] Typed member data populated:', this._typedMemberData);\n }\n\n /**\n * Recursively extract typed member values from concept tree\n */\n private _extractTypedMembersFromConcepts(concepts: ConceptTree[], section: FormSection) {\n concepts.forEach(concept => {\n // Check if concept has facts\n if (concept.facts && concept.facts.length > 0) {\n console.log(`🔍 [DynamicForm] Checking concept ${concept.id} with ${concept.facts.length} facts`);\n\n concept.facts.forEach((fact: any) => {\n // Check if fact has typed dimensions\n if (fact.dimensions && Array.isArray(fact.dimensions)) {\n const typedDimensions = fact.dimensions.filter((d: any) => d.dimensionType === 'typed' && d.typedMemberValue);\n\n if (typedDimensions.length > 0) {\n console.log(`📝 [DynamicForm] Found ${typedDimensions.length} typed dimensions in fact:`, {\n factName: fact.name,\n typedDimensions: typedDimensions.map((d: any) => ({\n dimension: d.dimension,\n typedMemberValue: d.typedMemberValue\n }))\n });\n\n // Find the column that has typed members and matches this fact\n const matchingColumn = this._findColumnWithTypedMembers(fact, concept, section);\n\n if (matchingColumn) {\n console.log(`✅ [DynamicForm] Found matching column: ${matchingColumn.id}`);\n\n // Extract typed values for each typed dimension\n typedDimensions.forEach((dim: any) => {\n const normalizedAxisId = this._normalizeAxisId(dim.dimension);\n\n // Check if this axis exists in the column's typed members\n const typedMember = matchingColumn.dimensionData?.typedMembers?.find(\n (tm: any) => tm.axisId === normalizedAxisId ||\n this._normalizeAxisId(tm.axisId) === normalizedAxisId\n );\n\n if (typedMember) {\n // Initialize column in typedMemberData if needed\n if (!this._typedMemberData[matchingColumn.id]) {\n this._typedMemberData[matchingColumn.id] = {};\n }\n\n // Set the typed value using the typedMember's axisId (which may be already normalized)\n const axisKey = typedMember.axisId;\n this._typedMemberData[matchingColumn.id][axisKey] = dim.typedMemberValue;\n\n console.log(`✅ [DynamicForm] Set typed member value:`, {\n sectionId: section.id,\n conceptId: concept.id,\n columnId: matchingColumn.id,\n axisKey: axisKey,\n typedMemberValue: dim.typedMemberValue\n });\n } else {\n console.warn(`⚠️ [DynamicForm] Typed member not found for axis: ${normalizedAxisId}`);\n }\n });\n } else {\n console.warn(`⚠️ [DynamicForm] No matching column found for fact with typed dimensions`);\n }\n }\n }\n });\n }\n\n // Recursively process children\n if (concept.children && concept.children.length > 0) {\n this._extractTypedMembersFromConcepts(concept.children, section);\n }\n });\n }\n\n /**\n * Find a column that has typed members and matches the fact's explicit dimensions\n */\n private _findColumnWithTypedMembers(fact: any, concept: ConceptTree, section: FormSection): FormColumn | null {\n if (!concept.fields || concept.fields.length === 0) {\n return null;\n }\n\n // Get columns from section\n const sectionColumns = section.columns || [];\n if (sectionColumns.length === 0) {\n return null;\n }\n\n // Try to find a field/column that has typed members and matches explicit dimensions\n for (const field of concept.fields) {\n const column = sectionColumns.find(col => col.id === field.columnId);\n\n if (column && column.dimensionData?.hasTypedMembers) {\n // This column has typed members, check if explicit dimensions match\n const factExplicitDims = (fact.dimensions || []).filter((d: any) => d.dimensionType === 'explicit');\n const columnExplicitDims = column.dimensionData.combinations || [];\n\n // If there are no explicit dimensions, or if they match, this is the column\n if (factExplicitDims.length === 0 ||\n factExplicitDims.length === columnExplicitDims.length &&\n factExplicitDims.every((factDim: any) =>\n columnExplicitDims.some((colDim: any) =>\n this._normalizeAxisId(factDim.dimension) === this._normalizeAxisId(colDim.axisId) &&\n this._normalizeMemberId(factDim.member) === this._normalizeMemberId(colDim.memberId)\n )\n )) {\n return column;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Find the column that matches the fact's dimensions\n */\n private _findColumnForFactDimensions(fact: any, concept: ConceptTree, section: FormSection): FormColumn | null {\n if (!concept.fields || concept.fields.length === 0) {\n console.log(`⚠️ [DynamicForm] No fields for concept: ${concept.id}`);\n return null;\n }\n\n // Get columns from section, not from this._columns\n const sectionColumns = section.columns || [];\n if (sectionColumns.length === 0) {\n console.log(`⚠️ [DynamicForm] No columns in section: ${section.id}`);\n return null;\n }\n\n // Try to find a field that matches the fact's dimensions\n for (const field of concept.fields) {\n const column = sectionColumns.find(col => col.id === field.columnId);\n if (column && column.dimensionData) {\n // Check if dimensions match\n const factDimensions = fact.dimensions || [];\n const columnDimensions = column.dimensionData.combinations || [];\n\n console.log(`🔍 [DynamicForm] Checking column ${column.id}:`, {\n factDimensions: factDimensions.map((d: any) => ({ axis: d.dimension, member: d.member, type: d.dimensionType })),\n columnDimensions: columnDimensions.map((d: any) => ({ axis: d.axisId, member: d.memberId }))\n });\n\n // Simple matching - check if all column dimensions are present in fact\n const allMatch = columnDimensions.every((colDim: any) => {\n return factDimensions.some((factDim: any) => {\n const axisMatch = this._normalizeAxisId(factDim.dimension) === this._normalizeAxisId(colDim.axisId);\n if (factDim.dimensionType === 'explicit') {\n const memberMatch = this._normalizeMemberId(factDim.member) === this._normalizeMemberId(colDim.memberId);\n return axisMatch && memberMatch;\n } else if (factDim.dimensionType === 'typed') {\n return axisMatch; // Typed dimensions match by axis only\n }\n return false;\n });\n });\n\n if (allMatch) {\n return column;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Normalize axis ID by extracting the local name\n */\n private _normalizeAxisId(axisId: string): string {\n if (!axisId) return '';\n // Handle both \"prefix:Name\" and \"prefix_Name\" formats\n if (axisId.includes(':')) {\n return axisId.split(':').pop() || axisId;\n } else if (axisId.includes('_')) {\n return axisId.split('_').pop() || axisId;\n }\n return axisId;\n }\n\n /**\n * Normalize member ID by extracting the local name\n */\n private _normalizeMemberId(memberId: string): string {\n if (!memberId) return '';\n // Handle both \"prefix:Name\" and \"prefix_Name\" formats\n if (memberId.includes(':')) {\n return memberId.split(':').pop() || memberId;\n } else if (memberId.includes('_')) {\n return memberId.split('_').pop() || memberId;\n }\n return memberId;\n }\n\n private _getDefaultSchema(): XBRLFormSchema {\n return {\n version: '1.0',\n formId: 'default-form',\n title: 'Dynamic Form',\n description: 'Please provide form schema or XBRL input data',\n sections: []\n };\n }\n\n private _getDefaultColumns(): FormColumn[] {\n return [\n {\n id: 'base',\n title: 'Value',\n description: 'Base values for concepts',\n type: 'base',\n order: 0,\n removable: false\n }\n ];\n }\n\n /**\n * Initialize period preferences from presentation data\n * Reads showPreviousYear, instant, and duration attributes from each role to set initial preferences\n * Only sets defaults for roles that don't have existing user preferences\n */\n private _initializePeriodPreferencesFromData() {\n if (!this.xbrlInput?.presentation?.[0]?.roles) {\n return;\n }\n\n const preferences: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }> = { ...this._periodPreferences };\n\n this.xbrlInput.presentation[0].roles.forEach(role => {\n // Only set defaults if this role doesn't already have preferences (preserve user selections)\n if (!preferences[role.id]) {\n // Read preset values from role data, with defaults\n const showPreviousYear = (role as any).showPreviousYear === true;\n const instant = (role as any).instant !== undefined ? (role as any).instant === true : true;\n const duration = (role as any).duration !== undefined ? (role as any).duration === true : true;\n\n preferences[role.id] = {\n showDuration: duration,\n showInstant: instant,\n showPreviousYear: showPreviousYear\n };\n\n const presets: string[] = [];\n if (showPreviousYear) presets.push('previous year');\n if (instant) presets.push('instant');\n if (duration) presets.push('duration');\n\n if (presets.length > 0) {\n //console.log(`✅ Auto-configured role \"${role.role}\" with presets: ${presets.join(', ')}`);\n }\n }\n });\n\n this._periodPreferences = preferences;\n }\n\n /**\n * Translate roleFilterAxes into dimensionSelections within _periodPreferences so that\n * buildFormSchema / filterHypercubeDimensionsBySelection picks up the right columns.\n *\n * Rules:\n * - Only runs when roleFilterAxes is non-empty and hypercube data is present.\n * - For each hypercube role, if no dimensionSelections have been saved yet (fresh start / no\n * user metadata), derive them from roleFilterAxes: available=true members → selectedMemberIds.\n * - Skips roles that already have dimensionSelections (user's saved preference takes priority).\n */\n private _applyAxisFilterToPeriodPreferences(): void {\n if (!this.roleFilterAxes || this.roleFilterAxes.length === 0) return;\n if (!this.xbrlInput?.hypercubes?.[0]?.roles) return;\n\n const hypercubeRoles = this.xbrlInput.hypercubes[0].roles;\n const preferences = { ...this._periodPreferences };\n\n for (const hypercubeRole of hypercubeRoles) {\n const roleId = hypercubeRole.roleId;\n const existing = preferences[roleId];\n\n // Preserve user's saved dimension selections — only apply defaults on first load\n if (existing?.dimensionSelections && existing.dimensionSelections.length > 0) {\n continue;\n }\n\n const dimensionSelections: Array<{ dimensionId: string; dimensionLabel: string; selectedMemberIds: string[] }> = [];\n\n for (const filterAxis of this.roleFilterAxes) {\n // Check if this role has the axis dimension in any of its hypercube items\n for (const item of hypercubeRole.items || []) {\n const matchingDim = item.dimensions?.find(\n (dim: any) => dim.id === filterAxis.id ||\n (filterAxis.conceptName && dim.conceptName === filterAxis.conceptName)\n );\n\n if (matchingDim) {\n dimensionSelections.push({\n dimensionId: filterAxis.id,\n dimensionLabel: filterAxis.conceptName || filterAxis.id,\n selectedMemberIds: filterAxis.members\n .filter(m => m.available === true)\n .map(m => m.id)\n });\n break; // Found in this item — no need to check remaining items for this axis\n }\n }\n }\n\n if (dimensionSelections.length > 0) {\n preferences[roleId] = {\n showDuration: existing?.showDuration ?? true,\n showInstant: existing?.showInstant ?? true,\n showPreviousYear: existing?.showPreviousYear ?? false,\n dimensionSelections\n };\n }\n }\n\n this._periodPreferences = preferences;\n }\n\n /**\n * In admin mode, auto-enables showPreviousYear for roles that have at least one dimension\n * member selected (from roleFilterAxes defaults). This ensures such roles render with a\n * minimum of two columns (current + previous year) on fresh initialization.\n *\n * Skipped when form state is being restored from external props or localStorage so that\n * the user's previously saved preferences are not overridden.\n */\n private _applyDimensionShowPreviousYear(): void {\n if (this.mode !== 'admin') return;\n\n // Only apply on fresh initialization — skip if any saved state exists\n const hasExternalState = !!(this.dynaformsFacts && this.dynaformsMetadata);\n const hasLocalDraft = this._draftStorageService?.hasDraft() ?? false;\n if (hasExternalState || hasLocalDraft) return;\n\n const updated = { ...this._periodPreferences };\n let changed = false;\n\n for (const roleId of Object.keys(updated)) {\n const prefs = updated[roleId];\n if (prefs.showPreviousYear) continue; // already enabled\n\n const hasDimensionMembers = prefs.dimensionSelections?.some(\n ds => ds.selectedMemberIds && ds.selectedMemberIds.length > 0\n ) ?? false;\n\n if (hasDimensionMembers) {\n updated[roleId] = { ...prefs, showPreviousYear: true };\n changed = true;\n console.log(`📅 [JDF-010] Auto-enabled showPreviousYear for role \"${roleId}\" (has dimension members)`);\n }\n }\n\n if (changed) {\n this._periodPreferences = updated;\n }\n }\n\n /**\n * Helper method to extract roleIds from _selectedRoleIds\n * Handles both legacy string[] and enhanced object[] structure\n */\n private _getRoleIdsArray(): string[] {\n if (!Array.isArray(this._selectedRoleIds) || this._selectedRoleIds.length === 0) {\n return [];\n }\n\n // Check if first element is a string (legacy format) or object (enhanced format)\n if (typeof this._selectedRoleIds[0] === 'string') {\n return this._selectedRoleIds as string[];\n } else {\n return (this._selectedRoleIds as Array<{ roleId: string; roleURI: string; order: number }>).map(item => item.roleId);\n }\n }\n\n private _applyRoleFilter() {\n if (!this._currentSchema || !this._allSections.length) return;\n\n // Extract roleIds from enhanced structure for filtering\n const roleIds = this._getRoleIdsArray();\n\n console.log(`🔍 Applying role filter: ${roleIds.length} selected out of ${this._allSections.length} total`);\n\n // If no roles are selected, show empty form (user needs to select roles)\n if (roleIds.length === 0) {\n console.log(`📝 No roles selected - showing empty form`);\n this._currentSchema = {\n ...this._currentSchema,\n sections: []\n };\n this.requestUpdate();\n return;\n }\n\n // Before filtering, preserve data from sections that will be hidden\n this._preserveDataForHiddenSections();\n\n // Filter sections based on selected role IDs\n const filteredSections = this._allSections.filter(section =>\n roleIds.includes(section.id)\n );\n\n // CRITICAL: Sort filtered sections according to custom order from picklist\n const orderedSections = this._sortSectionsByCustomOrder(filteredSections);\n\n console.log(`📊 Filtered sections: ${orderedSections.length}`);\n console.log(`📋 Custom order applied:`, orderedSections.map(s => s.title));\n\n // Restore data for sections that are now being shown\n this._restoreDataForVisibleSections(orderedSections);\n\n // Update current schema with filtered and ordered sections\n this._currentSchema = {\n ...this._currentSchema,\n sections: orderedSections\n };\n\n console.log(`✅ Schema updated with custom order. Current sections count: ${this._currentSchema.sections.length}`);\n\n // Force re-render to update the UI with new order\n this.requestUpdate();\n }\n\n /**\n * Sort sections according to custom order from _selectedRoleIds\n * Handles both enhanced structure and legacy string array\n */\n private _sortSectionsByCustomOrder(sections: FormSection[]): FormSection[] {\n // If _selectedRoleIds is enhanced structure with order\n if (Array.isArray(this._selectedRoleIds) &&\n this._selectedRoleIds.length > 0 &&\n typeof this._selectedRoleIds[0] === 'object') {\n\n const enhancedRoles = this._selectedRoleIds as Array<{ roleId: string; roleURI: string; order: number }>;\n\n // Create a map of roleId to order\n const orderMap = new Map<string, number>();\n enhancedRoles.forEach(role => {\n orderMap.set(role.roleId, role.order);\n });\n\n // Sort sections by order\n return [...sections].sort((a, b) => {\n const orderA = orderMap.get(a.id) ?? 999;\n const orderB = orderMap.get(b.id) ?? 999;\n return orderA - orderB;\n });\n }\n\n // Legacy string array or no order - return as is\n return sections;\n }\n\n /**\n * Filter roles based on roleFilterAxes input property (checkboxes.json format).\n *\n * Rules per axis:\n * 1. If the role has no hypercube entry → always included.\n * 2. If the axis from the filter config is NOT present in the role's hypercube dimensions → axis is\n * not applicable to this role → role is not affected by this axis (still included).\n * 3. If the axis IS present: include the role only if at least one of the role's members for that\n * axis matches an available=true member in the filter config.\n * 4. All axes in the config must pass (logical AND). A single failing axis excludes the role.\n */\n private _filterRolesByAxisConfig(sections: FormSection[]): FormSection[] {\n if (!this.roleFilterAxes || this.roleFilterAxes.length === 0) {\n return sections;\n }\n if (!this.xbrlInput?.hypercubes || this.xbrlInput.hypercubes.length === 0) {\n return sections;\n }\n\n const hypercubeData = this.xbrlInput.hypercubes[0];\n\n return sections.filter(section => {\n const hypercubeRole = hypercubeData.roles?.find((r: any) => r.roleId === section.id);\n\n // Rule 1: No hypercube entry for this role → always include\n if (!hypercubeRole || !hypercubeRole.items || hypercubeRole.items.length === 0) {\n return true;\n }\n\n // Evaluate each filter axis independently; all must pass\n for (const filterAxis of this.roleFilterAxes) {\n const availableMemberIds = new Set(\n filterAxis.members\n .filter(m => m.available === true)\n .map(m => m.id)\n );\n\n let axisApplicable = false;\n let rolePassesAxis = false;\n\n for (const item of hypercubeRole.items) {\n if (!item.dimensions || item.dimensions.length === 0) continue;\n\n const matchingDim = item.dimensions.find(\n (dim: any) => dim.id === filterAxis.id ||\n (filterAxis.conceptName && dim.conceptName === filterAxis.conceptName)\n );\n\n if (matchingDim) {\n axisApplicable = true;\n\n if (matchingDim.members) {\n for (const roleMember of matchingDim.members) {\n if (availableMemberIds.has(roleMember.id)) {\n rolePassesAxis = true;\n break;\n }\n }\n }\n\n if (rolePassesAxis) break;\n }\n }\n\n // Rule 2: Axis not applicable to this role → passes this axis check\n // Rule 3/4: Axis applicable but no available=true member matches → exclude\n if (axisApplicable && !rolePassesAxis) {\n return false;\n }\n }\n\n return true;\n });\n }\n\n private _preserveDataForHiddenSections() {\n // Get currently visible section IDs\n const currentlyVisibleSectionIds = this._currentSchema?.sections.map(s => s.id) || [];\n\n // Extract roleIds from enhanced structure\n const selectedRoleIds = this._getRoleIdsArray();\n\n // Find sections that will be hidden after filter is applied\n const sectionsThatWillBeHidden = currentlyVisibleSectionIds.filter(\n sectionId => !selectedRoleIds.includes(sectionId)\n );\n\n // Preserve form data for concepts in hidden sections\n sectionsThatWillBeHidden.forEach(sectionId => {\n const section = this._allSections.find(s => s.id === sectionId);\n if (section) {\n this._preserveSectionData(section);\n }\n });\n\n // console.log(`📦 Preserved data for ${sectionsThatWillBeHidden.length} hidden sections:`, sectionsThatWillBeHidden);\n }\n\n private _restoreDataForVisibleSections(visibleSections: FormSection[]) {\n // Restore data for sections that are now being shown\n visibleSections.forEach(section => {\n this._restoreSectionData(section);\n });\n\n console.log(`🔄 Restored data for ${visibleSections.length} visible sections`);\n }\n\n private _preserveSectionData(section: FormSection) {\n // Preserve form data for all concepts in this section\n section.concepts.forEach(concept => {\n this._preserveConceptData(concept);\n });\n }\n\n private _preserveConceptData(concept: ConceptTree) {\n // Preserve data for this concept\n if (this._formData[concept.id]) {\n this._preservedFormData[concept.id] = { ...this._formData[concept.id] };\n }\n\n // Preserve typed member data for columns related to this concept\n concept.fields.forEach(field => {\n if (this._typedMemberData[field.columnId]) {\n this._preservedTypedMemberData[field.columnId] = { ...this._typedMemberData[field.columnId] };\n }\n // Preserve cross-role typed member data (stored under compound key)\n const crossRoleKey = `${concept.id}__${field.columnId}`;\n if (this._typedMemberData[crossRoleKey]) {\n this._preservedTypedMemberData[crossRoleKey] = { ...this._typedMemberData[crossRoleKey] };\n }\n });\n\n // Recursively preserve data for child concepts\n if (concept.children) {\n concept.children.forEach(child => {\n this._preserveConceptData(child);\n });\n }\n }\n\n private _restoreSectionData(section: FormSection) {\n // Restore form data for all concepts in this section\n section.concepts.forEach(concept => {\n this._restoreConceptData(concept);\n });\n }\n\n private _restoreConceptData(concept: ConceptTree) {\n // Restore data for this concept if it was preserved\n if (this._preservedFormData[concept.id]) {\n this._formData[concept.id] = { ...this._preservedFormData[concept.id] };\n }\n\n // Restore typed member data for columns related to this concept\n concept.fields.forEach(field => {\n if (this._preservedTypedMemberData[field.columnId]) {\n this._typedMemberData[field.columnId] = { ...this._preservedTypedMemberData[field.columnId] };\n }\n // Restore cross-role typed member data (stored under compound key)\n const crossRoleKey = `${concept.id}__${field.columnId}`;\n if (this._preservedTypedMemberData[crossRoleKey]) {\n this._typedMemberData[crossRoleKey] = { ...this._preservedTypedMemberData[crossRoleKey] };\n }\n });\n\n // Recursively restore data for child concepts\n if (concept.children) {\n concept.children.forEach(child => {\n this._restoreConceptData(child);\n });\n }\n }\n\n private _shouldShowFilterButton(): boolean {\n return true; // Always show filter button to allow role selection\n }\n\n private _handleFilterRolesClick() {\n this._showFilterDialog = true;\n }\n\n private _handleAdvancedFilterApply(event: CustomEvent) {\n this._showFactsOnly = event.detail.showFactsOnly;\n this._conceptSearchText = event.detail.conceptSearchText ?? '';\n this._showFilterDialog = false;\n }\n\n private _handleFilterDialogCancel() {\n this._showFilterDialog = false;\n\n // If no roles were previously selected (first time opening), \n // and user cancels, keep empty selection for consistency\n const roleCount = this._getRoleIdsArray().length;\n console.log(`🚫 Filter dialog cancelled. Current selection: ${roleCount}/${this._allSections.length}`);\n }\n\n private _handleRoleFilterApply(event: CustomEvent) {\n const { selectedRoleIds, periodPreferences } = event.detail;\n console.log('🎯 Filter apply triggered');\n console.log('📊 Old _selectedRoleIds:', this._selectedRoleIds);\n console.log('📊 New selectedRoleIds from dialog:', selectedRoleIds);\n\n this._selectedRoleIds = selectedRoleIds;\n this._periodPreferences = periodPreferences;\n\n console.log('📊 Updated _selectedRoleIds:', this._selectedRoleIds);\n console.log('📊 New period preferences (including dimension selections):', this._periodPreferences);\n\n // CRITICAL: Capture current form data BEFORE reinitialization to preserve user input\n console.log('💾 Capturing current form data before reinitialization...');\n const currentFormData = this._generateSubmissionData();\n const currentMetadata = this._draftStorageService.createMetadataSnapshot(\n this.periodStartDate,\n this.periodEndDate,\n this.language,\n this._selectedRoleIds, // Enhanced structure with roleURI and order\n this._allSections,\n this._typedMemberData,\n this._periodPreferences,\n this._periodData,\n this._unitData,\n this.reportingLanguage,\n this._repeatCounts,\n this._decimalsData\n );\n\n // Save current state to draft storage\n this._draftStorageService.saveDraft(currentFormData, currentMetadata);\n console.log('✅ Current form data saved to draft storage with NEW preferences');\n\n // CRITICAL: Skip period preferences restoration to prevent override of new selections\n this._skipPeriodPreferencesRestore = true;\n\n // CRITICAL: Skip draft loading during reinitialization to prevent old draft from overriding changes\n this._skipDraftLoading = true;\n console.log('🔄 Reinitializing form with new filter settings...');\n this._initializeForm();\n this._skipDraftLoading = false;\n this._skipPeriodPreferencesRestore = false;\n\n console.log('📊 After _initializeForm, _currentSchema.sections.length:', this._currentSchema?.sections.length);\n console.log('📊 Section IDs:', this._currentSchema?.sections.map(s => s.id));\n\n // CRITICAL: Restore form data from draft after reinitialization\n console.log('📥 Restoring form data from draft after reinitialization...');\n this._loadDraftIfExists().then(() => {\n console.log('✅ Form data restored successfully after reinitialization');\n }).catch((error) => {\n console.error('❌ Error restoring form data after reinitialization:', error);\n });\n\n this._showFilterDialog = false;\n\n // Extract roleIds for counting (handle both legacy string[] and enhanced object[])\n const roleCount = Array.isArray(this._selectedRoleIds) && this._selectedRoleIds.length > 0\n ? (typeof this._selectedRoleIds[0] === 'string' ? this._selectedRoleIds.length : (this._selectedRoleIds as Array<{ roleId: string; roleURI: string; order: number }>).length)\n : 0;\n\n console.log(`🎯 Applied role filter: ${roleCount}/${this._allSections.length} roles selected`);\n console.log('📋 Enhanced selectedRoleIds structure:', this._selectedRoleIds);\n\n // Dispatch event for external listeners\n this.dispatchEvent(new CustomEvent('roles-filter-changed', {\n detail: {\n selectedRoleIds, // Enhanced structure with roleURI and order\n totalRoles: this._allSections.length,\n visibleRoles: roleCount,\n periodPreferences\n },\n bubbles: true\n }));\n }\n\n /**\n * Check if dimension selections have changed for any role\n */\n private _haveDimensionSelectionsChanged(newPeriodPreferences: any): boolean {\n // Get all role IDs from both old and new preferences\n const allRoleIds = new Set([\n ...Object.keys(this._periodPreferences || {}),\n ...Object.keys(newPeriodPreferences || {})\n ]);\n\n for (const roleId of allRoleIds) {\n const oldPrefs = this._periodPreferences?.[roleId];\n const newPrefs = newPeriodPreferences?.[roleId];\n\n const oldDimensions = oldPrefs?.dimensionSelections || [];\n const newDimensions = newPrefs?.dimensionSelections || [];\n\n // Compare dimension selections using sorted JSON strings\n const oldDimensionsStr = JSON.stringify(\n oldDimensions.sort((a: any, b: any) => a.dimensionId.localeCompare(b.dimensionId))\n );\n const newDimensionsStr = JSON.stringify(\n newDimensions.sort((a: any, b: any) => a.dimensionId.localeCompare(b.dimensionId))\n );\n\n if (oldDimensionsStr !== newDimensionsStr) {\n console.log(`🔍 Dimension selection changed for role: ${roleId}`);\n console.log(' Old:', oldDimensions);\n console.log(' New:', newDimensions);\n return true;\n }\n }\n\n return false;\n }\n\n private _validateForm() {\n const errors: ValidationError[] = [];\n\n // Use current schema for validation\n const schema = this._currentSchema;\n if (!schema) return;\n\n // Validate each section and its concepts\n for (const section of schema.sections) {\n for (const concept of section.concepts) {\n for (const field of concept.fields) {\n const value = this._formData[concept.id]?.[field.columnId];\n const fieldErrors = FormValidator.validateField(\n field.id,\n concept.id,\n field.columnId,\n value,\n field.type,\n field.validation || []\n );\n errors.push(...fieldErrors);\n }\n }\n }\n\n this._errors = errors;\n this._valid = errors.filter(e => e.severity === 'error').length === 0;\n }\n\n private _handleFieldChange(event: CustomEvent) {\n const { fieldId, conceptId, columnId, value } = event.detail;\n\n console.log(`📝 Field change: conceptId=${conceptId}, columnId=${columnId}, value=${value}, fieldId=${fieldId}`);\n\n // Update form data with proper immutable update to trigger Lit reactivity\n const updatedFormData = { ...this._formData };\n if (!updatedFormData[conceptId]) {\n updatedFormData[conceptId] = {};\n }\n const oldValue = updatedFormData[conceptId][columnId];\n updatedFormData[conceptId] = { ...updatedFormData[conceptId], [columnId]: value };\n this._formData = updatedFormData;\n\n console.log(`💾 Updated formData[${conceptId}]:`, this._formData[conceptId]);\n\n // Mark as touched and dirty\n this._touched.add(`${conceptId}-${columnId}`);\n this._dirty = true;\n\n // Re-validate\n this._validateForm();\n\n // Trigger update (should be automatic with the new object reference)\n this.requestUpdate();\n\n // Dispatch change event\n this.dispatchEvent(new CustomEvent('field-change', {\n detail: { fieldId, conceptId, columnId, value, oldValue },\n bubbles: true\n }));\n }\n\n private _handlePeriodChange(event: CustomEvent) {\n console.log(`🎯 [DynamicForm] _handlePeriodChange called with event:`, event);\n console.log(`🎯 [DynamicForm] Event detail:`, event.detail);\n const { conceptId, columnId, periodType, periodStartDate, periodEndDate, periodInstantDate, unit } = event.detail;\n\n console.log(`📅 Period change received: conceptId=${conceptId}, columnId=${columnId}, periodType=${periodType}, startDate=${periodStartDate}, endDate=${periodEndDate}, instantDate=${periodInstantDate}, unit=${unit}`);\n\n // Update period data with proper immutable update\n const updatedPeriodData = { ...this._periodData };\n if (!updatedPeriodData[conceptId]) {\n updatedPeriodData[conceptId] = {};\n }\n\n updatedPeriodData[conceptId] = {\n ...updatedPeriodData[conceptId],\n [columnId]: {\n startDate: periodStartDate,\n endDate: periodEndDate,\n instantDate: periodInstantDate\n }\n };\n this._periodData = updatedPeriodData;\n\n console.log(`💾 Period data stored for [${conceptId}][${columnId}]:`, this._periodData[conceptId][columnId]);\n console.log(`📦 Full period data state:`, JSON.stringify(this._periodData, null, 2));\n\n // Also store unit if provided\n if (unit) {\n this._storeUnit(conceptId, columnId, unit);\n }\n\n // Mark as dirty\n this._dirty = true;\n\n // Trigger update\n this.requestUpdate();\n }\n\n private _handleUnitChange(event: CustomEvent) {\n console.log(`🏷️ [DynamicForm] _handleUnitChange called with event:`, event);\n console.log(`🏷️ [DynamicForm] Event detail:`, event.detail);\n const { conceptId, columnId, unit } = event.detail;\n\n console.log(`🏷️ Unit change received: conceptId=${conceptId}, columnId=${columnId}, unit=${unit}`);\n\n this._storeUnit(conceptId, columnId, unit);\n\n // Mark as dirty\n this._dirty = true;\n\n // Trigger update\n this.requestUpdate();\n }\n\n private _storeUnit(conceptId: string, columnId: string, unit: string) {\n console.log(`🔧 [_storeUnit] Called with conceptId=${conceptId}, columnId=${columnId}, unit=${unit}`);\n console.log(`🔧 [_storeUnit] Current _unitData before update:`, JSON.stringify(this._unitData, null, 2));\n\n // Update unit data with proper immutable update\n const updatedUnitData = { ...this._unitData };\n if (!updatedUnitData[conceptId]) {\n console.log(`🔧 [_storeUnit] Creating new entry for conceptId: ${conceptId}`);\n updatedUnitData[conceptId] = {};\n }\n\n updatedUnitData[conceptId] = {\n ...updatedUnitData[conceptId],\n [columnId]: unit\n };\n this._unitData = updatedUnitData;\n\n console.log(`💾 [_storeUnit] Unit data stored for [${conceptId}][${columnId}]:`, this._unitData[conceptId][columnId]);\n console.log(`📦 [_storeUnit] Full unit data state after update:`, JSON.stringify(this._unitData, null, 2));\n }\n\n private _handleDecimalsChange(event: CustomEvent) {\n const { conceptId, columnId, decimals } = event.detail;\n if (!conceptId || !columnId) return;\n this._storeDecimals(conceptId, columnId, decimals);\n this._dirty = true;\n this.requestUpdate();\n }\n\n private _computeEffectiveMasterData() {\n const ROUNDING_CONCEPT = 'rj-i_DocumentIntendedRoundingLevel';\n if (this.decimals !== 'INF') {\n const parsed = parseFloat(this.decimals);\n if (!isNaN(parsed)) {\n this._effectiveMasterData = {\n ...(this.masterData || {}),\n [ROUNDING_CONCEPT]: String(-parsed)\n };\n return;\n }\n }\n // No valid global decimals — use masterData as-is (may be undefined)\n this._effectiveMasterData = this.masterData ? { ...this.masterData } : undefined;\n }\n\n private _initializeGlobalDecimalsFromRoundingData(): void {\n // Respect explicit global decimals provided by host app/user.\n if (this._hasValidGlobalDecimals()) {\n return;\n }\n\n const roundingLevel =\n this._findRoundingLevelFactValue(this._allSections) ??\n this._findRoundingLevelValueInFormData(this._formData);\n\n if (roundingLevel === undefined || roundingLevel === null || roundingLevel === '') {\n return;\n }\n\n const parsed = parseFloat(String(roundingLevel));\n if (isNaN(parsed)) {\n return;\n }\n\n // Rounding-level facts are typically negative (e.g., -2). Global decimals\n // should be a positive value for UI/edit-period defaults.\n this.decimals = String(Math.abs(parsed));\n }\n\n private _findRoundingLevelValueInFormData(formData?: FormData): any {\n if (!formData) {\n return undefined;\n }\n\n for (const conceptKey of Object.keys(formData)) {\n if (!this._isRoundingLevelConcept(conceptKey)) {\n continue;\n }\n\n const columnValues = formData[conceptKey] || {};\n for (const columnId of Object.keys(columnValues)) {\n const value = columnValues[columnId];\n if (value !== undefined && value !== null && value !== '') {\n return value;\n }\n }\n }\n\n return undefined;\n }\n\n private _findRoundingLevelFactValue(sections: FormSection[]): any {\n for (const section of sections) {\n const value = this._findRoundingLevelFactValueInConcepts(section.concepts || []);\n if (value !== undefined && value !== null && value !== '') {\n return value;\n }\n }\n return undefined;\n }\n\n private _findRoundingLevelFactValueInConcepts(concepts: ConceptTree[]): any {\n for (const concept of concepts) {\n const conceptIdToCheck = concept.originalConceptId || concept.id;\n if (this._isRoundingLevelConcept(conceptIdToCheck)) {\n const facts = concept.facts || [];\n for (const fact of facts as any[]) {\n if (fact?.value !== undefined && fact?.value !== null && fact?.value !== '') {\n return fact.value;\n }\n }\n }\n\n if (concept.children && concept.children.length > 0) {\n const childValue = this._findRoundingLevelFactValueInConcepts(concept.children);\n if (childValue !== undefined && childValue !== null && childValue !== '') {\n return childValue;\n }\n }\n }\n\n return undefined;\n }\n\n private _hasValidGlobalDecimals(): boolean {\n if (this.decimals === undefined || this.decimals === null) {\n return false;\n }\n if (this.decimals === 'INF') {\n return false;\n }\n const parsed = parseFloat(this.decimals);\n return !isNaN(parsed);\n }\n\n private _isRoundingLevelConcept(conceptId?: string): boolean {\n if (!conceptId) {\n return false;\n }\n\n // Accept exact and suffixed keys (e.g. __hash / __repeat_N)\n // and namespace/prefix variants that end with local name.\n return conceptId === 'rj-i_DocumentIntendedRoundingLevel' || conceptId.includes('DocumentIntendedRoundingLevel');\n }\n\n private _findFactValueForField(concept: ConceptTree, field: FormField, section?: FormSection): any {\n if (!concept.facts || concept.facts.length === 0) {\n return undefined;\n }\n\n const column = this._findColumnByIdInSection(field.columnId, section);\n const fieldPeriodData = this._periodData[concept.id]?.[field.columnId];\n const periodStartDate = fieldPeriodData?.startDate || column?.periodStartDate || field.periodStartDate || this.periodStartDate;\n const periodEndDate = fieldPeriodData?.endDate || column?.periodEndDate || field.periodEndDate || this.periodEndDate;\n const periodInstantDate = fieldPeriodData?.instantDate || field.periodInstantDate || periodEndDate || periodStartDate;\n const unit = this._unitData[concept.id]?.[field.columnId];\n\n const cellContext = {\n conceptId: concept.originalConceptId || field.conceptId || concept.id,\n columnId: field.columnId,\n periodStartDate,\n periodEndDate,\n periodInstantDate,\n periodType: field.periodType,\n unit,\n dimensionData: column?.dimensionData\n };\n\n const matchedFact = FactMatcher.findMatchingFact(concept.facts as any[], cellContext as any);\n return matchedFact?.value;\n }\n\n private _storeDecimals(conceptId: string, columnId: string, decimals: string | undefined) {\n const updated = { ...this._decimalsData };\n if (!updated[conceptId]) updated[conceptId] = {};\n updated[conceptId] = { ...updated[conceptId], [columnId]: decimals ?? '' };\n this._decimalsData = updated;\n }\n\n /**\n * Generate a unique concept key that includes section context\n */\n private _generateUniqueConceptKey(sectionId: string, conceptId: string): string {\n return `${sectionId}::${conceptId}`;\n }\n\n /**\n * Extract the original concept ID from a unique concept key\n */\n private _extractOriginalConceptId(uniqueConceptKey: string): string {\n const parts = uniqueConceptKey.split('::');\n return parts.length > 1 ? parts[1] : uniqueConceptKey;\n }\n\n private _handleAddConceptRepeat(event: CustomEvent) {\n const { conceptId } = event.detail;\n this._repeatCounts = { ...this._repeatCounts, [conceptId]: (this._repeatCounts[conceptId] || 0) + 1 };\n this._dirty = true;\n }\n\n private _handleRemoveConceptRepeat(event: CustomEvent) {\n const { conceptId: rawConceptId } = event.detail;\n\n // The event detail carries the synthetic instance ID (e.g. \"baseId__repeat_2\").\n // Parse out the base concept ID and which repeat index to remove.\n const repeatMatch = rawConceptId.match(/^(.+)__repeat_(\\d+)$/);\n const baseConceptId = repeatMatch ? repeatMatch[1] : rawConceptId;\n const removeIndex = repeatMatch ? parseInt(repeatMatch[2]) : (this._repeatCounts[rawConceptId] || 0);\n\n const current = this._repeatCounts[baseConceptId] || 0;\n if (current <= 0 || removeIndex < 1 || removeIndex > current) return;\n\n const newFormData = { ...this._formData };\n const newTypedData = { ...this._typedMemberData };\n const newUnitData = { ...this._unitData };\n const newPeriodData = { ...this._periodData };\n\n // Shift instances after the removed one down by one\n for (let n = removeIndex; n < current; n++) {\n const fromId = `${baseConceptId}__repeat_${n + 1}`;\n const toId = `${baseConceptId}__repeat_${n}`;\n\n // Move form data\n if (newFormData[fromId] !== undefined) {\n newFormData[toId] = newFormData[fromId];\n } else {\n delete newFormData[toId];\n }\n\n // Move typed member data (keys like \"fromId__columnId\")\n const toPrefix = `${toId}__`;\n const fromPrefix = `${fromId}__`;\n const fromEntries = Object.keys(newTypedData).filter(k => k.startsWith(fromPrefix));\n // Clear destination first, then copy source, then delete source originals\n Object.keys(newTypedData).filter(k => k.startsWith(toPrefix)).forEach(k => delete newTypedData[k]);\n fromEntries.forEach(k => {\n newTypedData[`${toId}__${k.slice(fromPrefix.length)}`] = newTypedData[k];\n });\n fromEntries.forEach(k => delete newTypedData[k]);\n\n // Move unit data\n if (newUnitData[fromId] !== undefined) {\n newUnitData[toId] = newUnitData[fromId];\n } else {\n delete newUnitData[toId];\n }\n\n // Move period data\n if (newPeriodData[fromId] !== undefined) {\n newPeriodData[toId] = newPeriodData[fromId];\n } else {\n delete newPeriodData[toId];\n }\n }\n\n // Delete the last (now duplicated) slot after shifting\n const lastId = `${baseConceptId}__repeat_${current}`;\n delete newFormData[lastId];\n delete newUnitData[lastId];\n delete newPeriodData[lastId];\n const lastPrefix = `${lastId}__`;\n Object.keys(newTypedData).filter(k => k.startsWith(lastPrefix)).forEach(k => delete newTypedData[k]);\n\n this._formData = newFormData;\n this._typedMemberData = newTypedData;\n this._unitData = newUnitData;\n this._periodData = newPeriodData;\n this._repeatCounts = { ...this._repeatCounts, [baseConceptId]: current - 1 };\n this._dirty = true;\n }\n\n private _handleTypedMemberChange(event: CustomEvent) {\n const { columnId, axisId, value, conceptId } = event.detail;\n\n // Cross-role typed members (from Edit Period dialog) carry conceptId so that\n // each concept row stores its own values independently.\n // Column-header typed members have no conceptId and keep using columnId alone.\n const storageKey = conceptId ? `${conceptId}__${columnId}` : columnId;\n\n console.log(`🔍 [DynamicForm] Typed member change: storageKey=${storageKey}, axisId=${axisId}, value=${value}`);\n\n // Update typed member data with immutable update\n const updatedTypedMemberData = { ...this._typedMemberData };\n if (!updatedTypedMemberData[storageKey]) {\n updatedTypedMemberData[storageKey] = {};\n }\n updatedTypedMemberData[storageKey] = { ...updatedTypedMemberData[storageKey], [axisId]: value };\n this._typedMemberData = updatedTypedMemberData;\n\n // Mark as dirty\n this._dirty = true;\n\n // Trigger update\n this.requestUpdate();\n\n // Dispatch change event\n this.dispatchEvent(new CustomEvent('typed-member-change', {\n detail: { columnId, axisId, value },\n bubbles: true\n }));\n }\n\n private _handleFieldBlur(event: CustomEvent) {\n console.log(`🟧 [DynamicForm] _handleFieldBlur received event:`, event);\n console.log(`🟧 [DynamicForm] Event detail:`, event.detail);\n\n const { fieldId, conceptId, columnId, xbrlValidationErrors } = event.detail;\n\n console.log(`🟧 [DynamicForm] Extracted - fieldId: ${fieldId}, conceptId: ${conceptId}, columnId: ${columnId}`);\n console.log(`🟧 [DynamicForm] xbrlValidationErrors:`, xbrlValidationErrors);\n\n // Find which section this field belongs to using composedPath for Shadow DOM\n let sectionId = '';\n const path = event.composedPath();\n\n console.log(`🟧 [DynamicForm] Event path length: ${path.length}`);\n\n // Traverse the composed path to find the section\n for (const element of path) {\n const el = element as HTMLElement;\n if (el.tagName === 'JUPITER-FORM-SECTION') {\n sectionId = el.getAttribute('section-id') || '';\n console.log(`🟧 [DynamicForm] Found section element with id: ${sectionId}`);\n break;\n }\n }\n\n console.log(`🟧 [DynamicForm] Found sectionId: ${sectionId}`);\n\n // Update error tracking (create new array for Lit reactivity)\n console.log(`🟧 [DynamicForm] Processing errors - has errors: ${xbrlValidationErrors && xbrlValidationErrors.length > 0}`);\n\n if (xbrlValidationErrors && xbrlValidationErrors.length > 0) {\n console.log(`🟧 [DynamicForm] Adding/updating error for fieldId: ${fieldId}, sectionId: ${sectionId}`);\n\n // Get the current value from formData\n const value = this._formData[conceptId]?.[columnId] || '';\n\n // Add or update error entry\n const existingIndex = this._xbrlFormErrors.findIndex(\n e => e.fieldId === fieldId && e.sectionId === sectionId\n );\n\n const newError = {\n sectionId,\n fieldId,\n conceptId,\n columnId,\n value,\n errors: xbrlValidationErrors\n };\n\n console.log(`🟧 [DynamicForm] New error object:`, newError);\n console.log(`🟧 [DynamicForm] Existing index: ${existingIndex}`);\n\n if (existingIndex >= 0) {\n // Update existing error - create new array with updated entry\n this._xbrlFormErrors = [\n ...this._xbrlFormErrors.slice(0, existingIndex),\n newError,\n ...this._xbrlFormErrors.slice(existingIndex + 1)\n ];\n console.log(`🟧 [DynamicForm] Updated existing error at index ${existingIndex}`);\n } else {\n // Add new error - create new array with new entry\n this._xbrlFormErrors = [...this._xbrlFormErrors, newError];\n console.log(`🟧 [DynamicForm] Added new error`);\n }\n } else {\n console.log(`🟧 [DynamicForm] Removing error (if exists) for fieldId: ${fieldId}, sectionId: ${sectionId}`);\n // Remove error entry if validation passed - create new filtered array\n const beforeLength = this._xbrlFormErrors.length;\n this._xbrlFormErrors = this._xbrlFormErrors.filter(\n e => !(e.fieldId === fieldId && e.sectionId === sectionId)\n );\n console.log(`🟧 [DynamicForm] Removed ${beforeLength - this._xbrlFormErrors.length} errors`);\n }\n\n console.log(`🔍 [Validation] Total errors: ${this._xbrlFormErrors.length}`, this._xbrlFormErrors);\n }\n\n private _getSectionTitle(sectionId: string): string {\n console.log(`🔍 [_getSectionTitle] Looking for sectionId: \"${sectionId}\"`);\n console.log(`🔍 [_getSectionTitle] Available sections:`, this._allSections.map(s => ({ id: s.id, title: s.title })));\n const section = this._allSections.find(s => s.id === sectionId);\n const result = section?.title || sectionId || '(Unknown Section)';\n console.log(`🔍 [_getSectionTitle] Result: \"${result}\"`);\n return result;\n }\n\n private _roleHasErrors(roleId: string): boolean {\n return this._xbrlFormErrors.some(error => error.sectionId === roleId);\n }\n\n private async _handleErrorFieldClick(conceptId: string, columnId: string, sectionId: string) {\n console.log(`🎯 [Error Click] Attempting to focus field: ${conceptId}__${columnId} in section: ${sectionId}`);\n\n // Close the error popup\n this._showErrorPopup = false;\n this.requestUpdate();\n\n // Wait for popup to close\n await this.updateComplete;\n\n // CRITICAL: If using side panel layout, switch to the correct section first\n if (this.display === 'sidePanel' && this._activeSidePanelRoleId !== sectionId) {\n console.log(`🔀 Switching to section: ${sectionId} (currently on: ${this._activeSidePanelRoleId})`);\n this._activeSidePanelRoleId = sectionId;\n this.requestUpdate();\n await this.updateComplete;\n // Wait for the section to fully render\n await new Promise(resolve => setTimeout(resolve, 500));\n }\n\n // Find the section element\n const sectionElements = this.shadowRoot?.querySelectorAll('jupiter-form-section');\n let targetSection: any = null;\n\n sectionElements?.forEach((sectionEl: any) => {\n if (sectionEl.section?.id === sectionId) {\n targetSection = sectionEl;\n }\n });\n\n if (!targetSection) {\n console.warn(`⚠️ Section not found: ${sectionId}`);\n return;\n }\n\n console.log(`✅ Found section element:`, targetSection);\n\n // Expand the section if it's collapsed\n if (targetSection.section?.collapsed) {\n console.log(`📂 Expanding collapsed section`);\n targetSection.section.collapsed = false;\n targetSection.requestUpdate();\n await targetSection.updateComplete;\n // Wait a bit more for animation and nested components to render\n await new Promise(resolve => setTimeout(resolve, 500));\n } else {\n // Even if not collapsed, wait for rendering\n await targetSection.updateComplete;\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n\n // Debug: Check shadow DOM availability\n console.log(`🔍 Section shadow DOM exists: ${!!targetSection.shadowRoot}`);\n if (targetSection.shadowRoot) {\n console.log(`🔍 Shadow DOM innerHTML length: ${targetSection.shadowRoot.innerHTML?.length || 0}`);\n\n // Debug: Check what elements exist in shadow DOM\n const allElements = targetSection.shadowRoot.querySelectorAll('*');\n console.log(`🔍 Total elements in shadow DOM: ${allElements.length}`);\n\n // List all custom elements (with proper type casting)\n const customElements = Array.from(allElements).filter((el): el is Element => {\n const element = el as Element;\n return !!(element.tagName && element.tagName.includes('-'));\n });\n console.log(`🔍 Custom elements found:`, customElements.map(el => el.tagName).join(', '));\n }\n\n // Construct the field ID that form-field component uses\n const fieldId = `${conceptId}_${columnId}_field`;\n console.log(`🔍 Looking for input with fieldId: ${fieldId}`);\n console.log(`🔍 Looking for field with conceptId: ${conceptId} AND columnId: ${columnId}`);\n\n // CRITICAL: Form fields are nested inside jupiter-concept-tree elements' shadow DOMs\n // We need to search through concept trees first\n const conceptTrees = targetSection.shadowRoot?.querySelectorAll('jupiter-concept-tree');\n let targetInput: HTMLInputElement | HTMLTextAreaElement | null = null;\n\n console.log(`🔍 Found ${conceptTrees?.length || 0} concept-tree elements`);\n\n // Search through each concept tree's shadow DOM for form-field elements\n if (conceptTrees) {\n conceptTrees.forEach((conceptTree: any, treeIndex: number) => {\n if (targetInput) return; // Already found, skip\n\n const formFieldsInTree = conceptTree.shadowRoot?.querySelectorAll('jupiter-form-field');\n console.log(`🔍 Concept tree ${treeIndex}: Found ${formFieldsInTree?.length || 0} form-field elements`);\n\n formFieldsInTree?.forEach((fieldEl: any, fieldIndex: number) => {\n if (targetInput) return; // Already found, skip\n\n console.log(` Field ${fieldIndex}: conceptId=${fieldEl.conceptId}, columnId=${fieldEl.columnId}`);\n\n // Match by both conceptId AND columnId for precise targeting\n if (fieldEl.conceptId === conceptId && fieldEl.columnId === columnId) {\n // Try to find the input element inside the form-field's shadow DOM\n const inputEl = fieldEl.shadowRoot?.querySelector('input, textarea');\n console.log(` -> Matched! Input element found: ${!!inputEl}`);\n if (inputEl) {\n targetInput = inputEl as HTMLInputElement | HTMLTextAreaElement;\n console.log(`✅ Found input element in form-field`);\n }\n }\n });\n });\n }\n\n if (!targetInput) {\n console.warn(`⚠️ Input field not found for: ${fieldId}`);\n return;\n }\n\n // TypeScript type guard - we know targetInput is not null here\n const input = targetInput as HTMLInputElement | HTMLTextAreaElement;\n\n // Scroll the section into view\n targetSection.scrollIntoView({ behavior: 'smooth', block: 'start' });\n\n // Wait for scroll\n await new Promise(resolve => setTimeout(resolve, 300));\n\n // Focus the input field\n input.focus();\n\n // Select the text if it's an input field\n if (input.tagName === 'INPUT' || input.tagName === 'TEXTAREA') {\n input.select();\n }\n\n // Add a red highlight effect\n input.style.boxShadow = '0 0 0 3px rgba(220, 38, 38, 0.5)';\n setTimeout(() => {\n input.style.boxShadow = '';\n }, 2000);\n\n console.log(`✅ Successfully focused field: ${conceptId}__${columnId}`);\n }\n\n private _handleSectionExpand(event: CustomEvent) {\n this.dispatchEvent(new CustomEvent('section-expand', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _handleConceptExpand(event: CustomEvent) {\n this.dispatchEvent(new CustomEvent('concept-expand', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _handleColumnRemove(event: CustomEvent) {\n const { columnId, sectionId } = event.detail;\n\n // Remove column from ONLY the specific section\n if (this._currentSchema && sectionId) {\n const targetSection = this._currentSchema.sections.find(section => section.id === sectionId);\n if (targetSection && targetSection.columns) {\n targetSection.columns = targetSection.columns.filter(col => col.id !== columnId);\n }\n } else {\n // Fallback: remove from all sections (for backward compatibility)\n this._columns = this._columns.filter(col => col.id !== columnId);\n\n if (this._currentSchema) {\n this._currentSchema.sections.forEach(section => {\n if (section.columns) {\n section.columns = section.columns.filter(col => col.id !== columnId);\n }\n });\n }\n }\n\n // Remove data for this column from the specific section's concepts\n this._removeColumnData(columnId, sectionId);\n\n this._dirty = true;\n this._validateForm();\n this.requestUpdate();\n\n this.dispatchEvent(new CustomEvent('column-remove', {\n detail: { columnId, sectionId },\n bubbles: true\n }));\n }\n\n private _handleColumnAddRequest(event: CustomEvent) {\n const { sectionId, columnRequest, insertAfterColumnId } = event.detail;\n this._addColumnFromRequest(columnRequest, sectionId, insertAfterColumnId);\n }\n\n private _getAvailableDimensionsForSection(sectionId: string): AvailableDimension[] {\n // console.log(`🔍 Getting dimensions for section: ${sectionId}`);\n\n if (!this.xbrlInput?.hypercubes?.[0]) {\n //console.log('❌ No hypercubes data available');\n return [];\n }\n\n //console.log(`📊 Available hypercube roles:`, this.xbrlInput.hypercubes[0].roles.map(r => r.roleId));\n\n const hypercubeRole = this.xbrlInput.hypercubes[0].roles.find(hr => hr.roleId === sectionId);\n\n if (!hypercubeRole?.items?.length) {\n console.log(`❌ No hypercube items found for role: ${sectionId}`);\n return [];\n }\n\n // console.log(`✅ Found hypercube role with ${hypercubeRole.items.length} items`);\n\n const availableDimensions: AvailableDimension[] = [];\n\n // Process all hypercube items to find unique dimensions\n hypercubeRole.items.forEach(item => {\n if (item.dimensions && item.dimensions.length > 0) {\n item.dimensions.forEach(dimension => {\n // Check if we already have this dimension\n if (!availableDimensions.find(d => d.id === dimension.id)) {\n const axisLabel = dimension.labels.find(l => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n\n const availableDimension: AvailableDimension = {\n id: dimension.id,\n conceptName: dimension.conceptName,\n axisLabel: axisLabel\n };\n\n // Add members if available\n if (dimension.members && dimension.members.length > 0) {\n availableDimension.members = dimension.members.map(member => ({\n id: member.id,\n label: member.labels?.find(l => l.role === 'http://www.xbrl.org/2003/role/label')?.label || member.conceptName || member.id\n }));\n }\n\n // Add typed member if available\n if (dimension.typedMember) {\n availableDimension.typedMember = {\n id: dimension.typedMember.id,\n dataType: 'string' // Default to string for now\n };\n }\n\n availableDimensions.push(availableDimension);\n }\n });\n }\n });\n\n // console.log(`📈 Found ${availableDimensions.length} dimensions for section ${sectionId}:`, availableDimensions.map(d => d.axisLabel));\n return availableDimensions;\n }\n\n /**\n * Format period range for display - shows only year when both dates are in same year\n * @param startDate - Period start date in YYYY-MM-DD format\n * @param endDate - Period end date in YYYY-MM-DD format\n * @returns Formatted period string (e.g., \"2025\" or \"2025-01-01 / 2026-12-31\")\n */\n private _formatPeriodDisplay(startDate?: string, endDate?: string): string {\n if (!startDate || !endDate) {\n return `${startDate || ''} / ${endDate || ''}`;\n }\n\n const startYear = startDate.substring(0, 4);\n const endYear = endDate.substring(0, 4);\n\n // If both dates are in the same year, show only the year\n if (startYear === endYear) {\n return startYear;\n }\n\n // Otherwise, show the full date range\n return `${startDate} / ${endDate}`;\n }\n\n private _resolveInstantDate(\n preferredLabel: string | undefined,\n instantDate: string | undefined,\n startDate: string | undefined,\n endDate: string | undefined\n ): string {\n if (preferredLabel?.includes('periodStartLabel')) {\n // One day before periodStartDate (e.g. 2024-01-01 → 2023-12-31)\n const base = startDate || '2025-01-01';\n try {\n const d = new Date(base);\n d.setDate(d.getDate() - 1);\n return d.toISOString().split('T')[0];\n } catch {\n return base;\n }\n }\n // Default: use explicit instantDate, then periodEndDate, then periodStartDate\n return instantDate || endDate || startDate || '2025-01-01';\n }\n\n private _addColumnFromRequest(request: AddColumnRequest, sectionId: string, insertAfterColumnId?: string | null) {\n const timestamp = Date.now();\n const newColumnId = `col-${timestamp}`;\n\n let title = '';\n let description = '';\n\n if (request.periodType === 'instant') {\n title = request.instantDate || '';\n description = '';\n } else if (request.periodType === 'duration' || request.periodType === 'mixed') {\n title = this._formatPeriodDisplay(request.startDate, request.endDate);\n description = '';\n }\n\n // Process selected dimensions from the dialog\n let dimensionData: any = {\n dimensionId: 'period',\n memberValue: request.periodType === 'instant' ?\n `instant-${request.instantDate}` :\n `duration-${request.startDate}-${request.endDate}`,\n memberLabel: title,\n };\n\n // If dimensions were selected in the dialog, use them\n if (request.selectedDimensions && request.selectedDimensions.length > 0) {\n const dimensionParts: string[] = [];\n const dimensionKeys: string[] = [];\n\n for (const dimSelection of request.selectedDimensions) {\n if (dimSelection.isTyped && dimSelection.typedValue) {\n // Typed dimension\n dimensionParts.push(`${dimSelection.axisLabel}: ${dimSelection.typedValue}`);\n dimensionKeys.push(`${dimSelection.axisId}|${dimSelection.typedValue}`);\n } else if (dimSelection.memberId && dimSelection.memberLabel) {\n // Domain dimension with selected member\n dimensionParts.push(dimSelection.memberLabel);\n dimensionKeys.push(`${dimSelection.axisId}|${dimSelection.memberId}`);\n }\n }\n\n // Build title and description to match default column format\n // Title: dimension labels only (e.g., \"Fiscal | Separate\")\n // Description: period display (e.g., \"2025\")\n if (dimensionParts.length > 0) {\n title = dimensionParts.join(' | ');\n description = request.periodType === 'instant' ?\n request.instantDate || '' :\n this._formatPeriodDisplay(request.startDate, request.endDate);\n\n dimensionData = {\n dimensionId: newColumnId,\n memberValue: dimensionParts.join(' | '),\n memberLabel: dimensionParts.join(' | '),\n memberKey: dimensionParts.join(' | '),\n dimensionIdKey: dimensionKeys.join('::'),\n selectedDimensions: request.selectedDimensions\n };\n\n console.log(`📊 Applied selected dimensions to new column: ${dimensionData.memberKey}`);\n }\n } else {\n // Fallback to existing hypercube logic for backwards compatibility\n if (this.xbrlInput?.hypercubes?.[0]) {\n const hypercubeRole = this.xbrlInput.hypercubes[0].roles.find(hr => hr.roleId === sectionId);\n\n if (hypercubeRole?.items?.length === 1) {\n const item = hypercubeRole.items[0];\n if (item.dimensions.length === 1) {\n const dimension = item.dimensions[0];\n if (dimension.members && dimension.members.length > 0) {\n // Find axis label\n const axisLabel = dimension.labels.find(l => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n\n // For manually added columns, we could offer choice or use first member\n // For now, using first member as specified in requirements\n const firstMember = dimension.members[0];\n const memberLabel = firstMember.labels.find(l => l.role === 'http://www.xbrl.org/2003/role/label')?.label || firstMember.conceptName;\n\n // Update title and description to match default column format\n // Title: dimension label only\n // Description: period display\n title = memberLabel;\n description = request.periodType === 'instant' ?\n request.instantDate || '' :\n this._formatPeriodDisplay(request.startDate, request.endDate);\n\n dimensionData = {\n dimensionId: newColumnId,\n axisId: dimension.id,\n memberId: firstMember.id,\n memberValue: memberLabel,\n memberLabel: memberLabel,\n axis: axisLabel,\n axisLabel: axisLabel,\n memberKey: `${axisLabel} | ${memberLabel}`,\n dimensionIdKey: `${dimension.id} | ${firstMember.id}`\n };\n\n console.log(`📊 Applied hypercube dimension to new column: ${dimensionData.memberKey}`);\n }\n }\n }\n }\n }\n\n const newColumn: FormColumn = {\n id: newColumnId,\n title,\n description,\n type: dimensionData.memberKey ? 'dimension' : 'dimension',\n order: this._columns.length,\n removable: true,\n dimensionData,\n // CRITICAL: Add period dates so they can be saved to draft and restored\n periodStartDate: request.periodType === 'instant' ? request.instantDate : request.startDate,\n periodEndDate: request.periodType === 'instant' ? request.instantDate : request.endDate\n };\n\n // Store typed member data for the new column if typed dimensions were selected\n if (request.selectedDimensions && request.selectedDimensions.length > 0) {\n const typedMembers: { [axisId: string]: string } = {};\n let hasTypedDimensions = false;\n\n for (const dimSelection of request.selectedDimensions) {\n if (dimSelection.isTyped) {\n // Initialize typed member data with provided value or empty string\n typedMembers[dimSelection.axisId] = dimSelection.typedValue || '';\n hasTypedDimensions = true;\n //console.log(`💾 Initializing typed member data: ${dimSelection.axisLabel} = \"${dimSelection.typedValue || '(empty - will be entered in column header)'}\"`);\n }\n }\n\n if (hasTypedDimensions) {\n this._typedMemberData[newColumnId] = typedMembers;\n // Update dimension data to indicate it has typed members and include the typed member info\n if (newColumn.dimensionData) {\n newColumn.dimensionData.hasTypedMembers = true;\n // Create typedMembers array for the form-section template\n newColumn.dimensionData.typedMembers = request.selectedDimensions\n .filter(dim => dim.isTyped)\n .map(dim => ({\n axisId: dim.axisId,\n axisLabel: dim.axisLabel,\n typedMemberId: dim.axisId, // Use axisId as typedMemberId for typed dimensions\n memberLabel: dim.axisLabel // Use axisLabel as memberLabel\n }));\n //console.log(`� Added typed members to column dimension data:`, newColumn.dimensionData.typedMembers);\n }\n // console.log(`� Initialized typed member data for column ${newColumnId}:`, typedMembers);\n }\n }\n\n // Add column ONLY to the specific section that requested it\n if (this._currentSchema) {\n const targetSection = this._currentSchema.sections.find(section => section.id === sectionId);\n if (targetSection) {\n if (!targetSection.columns) {\n targetSection.columns = [...this._columns];\n }\n\n // Insert column at the specified position or at the end\n if (insertAfterColumnId) {\n const insertIndex = targetSection.columns.findIndex(col => col.id === insertAfterColumnId);\n if (insertIndex !== -1) {\n // Insert after the specified column\n targetSection.columns = [\n ...targetSection.columns.slice(0, insertIndex + 1),\n newColumn,\n ...targetSection.columns.slice(insertIndex + 1)\n ];\n } else {\n // Column not found, add at the end\n targetSection.columns = [...targetSection.columns, newColumn];\n }\n } else {\n // No position specified, add at the end\n targetSection.columns = [...targetSection.columns, newColumn];\n }\n }\n }\n\n // Replicate form fields for existing concepts in ONLY the target section\n this._replicateFieldsForNewColumn(newColumnId, request, sectionId);\n\n this._dirty = true;\n this.requestUpdate();\n\n this.dispatchEvent(new CustomEvent('column-add', {\n detail: { column: newColumn },\n bubbles: true\n }));\n }\n\n private _removeColumnData(columnId: string, sectionId?: string) {\n if (!this._currentSchema) return;\n\n if (sectionId) {\n // Remove data only for concepts in the specific section\n const targetSection = this._currentSchema.sections.find(section => section.id === sectionId);\n if (targetSection) {\n this._removeColumnDataFromConcepts(targetSection.concepts, columnId);\n }\n } else {\n // Remove data for all concepts in all sections\n for (const conceptId in this._formData) {\n if (this._formData[conceptId][columnId] !== undefined) {\n delete this._formData[conceptId][columnId];\n }\n }\n }\n }\n\n private _removeColumnDataFromConcepts(concepts: ConceptTree[], columnId: string) {\n concepts.forEach(concept => {\n // Remove form data for this concept and column\n if (this._formData[concept.id] && this._formData[concept.id][columnId] !== undefined) {\n delete this._formData[concept.id][columnId];\n }\n\n // Remove field from concept's fields array\n if (concept.fields) {\n concept.fields = concept.fields.filter(field => field.columnId !== columnId);\n }\n\n // Recursively process children\n if (concept.children) {\n this._removeColumnDataFromConcepts(concept.children, columnId);\n }\n });\n }\n\n private _shouldCreateFieldForConcept(concept: ConceptTree, request: AddColumnRequest): boolean {\n // Don't create fields for abstract concepts\n if (concept.abstract) {\n return false;\n }\n\n // CRITICAL FIX: For dimension columns (when selectedDimensions are provided),\n // we should NOT filter by period type. Each field will have its own period control (📅 button).\n // This allows mixed sections to show both instant and duration concepts in the same column.\n const isDimensionColumn = request.selectedDimensions && request.selectedDimensions.length > 0;\n\n // Check period type compatibility ONLY for non-dimension columns\n if (!isDimensionColumn && concept.periodType) {\n if (request.periodType === 'instant' && concept.periodType !== 'instant') {\n return false;\n }\n if (request.periodType === 'duration' && concept.periodType !== 'duration') {\n return false;\n }\n }\n\n return true;\n }\n\n private _replicateFieldsForNewColumn(columnId: string, request: AddColumnRequest, sectionId: string) {\n if (!this._currentSchema) return;\n\n // Build fields for the new column for ONLY the specific section\n const formBuilder = new XBRLFormBuilder();\n\n const targetSection = this._currentSchema.sections.find(section => section.id === sectionId);\n if (targetSection) {\n this._replicateFieldsForSection(targetSection.concepts, columnId, request, formBuilder);\n }\n }\n\n private _replicateFieldsForSection(concepts: ConceptTree[], columnId: string, request: AddColumnRequest, formBuilder: XBRLFormBuilder) {\n concepts.forEach(concept => {\n // Check if we should create a field for this concept in the new column\n if (this._shouldCreateFieldForConcept(concept, request)) {\n // Create a new field manually based on existing field structure or from scratch\n const existingField = concept.fields?.[0]; // Use first existing field as template\n\n let field: FormField;\n const colStartDate = request.periodType === 'instant' ? request.instantDate : request.startDate;\n const colEndDate = request.periodType === 'instant' ? request.instantDate : request.endDate;\n const instantDate = this._resolveInstantDate(concept.preferredLabel, request.instantDate, colStartDate, colEndDate);\n\n if (existingField) {\n // Template from existing field\n field = {\n id: `${concept.id}_${columnId}`,\n conceptId: concept.id,\n columnId: columnId,\n type: existingField.type,\n label: existingField.label,\n placeholder: existingField.placeholder,\n required: existingField.required,\n disabled: existingField.disabled,\n validation: existingField.validation,\n defaultValue: existingField.defaultValue,\n periodType: concept.periodType,\n conceptType: concept.type,\n periodStartDate: colStartDate,\n periodEndDate: colEndDate,\n periodInstantDate: concept.periodType === 'instant' ? instantDate : undefined\n };\n } else {\n // Create field from scratch for concepts without existing fields\n field = {\n id: `${concept.id}_${columnId}`,\n conceptId: concept.id,\n columnId: columnId,\n type: 'text' as FieldType,\n label: concept.label || concept.name,\n placeholder: `Enter ${concept.name}`,\n required: false,\n disabled: false,\n validation: [],\n defaultValue: '',\n periodType: concept.periodType,\n conceptType: concept.type,\n periodStartDate: colStartDate,\n periodEndDate: colEndDate,\n periodInstantDate: concept.periodType === 'instant' ? instantDate : undefined\n };\n }\n\n // Add field to concept's fields array\n if (!concept.fields) {\n concept.fields = [];\n }\n concept.fields.push(field);\n }\n\n // Recursively process children\n if (concept.children) {\n this._replicateFieldsForSection(concept.children, columnId, request, formBuilder);\n }\n });\n }\n\n private _addColumn() {\n // This would typically open a dialog to configure the new dimension column\n // For now, we'll add a generic dimension column\n const newColumnId = `dim-${Date.now()}`;\n const newColumn: FormColumn = {\n id: newColumnId,\n title: `Dimension ${this._columns.length}`,\n description: 'Additional dimension column',\n type: 'dimension',\n order: this._columns.length,\n removable: true,\n dimensionData: {\n dimensionId: 'custom',\n memberValue: 'default',\n memberLabel: 'Default Member',\n }\n };\n\n this._columns = [...this._columns, newColumn];\n this.requestUpdate();\n\n this.dispatchEvent(new CustomEvent('column-add', {\n detail: { column: newColumn },\n bubbles: true\n }));\n }\n\n private _handleSubmit() {\n console.log('📝 Form submission started...');\n this._submitted = true;\n\n // Disable submit button immediately to prevent double-clicks\n this._submitDisabled = true;\n\n // Admin mode: Save draft first, then update and print presentation data\n if (this.mode === 'admin') {\n this._handleSaveDraft();\n this._handleAdminModeSubmit();\n this._submitDisabled = false;\n return;\n }\n\n // Input form mode: Check for XBRL validation errors before submission\n console.log(`🔵 [Submit] Checking for errors...`);\n console.log(`🔵 [Submit] _xbrlFormErrors.length: ${this._xbrlFormErrors.length}`);\n console.log(`🔵 [Submit] _xbrlFormErrors:`, this._xbrlFormErrors);\n\n if (this._xbrlFormErrors.length > 0) {\n console.log('❌ [Submit] Cannot submit - validation errors present:', this._xbrlFormErrors);\n this._showErrorPopup = true;\n this._submitDisabled = false; // Re-enable — user must fix errors and retry\n this.requestUpdate();\n return;\n }\n\n console.log(`✅ [Submit] No validation errors, proceeding with submission...`);\n\n // Input form mode: Regular validation and submission\n this._validateForm();\n\n // Block submission when form-level validation found errors\n if (!this._valid) {\n console.log('❌ [Submit] Cannot submit - form validation errors present:', this._errors);\n this._showErrorPopup = true;\n this._submitDisabled = false; // Re-enable — user must fix errors and retry\n this.requestUpdate();\n return;\n }\n\n // Generate submission data in the required format\n const submissionData = this._generateSubmissionData();\n\n // Log final submission data for debugging\n console.log('📊 Form Submission Data:', JSON.stringify(submissionData, null, 2));\n console.log('📊 Submission Data Summary:');\n submissionData.forEach((entry, index) => {\n console.log(` [${index}] conceptId: ${entry.conceptId}, columnId: ${entry.columnId}, value: ${entry.value}, unit: ${entry.unit || 'none'}`);\n });\n\n this.dispatchEvent(new CustomEvent('form-submit', {\n detail: {\n data: this._formData,\n submissionData: submissionData,\n valid: this._valid,\n errors: this._errors,\n reportingLanguage: this.reportingLanguage\n },\n bubbles: true\n }));\n\n console.log('✅ Form submit event dispatched');\n\n // Re-enable submit button 1 second after the event fires\n setTimeout(() => {\n this._submitDisabled = false;\n }, 1000);\n }\n\n private _handleSaveDraft(source: 'manual' | 'auto' = 'manual') {\n\n console.log(`🔵 [Save Draft] Checking for errors...`);\n console.log(`🔵 [Save Draft] _xbrlFormErrors.length: ${this._xbrlFormErrors.length}`);\n console.log(`🔵 [Save Draft] _xbrlFormErrors:`, this._xbrlFormErrors);\n\n // Check for validation errors before saving\n if (this._xbrlFormErrors.length > 0) {\n console.log('❌ [Save Draft] Cannot save - validation errors present:', this._xbrlFormErrors);\n this._showErrorPopup = true;\n this.requestUpdate();\n return; // Stop execution\n }\n\n console.log(`✅ [Save Draft] No validation errors, proceeding with save...`);\n console.log('💾 Raw form data before submission generation:', this._formData);\n console.log('🏷️ Unit data before submission generation:', this._unitData);\n console.log('📋 Enhanced selectedRoleIds with roleURI and order:', this._selectedRoleIds);\n\n // Generate draft data in the same format as submission\n const draftData = this._generateSubmissionData();\n\n console.log('📤 Generated submission data:', draftData);\n console.log('📊 Submission data breakdown:');\n draftData.forEach((entry, index) => {\n console.log(` [${index}] conceptId: ${entry.conceptId}, columnId: ${entry.columnId}, value: ${entry.value}, unit: ${entry.unit || 'none'}`);\n });\n\n // Create metadata snapshot with enhanced selectedRoleIds structure (includes roleURI and order)\n const roleCompletedStates = this._roleCompletedStates.size > 0\n ? Object.fromEntries(this._roleCompletedStates)\n : undefined;\n\n const metadata = this._draftStorageService.createMetadataSnapshot(\n this.periodStartDate,\n this.periodEndDate,\n this.language,\n this._selectedRoleIds, // Enhanced structure: Array<{ roleId, roleURI, order }> or string[]\n this._allSections,\n this._typedMemberData,\n this._periodPreferences,\n this._periodData,\n this._unitData,\n this.reportingLanguage,\n this._repeatCounts,\n this._decimalsData,\n roleCompletedStates\n );\n\n // Emit/save only when actual draft payload changed.\n const draftPayloadSnapshot = JSON.stringify({\n draftData,\n metadata\n });\n\n if (draftPayloadSnapshot === this._lastSavedDraftSnapshot) {\n console.log(`ℹ️ [Save Draft] No draft content change detected (${source}); skipping event emit.`);\n return;\n }\n\n this._lastSavedDraftSnapshot = draftPayloadSnapshot;\n\n // Save to localStorage (optional - for browser persistence)\n const saved = this._draftStorageService.saveDraft(draftData, metadata);\n\n console.log('💾 [Save Draft] Metadata saved with enhanced selectedRoleIds:', metadata.selectedRoleIds);\n\n // Update the @Input properties with current draft data\n // Consumer application can bind to these properties to persist to database\n this.dynaformsFacts = draftData;\n this.dynaformsMetadata = metadata;\n\n // Emit event with JSON data for consumer application to catch and persist\n this.dispatchEvent(new CustomEvent('form-save-draft', {\n detail: {\n data: this._formData,\n draftData: draftData,\n metadata: metadata,\n saved: saved,\n valid: this._valid,\n errors: this._errors,\n // JSON data ready for external database storage\n dynaformsFacts: draftData,\n dynaformsMetadata: metadata,\n reportingLanguage: this.reportingLanguage,\n source: source == 'auto' ? 'auto' : 'manual'\n },\n bubbles: true,\n composed: true\n }));\n\n const roleCount = this._getRoleIdsArray().length;\n console.log('💾 Draft saved - localStorage + event emitted', {\n entries: draftData.length,\n saved: saved,\n roles: roleCount,\n customColumns: metadata.customColumns.length,\n eventEmitted: true,\n enhancedRoleStructure: Array.isArray(this._selectedRoleIds) && this._selectedRoleIds.length > 0 && typeof this._selectedRoleIds[0] === 'object'\n });\n }\n\n // ===========================================\n // Draft Loading & Restoration\n // ===========================================\n\n private async _loadDraftIfExists() {\n console.log('📋 Checking for saved draft...');\n\n // Priority 1: Check if external draft data was provided via properties\n if (this.dynaformsFacts && this.dynaformsMetadata) {\n console.log('📦 Using external draft data from properties');\n const draft = {\n formData: this.dynaformsFacts,\n metadata: this.dynaformsMetadata\n };\n\n await this._restoreFromDraft(draft);\n\n // Set draft loaded state\n this._draftLoaded = true;\n this._draftLoadedAt = this.dynaformsMetadata.savedAt || new Date().toISOString();\n\n // Dispatch event\n this.dispatchEvent(new CustomEvent('form-draft-loaded', {\n detail: {\n draft: draft,\n source: 'external',\n compatible: true,\n warnings: []\n },\n bubbles: true,\n composed: true\n }));\n\n console.log('📥 External draft loaded successfully');\n return;\n }\n\n // Priority 2: Check localStorage\n if (!this._draftStorageService.hasDraft()) {\n console.log('ℹ️ No saved draft found');\n return;\n }\n\n const draft = this._draftStorageService.loadDraft();\n if (!draft) {\n console.warn('⚠️ Failed to load draft');\n return;\n }\n\n // Validate draft compatibility\n const { compatible, warnings } = this._draftStorageService.validateDraftCompatibility(\n draft,\n this.periodStartDate,\n this.periodEndDate\n );\n\n if (warnings.length > 0) {\n console.warn('⚠️ Draft compatibility warnings:', warnings);\n }\n\n // Restore the form state\n await this._restoreFromDraft(draft);\n\n // Dispatch event to notify parent application\n this.dispatchEvent(new CustomEvent('form-draft-loaded', {\n detail: {\n draft: draft,\n compatible: compatible,\n warnings: warnings\n },\n bubbles: true,\n composed: true\n }));\n\n console.log('📥 Draft loaded successfully', {\n entries: draft.formData.length,\n savedAt: draft.metadata.savedAt,\n age: this._draftStorageService.getDraftAge()\n });\n }\n\n private async _restoreFromDraft(draft: any) {\n const { formData, metadata } = draft;\n\n // 1. Restore metadata state\n if (metadata.selectedRoleIds && metadata.selectedRoleIds.length > 0) {\n this._selectedRoleIds = metadata.selectedRoleIds;\n console.log(`🔄 Restored ${this._selectedRoleIds.length} selected roles`);\n }\n\n if (metadata.typedMemberData) {\n this._typedMemberData = metadata.typedMemberData;\n this._preservedTypedMemberData = {}; // Clear preserved typed data when restoring\n console.log('🔄 Restored typed member data');\n }\n\n if (metadata.repeatCounts) {\n this._repeatCounts = metadata.repeatCounts;\n console.log('🔄 Restored repeat counts:', this._repeatCounts);\n }\n\n if (metadata.periodData) {\n this._periodData = metadata.periodData;\n console.log('🔄 Restored custom field-level period data:', Object.keys(this._periodData).length, 'concepts');\n }\n\n if (metadata.unitData) {\n this._unitData = metadata.unitData;\n console.log('🔄 Restored custom field-level unit data:', Object.keys(this._unitData).length, 'concepts');\n }\n\n if (metadata.decimalsData) {\n this._decimalsData = metadata.decimalsData;\n console.log('🔄 Restored per-fact decimals data:', Object.keys(this._decimalsData).length, 'concepts');\n }\n\n if (metadata.roleCompletedStates) {\n this._roleCompletedStates = new Map(Object.entries(metadata.roleCompletedStates));\n console.log('🔄 Restored role completed states:', Object.keys(metadata.roleCompletedStates).length, 'roles');\n }\n\n if (metadata.periodPreferences) {\n // CRITICAL: Skip restoration if we're intentionally changing period preferences\n if (this._skipPeriodPreferencesRestore) {\n console.log('⏭️ Skipping period preferences restoration - using new filter selections');\n } else {\n this._periodPreferences = metadata.periodPreferences;\n console.log('🔄 Restored period preferences (including previous year settings):', this._periodPreferences);\n\n // CRITICAL: Rebuild schema with restored period preferences\n // This ensures default columns (like previous year) are generated correctly\n if (this.xbrlInput) {\n console.log('🔄 Rebuilding schema with restored period preferences...');\n this._currentSchema = XBRLFormBuilder.buildFormSchema(\n this.xbrlInput,\n this.periodStartDate,\n this.periodEndDate,\n this.language,\n this._periodPreferences\n );\n\n // Update all sections with the rebuilt schema — keep the full pool intact\n // (roleFilterAxes only narrows the initial selection, not the available pool)\n this._allSections = [...this._currentSchema.sections];\n\n console.log('✅ Schema rebuilt with restored period preferences');\n\n // CRITICAL: Apply custom period data to fields after schema rebuild\n // This must happen BEFORE custom columns are merged\n console.log('🔄 Applying custom period data to schema fields...');\n this._applyCustomPeriodDataToFields();\n\n // IMPORTANT: After rebuilding, merge any additional custom columns that were manually added\n // (but DON'T replace default columns like duration, instant, previous year)\n if (metadata.customColumns && metadata.customColumns.length > 0) {\n this._mergeAdditionalCustomColumns(metadata.customColumns);\n console.log(`🔄 Merged ${metadata.customColumns.length} additional custom columns`);\n }\n }\n }\n } else {\n // If no period preferences to restore, use the old logic of restoring columns directly\n // 2. Restore custom columns structure (only if schema wasn't rebuilt)\n if (metadata.customColumns && metadata.customColumns.length > 0) {\n this._restoreCustomColumns(metadata.customColumns);\n console.log(`🔄 Restored ${metadata.customColumns.length} custom columns`);\n }\n }\n\n // 2. Convert submission data back to FormData structure AND extract custom period data AND unit data\n const restoredFormData: any = {};\n const restoredPeriodData: { [conceptId: string]: { [columnId: string]: { startDate?: string; endDate?: string; instantDate?: string } } } = {};\n const restoredUnitData: { [conceptId: string]: { [columnId: string]: string } } = {};\n\n formData.forEach((entry: any) => {\n let { conceptId, draftInstanceId, value, columnId, period, unit } = entry;\n\n // Fallback: Infer columnId from period data if missing (for old draft format)\n if (!columnId && period) {\n columnId = this._inferColumnIdFromPeriod(period, conceptId);\n if (!columnId) {\n console.warn(`⚠️ Could not infer columnId for concept ${conceptId}, skipping...`);\n return;\n }\n }\n\n // For repeat instances, draftInstanceId is the synthetic key (e.g. \"conceptId__repeat_1\").\n // For base instances it equals conceptId. Fall back to conceptId for older draft formats.\n const instanceKey = draftInstanceId || conceptId;\n\n // Find the actual concept in sections to get the correct ID (might have suffix).\n // Only apply suffix-lookup for the base concept part (not the __repeat_ suffix).\n const baseConceptId = instanceKey.includes('__repeat_')\n ? instanceKey.split('__repeat_')[0]\n : instanceKey;\n const actualBaseId = this._findActualConceptId(baseConceptId);\n const conceptIdToUse = instanceKey.includes('__repeat_')\n ? `${actualBaseId || baseConceptId}__repeat_${instanceKey.split('__repeat_')[1]}`\n : (actualBaseId || instanceKey);\n\n if (!restoredFormData[conceptIdToUse]) {\n restoredFormData[conceptIdToUse] = {};\n }\n\n restoredFormData[conceptIdToUse][columnId] = value;\n console.log(`📦 Restored: ${conceptIdToUse}[${columnId}] = ${value}${instanceKey !== conceptId ? ` (repeat instance)` : ''}`);\n\n // CRITICAL: Extract custom period data from submission entries\n if (period) {\n if (!restoredPeriodData[conceptIdToUse]) {\n restoredPeriodData[conceptIdToUse] = {};\n }\n\n if (period.type === 'instant') {\n restoredPeriodData[conceptIdToUse][columnId] = {\n instantDate: period.date\n };\n console.log(`📅 [Restore Period] Extracted instant date for ${conceptIdToUse}/${columnId}: ${period.date}`);\n } else if (period.type === 'duration') {\n restoredPeriodData[conceptIdToUse][columnId] = {\n startDate: period.startDate,\n endDate: period.endDate\n };\n console.log(`📅 [Restore Period] Extracted duration dates for ${conceptIdToUse}/${columnId}: ${period.startDate} - ${period.endDate}`);\n }\n }\n\n // CRITICAL: Extract custom unit data from submission entries\n if (unit) {\n if (!restoredUnitData[conceptIdToUse]) {\n restoredUnitData[conceptIdToUse] = {};\n }\n restoredUnitData[conceptIdToUse][columnId] = unit;\n console.log(`🏷️ [Restore Unit] Extracted unit for ${conceptIdToUse}/${columnId}: ${unit}`);\n }\n });\n\n // 3. Apply restored data to form data\n this._formData = { ...this._formData, ...restoredFormData };\n console.log(`🔄 Restored ${Object.keys(restoredFormData).length} concepts with data`);\n\n // Recompute global decimals default from restored rounding-level value\n // when decimals was not explicitly provided.\n this._initializeGlobalDecimalsFromRoundingData();\n\n // 3a. CRITICAL: Merge restored period data from submission entries with metadata periodData\n // Priority: submission period data (most recent) > metadata periodData (backup)\n this._periodData = {\n ...this._periodData,\n ...(metadata.periodData || {}),\n ...restoredPeriodData\n };\n console.log(`📅 [Period Restore] Merged period data: ${Object.keys(this._periodData).length} concepts with custom periods`);\n console.log(`📅 [Period Restore] Full _periodData after merge:`, JSON.stringify(this._periodData, null, 2));\n\n // 3b. CRITICAL: Merge restored unit data from submission entries with metadata unitData\n // Priority: submission unit data (most recent) > metadata unitData (backup)\n this._unitData = {\n ...this._unitData,\n ...(metadata.unitData || {}),\n ...restoredUnitData\n };\n console.log(`🏷️ [Unit Restore] Merged unit data: ${Object.keys(this._unitData).length} concepts with custom units`);\n console.log(`🏷️ [Unit Restore] Full _unitData after merge:`, JSON.stringify(this._unitData, null, 2));\n\n // 4. Apply role filter to show selected sections\n if (this._selectedRoleIds.length > 0) {\n this._applyRoleFilter();\n }\n\n // 5. Mark form as dirty since it has restored data\n this._dirty = true;\n this._touched.clear(); // Clear touched state since this is a restoration\n\n // 6. Validate restored data\n this._validateForm();\n\n // 7. Force a complete re-render by reassigning the sections array\n this._allSections = [...this._allSections];\n this.requestUpdate();\n\n // 8. Wait for the update to complete and all child components to render\n await this.updateComplete;\n\n // 9. Wait a bit more for nested components\n await new Promise(resolve => setTimeout(resolve, 100));\n\n // 10. Now populate the field values\n const fieldCount = this.shadowRoot?.querySelectorAll('input, textarea, select').length || 0;\n console.log(`🔍 Found ${fieldCount} fields in DOM after update`);\n\n if (fieldCount > 0) {\n this._populateFieldValues(restoredFormData);\n } else {\n console.error('❌ No fields found in DOM even after updateComplete');\n }\n\n console.log('✅ Draft restoration completed');\n }\n\n private _findActualConceptId(conceptId: string): string | null {\n // Try to find the concept in all sections\n // The concept might be stored with original ID but field uses suffixed ID\n for (const section of this._allSections) {\n const found = this._findActualConceptIdInTree(section.concepts, conceptId);\n if (found) return found;\n }\n return null;\n }\n\n private _findActualConceptIdInTree(concepts: ConceptTree[], conceptId: string): string | null {\n for (const concept of concepts) {\n // Match by originalConceptId or id\n if (concept.originalConceptId === conceptId || concept.id === conceptId) {\n return concept.id; // Return the actual ID used in fields\n }\n if (concept.children) {\n const found = this._findActualConceptIdInTree(concept.children, conceptId);\n if (found) return found;\n }\n }\n return null;\n }\n\n private _inferColumnIdFromPeriod(period: any, conceptId: string): string | null {\n // Find the concept in all sections\n for (const section of this._allSections) {\n const concept = this._findConceptInSection(section.concepts, conceptId);\n if (concept && section.columns) {\n // Try to match period with available columns\n for (const column of section.columns) {\n const isInstant = period.type === 'instant';\n const isDuration = period.type === 'duration';\n\n if (isInstant && period.date) {\n // Match instant period with column date\n if (column.periodStartDate === period.date ||\n (column.periodStartDate === column.periodEndDate && column.periodStartDate === period.date)) {\n console.log(`✓ Inferred columnId: ${column.id} for concept ${conceptId}`);\n return column.id;\n }\n } else if (isDuration && period.startDate && period.endDate) {\n // Match duration period with column date range\n if (column.periodStartDate === period.startDate && column.periodEndDate === period.endDate) {\n console.log(`✓ Inferred columnId: ${column.id} for concept ${conceptId}`);\n return column.id;\n }\n }\n }\n\n // Fallback: Use default column based on period type\n if (period.type === 'instant') {\n const instantCol = section.columns.find(c => c.id === 'instant');\n if (instantCol) return instantCol.id;\n } else {\n const durationCol = section.columns.find(c => c.id === 'duration');\n if (durationCol) return durationCol.id;\n }\n }\n }\n return null;\n }\n\n private _findConceptInSection(concepts: ConceptTree[], conceptId: string): ConceptTree | null {\n for (const concept of concepts) {\n if (concept.id === conceptId || concept.originalConceptId === conceptId) {\n return concept;\n }\n if (concept.children) {\n const found = this._findConceptInSection(concept.children, conceptId);\n if (found) return found;\n }\n }\n return null;\n }\n\n private _populateFieldValues(formData: any) {\n let populatedCount = 0;\n let notFoundCount = 0;\n\n console.log('🔍 Starting field population...');\n console.log('📦 Form data to populate:', formData);\n\n // Iterate through all concepts and columns to populate field values\n Object.keys(formData).forEach(conceptId => {\n const conceptData = formData[conceptId];\n\n Object.keys(conceptData).forEach(columnId => {\n const value = conceptData[columnId];\n\n // The field ID format is: conceptId__columnId (double underscore)\n const fieldId = `${conceptId}__${columnId}`;\n\n console.log(`🔍 Looking for field: ${fieldId}`);\n\n // Find the input element by ID\n const fieldElement = this.shadowRoot?.querySelector(`#${CSS.escape(fieldId)}`);\n\n if (fieldElement) {\n if (fieldElement instanceof HTMLInputElement ||\n fieldElement instanceof HTMLTextAreaElement ||\n fieldElement instanceof HTMLSelectElement) {\n\n if (fieldElement.type === 'checkbox') {\n (fieldElement as HTMLInputElement).checked = Boolean(value);\n } else {\n fieldElement.value = value !== null && value !== undefined ? String(value) : '';\n }\n\n console.log(` ✅ Populated field ${fieldId} with value:`, value);\n populatedCount++;\n }\n } else {\n console.warn(` ❌ Field element NOT FOUND: ${fieldId}`);\n console.warn(` Available fields in DOM:`, Array.from(this.shadowRoot?.querySelectorAll('input, textarea, select') || []).map(el => el.id).filter(id => id.includes(conceptId.split('__')[0])));\n notFoundCount++;\n }\n });\n });\n\n console.log(`✅ Field population complete: ${populatedCount} populated, ${notFoundCount} not found`);\n }\n\n private _restoreCustomColumns(customColumns: any[]) {\n // Group columns by section ID\n const columnsBySection = new Map<string, any[]>();\n\n customColumns.forEach(col => {\n if (!columnsBySection.has(col.sectionId)) {\n columnsBySection.set(col.sectionId, []);\n }\n columnsBySection.get(col.sectionId)!.push(col);\n });\n\n // Apply columns to each section\n this._allSections.forEach(section => {\n const savedColumns = columnsBySection.get(section.id);\n if (savedColumns) {\n // Reconstruct FormColumn objects from saved metadata\n section.columns = savedColumns.map(col => {\n const column: FormColumn = {\n id: col.columnId,\n title: col.label,\n description: col.description, // Restore description (period display)\n type: col.dimensionData ? 'dimension' : 'base',\n periodStartDate: col.startDate || col.date,\n periodEndDate: col.endDate || col.date,\n dimensionData: col.dimensionData,\n order: 0,\n removable: col.columnId !== 'duration' && col.columnId !== 'instant',\n periodType: col.periodType // CRITICAL: Preserve explicit period type\n };\n console.log(`📅 [Draft Restore] Restoring column ${col.columnId}: title=${column.title}, description=${column.description}, startDate=${column.periodStartDate}, endDate=${column.periodEndDate}, periodType=${column.periodType}`);\n return column;\n });\n\n // CRITICAL: Ensure datatypes are available for field generation\n if (this.xbrlInput?.datatypes && !section.datatypes) {\n // Handle both array and wrapped formats\n const datatypesArray = Array.isArray(this.xbrlInput.datatypes)\n ? this.xbrlInput.datatypes\n : this.xbrlInput.datatypes.concepts || [];\n section.datatypes = datatypesArray;\n console.log(`✅ [Draft Restore] Attached ${datatypesArray.length} datatypes to section ${section.id}`);\n } else if (section.datatypes) {\n console.log(`ℹ️ [Draft Restore] Section ${section.id} already has ${section.datatypes.length} datatypes`);\n } else {\n console.warn(`⚠️ [Draft Restore] No datatypes available for section ${section.id}`);\n }\n\n // Regenerate fields for concepts to include the restored columns\n this._regenerateFieldsForSection(section);\n\n console.log(` └─ Restored ${savedColumns.length} columns for section ${section.id}`);\n }\n });\n\n // Update current schema with restored sections\n if (this._currentSchema) {\n this._currentSchema = {\n ...this._currentSchema,\n sections: this._allSections\n };\n }\n }\n\n /**\n * Merge additional custom columns that were manually added by user\n * This preserves default columns (duration, instant, previous year) generated by schema builder\n * and only adds custom columns that don't already exist\n */\n private _mergeAdditionalCustomColumns(customColumns: any[]) {\n // Group columns by section ID\n const columnsBySection = new Map<string, any[]>();\n\n customColumns.forEach(col => {\n // Only merge columns that were manually added (e.g., col-123456)\n // Skip default columns like 'duration', 'instant', 'duration_prev', 'instant_prev', 'duration_0', etc.\n const isManuallyAdded = col.columnId.startsWith('col-');\n if (isManuallyAdded) {\n if (!columnsBySection.has(col.sectionId)) {\n columnsBySection.set(col.sectionId, []);\n }\n columnsBySection.get(col.sectionId)!.push(col);\n }\n });\n\n // Add custom columns to each section without replacing existing columns\n this._allSections.forEach(section => {\n const customColumnsForSection = columnsBySection.get(section.id);\n if (customColumnsForSection && customColumnsForSection.length > 0) {\n if (!section.columns) {\n section.columns = [];\n }\n\n // CRITICAL: Ensure datatypes are available for field generation\n if (this.xbrlInput?.datatypes && !section.datatypes) {\n // Handle both array and wrapped formats\n const datatypesArray = Array.isArray(this.xbrlInput.datatypes)\n ? this.xbrlInput.datatypes\n : this.xbrlInput.datatypes.concepts || [];\n section.datatypes = datatypesArray;\n console.log(`✅ [Merge Custom] Attached ${datatypesArray.length} datatypes to section ${section.id}`);\n } else if (section.datatypes) {\n console.log(`ℹ️ [Merge Custom] Section ${section.id} already has ${section.datatypes.length} datatypes`);\n } else {\n console.warn(`⚠️ [Merge Custom] No datatypes available for section ${section.id}`);\n }\n\n // Add each custom column if it doesn't already exist\n customColumnsForSection.forEach(col => {\n console.log(`📅 [Merge Custom Column] Column ${col.columnId}: col.startDate=${col.startDate}, col.endDate=${col.endDate}, col.date=${col.date}, col.periodType=${col.periodType}`);\n const existingColumn = section.columns!.find(c => c.id === col.columnId);\n if (!existingColumn) {\n const newColumn: FormColumn = {\n id: col.columnId,\n title: col.label,\n description: col.description, // Restore description (period display)\n type: col.dimensionData ? 'dimension' : 'base',\n periodStartDate: col.startDate || col.date,\n periodEndDate: col.endDate || col.date,\n dimensionData: col.dimensionData,\n order: section.columns!.length,\n removable: true,\n periodType: col.periodType // CRITICAL: Preserve explicit period type\n };\n console.log(`📅 [New Column Created] Column ${newColumn.id}: title=${newColumn.title}, description=${newColumn.description}, periodStartDate=${newColumn.periodStartDate}, periodEndDate=${newColumn.periodEndDate}, periodType=${newColumn.periodType}`);\n section.columns!.push(newColumn);\n console.log(` └─ Added custom column ${col.columnId} to section ${section.id}`);\n }\n });\n\n // Regenerate fields for concepts to include the merged columns\n this._regenerateFieldsForSection(section);\n }\n });\n\n // Update current schema with merged sections\n if (this._currentSchema) {\n this._currentSchema = {\n ...this._currentSchema,\n sections: this._allSections\n };\n }\n }\n\n /**\n * Apply custom period data from _periodData to all existing fields\n * This is called after schema rebuild to preserve user-modified period dates\n */\n private _applyCustomPeriodDataToFields() {\n if (!this._periodData || Object.keys(this._periodData).length === 0) {\n console.log('ℹ️ No custom period data to apply');\n return;\n }\n\n let appliedCount = 0;\n\n // Recursive function to traverse concept trees\n const applyToConceptTree = (concepts: ConceptTree[]) => {\n concepts.forEach(concept => {\n // Check if this concept has custom period data\n if (this._periodData[concept.id]) {\n const conceptPeriodData = this._periodData[concept.id];\n\n // Apply to each field in this concept\n if (concept.fields) {\n concept.fields.forEach(field => {\n const customPeriod = conceptPeriodData[field.columnId];\n if (customPeriod) {\n // Apply custom period dates\n if (customPeriod.startDate) {\n field.periodStartDate = customPeriod.startDate;\n }\n if (customPeriod.endDate) {\n field.periodEndDate = customPeriod.endDate;\n }\n if (customPeriod.instantDate) {\n field.periodInstantDate = customPeriod.instantDate;\n }\n appliedCount++;\n console.log(`✅ [Apply Period] Updated field ${concept.id}/${field.columnId}: start=${field.periodStartDate}, end=${field.periodEndDate}, instant=${field.periodInstantDate}`);\n }\n });\n }\n }\n\n // Recursively apply to children\n if (concept.children && concept.children.length > 0) {\n applyToConceptTree(concept.children);\n }\n });\n };\n\n // Apply to all sections\n this._allSections.forEach(section => {\n if (section.concepts && section.concepts.length > 0) {\n applyToConceptTree(section.concepts);\n }\n });\n\n console.log(`📅 [Apply Period] Applied custom period data to ${appliedCount} fields`);\n }\n\n private _regenerateFieldsForSection(section: FormSection) {\n if (!section.columns) return;\n\n // Get period preferences for this section to respect concept filtering\n const sectionPreferences = this._periodPreferences[section.id] || {\n showDuration: true,\n showInstant: true,\n showPreviousYear: false\n };\n\n // Recursively regenerate fields for all concepts\n const regenerateConcepts = (concepts: ConceptTree[]) => {\n concepts.forEach(concept => {\n // Clear existing fields\n concept.fields = [];\n\n // Check if concept should be visible based on period preferences\n const shouldShowConcept = this._shouldShowConceptBasedOnPeriodPreferences(\n concept,\n sectionPreferences\n );\n\n // Only create fields if concept should be visible\n if (shouldShowConcept) {\n // Create fields for each column\n section.columns!.forEach(column => {\n // Only create field if period type matches or is compatible\n const conceptPeriodType = concept.periodType;\n const columnPeriodType = this._inferColumnPeriodType(column);\n\n // Skip abstract concepts without values\n if (concept.abstract) return;\n\n // CRITICAL FIX: For merged columns (where both duration and instant concepts appear),\n // we should NOT filter by period type since each field has its own period controls.\n // Only filter if we have explicit period-specific columns (like 'instant' or duration with typed dimensions)\n // Skip period checking for:\n // - Custom columns (col-*) in mixed sections\n // - Dimension columns (duration_*, instant_*) which are always merged\n // - Default columns ('duration', 'default')\n const isCustomColumn = column.id.startsWith('col-');\n const isDimensionColumn =\n column.id.startsWith('duration_') ||\n column.id.startsWith('instant_') ||\n column.id.startsWith('typed-');\n const isMixedSection = section.showPeriodControl === true;\n const shouldSkipPeriodCheck = !columnPeriodType ||\n column.id === 'duration' ||\n column.id === 'default' ||\n (isCustomColumn && isMixedSection) ||\n isDimensionColumn;\n\n // Check period type compatibility (skip for merged columns)\n if (!shouldSkipPeriodCheck && conceptPeriodType && columnPeriodType) {\n // For instant concepts, only show in instant columns\n // For duration concepts, only show in duration columns\n if (conceptPeriodType !== columnPeriodType) {\n console.log(`⏭️ [Field Regeneration] Skipping field for ${concept.id} in column ${column.id}: conceptPeriodType=${conceptPeriodType}, columnPeriodType=${columnPeriodType}`);\n return;\n }\n }\n\n // Create the field\n const newField = {\n id: `${concept.id}_${column.id}`,\n conceptId: concept.id,\n columnId: column.id,\n type: this._mapConceptTypeToFieldType(concept.type),\n label: concept.label,\n periodType: conceptPeriodType, // Add periodType from concept\n conceptType: concept.type, // CRITICAL: Include conceptType for XBRL validation\n periodStartDate: column.periodStartDate,\n periodEndDate: column.periodEndDate,\n periodInstantDate: conceptPeriodType === 'instant' ? (column.periodEndDate || column.periodStartDate) : undefined\n };\n\n // Apply custom period data if exists (user-modified period dates)\n if (this._periodData[concept.id]?.[column.id]) {\n const customPeriod = this._periodData[concept.id][column.id];\n if (customPeriod.startDate) newField.periodStartDate = customPeriod.startDate;\n if (customPeriod.endDate) newField.periodEndDate = customPeriod.endDate;\n if (customPeriod.instantDate) newField.periodInstantDate = customPeriod.instantDate;\n console.log(`✅ [Field Regeneration] Applied custom period data to ${concept.id}/${column.id}:`, customPeriod);\n console.log(`✅ [Field Regeneration] Field properties after apply: periodStartDate=${newField.periodStartDate}, periodEndDate=${newField.periodEndDate}, periodInstantDate=${newField.periodInstantDate}`);\n } else {\n console.log(`ℹ️ [Field Regeneration] No custom period data for ${concept.id}/${column.id}. Checking _periodData:`, this._periodData[concept.id]);\n }\n\n if (concept.id.includes('DescriptionLocationNL') || column.id.startsWith('col-')) {\n console.log(`📅 [Field Regeneration] Concept ${concept.id}, Column ${column.id}: field.periodStartDate=${newField.periodStartDate}, field.periodEndDate=${newField.periodEndDate}, column.periodStartDate=${column.periodStartDate}`);\n }\n concept.fields.push(newField);\n });\n }\n\n // Recursively process children\n if (concept.children) {\n regenerateConcepts(concept.children);\n }\n });\n };\n\n regenerateConcepts(section.concepts);\n }\n\n /**\n * Check if a concept should be shown based on period preferences\n */\n private _shouldShowConceptBasedOnPeriodPreferences(\n concept: ConceptTree,\n preferences: { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }\n ): boolean {\n // Always show abstract concepts (they're just headers)\n if (concept.abstract) {\n return true;\n }\n\n // If concept has no period type, show it\n if (!concept.periodType) {\n return true;\n }\n\n // Check if the concept's period type matches the preferences\n if (concept.periodType === 'duration' && !preferences.showDuration) {\n return false;\n }\n\n if (concept.periodType === 'instant' && !preferences.showInstant) {\n return false;\n }\n\n return true;\n }\n\n private _inferColumnPeriodType(column: FormColumn): 'instant' | 'duration' | undefined {\n // CRITICAL: Check explicit periodType first (from user selection or saved metadata)\n if (column.periodType) {\n return column.periodType;\n }\n\n // Fallback: infer from dates\n // If both dates are same, it's instant\n if (column.periodStartDate && column.periodEndDate) {\n return column.periodStartDate === column.periodEndDate ? 'instant' : 'duration';\n }\n // If only start date, assume instant\n if (column.periodStartDate && !column.periodEndDate) {\n return 'instant';\n }\n return undefined;\n }\n\n private _mapConceptTypeToFieldType(conceptType?: string): FieldType {\n if (!conceptType) return 'text';\n\n if (conceptType.includes('monetary') || conceptType.includes('Monetary')) {\n return 'number';\n }\n if (conceptType.includes('date') || conceptType.includes('Date')) {\n return 'date';\n }\n if (conceptType.includes('boolean') || conceptType.includes('Boolean')) {\n return 'boolean';\n }\n if (conceptType.includes('integer') || conceptType.includes('Integer')) {\n return 'number';\n }\n if (conceptType.includes('decimal') || conceptType.includes('Decimal')) {\n return 'number';\n }\n\n return 'text';\n }\n\n private _generateSubmissionData(): SubmissionData {\n const submissionData: SubmissionData = [];\n\n if (!this._currentSchema) {\n return submissionData;\n }\n\n // Include data from currently visible sections\n this._currentSchema.sections.forEach(section => {\n this._processConceptsForSubmission(section.concepts, submissionData, section);\n });\n\n // IMPORTANT: Also include data from preserved (hidden) sections\n this._includePreservedDataInSubmission(submissionData);\n\n // Remove duplicates from submission data\n const uniqueSubmissionData = this._removeDuplicateSubmissions(submissionData);\n\n return uniqueSubmissionData;\n }\n\n private _includePreservedDataInSubmission(submissionData: SubmissionData) {\n // Process preserved form data\n Object.keys(this._preservedFormData).forEach(conceptId => {\n const conceptData = this._preservedFormData[conceptId];\n if (conceptData) {\n Object.keys(conceptData).forEach(columnId => {\n const value = conceptData[columnId];\n if (value !== undefined && value !== null && value !== '') {\n // Find the original concept from all sections to get proper submission data\n const originalConcept = this._findConceptInAllSections(conceptId);\n if (originalConcept) {\n const originalSection = this._findSectionForConcept(conceptId);\n this._addConceptDataToSubmission(originalConcept, columnId, value, submissionData, originalSection || undefined);\n }\n }\n });\n }\n });\n\n console.log(`📤 Included preserved data in submission. Total entries: ${submissionData.length}`);\n }\n\n private _findConceptInAllSections(conceptId: string): ConceptTree | null {\n for (const section of this._allSections) {\n const concept = this._findConceptInSection(section.concepts, conceptId);\n if (concept) {\n return concept;\n }\n }\n return null;\n }\n\n private _findSectionForConcept(conceptId: string): FormSection | null {\n for (const section of this._allSections) {\n const concept = this._findConceptInSection(section.concepts, conceptId);\n if (concept) {\n return section;\n }\n }\n return null;\n }\n\n private _addConceptDataToSubmission(concept: ConceptTree, columnId: string, value: any, submissionData: SubmissionData, section?: FormSection) {\n // Find the matching field for this column\n const field = concept.fields.find(f => f.columnId === columnId);\n if (!field) return;\n\n // Determine period type for submission\n const isInstant = concept.periodType === 'instant';\n\n // Check if field has custom period data (user-modified)\n const fieldPeriodData = this._periodData[concept.id]?.[columnId];\n\n // Get stored unit for this field\n const fieldUnit = this._unitData[concept.id]?.[columnId];\n\n // Get column to check for period dates (for previous year columns as fallback)\n const column = this._findColumnByIdInAllSections(columnId);\n\n console.log(`🔍 [Submission] Concept: ${concept.id}, Column: ${columnId}, Field Period: ${fieldPeriodData ? JSON.stringify(fieldPeriodData) : 'none'}, Unit: ${fieldUnit || 'none'}, Column Period: ${column?.periodStartDate || 'none'} - ${column?.periodEndDate || 'none'}`);\n\n // Priority: field-specific period > column period > form defaults\n const periodStartDate = fieldPeriodData?.startDate || column?.periodStartDate || field.periodStartDate || this.periodStartDate;\n const periodEndDate = fieldPeriodData?.endDate || column?.periodEndDate || field.periodEndDate || this.periodEndDate;\n const periodInstantDate = fieldPeriodData?.instantDate || field.periodInstantDate || periodEndDate || periodStartDate;\n\n const entry: SubmissionEntry = {\n conceptId: concept.originalConceptId || concept.id,\n columnId: columnId,\n value: value,\n period: {\n type: concept.periodType || 'duration',\n ...(isInstant\n ? { date: periodInstantDate }\n : {\n startDate: periodStartDate,\n endDate: periodEndDate\n })\n }\n };\n\n // Add unit if available\n if (fieldUnit) {\n entry.unit = fieldUnit;\n console.log(`✅ [Submission] Adding unit to entry: ${fieldUnit} for ${concept.id}/${columnId}`);\n }\n\n // Add decimals for monetary concepts (per-fact value takes precedence over global)\n const isMonetary = concept.type?.toLowerCase().includes('monetary');\n const fieldDecimals = this._decimalsData[concept.id]?.[columnId];\n const decimalsValue = fieldDecimals || (this.decimals !== 'INF' ? this.decimals : undefined);\n if (isMonetary && decimalsValue) {\n const parsed = parseFloat(decimalsValue);\n entry.decimals = isNaN(parsed) ? decimalsValue : String(-Math.abs(parsed));\n }\n\n // Add dimension information if available\n if (column?.dimensionData?.memberLabel) {\n entry.dimension = column.dimensionData.memberLabel;\n }\n\n console.log(`📤 [Submission Entry] Created entry:`, JSON.stringify(entry, null, 2));\n submissionData.push(entry);\n }\n\n private _findColumnByIdInAllSections(columnId: string): FormColumn | undefined {\n for (const section of this._allSections) {\n if (section.columns) {\n const column = section.columns.find(col => col.id === columnId);\n if (column) {\n return column;\n }\n }\n }\n return undefined;\n }\n\n private _removeDuplicateSubmissions(submissionData: SubmissionData): SubmissionData {\n const uniqueEntries = new Map<string, any>();\n\n submissionData.forEach(entry => {\n // Create a unique key based on concept ID, value, dimension, AND period\n const periodKey = entry.period.type === 'instant'\n ? entry.period.date\n : `${entry.period.startDate}_${entry.period.endDate}`;\n const key = `${entry.conceptId}_${entry.value}_${entry.dimension || 'no-dimension'}_${periodKey}`;\n\n // Only keep the first occurrence of each unique entry\n if (!uniqueEntries.has(key)) {\n uniqueEntries.set(key, entry);\n }\n });\n\n return Array.from(uniqueEntries.values());\n }\n\n private _findColumnById(columnId: string): FormColumn | undefined {\n if (!this._currentSchema) {\n return undefined;\n }\n\n for (const section of this._currentSchema.sections) {\n if (section.columns) {\n const column = section.columns.find(col => col.id === columnId);\n if (column) {\n return column;\n }\n }\n }\n return undefined;\n }\n\n private _findColumnByIdInSection(columnId: string, section?: FormSection): FormColumn | undefined {\n if (!section?.columns) {\n return undefined;\n }\n\n return section.columns.find(col => col.id === columnId);\n }\n\n private _getTypedMemberNameForAxis(axisId: string, section?: FormSection): string | null {\n // Look for the typed member name in the hypercube data\n if (!this.xbrlInput?.hypercubes?.[0]) {\n return null;\n }\n\n const sectionRoleId = section?.id;\n if (!sectionRoleId) {\n return null;\n }\n\n // Find the role in hypercubes\n const hypercube = this.xbrlInput.hypercubes[0];\n const role = hypercube.roles?.find((r: any) => r.roleId === sectionRoleId);\n if (!role?.items) {\n return null;\n }\n\n // Search through all items for dimensions matching the axis\n for (const item of role.items) {\n if (item.dimensions) {\n const dimension = item.dimensions.find((d: any) => d.id === axisId);\n if (dimension?.typedMember?.id) {\n return dimension.typedMember.id;\n }\n }\n }\n\n return null;\n }\n\n private _doesConceptApplyToTypedDimension(concept: ConceptTree, section?: FormSection, columnId?: string): boolean {\n // Check if this concept is part of a hypercube that has typed dimensions\n if (!this.xbrlInput?.hypercubes?.[0]) {\n return false;\n }\n\n const sectionRoleId = section?.id;\n if (!sectionRoleId) {\n return false;\n }\n\n // Find the hypercube role that matches this section\n const hypercubeRole = this.xbrlInput.hypercubes[0].roles.find(hr => hr.roleId === sectionRoleId);\n if (!hypercubeRole?.items?.length) {\n return false;\n }\n\n // Check if any hypercube item contains this concept and has typed dimensions\n for (const item of hypercubeRole.items) {\n // Check if this concept is in the conceptIds list for this hypercube item\n const conceptIdToCheck = concept.originalConceptId || concept.id;\n if (item.conceptIds && item.conceptIds.includes(conceptIdToCheck)) {\n // Check if this hypercube item has typed dimensions\n const hasTypedDimensions = item.dimensions.some(dim => dim.typedMember);\n console.log(`🔍 [DynamicForm] Concept ${conceptIdToCheck} found in hypercube item. Has typed dimensions:`, hasTypedDimensions);\n return hasTypedDimensions;\n }\n }\n\n console.log(`🔍 [DynamicForm] Concept ${concept.originalConceptId || concept.id} not found in any hypercube items for role ${sectionRoleId}`);\n return false;\n }\n\n /**\n * Get the specific typed dimensions that apply to a concept in its role\n */\n private _getApplicableTypedDimensions(concept: ConceptTree, section?: FormSection): string[] {\n if (!this.xbrlInput?.hypercubes?.[0] || !section?.id) {\n return [];\n }\n\n const hypercubeRole = this.xbrlInput.hypercubes[0].roles.find(hr => hr.roleId === section.id);\n if (!hypercubeRole?.items?.length) {\n return [];\n }\n\n const conceptIdToCheck = concept.originalConceptId || concept.id;\n\n // Find the hypercube item that contains this concept\n for (const item of hypercubeRole.items) {\n if (item.conceptIds && item.conceptIds.includes(conceptIdToCheck)) {\n // Return the IDs of typed dimensions in this hypercube item\n const typedDimensions = item.dimensions\n .filter(dim => dim.typedMember)\n .map(dim => dim.id);\n\n console.log(`🔍 [DynamicForm] Found applicable typed dimensions for concept ${conceptIdToCheck}:`, typedDimensions);\n return typedDimensions;\n }\n }\n\n return [];\n }\n\n private _processConceptsForSubmission(concepts: ConceptTree[], submissionData: SubmissionData, section?: FormSection) {\n const targetRole = \"Toelichting op de geconsolideerde jaarrekening - Financiële vaste activa: Deelnemingen: Volledig geconsolideerd: Specificatie\";\n const sectionTitle = section?.title || 'Unknown';\n\n concepts.forEach(concept => {\n // Enhanced debug logging for target role\n if (sectionTitle === targetRole) {\n console.warn(`[DUPLICATE DEBUG] Processing concept ${concept.originalConceptId || concept.id} in target role`);\n if (concept.fields) {\n console.warn(`[DUPLICATE DEBUG] Concept has ${concept.fields.length} fields`);\n concept.fields.forEach((field, index) => {\n console.warn(`[DUPLICATE DEBUG] Field ${index}: columnId=${field.columnId}, current value=${this._formData[concept.id]?.[field.columnId]}`);\n });\n }\n }\n\n // Debug log for any concept with multiple fields\n if (concept.fields && concept.fields.length > 1) {\n //console.log(`🔍 [DEBUG] Processing concept ${concept.originalConceptId}, fields count: ${concept.fields.length}`);\n concept.fields.forEach((field, index) => {\n //console.log(` Field ${index}: columnId=${field.columnId}, value=${this._formData[concept.id]?.[field.columnId]}`);\n });\n }\n\n // Process fields for this concept\n if (concept.fields && concept.fields.length > 0) {\n concept.fields.forEach(field => {\n // Get the value from the nested form data structure\n const conceptData = this._formData[concept.id];\n let fieldValue = conceptData?.[field.columnId];\n const baseConceptId = field.conceptId || concept.id.split('__').slice(0, -1).join('__') || concept.id;\n\n // If decimals is not provided, preserve fact value for rounding level concept.\n // This prevents an injected/legacy masterData value (commonly 0) from overriding facts.\n if (\n (fieldValue === undefined || fieldValue === null || fieldValue === '') &&\n this._isRoundingLevelConcept(baseConceptId) &&\n !this._hasValidGlobalDecimals()\n ) {\n const factValue = this._findFactValueForField(concept, field, section);\n if (factValue !== undefined && factValue !== null && factValue !== '') {\n fieldValue = factValue;\n }\n }\n\n // masterData fields are rendered disabled so no field-change event fires for them.\n // Their values are never written into _formData. Fall back to masterData here so\n // they are included in draft saves and final submission.\n if ((fieldValue === undefined || fieldValue === null || fieldValue === '') && this._effectiveMasterData) {\n const masterValue = this._effectiveMasterData?.[baseConceptId];\n if (masterValue !== undefined && masterValue !== null && masterValue !== '') {\n fieldValue = masterValue;\n console.warn(` 📦 [Submission] Using masterData for: ${baseConceptId} [${field.columnId}] = ${JSON.stringify(fieldValue)}`);\n }\n }\n\n // Only include fields that have values\n if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {\n // Log submission entry creation for target role\n if (sectionTitle === targetRole) {\n // console.warn(`[DUPLICATE DEBUG] Creating submission entry for concept ${concept.originalConceptId || concept.id}, field columnId=${field.columnId}, value=${fieldValue}`);\n }\n\n // Find the column information from the SPECIFIC section to check for dimension data\n const column = this._findColumnByIdInSection(field.columnId, section);\n // console.log(`🔍 [DynamicForm] Processing field for concept ${concept.originalConceptId || concept.id}, field columnId: ${field.columnId}, found column in section ${section?.id}: ${!!column}, column title: ${column?.title}`);\n\n // Check if field has custom period data (user-modified)\n const fieldPeriodData = this._periodData[concept.id]?.[field.columnId];\n\n const submissionEntry: any = {\n conceptId: concept.id,\n draftInstanceId: concept.id, // used during draft restoration to route value to the correct _formData slot\n columnId: field.columnId, // CRITICAL: Include columnId for draft restoration\n value: fieldValue,\n period: {\n type: concept.periodType || 'duration'\n } as { type: 'instant' | 'duration'; date?: string; startDate?: string; endDate?: string; }\n };\n\n // Determine period structure based on concept's period type\n // Priority: field-specific period (user-modified) > column period dates > field defaults > form defaults\n if (concept.periodType === 'instant') {\n // For instant concepts, use a single date\n const instantDate = fieldPeriodData?.instantDate || fieldPeriodData?.endDate || column?.periodEndDate || field.periodInstantDate || field.periodEndDate || field.periodStartDate || this.periodStartDate;\n submissionEntry.period.date = instantDate;\n } else {\n // For duration concepts, use start and end dates\n const startDate = fieldPeriodData?.startDate || column?.periodStartDate || field.periodStartDate || this.periodStartDate;\n const endDate = fieldPeriodData?.endDate || column?.periodEndDate || field.periodEndDate || this.periodEndDate;\n submissionEntry.period.startDate = startDate;\n submissionEntry.period.endDate = endDate;\n }\n\n // Debug log period dates with field-specific info\n console.log(`🔍 [Submission] Concept: ${concept.id}, Column: ${field.columnId}, Field Period: ${fieldPeriodData ? JSON.stringify(fieldPeriodData) : 'none'}, Column Period: ${column?.periodStartDate || 'none'} - ${column?.periodEndDate || 'none'}, Used Period: ${submissionEntry.period.type === 'instant' ? submissionEntry.period.date : `${submissionEntry.period.startDate} - ${submissionEntry.period.endDate}`}`);\n\n // Add unit if available\n const fieldUnit = this._unitData[concept.id]?.[field.columnId];\n if (fieldUnit) {\n submissionEntry.unit = fieldUnit;\n console.log(`✅ [Submission] Adding unit to entry: ${fieldUnit} for ${concept.id}/${field.columnId}`);\n } else {\n console.log(`⚠️ [Submission] No unit found in _unitData for ${concept.id}/${field.columnId}. _unitData state:`, JSON.stringify(this._unitData, null, 2));\n }\n\n // Add decimals for monetary concepts\n const isMonetary = concept.type?.toLowerCase().includes('monetary');\n const fieldDecimals = this._decimalsData[concept.id]?.[field.columnId];\n const decimalsValue = fieldDecimals || (this.decimals !== 'INF' ? this.decimals : undefined);\n if (isMonetary && decimalsValue) {\n const parsed = parseFloat(decimalsValue);\n submissionEntry.decimals = isNaN(parsed) ? decimalsValue : String(-Math.abs(parsed));\n }\n\n // Add dimension information\n // Only use dimension data from the specific column that this field is linked to\n if (column?.type === 'dimension' && column.dimensionData?.dimensionIdKey) {\n submissionEntry.dimension = column.dimensionData.dimensionIdKey;\n console.log(`🔍 [DynamicForm] Using dimension key from field's column (${field.columnId}):`, column.dimensionData.dimensionIdKey);\n } else {\n console.log(`🔍 [DynamicForm] No dimension data found for field column ${field.columnId}. Column type: ${column?.type}, has dimensionData: ${!!column?.dimensionData}`);\n }\n\n // Add typed member values if they exist for this column AND the concept is part of the hypercube\n if (this._typedMemberData[field.columnId]) {\n const applicableTypedDimensions = this._getApplicableTypedDimensions(concept, section);\n console.log(`🔍 [DynamicForm] Concept ${concept.id} applicable typed dimensions:`, applicableTypedDimensions);\n\n if (applicableTypedDimensions.length > 0) {\n // Filter typed member data to only include dimensions applicable to this concept\n const filteredTypedMembers: { [axisId: string]: { value: string; memberName: string } } = {};\n const allTypedMemberData = this._typedMemberData[field.columnId];\n\n applicableTypedDimensions.forEach(dimensionId => {\n if (allTypedMemberData[dimensionId]) {\n const memberName = this._getTypedMemberNameForAxis(dimensionId, section);\n filteredTypedMembers[dimensionId] = {\n value: allTypedMemberData[dimensionId],\n memberName: memberName || 'Unknown'\n };\n }\n });\n\n if (Object.keys(filteredTypedMembers).length > 0) {\n submissionEntry.typedMembers = filteredTypedMembers;\n console.log(`🔍 [DynamicForm] Adding filtered typed members to submission:`, filteredTypedMembers);\n } else {\n console.log(`🔍 [DynamicForm] No typed member values found for applicable dimensions:`, applicableTypedDimensions);\n }\n } else {\n console.log(`🔍 [DynamicForm] Skipping typed members for concept ${concept.id} - not applicable to this hypercube`);\n }\n } else {\n console.log(`🔍 [DynamicForm] No typed member data found for column ${field.columnId}. Available columns:`, Object.keys(this._typedMemberData));\n if (column) {\n console.log(`🔍 [DynamicForm] Column details:`, {\n id: column.id,\n type: column.type,\n hasTypedMembers: column.dimensionData?.hasTypedMembers,\n dimensionData: column.dimensionData\n });\n }\n }\n\n // Add cross-role typed member values (from Edit Period dialog, JDF-021/JDF-022).\n // These are stored under the compound key \"${concept.id}__${field.columnId}\" so\n // that each concept row has its own independent dimension values.\n if (!submissionEntry.typedMembers && field.crossRoleTypedMembers?.length) {\n const crossRoleKey = `${concept.id}__${field.columnId}`;\n const crossRoleValues = this._typedMemberData[crossRoleKey];\n if (crossRoleValues) {\n const filteredTypedMembers: { [axisId: string]: { value: string; memberName: string } } = {};\n field.crossRoleTypedMembers.forEach(tm => {\n const val = crossRoleValues[tm.axisId];\n if (val !== undefined && val !== null && val !== '') {\n filteredTypedMembers[tm.axisId] = {\n value: val,\n memberName: tm.typedMemberId\n };\n }\n });\n if (Object.keys(filteredTypedMembers).length > 0) {\n submissionEntry.typedMembers = filteredTypedMembers;\n console.log(`🔍 [Submission] Adding cross-role typed members for ${concept.id}/${field.columnId}:`, filteredTypedMembers);\n }\n }\n }\n\n // Log final submission entry for target role\n if (sectionTitle === targetRole) {\n console.warn(`[DUPLICATE DEBUG] Final submission entry:`, submissionEntry);\n }\n\n submissionData.push(submissionEntry);\n }\n });\n\n // Process extra repeat instances for cross-role typed members (JDF-022)\n const repeatCount = this._repeatCounts[concept.id] || 0;\n if (repeatCount > 0 && concept.fields.some(f => f.crossRoleTypedMembers?.length)) {\n for (let n = 1; n <= repeatCount; n++) {\n const instanceId = `${concept.id}__repeat_${n}`;\n\n concept.fields.forEach(field => {\n const instanceValue = this._formData[instanceId]?.[field.columnId];\n if (instanceValue === undefined || instanceValue === null || instanceValue === '') return;\n\n const column = this._findColumnByIdInSection(field.columnId, section);\n const fieldPeriodData = this._periodData[instanceId]?.[field.columnId];\n\n const instanceEntry: any = {\n conceptId: concept.id, // original concept ID (not synthetic repeat ID)\n draftInstanceId: instanceId, // synthetic ID used during draft restoration to route to the correct _formData slot\n columnId: field.columnId,\n value: instanceValue,\n period: {\n type: concept.periodType || 'duration'\n } as { type: 'instant' | 'duration'; date?: string; startDate?: string; endDate?: string; }\n };\n\n if (concept.periodType === 'instant') {\n instanceEntry.period.date = fieldPeriodData?.instantDate || fieldPeriodData?.endDate || column?.periodEndDate || field.periodInstantDate || field.periodEndDate || field.periodStartDate || this.periodStartDate;\n } else {\n instanceEntry.period.startDate = fieldPeriodData?.startDate || column?.periodStartDate || field.periodStartDate || this.periodStartDate;\n instanceEntry.period.endDate = fieldPeriodData?.endDate || column?.periodEndDate || field.periodEndDate || this.periodEndDate;\n }\n\n const instanceUnit = this._unitData[instanceId]?.[field.columnId];\n if (instanceUnit) {\n instanceEntry.unit = instanceUnit;\n }\n\n if (column?.type === 'dimension' && column.dimensionData?.dimensionIdKey) {\n instanceEntry.dimension = column.dimensionData.dimensionIdKey;\n }\n\n // Add cross-role typed members for this repeat instance\n if (field.crossRoleTypedMembers?.length) {\n const crossRoleKey = `${instanceId}__${field.columnId}`;\n const crossRoleValues = this._typedMemberData[crossRoleKey];\n if (crossRoleValues) {\n const filteredTypedMembers: { [axisId: string]: { value: string; memberName: string } } = {};\n field.crossRoleTypedMembers.forEach(tm => {\n const val = crossRoleValues[tm.axisId];\n if (val !== undefined && val !== null && val !== '') {\n filteredTypedMembers[tm.axisId] = { value: val, memberName: tm.typedMemberId };\n }\n });\n if (Object.keys(filteredTypedMembers).length > 0) {\n instanceEntry.typedMembers = filteredTypedMembers;\n }\n }\n }\n\n submissionData.push(instanceEntry);\n });\n }\n }\n }\n\n // Recursively process children\n if (concept.children) {\n this._processConceptsForSubmission(concept.children, submissionData, section);\n }\n });\n }\n\n private _handleReset() {\n this._formData = { ...this.initialData };\n this._touched.clear();\n this._dirty = false;\n this._submitted = false;\n\n // Clear preserved data when form is reset\n this._preservedFormData = {};\n this._preservedTypedMemberData = {};\n\n console.log('🔄 Form reset - all data and preserved data cleared');\n\n this._validateForm();\n this.requestUpdate();\n\n this.dispatchEvent(new CustomEvent('form-reset', {\n detail: {},\n bubbles: true\n }));\n }\n\n private _getFormState(): FormState {\n return {\n data: this._formData,\n errors: this._errors,\n touched: this._touched,\n dirty: this._dirty,\n valid: this._valid,\n submitted: this._submitted\n };\n }\n\n /**\n * Analyze all visible roles on form load to set initial border statuses\n */\n private _analyzeAllVisibleRoles() {\n if (!this._currentSchema || !this._currentSchema.sections || this._currentSchema.sections.length === 0) {\n console.log('⏭️ No sections to analyze for initial border status');\n return;\n }\n\n console.log(`🔍 Analyzing ${this._currentSchema.sections.length} visible roles for initial border status...`);\n\n for (const section of this._currentSchema.sections) {\n this._analyzeAndLogRole(section.id);\n }\n\n console.log(`✅ Initial border status analysis complete for all visible roles`);\n }\n\n /**\n * Handle right-click on role item to show context menu\n */\n private _handleRoleContextMenu(event: MouseEvent, roleId: string, roleTitle: string) {\n event.preventDefault();\n event.stopPropagation();\n\n this._contextMenuX = event.clientX;\n this._contextMenuY = event.clientY;\n this._contextMenuRoleId = roleId;\n this._showRoleContextMenu = true;\n\n console.log(`🖱️ Context menu opened for role: ${roleTitle} (ID: ${roleId})`);\n\n this.requestUpdate();\n }\n\n /**\n * Close the context menu\n */\n private _closeRoleContextMenu() {\n this._showRoleContextMenu = false;\n this._contextMenuRoleId = null;\n this.requestUpdate();\n }\n\n /**\n * Handle remove role action - removes role from side panel\n */\n private _handleRemoveRole() {\n if (!this._contextMenuRoleId) {\n this._closeRoleContextMenu();\n return;\n }\n\n const role = this._allSections.find(s => s.id === this._contextMenuRoleId);\n const roleTitle = role?.title || 'Unknown';\n\n console.log(`🗑️ Removing role from side panel:`);\n console.log(` - Role ID: ${this._contextMenuRoleId}`);\n console.log(` - Role Title: ${roleTitle}`);\n\n // 1. Remove from selected role IDs\n if (Array.isArray(this._selectedRoleIds)) {\n // Handle both string array and object array formats\n if (this._selectedRoleIds.length > 0 && typeof this._selectedRoleIds[0] === 'object') {\n // Object format: { roleId, roleURI, order }\n this._selectedRoleIds = (this._selectedRoleIds as Array<{ roleId: string; roleURI: string; order: number }>)\n .filter(r => r.roleId !== this._contextMenuRoleId);\n } else {\n // String array format\n this._selectedRoleIds = (this._selectedRoleIds as string[])\n .filter(id => id !== this._contextMenuRoleId);\n }\n }\n\n console.log(`✅ Role removed from _selectedRoleIds. Remaining roles: ${this._selectedRoleIds.length}`);\n\n // 2. If removed role was active, select another role\n if (this._activeSidePanelRoleId === this._contextMenuRoleId) {\n // Find first available role after removal\n const remainingRoleIds = this._getRoleIdsArray();\n this._activeSidePanelRoleId = remainingRoleIds.length > 0 ? remainingRoleIds[0] : null;\n console.log(`📌 Active role changed to: ${this._activeSidePanelRoleId || 'None'}`);\n }\n\n // 3. Apply role filter to update visible sections\n this._applyRoleFilter();\n\n // 4. Emit custom event for external listeners\n this.dispatchEvent(new CustomEvent('role-removed', {\n detail: {\n roleId: this._contextMenuRoleId,\n roleTitle: roleTitle,\n remainingRolesCount: this._selectedRoleIds.length\n },\n bubbles: true,\n composed: true\n }));\n\n console.log(`✅ Role \"${roleTitle}\" successfully removed from side panel`);\n console.log(`ℹ️ User can re-add this role using the Filter Roles dialog`);\n\n this._closeRoleContextMenu();\n }\n\n private _handleRoleCompletedChange(roleId: string, checked: boolean) {\n if (checked) {\n this._roleCompletedStates.set(roleId, true);\n } else {\n this._roleCompletedStates.delete(roleId);\n }\n this._roleCompletedStates = new Map(this._roleCompletedStates);\n this._handleSaveDraft('auto');\n }\n\n private _handleSidePanelRoleClick(roleId: string) {\n // Check the previous role before switching\n if (this._activeSidePanelRoleId && this._activeSidePanelRoleId !== roleId) {\n this._analyzeAndLogRole(this._activeSidePanelRoleId);\n }\n\n this._activeSidePanelRoleId = roleId;\n }\n\n private _analyzeAndLogRole(roleId: string) {\n const section = this._allSections.find(s => s.id === roleId);\n if (!section) {\n console.warn(`⚠️ Section not found for roleId: ${roleId}`);\n return;\n }\n\n console.warn(`\\n========================================`);\n console.warn(`🔍 ANALYZING ROLE: \"${section.title}\"`);\n console.warn(`========================================`);\n\n // Log masterData if it exists\n if (this.masterData) {\n console.warn(`📦 masterData keys:`, Object.keys(this.masterData));\n } else {\n console.warn(`📦 masterData: NOT PROVIDED`);\n }\n\n // Collect all fields\n const allFields: Array<{ conceptId: string; columnId: string; value: any; isEmpty: boolean }> = [];\n this._collectAllFields(section.concepts || [], new Set((section.columns || []).map(col => col.id)), section.columns || [], allFields);\n\n // console.warn(`📊 Total fields found: ${allFields.length}`);\n //console.warn(`\\n📋 FIELD DETAILS:`);\n\n // allFields.forEach((field, index) => {\n // const status = field.isEmpty ? '❌ EMPTY' : '✅ FILLED';\n // console.warn(` ${index + 1}. ${field.conceptId} [${field.columnId}]: ${status} = ${JSON.stringify(field.value)}`);\n // });\n\n // Check for errors\n const hasErrors = this._roleHasErrors(roleId);\n\n // Count empty fields\n const emptyCount = allFields.filter(f => f.isEmpty).length;\n const filledCount = allFields.filter(f => !f.isEmpty).length;\n\n console.warn(`\\n📈 SUMMARY:`);\n console.warn(` Total Fields: ${allFields.length}`);\n console.warn(` Filled: ${filledCount}`);\n console.warn(` Empty: ${emptyCount}`);\n console.warn(` Has Errors: ${hasErrors}`);\n\n // Determine result\n let result: 'INVALID' | 'UNTOUCHED' | 'INCOMPLETE' | 'COMPLETE';\n\n if (hasErrors) {\n result = 'INVALID';\n console.warn(`\\n🔴 RESULT: INVALID (contains validation errors)`);\n } else if (filledCount === 0) {\n result = 'UNTOUCHED';\n console.warn(`\\n⬜ RESULT: UNTOUCHED (no data entered)`);\n } else if (emptyCount > 0) {\n result = 'INCOMPLETE';\n console.warn(`\\n🟠 RESULT: INCOMPLETE (${emptyCount} field(s) blank)`);\n } else {\n result = 'COMPLETE';\n console.warn(`\\n🟢 RESULT: COMPLETE (all fields filled)`);\n }\n\n console.warn(`========================================\\n`);\n\n // Update border status\n if (result === 'INVALID') {\n // Errors are already handled by has-errors class\n } else if (result === 'UNTOUCHED') {\n this._roleBorderStatuses.set(roleId, 'untouched');\n this._roleBorderStatuses = new Map(this._roleBorderStatuses);\n } else if (result === 'INCOMPLETE') {\n this._roleBorderStatuses.set(roleId, 'incomplete');\n this._roleBorderStatuses = new Map(this._roleBorderStatuses);\n } else {\n this._roleBorderStatuses.set(roleId, 'complete');\n this._roleBorderStatuses = new Map(this._roleBorderStatuses);\n }\n }\n\n private _collectAllFields(\n concepts: ConceptTree[],\n sectionColumnIds: Set<string>,\n sectionColumns: FormColumn[],\n allFields: Array<{ conceptId: string; columnId: string; value: any; isEmpty: boolean }>\n ) {\n for (const concept of concepts) {\n if (concept.abstract) {\n if (concept.children && concept.children.length > 0) {\n this._collectAllFields(concept.children, sectionColumnIds, sectionColumns, allFields);\n }\n continue;\n }\n\n if (concept.fields && concept.fields.length > 0) {\n const relevantFields = concept.fields.filter(field => sectionColumnIds.has(field.columnId));\n\n for (const field of relevantFields) {\n // CRITICAL: _formData is keyed by concept.id (which may have a suffix like __4qukyf)\n // because concept-tree.ts passes concept.id as conceptId to jupiter-form-field,\n // and form-field dispatches field-change events using that same id.\n // field.conceptId holds the original XBRL concept ID (without suffix).\n // We must check BOTH keys to correctly find stored values.\n const conceptIdWithSuffix = concept.id; // e.g. \"kvk-i_BusinessNames__4qukyf\"\n const fieldConceptId = field.conceptId; // e.g. \"kvk-i_BusinessNames\"\n\n // Prefer the suffixed concept.id lookup (primary storage key used by form-field),\n // fall back to the original fieldConceptId for backward compatibility.\n let value = this._formData[conceptIdWithSuffix]?.[field.columnId];\n if (value === undefined && conceptIdWithSuffix !== fieldConceptId) {\n value = this._formData[fieldConceptId]?.[field.columnId];\n }\n\n // If the field has no user-entered value, fall back to masterData.\n // masterData fields are rendered disabled in the form but their values\n // must still be included in the final/draft data (they are often mandatory).\n const masterValue = this._effectiveMasterData?.[fieldConceptId];\n if ((value === null || value === undefined || (typeof value === 'string' && value.trim() === ''))\n && masterValue !== undefined) {\n value = masterValue;\n console.warn(` 📦 Using masterData value for: ${fieldConceptId} [${field.columnId}] = ${JSON.stringify(value)}`);\n }\n\n let isEmpty = value === null || value === undefined ||\n (typeof value === 'string' && value.trim() === '');\n\n // If value is empty in _formData, check if there's a matching XBRL fact\n // that is pre-populating this field visually (facts are displayed in UI but\n // not stored in _formData until the user edits the field).\n if (isEmpty && concept.facts && concept.facts.length > 0) {\n const column = sectionColumns.find(col => col.id === field.columnId);\n const cellContext = {\n conceptId: fieldConceptId,\n columnId: field.columnId,\n periodStartDate: field.periodStartDate || column?.periodStartDate,\n periodEndDate: field.periodEndDate || column?.periodEndDate,\n periodInstantDate: field.periodInstantDate || (field.periodType === 'instant' ? (field.periodEndDate || field.periodStartDate) : undefined),\n periodType: field.periodType,\n dimensionData: column?.dimensionData\n };\n const matchedFact = FactMatcher.findMatchingFact(concept.facts as any[], cellContext as any);\n if (matchedFact && matchedFact.value !== null && matchedFact.value !== undefined && matchedFact.value !== '') {\n value = matchedFact.value;\n isEmpty = false;\n // console.warn(` ✨ FACT PRE-POPULATED: ${fieldConceptId} [${field.columnId}] = ${JSON.stringify(value)}`);\n }\n }\n\n// console.warn(` 🔍 Field lookup: concept.id=\"${conceptIdWithSuffix}\", field.conceptId=\"${fieldConceptId}\", value=${JSON.stringify(value)}, isEmpty=${isEmpty}`);\n\n allFields.push({\n conceptId: fieldConceptId,\n columnId: field.columnId,\n value: value,\n isEmpty: isEmpty\n });\n }\n }\n\n if (concept.children && concept.children.length > 0) {\n this._collectAllFields(concept.children, sectionColumnIds, sectionColumns, allFields);\n }\n }\n }\n\n private _handleSidePanelSearchInput(event: Event) {\n const input = event.target as HTMLInputElement;\n this._sidePanelSearchQuery = input.value;\n }\n\n private _clearSidePanelSearch() {\n this._sidePanelSearchQuery = '';\n const searchInput = this.shadowRoot?.querySelector('.side-panel-search-input') as HTMLInputElement;\n if (searchInput) {\n searchInput.value = '';\n searchInput.focus();\n }\n }\n\n private _toggleSidePanelCollapse() {\n this._sidePanelCollapsed = !this._sidePanelCollapsed;\n }\n\n /**\n * Returns true when every non-abstract concept row in the section has no value\n * in any column. Used in readonly mode to hide fully-blank sections.\n */\n private _isSectionBlank(section: FormSection): boolean {\n const columns = section.columns || this._columns;\n\n const hasValue = (concepts: ConceptTree[]): boolean => {\n for (const concept of concepts) {\n if (!concept.abstract) {\n for (const column of columns) {\n const value = this._formData[concept.id]?.[column.id];\n if (value !== null && value !== undefined && value !== '') {\n return true;\n }\n }\n }\n if (concept.children && concept.children.length > 0) {\n if (hasValue(concept.children)) return true;\n }\n }\n return false;\n };\n\n return !hasValue(section.concepts);\n }\n\n private _getConceptSearchMatchIds(searchText: string): Set<string> {\n const result = new Set<string>();\n if (!searchText.trim() || !this.xbrlInput?.presentation?.length) {\n return result;\n }\n\n const query = searchText.toLowerCase().trim();\n\n const walkConcepts = (concepts: any[]) => {\n for (const concept of concepts) {\n let matches = concept.conceptName?.toLowerCase().includes(query) || concept.id?.toLowerCase().includes(query);\n if (!matches && Array.isArray(concept.labels)) {\n matches = concept.labels.some((l: any) => l.label?.toLowerCase().includes(query));\n }\n if (matches) {\n result.add(concept.id); // id uses underscore format matching originalConceptId in ConceptTree\n }\n if (concept.children?.length) {\n walkConcepts(concept.children);\n }\n }\n };\n\n for (const presentationData of this.xbrlInput.presentation) {\n for (const role of presentationData.roles || []) {\n walkConcepts(role.presentationLinkbase?.concepts || []);\n }\n }\n\n return result;\n }\n\n private _isSectionConceptSearchMatch(section: FormSection, matchIds: Set<string>): boolean {\n if (matchIds.size === 0) return false;\n\n const checkConcepts = (concepts: ConceptTree[]): boolean => {\n for (const concept of concepts) {\n if (matchIds.has(concept.originalConceptId)) return true;\n if (concept.children?.length && checkConcepts(concept.children)) return true;\n }\n return false;\n };\n\n return checkConcepts(section.concepts);\n }\n\n private _filterSidePanelSections(sections: FormSection[]): FormSection[] {\n if (!this._sidePanelSearchQuery.trim()) {\n return sections;\n }\n\n const query = this._sidePanelSearchQuery.toLowerCase().trim();\n return sections.filter(section => {\n // Search in section title\n const titleMatch = section.title.toLowerCase().includes(query);\n\n // Search in section ID\n const idMatch = section.id.toLowerCase().includes(query);\n\n // Search in section description if available\n const descriptionMatch = section.description?.toLowerCase().includes(query) || false;\n\n // Search in roleURI if available\n const uriMatch = section.metadata?.roleURI?.toLowerCase().includes(query) || false;\n\n return titleMatch || idMatch || descriptionMatch || uriMatch;\n });\n }\n\n private _renderAdminModeContent(section?: FormSection) {\n if (!section) {\n return html`\n <div class=\"admin-mode-container\">\n <p>No role selected</p>\n </div>\n `;\n }\n\n // CRITICAL: Read from _periodPreferences (which is persisted/restored) instead of _adminRoleConfigs\n const showPreviousYearChecked = this._periodPreferences[section.id]?.showPreviousYear ?? section.showPreviousYear ?? false;\n\n // Get dimensions for this role\n const dimensions = this._getDimensionsForRole(section.id);\n const hasDimensions = dimensions.length > 0;\n\n // Initialize dimension selections with all members checked by default if not already set\n if (hasDimensions && !this._periodPreferences[section.id]?.dimensionSelections) {\n const currentPref = this._periodPreferences[section.id] || {\n showDuration: true,\n showInstant: true,\n showPreviousYear: false\n };\n\n currentPref.dimensionSelections = [];\n\n dimensions.forEach((dimension: any) => {\n const allMembers = this._getAllDimensionMembers(dimension.members);\n const allMemberIds = allMembers.map((m: any) => m.id);\n const dimensionLabel = dimension.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n\n if (currentPref.dimensionSelections) {\n currentPref.dimensionSelections.push({\n dimensionId: dimension.id,\n dimensionLabel: dimensionLabel,\n selectedMemberIds: allMemberIds\n });\n }\n });\n\n this._periodPreferences = {\n ...this._periodPreferences,\n [section.id]: currentPref\n };\n\n console.log('✅ [Admin Mode] Initialized all dimension members as selected by default for role:', section.id);\n }\n\n return html`\n <div class=\"admin-mode-container\">\n <h2 class=\"admin-mode-title\">Role Configuration: ${section.title}</h2>\n <div class=\"admin-roles-list\">\n <div class=\"admin-role-item\">\n <div class=\"admin-role-checkbox\">\n <input\n type=\"checkbox\"\n id=\"admin-prev-year-${section.id}\"\n .checked=\"${showPreviousYearChecked}\"\n @change=\"${(e: Event) => this._handleAdminCheckboxChange(section.id, 'showPreviousYear', (e.target as HTMLInputElement).checked)}\"\n />\n <label for=\"admin-prev-year-${section.id}\">Show Previous Year Column</label>\n </div>\n </div>\n \n ${hasDimensions ? html`\n <div class=\"admin-dimension-section\">\n <div class=\"admin-dimension-header\">📊 ${I18n.t('filter.dimensionMemberSelection')}</div>\n ${dimensions.map((dimension: any) => {\n const allMembers = this._getAllDimensionMembers(dimension.members);\n const dimensionLabel = dimension.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n const isSingleMember = this._isSingleMemberDimension(dimension);\n\n return html`\n <div class=\"admin-dimension-group\">\n <div class=\"admin-dimension-label\">${dimensionLabel}${isSingleMember ? ' (Mandatory)' : ''}</div>\n <div class=\"admin-dimension-members\">\n ${allMembers.map((member: any) => {\n const memberLabel = member.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || member.conceptName;\n const isChecked = this._isAdminDimensionMemberSelected(section.id, dimension.id, member.id);\n\n return html`\n <label class=\"admin-member-checkbox-item\">\n <input\n type=\"checkbox\"\n class=\"admin-member-checkbox\"\n .checked=\"${isChecked}\"\n ?disabled=\"${isSingleMember}\"\n @change=\"${(e: Event) => this._handleAdminDimensionMemberChange(e, section.id, dimension.id, member.id)}\"\n />\n <span class=\"admin-member-checkbox-label\">${memberLabel}</span>\n </label>\n `;\n })}\n </div>\n ${!isSingleMember ? html`\n <div class=\"admin-member-select-controls\">\n <button \n class=\"admin-member-select-btn\"\n @click=\"${() => this._selectAllAdminDimensionMembers(section.id, dimension.id)}\"\n >\n ${I18n.t('filter.selectAllMembers')}\n </button>\n <button \n class=\"admin-member-select-btn\"\n @click=\"${() => this._deselectAllAdminDimensionMembers(section.id, dimension.id)}\"\n >\n ${I18n.t('filter.clearMembers')}\n </button>\n </div>\n ` : ''}\n </div>\n `;\n })}\n </div>\n ` : ''}\n </div>\n </div>\n `;\n }\n\n private _handleAdminCheckboxChange(roleId: string, field: 'showPreviousYear' | 'instant' | 'duration', checked: boolean) {\n const currentConfig = this._adminRoleConfigs[roleId] || { showPreviousYear: false };\n this._adminRoleConfigs = {\n ...this._adminRoleConfigs,\n [roleId]: {\n ...currentConfig,\n [field]: checked\n }\n };\n\n // CRITICAL: Also update _periodPreferences so settings are saved to metadata/localStorage\n const currentPeriodPref = this._periodPreferences[roleId] || {\n showDuration: true,\n showInstant: true,\n showPreviousYear: false\n };\n this._periodPreferences = {\n ...this._periodPreferences,\n [roleId]: {\n ...currentPeriodPref,\n [field]: checked\n }\n };\n\n console.log(`✅ [Admin Mode] Updated ${field} = ${checked} for role ${roleId}`);\n console.log(`📋 [Admin Mode] _periodPreferences now includes:`, this._periodPreferences[roleId]);\n }\n\n /**\n * Get dimensions for a specific role from hypercube data\n */\n private _getDimensionsForRole(roleId: string): any[] {\n if (!this.xbrlInput?.hypercubes?.[0]) {\n return [];\n }\n\n const hypercubeRole = this.xbrlInput.hypercubes[0].roles?.find((r: any) => r.roleId === roleId);\n if (!hypercubeRole?.items?.length) {\n return [];\n }\n\n const dimensionsMap = new Map<string, any>();\n\n hypercubeRole.items.forEach((item: any) => {\n if (item.dimensions) {\n item.dimensions.forEach((dimension: any) => {\n if (!dimensionsMap.has(dimension.id)) {\n dimensionsMap.set(dimension.id, dimension);\n }\n });\n }\n });\n\n return Array.from(dimensionsMap.values());\n }\n\n /**\n * Get all dimension members recursively\n */\n private _getAllDimensionMembers(members: any[]): any[] {\n if (!members || members.length === 0) {\n return [];\n }\n\n let allMembers: any[] = [];\n members.forEach((member: any) => {\n allMembers.push(member);\n if (member.children && member.children.length > 0) {\n allMembers = allMembers.concat(this._getAllDimensionMembers(member.children));\n }\n });\n\n return allMembers;\n }\n\n /**\n * Check if a dimension has only one member (single choice, mandatory)\n */\n private _isSingleMemberDimension(dimension: any): boolean {\n if (!dimension || !dimension.members) {\n return false;\n }\n const allMembers = this._getAllDimensionMembers(dimension.members);\n return allMembers.length === 1;\n }\n\n /**\n * Handle dimension member selection in admin mode\n */\n private _handleAdminDimensionMemberChange(event: Event, roleId: string, dimensionId: string, memberId: string) {\n event.stopPropagation();\n const checkbox = event.target as HTMLInputElement;\n\n const currentPref = this._periodPreferences[roleId] || {\n showDuration: true,\n showInstant: true,\n showPreviousYear: false,\n dimensionSelections: []\n };\n\n // Initialize dimensionSelections if not present\n if (!currentPref.dimensionSelections) {\n currentPref.dimensionSelections = [];\n }\n\n // Find or create dimension selection entry\n let dimensionSelection = currentPref.dimensionSelections.find(\n ds => ds.dimensionId === dimensionId\n );\n\n if (!dimensionSelection) {\n // Get dimension label\n const dimensions = this._getDimensionsForRole(roleId);\n const dimension = dimensions.find((d: any) => d.id === dimensionId);\n const dimensionLabel = dimension?.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimensionId;\n\n dimensionSelection = {\n dimensionId: dimensionId,\n dimensionLabel: dimensionLabel,\n selectedMemberIds: []\n };\n currentPref.dimensionSelections.push(dimensionSelection);\n }\n\n // Update selected members\n if (checkbox.checked) {\n if (!dimensionSelection.selectedMemberIds.includes(memberId)) {\n dimensionSelection.selectedMemberIds.push(memberId);\n }\n } else {\n dimensionSelection.selectedMemberIds = dimensionSelection.selectedMemberIds.filter(\n id => id !== memberId\n );\n }\n\n this._periodPreferences = {\n ...this._periodPreferences,\n [roleId]: currentPref\n };\n\n console.log('📊 [Admin Mode] Updated dimension selections:', this._periodPreferences[roleId].dimensionSelections);\n this.requestUpdate();\n }\n\n /**\n * Check if a dimension member is selected in admin mode\n * Returns true by default if no explicit preference exists (all members checked by default)\n */\n private _isAdminDimensionMemberSelected(roleId: string, dimensionId: string, memberId: string): boolean {\n const preferences = this._periodPreferences[roleId];\n if (!preferences?.dimensionSelections) {\n // No preferences set yet - default to all checked\n return true;\n }\n\n const dimensionSelection = preferences.dimensionSelections.find(\n ds => ds.dimensionId === dimensionId\n );\n\n if (!dimensionSelection) {\n // This dimension hasn't been explicitly configured - default to checked\n return true;\n }\n\n return dimensionSelection.selectedMemberIds.includes(memberId);\n }\n\n /**\n * Select all members for a dimension in admin mode\n */\n private _selectAllAdminDimensionMembers(roleId: string, dimensionId: string) {\n const dimensions = this._getDimensionsForRole(roleId);\n const dimension = dimensions.find((d: any) => d.id === dimensionId);\n if (!dimension) return;\n\n const allMembers = this._getAllDimensionMembers(dimension.members);\n const allMemberIds = allMembers.map((m: any) => m.id);\n\n const currentPref = this._periodPreferences[roleId] || {\n showDuration: true,\n showInstant: true,\n showPreviousYear: false,\n dimensionSelections: []\n };\n\n if (!currentPref.dimensionSelections) {\n currentPref.dimensionSelections = [];\n }\n\n // Find or create dimension selection entry\n let dimensionSelection = currentPref.dimensionSelections.find(\n ds => ds.dimensionId === dimensionId\n );\n\n if (!dimensionSelection) {\n const dimensionLabel = dimension.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimensionId;\n dimensionSelection = {\n dimensionId: dimensionId,\n dimensionLabel: dimensionLabel,\n selectedMemberIds: []\n };\n currentPref.dimensionSelections.push(dimensionSelection);\n }\n\n dimensionSelection.selectedMemberIds = allMemberIds;\n\n this._periodPreferences = {\n ...this._periodPreferences,\n [roleId]: currentPref\n };\n\n this.requestUpdate();\n }\n\n /**\n * Deselect all members for a dimension in admin mode\n */\n private _deselectAllAdminDimensionMembers(roleId: string, dimensionId: string) {\n const currentPref = this._periodPreferences[roleId];\n if (!currentPref?.dimensionSelections) {\n return;\n }\n\n const dimensionSelection = currentPref.dimensionSelections.find(\n ds => ds.dimensionId === dimensionId\n );\n\n if (dimensionSelection) {\n dimensionSelection.selectedMemberIds = [];\n }\n\n this._periodPreferences = {\n ...this._periodPreferences,\n [roleId]: currentPref\n };\n\n this.requestUpdate();\n }\n\n private _handleAdminModeSubmit() {\n if (!this.xbrlInput?.presentation?.[0]?.roles) {\n console.error('No presentation data available');\n return;\n }\n\n // Create a deep copy of the presentation data\n const updatedPresentationData = JSON.parse(JSON.stringify(this.xbrlInput.presentation[0]));\n\n // Get IDs of selected roles (roles that user can configure in admin mode)\n const selectedRoleIds = new Set(\n this._currentSchema?.sections.map(s => s.id) || []\n );\n\n // Update each role with the new settings\n updatedPresentationData.roles = updatedPresentationData.roles.map((role: any) => {\n const isSelected = selectedRoleIds.has(role.id);\n const config = this._adminRoleConfigs[role.id];\n\n const updatedRole: any = {\n ...role,\n display: isSelected ? 'yes' : 'no'\n };\n\n // Only update configuration for selected roles\n if (config !== undefined && isSelected) {\n updatedRole.showPreviousYear = config.showPreviousYear;\n }\n\n return updatedRole;\n });\n\n // Get the saved metadata from localStorage\n const savedMetadata = this.dynaformsMetadata || this._loadMetadataFromLocalStorage();\n\n // Print the updated presentation data\n console.log('📋 Updated Presentation Data:', updatedPresentationData);\n console.log('📋 Metadata from localStorage:', savedMetadata);\n\n // Emit custom event with updated data including metadata\n this.dispatchEvent(new CustomEvent('admin-config-updated', {\n detail: {\n presentationData: updatedPresentationData,\n roleConfigs: this._adminRoleConfigs,\n metadata: savedMetadata\n },\n bubbles: true,\n composed: true\n }));\n\n console.log('✅ Admin configuration saved successfully with metadata');\n }\n\n private _loadMetadataFromLocalStorage(): any {\n try {\n const metadataStr = localStorage.getItem('jupiter-form-draft-metadata');\n if (metadataStr) {\n return JSON.parse(metadataStr);\n }\n } catch (error) {\n console.error('Failed to load metadata from localStorage:', error);\n }\n return null;\n }\n\n private _renderAccordionLayout(schema: XBRLFormSchema, config: ComponentConfig, showValidationSummary: boolean, errorCount: number) {\n return html`\n <div class=\"form-sections\">\n <!-- Validation Summary -->\n ${showValidationSummary ? html`\n <div class=\"validation-summary\">\n <h4 class=\"validation-summary-title\">${I18n.t('validation.summary')}</h4>\n <ul class=\"validation-summary-list\">\n ${this._errors\n .filter(e => e.severity === 'error')\n .map(error => html`\n <li class=\"validation-summary-item\">${error.message}</li>\n `)}\n </ul>\n </div>\n ` : ''}\n\n <!-- Form Sections or No Selection Message (hidden in admin mode) -->\n ${this.mode === 'admin' ? schema.sections.map((section, index) => html`\n <div class=\"admin-mode-placeholder\">\n ${this._renderAdminModeContent(section)}\n </div>\n `) : schema.sections.length === 0 ? html`\n <div class=\"no-roles-message\">\n <h3>${I18n.t('form.noRoleSelected')}</h3>\n <p>${I18n.t('filter.selectRoles')}</p>\n <p>${I18n.t('filter.roles')}: ${this._allSections.length}</p>\n </div>\n ` : (() => {\n const conceptMatchIds = this._getConceptSearchMatchIds(this._conceptSearchText);\n const hasConceptSearch = this._conceptSearchText.trim().length > 0;\n let sections = schema.sections;\n if (this.mode === 'readonly' || this._showFactsOnly) {\n sections = sections.filter(s => !this._isSectionBlank(s));\n }\n if (hasConceptSearch) {\n sections = sections.filter(s => this._isSectionConceptSearchMatch(s, conceptMatchIds));\n }\n return sections.map((section, index) => html`\n <jupiter-form-section\n section-id=\"${section.id}\"\n .section=\"${section}\"\n .columns=\"${section.columns || this._columns}\"\n .datatypes=\"${section.datatypes || this.xbrlInput?.datatypes}\"\n .formData=\"${this._formData}\"\n .periodData=\"${this._periodData}\"\n .unitData=\"${this._unitData}\"\n .decimalsData=\"${this._decimalsData}\"\n .globalDecimals=\"${this.decimals}\"\n .typedMemberData=\"${this._typedMemberData}\"\n .repeatCounts=\"${this._repeatCounts}\"\n .defaultUnits=\"${this.defaultUnits}\"\n .disabled=\"${this.disabled || this.readonly}\"\n .collapsible=\"${config.collapsibleSections !== false}\"\n .locale=\"${config.locale || 'en-US'}\"\n .language=\"${this.language}\"\n .isFirstSection=\"${index === 0}\"\n .availableDimensions=\"${this._getAvailableDimensionsForSection(section.id)}\"\n .mode=\"${this.mode}\"\n .showFactsOnly=\"${this._showFactsOnly}\"\n .conceptMatchIds=\"${hasConceptSearch ? conceptMatchIds : undefined}\"\n .masterData=\"${this._effectiveMasterData}\"\n .periodStartDate=\"${this.periodStartDate}\"\n .periodEndDate=\"${this.periodEndDate}\"\n @field-change=\"${this._handleFieldChange}\"\n @period-change=\"${this._handlePeriodChange}\"\n @typed-member-change=\"${this._handleTypedMemberChange}\"\n @add-concept-repeat=\"${this._handleAddConceptRepeat}\"\n @remove-concept-repeat=\"${this._handleRemoveConceptRepeat}\"\n @section-expand=\"${this._handleSectionExpand}\"\n @concept-expand=\"${this._handleConceptExpand}\"\n @column-remove=\"${this._handleColumnRemove}\"\n @column-add-request=\"${this._handleColumnAddRequest}\"\n ></jupiter-form-section>\n `);\n })()}\n </div>\n `;\n }\n\n private _renderSidePanelLayout(schema: XBRLFormSchema, config: ComponentConfig, showValidationSummary: boolean, errorCount: number) {\n const conceptMatchIds = this._getConceptSearchMatchIds(this._conceptSearchText);\n const hasConceptSearch = this._conceptSearchText.trim().length > 0;\n\n // In readonly/showFactsOnly mode, hide sections where all rows are blank\n let visibleSections = (this.mode === 'readonly' || this._showFactsOnly)\n ? schema.sections.filter(s => !this._isSectionBlank(s))\n : schema.sections;\n\n if (hasConceptSearch) {\n visibleSections = visibleSections.filter(s => this._isSectionConceptSearchMatch(s, conceptMatchIds));\n }\n\n // Apply search filter to visible sections\n const filteredSections = this._filterSidePanelSections(visibleSections);\n\n // Select first visible role by default if none selected or if current selection is not visible\n if (!this._activeSidePanelRoleId || !filteredSections.find(s => s.id === this._activeSidePanelRoleId)) {\n this._activeSidePanelRoleId = filteredSections.length > 0 ? filteredSections[0].id : null;\n }\n\n const activeSection = visibleSections.find(s => s.id === this._activeSidePanelRoleId);\n\n return html`\n <div class=\"side-panel-layout\">\n <!-- Left: Roles List (filtered) -->\n <div class=\"side-panel-roles-list ${this._sidePanelCollapsed ? 'collapsed' : ''}\">\n <!-- Toggle Button -->\n <button \n class=\"side-panel-toggle-btn ${this._sidePanelCollapsed ? 'collapsed' : ''}\"\n @click=\"${this._toggleSidePanelCollapse}\"\n title=\"${this._sidePanelCollapsed ? I18n.t('form.expandPanel') : I18n.t('form.collapsePanel')}\"\n >\n <svg viewBox=\"0 0 24 24\">\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/>\n </svg>\n </button>\n \n ${!this._sidePanelCollapsed ? html`\n <!-- Search Input -->\n <div class=\"side-panel-search-container\">\n <input\n type=\"text\"\n class=\"side-panel-search-input\"\n placeholder=\"${I18n.t('filter.searchPlaceholder')}\"\n .value=\"${this._sidePanelSearchQuery}\"\n @input=\"${this._handleSidePanelSearchInput}\"\n />\n ${this._sidePanelSearchQuery ? html`\n <button class=\"side-panel-clear-search\" @click=\"${this._clearSidePanelSearch}\" title=\"${I18n.t('filter.clearSearch')}\">\n ×\n </button>\n ` : html`\n <svg class=\"side-panel-search-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"/>\n </svg>\n `}\n </div>\n \n <!-- Search Results Info -->\n ${this._sidePanelSearchQuery.trim() && filteredSections.length !== visibleSections.length ? html`\n <div class=\"side-panel-search-results-info\">\n ${filteredSections.length} ${I18n.t('filter.of')} ${visibleSections.length} ${I18n.t('filter.roles')}\n </div>\n ` : ''}\n \n <!-- Roles List -->\n ${filteredSections.length === 0 ? html`\n <div class=\"side-panel-no-results\">\n ${I18n.t('filter.noRolesFound')} \"${this._sidePanelSearchQuery}\"<br>\n ${I18n.t('filter.tryDifferentSearch')}\n </div>\n ` : html`\n ${filteredSections.map(section => {\n const hasErrors = this._roleHasErrors(section.id);\n const borderStatus = this._roleBorderStatuses.get(section.id);\n\n const isManuallyCompleted = this._roleCompletedStates.get(section.id) === true;\n // Priority: manually completed (green) > errors (red) > untouched (gray) > incomplete (orange) > analysis-complete (green)\n const statusClass = isManuallyCompleted ? 'has-complete-data' :\n hasErrors ? 'has-errors' :\n borderStatus === 'untouched' ? 'has-no-data' :\n borderStatus === 'incomplete' ? 'has-empty-fields' :\n borderStatus === 'complete' ? 'has-complete-data' : '';\n\n return html`\n <div \n class=\"side-panel-role-item ${section.id === this._activeSidePanelRoleId ? 'active' : ''} ${statusClass}\"\n @click=\"${() => this._handleSidePanelRoleClick(section.id)}\"\n @contextmenu=\"${(e: MouseEvent) => this._handleRoleContextMenu(e, section.id, section.title)}\"\n >\n ${section.title}\n </div>\n `;\n })}\n `}\n ` : ''}\n </div>\n\n <!-- Right: Active Section Content -->\n <div class=\"side-panel-content\">\n <div class=\"form-sections\">\n <!-- Validation Summary -->\n ${showValidationSummary ? html`\n <div class=\"validation-summary\">\n <h4 class=\"validation-summary-title\">Please fix the following errors:</h4>\n <ul class=\"validation-summary-list\">\n ${this._errors\n .filter(e => e.severity === 'error')\n .map(error => html`\n <li class=\"validation-summary-item\">${error.message}</li>\n `)}\n </ul>\n </div>\n ` : ''}\n\n <!-- Active Section (hidden in admin mode) -->\n ${this.mode === 'admin' ? html`\n <div class=\"admin-mode-placeholder\">\n ${this._renderAdminModeContent(activeSection)}\n </div>\n ` : activeSection ? html`\n <jupiter-form-section\n section-id=\"${activeSection.id}\"\n .section=\"${activeSection}\"\n .columns=\"${activeSection.columns || this._columns}\"\n .datatypes=\"${activeSection.datatypes || this.xbrlInput?.datatypes}\"\n .formData=\"${this._formData}\"\n .periodData=\"${this._periodData}\"\n .unitData=\"${this._unitData}\"\n .decimalsData=\"${this._decimalsData}\"\n .globalDecimals=\"${this.decimals}\"\n .typedMemberData=\"${this._typedMemberData}\"\n .repeatCounts=\"${this._repeatCounts}\"\n .defaultUnits=\"${this.defaultUnits}\"\n .disabled=\"${this.disabled || this.readonly}\"\n .collapsible=\"${false}\"\n .hideHeader=\"${true}\"\n .locale=\"${config.locale || 'en-US'}\"\n .language=\"${this.language}\"\n .isFirstSection=\"${true}\"\n .availableDimensions=\"${this._getAvailableDimensionsForSection(activeSection.id)}\"\n .mode=\"${this.mode}\"\n .showFactsOnly=\"${this._showFactsOnly}\"\n .conceptMatchIds=\"${hasConceptSearch ? conceptMatchIds : undefined}\"\n .masterData=\"${this._effectiveMasterData}\"\n .periodStartDate=\"${this.periodStartDate}\"\n .periodEndDate=\"${this.periodEndDate}\"\n @field-change=\"${this._handleFieldChange}\"\n @typed-member-change=\"${this._handleTypedMemberChange}\"\n @add-concept-repeat=\"${this._handleAddConceptRepeat}\"\n @remove-concept-repeat=\"${this._handleRemoveConceptRepeat}\"\n @section-expand=\"${this._handleSectionExpand}\"\n @concept-expand=\"${this._handleConceptExpand}\"\n @column-remove=\"${this._handleColumnRemove}\"\n @column-add-request=\"${this._handleColumnAddRequest}\"\n ></jupiter-form-section>\n <div class=\"role-completion-row\">\n <input\n type=\"checkbox\"\n id=\"role-complete-${activeSection.id}\"\n .checked=\"${this._roleCompletedStates.get(activeSection.id) === true}\"\n @change=\"${(e: Event) => this._handleRoleCompletedChange(activeSection.id, (e.target as HTMLInputElement).checked)}\"\n >\n <label for=\"role-complete-${activeSection.id}\">${I18n.t('form.markAsComplete')}</label>\n </div>\n ` : html`\n <div class=\"no-roles-message\">\n <h3>${I18n.t('form.noRoleSelected')}</h3>\n <p>${I18n.t('form.pleaseSelectRole')}</p>\n </div>\n `}\n </div>\n </div>\n </div>\n `;\n }\n\n // Public API methods\n public getData(): FormData {\n return { ...this._formData };\n }\n\n public setData(data: FormData) {\n this._formData = { ...data };\n this._dirty = true;\n this._validateForm();\n this.requestUpdate();\n }\n\n public validate(): boolean {\n this._validateForm();\n return this._valid;\n }\n\n /**\n * Updates the validation status and footer UI accordingly.\n * Called by the hosting application after triggering external validation.\n * @param status 'inProgress' | 'cancel' | 'complete'\n */\n public setValidation(status: 'inProgress' | 'cancel' | 'complete'): void {\n console.log(`🔍 Validation status updated: ${status}`);\n if (status === 'cancel') {\n this._validationStatus = 'idle';\n } else {\n this._validationStatus = status;\n }\n this.requestUpdate();\n }\n\n public reset() {\n this._handleReset();\n }\n\n public getState(): FormState {\n return this._getFormState();\n }\n\n render() {\n const errorCount = this._errors.filter(e => e.severity === 'error').length;\n const config = this.config || {};\n const showValidationSummary = config.showValidationSummary !== false &&\n errorCount > 0 &&\n this._submitted;\n\n const schema = this._currentSchema;\n if (!schema) {\n return html`<div>${I18n.t('form.loading')}</div>`;\n }\n\n return html`\n <div class=\"form-container\">\n <!-- Form Header - Hidden in side panel mode -->\n ${this.display !== 'sidePanel' ? html`\n <div class=\"form-header\">\n <h1 class=\"form-title\">${schema.title}</h1>\n ${schema.description ? html`\n <p class=\"form-description\">${schema.description}</p>\n ` : ''}\n </div>\n ` : ''}\n\n <!-- Form Content -->\n ${this.display === 'sidePanel' ? this._renderSidePanelLayout(schema, config, showValidationSummary, errorCount) : this._renderAccordionLayout(schema, config, showValidationSummary, errorCount)}\n\n <!-- Form Actions - Fixed Footer (hidden in readonly mode) -->\n ${this.mode !== 'readonly' ? html`\n <div class=\"form-actions\">\n <!-- Filter Roles Button (shown when more than 10 roles) -->\n ${this._shouldShowFilterButton() ? html`\n <button \n class=\"filter-roles-button\"\n @click=\"${this._handleFilterRolesClick}\"\n ?disabled=\"${this.disabled || this.readonly}\"\n >\n <svg class=\"filter-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\"/>\n </svg>\n ${this._selectedRoleIds.length === 0 ? I18n.t('filter.selectRoles') : I18n.t('filter.filterRoles')}\n <span class=\"roles-count\">${this._selectedRoleIds.length}/${this._allSections.length}</span>\n </button>\n ` : ''}\n \n ${this.mode !== 'admin' ? html`\n <button \n class=\"btn-secondary\"\n @click=\"${this._handleSaveDraft}\"\n ?disabled=\"${this.disabled || this.readonly || this.isDraftSaving}\"\n >\n ${this.isDraftSaving ? I18n.t('form.savingDraft') : I18n.t('form.saveDraft')}\n </button>\n ` : ''}\n \n\n <!-- Validation state buttons -->\n ${this._validationStatus === 'inProgress' ? html`\n <button\n class=\"btn-preview\"\n @click=\"${() => this.dispatchEvent(new CustomEvent('showPreview', { bubbles: true, composed: true }))}\"\n ?disabled=\"${this.disabled || this.readonly}\"\n >\n ${I18n.t('form.preview')}\n </button>\n ` : ''}\n\n ${this._validationStatus === 'complete' || this.showLastValidationResultBtn ? html`\n <button\n class=\"btn-secondary btn-last-results\"\n @click=\"${() => this.dispatchEvent(new CustomEvent('show-validation-results', { bubbles: true, composed: true }))}\"\n ?disabled=\"${this.disabled || this.readonly}\"\n >\n ${I18n.t('form.lastValidationResults')}\n </button>\n ` : ''}\n\n\n <button\n class=\"btn-primary\"\n @click=\"${this._handleSubmit}\"\n ?disabled=\"${this.disabled || this.readonly || this._submitDisabled || this._validationStatus === 'inProgress'}\"\n >\n ${this.submitButtonLabel || (this.mode === 'admin' ? I18n.t('form.save') : I18n.t('form.submit'))}\n </button>\n\n </div>\n ` : ''}\n\n <!-- Filter Roles Dialog -->\n ${this._showFilterDialog ? html`\n <jupiter-filter-roles-dialog\n ?open=\"${this._showFilterDialog}\"\n .availableRoles=\"${this._allSections}\"\n .selectedRoleIds=\"${this._getRoleIdsArray()}\"\n .periodPreferences=\"${this._periodPreferences}\"\n .hypercubeData=\"${this.xbrlInput?.hypercubes}\"\n .mode=\"${this.mode}\"\n .showFactsOnly=\"${this._showFactsOnly}\"\n .conceptSearchText=\"${this._conceptSearchText}\"\n @dialog-cancel=\"${this._handleFilterDialogCancel}\"\n @roles-filter-apply=\"${this._handleRoleFilterApply}\"\n @advanced-filter-apply=\"${this._handleAdvancedFilterApply}\"\n @click=\"${this._handleFilterDialogCancel}\"\n ></jupiter-filter-roles-dialog>\n ` : ''}\n \n <!-- Validation Error Popup -->\n ${this._showErrorPopup ? html`\n <div class=\"error-popup-overlay\" @click=\"${() => { this._showErrorPopup = false; this.requestUpdate(); }}\">\n <div class=\"error-popup\" @click=\"${(e: Event) => e.stopPropagation()}\">\n <div class=\"error-popup-header\">\n <h3>⚠️ ${I18n.t('error.popup.title')}</h3>\n <button class=\"error-popup-close\" @click=\"${() => { this._showErrorPopup = false; this.requestUpdate(); }}\">×</button>\n </div>\n <div class=\"error-popup-content\">\n <p>${I18n.t('error.popup.message')}</p>\n <ul class=\"error-list\">\n ${this._xbrlFormErrors.map(error => {\n const concept = this._findConceptInAllSections(error.conceptId);\n const column = this._findColumnById(error.columnId);\n const fieldLabel = concept?.label || error.conceptId;\n const columnTitle = column?.title || error.columnId;\n return html`\n <li>\n <strong>${I18n.t('error.popup.field')}</strong>\n <a\n href=\"javascript:void(0)\"\n class=\"error-field-link\"\n @click=\"${() => this._handleErrorFieldClick(error.conceptId, error.columnId, error.sectionId)}\"\n title=\"${I18n.t('error.popup.clickToFocus')}\"\n >\n ${fieldLabel} (${columnTitle})\n </a><br>\n <strong>${I18n.t('error.popup.value')}</strong> ${error.value}<br>\n <strong>${I18n.t('error.popup.errors')}</strong>\n <ul>\n ${error.errors.map(err => html`<li>${err.message}</li>`)}\n </ul>\n </li>\n `; })}\n </ul>\n </div>\n <div class=\"error-popup-footer\">\n <button class=\"btn-primary\" @click=\"${() => { this._showErrorPopup = false; this.requestUpdate(); }}\">${I18n.t('error.popup.ok')}</button>\n </div>\n </div>\n </div>\n ` : ''}\n \n <!-- Role Context Menu -->\n ${this._showRoleContextMenu ? html`\n <div \n class=\"role-context-menu\"\n style=\"left: ${this._contextMenuX}px; top: ${this._contextMenuY}px;\"\n @click=\"${(e: Event) => { e.stopPropagation(); }}\"\n >\n <div \n class=\"context-menu-item danger\"\n @click=\"${() => this._handleRemoveRole()}\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\"/>\n </svg>\n Remove\n </div>\n </div>\n ` : ''}\n </div>\n `;\n }\n}\n","// Main entry point for Jupiter Dynamic Forms\nexport * from './core/dynamic-form';\nexport * from './core/form-section';\nexport * from './core/concept-tree';\nexport * from './core/form-field';\nexport * from './core/add-column-dialog';\nexport * from './core/filter-roles-dialog';\nexport * from './core/advanced-filter';\nexport * from './schema/types';\nexport * from './utils/validation';\nexport * from './utils/xbrl-validation';\nexport * from './utils/type-input-mapping';\nexport * from './utils/fact-matcher';\n\n// Register all custom elements\nimport './core/dynamic-form';\nimport './core/form-section';\nimport './core/concept-tree';\nimport './core/form-field';\nimport './core/add-column-dialog';\nimport './core/filter-roles-dialog';\nimport './core/advanced-filter';\n\n// Version export\nexport const version = '1.5.0';\n"],"names":["t","e","o","s","r","n","c","i","h","_a","error","l","section","column","field","item","d","axisLabel","dimensionInfo","columns","f","validation","u","__decorateClass","property","state","customElement","next","_b","a","b","customElements","draft","_c"],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,MAAMA,MAAE,CAAAA,OAAG,CAACC,IAAEC,OAAI;AAAC,aAASA,KAAEA,GAAE,eAAgB,MAAI;AAAC,mBAAe,OAAOF,IAAEC,EAAC;AAAA,EAAC,CAAC,IAAG,eAAe,OAAOD,IAAEC,EAAC;AAAC;ACL7G;AAAA;AAAA;AAAA;AAAA;AAKA,MAAM,IAAE,YAAWA,MAAE,EAAE,eAAa,WAAS,EAAE,YAAU,EAAE,SAAS,iBAAe,wBAAuB,SAAS,aAAW,aAAY,cAAc,WAAU,IAAE,OAAQ,GAACC,MAAE,oBAAI;AAAO,IAAA,MAAC,MAAM,EAAC;AAAA,EAAC,YAAYF,IAAEC,IAAEC,IAAE;AAAC,QAAG,KAAK,eAAa,MAAGA,OAAI;AAAE,YAAM,MAAM,mEAAmE;AAAE,SAAK,UAAQF,IAAE,KAAK,IAAEC;AAAA,EAAC;AAAA,EAAC,IAAI,aAAY;AAAC,QAAID,KAAE,KAAK;AAAE,UAAMG,KAAE,KAAK;AAAE,QAAGF,OAAG,WAASD,IAAE;AAAC,YAAMC,KAAE,WAASE,MAAG,MAAIA,GAAE;AAAO,MAAAF,OAAID,KAAEE,IAAE,IAAIC,EAAC,IAAG,WAASH,QAAK,KAAK,IAAEA,KAAE,IAAI,iBAAe,YAAY,KAAK,OAAO,GAAEC,MAAGC,IAAE,IAAIC,IAAEH,EAAC;AAAA,IAAE;AAAC,WAAOA;AAAA,EAAC;AAAA,EAAC,WAAU;AAAC,WAAO,KAAK;AAAA,EAAO;AAAC;AAAM,MAACI,MAAE,CAAAJ,OAAG,IAAIK,IAAE,YAAU,OAAOL,KAAEA,KAAEA,KAAE,IAAG,QAAO,CAAC,GAA2V,IAAE,CAACG,IAAED,OAAI;AAAC,MAAGD;AAAE,IAAAE,GAAE,qBAAmBD,GAAE,IAAK,CAAAF,OAAGA,cAAa,gBAAcA,KAAEA,GAAE;;AAAkB,eAAUC,MAAKC,IAAE;AAAC,YAAMA,KAAE,SAAS,cAAc,OAAO,GAAEG,KAAE,EAAE;AAAS,iBAASA,MAAGH,GAAE,aAAa,SAAQG,EAAC,GAAEH,GAAE,cAAYD,GAAE,SAAQE,GAAE,YAAYD,EAAC;AAAA,IAAC;AAAC,GAAEI,MAAEL,MAAE,CAAAD,OAAGA,KAAE,CAAAA,OAAGA,cAAa,iBAAe,CAAAA,OAAG;AAAC,MAAIC,KAAE;AAAG,aAAUE,MAAKH,GAAE;AAAS,IAAAC,MAAGE,GAAE;AAAQ,SAAOC,IAAEH,EAAC;AAAC,GAAGD,EAAC,IAAEA;ACJ3zC;AAAA;AAAA;AAAA;AAAA;AAIG,MAAK,EAAC,IAAG,GAAE,gBAAe,GAAE,0BAAyB,GAAE,qBAAoBI,KAAE,uBAAsBF,KAAE,gBAAeG,IAAC,IAAE,QAAO,IAAE,YAAW,IAAE,EAAE,cAAa,IAAE,IAAE,EAAE,cAAY,IAAG,IAAE,EAAE,gCAA+B,IAAE,CAACL,IAAEG,OAAIH,IAAE,IAAE,EAAC,YAAYA,IAAEG,IAAE;AAAC,UAAOA,IAAC;AAAA,IAAE,KAAK;AAAQ,MAAAH,KAAEA,KAAE,IAAE;AAAK;AAAA,IAAM,KAAK;AAAA,IAAO,KAAK;AAAM,MAAAA,KAAE,QAAMA,KAAEA,KAAE,KAAK,UAAUA,EAAC;AAAA,EAAC;AAAC,SAAOA;AAAC,GAAE,cAAcA,IAAEG,IAAE;AAAC,MAAII,KAAEP;AAAE,UAAOG,IAAG;AAAA,IAAA,KAAK;AAAQ,MAAAI,KAAE,SAAOP;AAAE;AAAA,IAAM,KAAK;AAAO,MAAAO,KAAE,SAAOP,KAAE,OAAK,OAAOA,EAAC;AAAE;AAAA,IAAM,KAAK;AAAA,IAAO,KAAK;AAAM,UAAG;AAAC,QAAAO,KAAE,KAAK,MAAMP,EAAC;AAAA,MAAC,SAAOA,IAAE;AAAC,QAAAO,KAAE;AAAA,MAAI;AAAA,EAAC;AAAC,SAAOA;AAAC,EAAC,GAAE,IAAE,CAACP,IAAEG,OAAI,CAAC,EAAEH,IAAEG,EAAC,GAAE,IAAE,EAAC,WAAU,MAAG,MAAK,QAAO,WAAU,GAAE,SAAQ,OAAG,YAAW,OAAG,YAAW,EAAC;AAAE,OAAO,aAAP,OAAO,WAAW,OAAO,UAAU,IAAE,EAAE,wBAAF,EAAE,sBAAsB,oBAAI;AAAQ,MAAM,UAAU,YAAW;AAAA,EAAC,OAAO,eAAeH,IAAE;AAAC,SAAK,KAAI,IAAI,KAAK,MAAL,KAAK,IAAI,CAAA,IAAI,KAAKA,EAAC;AAAA,EAAC;AAAA,EAAC,WAAW,qBAAoB;AAAC,WAAO,KAAK,SAAQ,GAAG,KAAK,QAAM,CAAC,GAAG,KAAK,KAAK,KAAM,CAAA;AAAA,EAAC;AAAA,EAAC,OAAO,eAAeA,IAAEG,KAAE,GAAE;AAAC,QAAGA,GAAE,UAAQA,GAAE,YAAU,QAAI,KAAK,KAAI,GAAG,KAAK,UAAU,eAAeH,EAAC,OAAKG,KAAE,OAAO,OAAOA,EAAC,GAAG,UAAQ,OAAI,KAAK,kBAAkB,IAAIH,IAAEG,EAAC,GAAE,CAACA,GAAE,YAAW;AAAC,YAAMI,KAAE,OAAQ,GAACC,KAAE,KAAK,sBAAsBR,IAAEO,IAAEJ,EAAC;AAAE,iBAASK,MAAG,EAAE,KAAK,WAAUR,IAAEQ,EAAC;AAAA,IAAC;AAAA,EAAC;AAAA,EAAC,OAAO,sBAAsBR,IAAEG,IAAEI,IAAE;AAAC,UAAK,EAAC,KAAIN,IAAE,KAAIG,GAAC,IAAE,EAAE,KAAK,WAAUJ,EAAC,KAAG,EAAC,MAAK;AAAC,aAAO,KAAKG,EAAC;AAAA,IAAC,GAAE,IAAIH,IAAE;AAAC,WAAKG,EAAC,IAAEH;AAAA,IAAC,EAAC;AAAE,WAAM,EAAC,KAAIC,IAAE,IAAIE,IAAE;AAAC,YAAMK,KAAEP,MAAA,gBAAAA,GAAG,KAAK;AAAM,MAAAG,MAAA,gBAAAA,GAAG,KAAK,MAAKD,KAAG,KAAK,cAAcH,IAAEQ,IAAED,EAAC;AAAA,IAAC,GAAE,cAAa,MAAG,YAAW,KAAE;AAAA,EAAC;AAAA,EAAC,OAAO,mBAAmBP,IAAE;AAAC,WAAO,KAAK,kBAAkB,IAAIA,EAAC,KAAG;AAAA,EAAC;AAAA,EAAC,OAAO,OAAM;AAAC,QAAG,KAAK,eAAe,EAAE,mBAAmB,CAAC;AAAE;AAAO,UAAMA,KAAEK,IAAE,IAAI;AAAE,IAAAL,GAAE,SAAU,GAAC,WAASA,GAAE,MAAI,KAAK,IAAE,CAAC,GAAGA,GAAE,CAAC,IAAG,KAAK,oBAAkB,IAAI,IAAIA,GAAE,iBAAiB;AAAA,EAAC;AAAA,EAAC,OAAO,WAAU;AAAC,QAAG,KAAK,eAAe,EAAE,WAAW,CAAC;AAAE;AAAO,QAAG,KAAK,YAAU,MAAG,KAAK,KAAI,GAAG,KAAK,eAAe,EAAE,YAAY,CAAC,GAAE;AAAC,YAAMA,KAAE,KAAK,YAAWG,KAAE,CAAC,GAAGC,IAAEJ,EAAC,GAAE,GAAGE,IAAEF,EAAC,CAAC;AAAE,iBAAUO,MAAKJ;AAAE,aAAK,eAAeI,IAAEP,GAAEO,EAAC,CAAC;AAAA,IAAC;AAAC,UAAMP,KAAE,KAAK,OAAO,QAAQ;AAAE,QAAG,SAAOA,IAAE;AAAC,YAAMG,KAAE,oBAAoB,IAAIH,EAAC;AAAE,UAAG,WAASG;AAAE,mBAAS,CAACH,IAAEO,EAAC,KAAIJ;AAAE,eAAK,kBAAkB,IAAIH,IAAEO,EAAC;AAAA,IAAC;AAAC,SAAK,OAAK,oBAAI;AAAI,eAAS,CAACP,IAAEG,EAAC,KAAI,KAAK,mBAAkB;AAAC,YAAMI,KAAE,KAAK,KAAKP,IAAEG,EAAC;AAAE,iBAASI,MAAG,KAAK,KAAK,IAAIA,IAAEP,EAAC;AAAA,IAAC;AAAC,SAAK,gBAAc,KAAK,eAAe,KAAK,MAAM;AAAA,EAAC;AAAA,EAAC,OAAO,eAAeG,IAAE;AAAC,UAAMI,KAAE,CAAA;AAAG,QAAG,MAAM,QAAQJ,EAAC,GAAE;AAAC,YAAMF,KAAE,IAAI,IAAIE,GAAE,KAAK,IAAE,CAAC,EAAE,QAAO,CAAE;AAAE,iBAAUA,MAAKF;AAAE,QAAAM,GAAE,QAAQP,IAAEG,EAAC,CAAC;AAAA,IAAC;AAAM,iBAASA,MAAGI,GAAE,KAAKP,IAAEG,EAAC,CAAC;AAAE,WAAOI;AAAA,EAAC;AAAA,EAAC,OAAO,KAAKP,IAAEG,IAAE;AAAC,UAAMI,KAAEJ,GAAE;AAAU,WAAM,UAAKI,KAAE,SAAO,YAAU,OAAOA,KAAEA,KAAE,YAAU,OAAOP,KAAEA,GAAE,YAAW,IAAG;AAAA,EAAM;AAAA,EAAC,cAAa;AAAC,UAAO,GAAC,KAAK,OAAK,QAAO,KAAK,kBAAgB,OAAG,KAAK,aAAW,OAAG,KAAK,OAAK,MAAK,KAAK,KAAM;AAAA,EAAA;AAAA,EAAC,OAAM;;AAAC,SAAK,OAAK,IAAI,QAAS,CAAAA,OAAG,KAAK,iBAAeA,EAAG,GAAC,KAAK,OAAK,oBAAI,OAAI,KAAK,KAAI,GAAG,KAAK,cAAe,IAAC,UAAK,YAAY,MAAjB,mBAAoB,QAAS,CAAAA,OAAGA,GAAE,IAAI;AAAA,EAAG;AAAA,EAAC,cAAcA,IAAE;;AAAC,KAAC,KAAK,SAAL,KAAK,OAAO,oBAAI,QAAK,IAAIA,EAAC,GAAE,WAAS,KAAK,cAAY,KAAK,iBAAa,KAAAA,GAAE,kBAAF,wBAAAA;AAAA,EAAmB;AAAA,EAAC,iBAAiBA,IAAE;;AAAC,eAAK,SAAL,mBAAW,OAAOA;AAAA,EAAE;AAAA,EAAC,OAAM;AAAC,UAAMA,KAAE,oBAAI,OAAIG,KAAE,KAAK,YAAY;AAAkB,eAAUI,MAAKJ,GAAE,KAAM;AAAC,WAAK,eAAeI,EAAC,MAAIP,GAAE,IAAIO,IAAE,KAAKA,EAAC,CAAC,GAAE,OAAO,KAAKA,EAAC;AAAG,IAAAP,GAAE,OAAK,MAAI,KAAK,OAAKA;AAAA,EAAE;AAAA,EAAC,mBAAkB;AAAC,UAAMA,KAAE,KAAK,cAAY,KAAK,aAAa,KAAK,YAAY,iBAAiB;AAAE,WAAOG,EAAEH,IAAE,KAAK,YAAY,aAAa,GAAEA;AAAA,EAAC;AAAA,EAAC,oBAAmB;;AAAC,SAAK,eAAL,KAAK,aAAa,KAAK,iBAAgB,IAAG,KAAK,eAAe,IAAE,IAAE,UAAK,SAAL,mBAAW,QAAS,CAAAA,OAAC;;AAAE,cAAAS,MAAAT,GAAE,kBAAF,gBAAAS,IAAA,KAAAT;AAAA;AAAA,EAAqB;AAAA,EAAC,eAAeA,IAAE;AAAA,EAAE;AAAA,EAAA,uBAAsB;;AAAC,eAAK,SAAL,mBAAW,QAAS,CAAAA,OAAC;;AAAE,cAAAS,MAAAT,GAAE,qBAAF,gBAAAS,IAAA,KAAAT;AAAA;AAAA,EAAwB;AAAA,EAAC,yBAAyBA,IAAEG,IAAEI,IAAE;AAAC,SAAK,KAAKP,IAAEO,EAAC;AAAA,EAAC;AAAA,EAAC,KAAKP,IAAEG,IAAE;;AAAC,UAAMI,KAAE,KAAK,YAAY,kBAAkB,IAAIP,EAAC,GAAEC,KAAE,KAAK,YAAY,KAAKD,IAAEO,EAAC;AAAE,QAAG,WAASN,MAAG,SAAKM,GAAE,SAAQ;AAAC,YAAMC,MAAG,aAAS,KAAAD,GAAE,cAAF,mBAAa,eAAYA,GAAE,YAAU,GAAG,YAAYJ,IAAEI,GAAE,IAAI;AAAE,WAAK,OAAKP,IAAE,QAAMQ,KAAE,KAAK,gBAAgBP,EAAC,IAAE,KAAK,aAAaA,IAAEO,EAAC,GAAE,KAAK,OAAK;AAAA,IAAI;AAAA,EAAC;AAAA,EAAC,KAAKR,IAAEG,IAAE;;AAAC,UAAMI,KAAE,KAAK,aAAYN,KAAEM,GAAE,KAAK,IAAIP,EAAC;AAAE,QAAG,WAASC,MAAG,KAAK,SAAOA,IAAE;AAAC,YAAMD,KAAEO,GAAE,mBAAmBN,EAAC,GAAEO,KAAE,cAAY,OAAOR,GAAE,YAAU,EAAC,eAAcA,GAAE,UAAS,IAAE,aAAS,KAAAA,GAAE,cAAF,mBAAa,iBAAcA,GAAE,YAAU;AAAE,WAAK,OAAKC;AAAE,YAAMG,KAAEI,GAAE,cAAcL,IAAEH,GAAE,IAAI;AAAE,WAAKC,EAAC,IAAEG,QAAG,UAAK,SAAL,mBAAW,IAAIH,QAAIG,IAAE,KAAK,OAAK;AAAA,IAAI;AAAA,EAAC;AAAA,EAAC,cAAcJ,IAAEG,IAAEI,IAAE;;AAAC,QAAG,WAASP,IAAE;AAAC,YAAMC,KAAE,KAAK,aAAYO,KAAE,KAAKR,EAAC;AAAE,UAAGO,YAAIN,GAAE,mBAAmBD,EAAC,IAAE,GAAGO,GAAE,cAAY,GAAGC,IAAEL,EAAC,KAAGI,GAAE,cAAYA,GAAE,WAASC,SAAI,UAAK,SAAL,mBAAW,IAAIR,QAAI,CAAC,KAAK,aAAaC,GAAE,KAAKD,IAAEO,EAAC,CAAC;AAAG;AAAO,WAAK,EAAEP,IAAEG,IAAEI,EAAC;AAAA,IAAC;AAAC,cAAK,KAAK,oBAAkB,KAAK,OAAK,KAAK,KAAI;AAAA,EAAG;AAAA,EAAC,EAAEP,IAAEG,IAAE,EAAC,YAAWI,IAAE,SAAQN,IAAE,SAAQO,GAAC,GAAEJ,IAAE;AAAC,IAAAG,MAAG,EAAE,KAAK,SAAL,KAAK,OAAO,oBAAI,QAAK,IAAIP,EAAC,MAAI,KAAK,KAAK,IAAIA,IAAEI,MAAGD,MAAG,KAAKH,EAAC,CAAC,GAAE,SAAKQ,MAAG,WAASJ,QAAK,KAAK,KAAK,IAAIJ,EAAC,MAAI,KAAK,cAAYO,OAAIJ,KAAE,SAAQ,KAAK,KAAK,IAAIH,IAAEG,EAAC,IAAG,SAAKF,MAAG,KAAK,SAAOD,OAAI,KAAK,SAAL,KAAK,OAAO,oBAAI,QAAK,IAAIA,EAAC;AAAA,EAAE;AAAA,EAAC,MAAM,OAAM;AAAC,SAAK,kBAAgB;AAAG,QAAG;AAAC,YAAM,KAAK;AAAA,IAAI,SAAOA,IAAE;AAAC,cAAQ,OAAOA,EAAC;AAAA,IAAC;AAAC,UAAMA,KAAE,KAAK,eAAc;AAAG,WAAO,QAAMA,MAAG,MAAMA,IAAE,CAAC,KAAK;AAAA,EAAe;AAAA,EAAC,iBAAgB;AAAC,WAAO,KAAK,cAAe;AAAA,EAAA;AAAA,EAAC,gBAAe;;AAAC,QAAG,CAAC,KAAK;AAAgB;AAAO,QAAG,CAAC,KAAK,YAAW;AAAC,UAAG,KAAK,eAAL,KAAK,aAAa,KAAK,qBAAmB,KAAK,MAAK;AAAC,mBAAS,CAACA,IAAEG,EAAC,KAAI,KAAK;AAAK,eAAKH,EAAC,IAAEG;AAAE,aAAK,OAAK;AAAA,MAAM;AAAC,YAAMH,KAAE,KAAK,YAAY;AAAkB,UAAGA,GAAE,OAAK;AAAE,mBAAS,CAACG,IAAEI,EAAC,KAAIP,IAAE;AAAC,gBAAK,EAAC,SAAQA,GAAC,IAAEO,IAAEN,KAAE,KAAKE,EAAC;AAAE,mBAAKH,MAAG,KAAK,KAAK,IAAIG,EAAC,KAAG,WAASF,MAAG,KAAK,EAAEE,IAAE,QAAOI,IAAEN,EAAC;AAAA,QAAC;AAAA,IAAC;AAAC,QAAID,KAAE;AAAG,UAAMG,KAAE,KAAK;AAAK,QAAG;AAAC,MAAAH,KAAE,KAAK,aAAaG,EAAC,GAAEH,MAAG,KAAK,WAAWG,EAAC,IAAE,UAAK,SAAL,mBAAW,QAAS,CAAAH,OAAC;;AAAE,gBAAAS,MAAAT,GAAE,eAAF,gBAAAS,IAAA,KAAAT;AAAA,UAAmB,KAAK,OAAOG,EAAC,KAAG,KAAK,KAAI;AAAA,IAAE,SAAOA,IAAE;AAAC,YAAMH,KAAE,OAAG,KAAK,KAAI,GAAGG;AAAA,IAAC;AAAC,IAAAH,MAAG,KAAK,KAAKG,EAAC;AAAA,EAAC;AAAA,EAAC,WAAWH,IAAE;AAAA,EAAA;AAAA,EAAE,KAAKA,IAAE;;AAAC,eAAK,SAAL,mBAAW,QAAS,CAAAA,OAAC;;AAAE,cAAAS,MAAAT,GAAE,gBAAF,gBAAAS,IAAA,KAAAT;AAAA,QAAoB,KAAK,eAAa,KAAK,aAAW,MAAG,KAAK,aAAaA,EAAC,IAAG,KAAK,QAAQA,EAAC;AAAA,EAAC;AAAA,EAAC,OAAM;AAAC,SAAK,OAAK,oBAAI,OAAI,KAAK,kBAAgB;AAAA,EAAE;AAAA,EAAC,IAAI,iBAAgB;AAAC,WAAO,KAAK,kBAAmB;AAAA,EAAA;AAAA,EAAC,oBAAmB;AAAC,WAAO,KAAK;AAAA,EAAI;AAAA,EAAC,aAAaA,IAAE;AAAC,WAAM;AAAA,EAAE;AAAA,EAAC,OAAOA,IAAE;AAAC,SAAK,SAAL,KAAK,OAAO,KAAK,KAAK,QAAS,CAAAA,OAAG,KAAK,KAAKA,IAAE,KAAKA,EAAC,CAAC,CAAG,IAAC,KAAK,KAAI;AAAA,EAAE;AAAA,EAAC,QAAQA,IAAE;AAAA,EAAE;AAAA,EAAA,aAAaA,IAAE;AAAA,EAAA;AAAE;AAAC,EAAE,gBAAc,CAAA,GAAG,EAAE,oBAAkB,EAAC,MAAK,OAAM,GAAE,EAAE,EAAE,mBAAmB,CAAC,IAAE,oBAAI,OAAI,EAAE,EAAE,WAAW,CAAC,IAAE,oBAAI,OAAI,uBAAI,EAAC,iBAAgB,EAAC,KAAI,EAAE,4BAAF,EAAE,0BAA0B,CAAE,IAAE,KAAK,OAAO;ACJ7xL;AAAA;AAAA;AAAA;AAAA;AAIG,MAAM,IAAE,EAAC,WAAU,MAAG,MAAK,QAAO,WAAUA,GAAE,SAAQ,OAAG,YAAWC,EAAC,GAAEG,MAAE,CAACJ,KAAE,GAAEC,IAAEG,OAAI;AAAC,QAAK,EAAC,MAAKC,IAAE,UAASE,GAAC,IAAEH;AAAE,MAAID,KAAE,WAAW,oBAAoB,IAAII,EAAC;AAAE,MAAG,WAASJ,MAAG,WAAW,oBAAoB,IAAII,IAAEJ,KAAE,oBAAI,KAAG,GAAE,aAAWE,QAAKL,KAAE,OAAO,OAAOA,EAAC,GAAG,UAAQ,OAAIG,GAAE,IAAIC,GAAE,MAAKJ,EAAC,GAAE,eAAaK,IAAE;AAAC,UAAK,EAAC,MAAKH,GAAC,IAAEE;AAAE,WAAM,EAAC,IAAIA,IAAE;AAAC,YAAMC,KAAEJ,GAAE,IAAI,KAAK,IAAI;AAAE,MAAAA,GAAE,IAAI,KAAK,MAAKG,EAAC,GAAE,KAAK,cAAcF,IAAEG,IAAEL,EAAC;AAAA,IAAC,GAAE,KAAKC,IAAE;AAAC,aAAO,WAASA,MAAG,KAAK,EAAEC,IAAE,QAAOF,IAAEC,EAAC,GAAEA;AAAA,IAAC,EAAC;AAAA,EAAC;AAAC,MAAG,aAAWI,IAAE;AAAC,UAAK,EAAC,MAAKH,GAAC,IAAEE;AAAE,WAAO,SAASA,IAAE;AAAC,YAAMC,KAAE,KAAKH,EAAC;AAAE,MAAAD,GAAE,KAAK,MAAKG,EAAC,GAAE,KAAK,cAAcF,IAAEG,IAAEL,EAAC;AAAA,IAAC;AAAA,EAAC;AAAC,QAAM,MAAM,qCAAmCK,EAAC;AAAC;AAAE,SAASA,GAAEL,IAAE;AAAC,SAAM,CAACC,IAAEC,OAAI,YAAU,OAAOA,KAAEE,IAAEJ,IAAEC,IAAEC,EAAC,KAAG,CAACF,IAAEC,IAAEC,OAAI;AAAC,UAAME,KAAEH,GAAE,eAAeC,EAAC;AAAE,WAAOD,GAAE,YAAY,eAAeC,IAAEF,EAAC,GAAEI,KAAE,OAAO,yBAAyBH,IAAEC,EAAC,IAAE;AAAA,EAAM,GAAGF,IAAEC,IAAEC,EAAC;AAAC;ACJryB;AAAA;AAAA;AAAA;AAAA;AAIG,SAAS,EAAEE,IAAE;AAAC,SAAOJ,GAAE,EAAC,GAAGI,IAAE,OAAM,MAAG,WAAU,MAAE,CAAC;AAAC;ACHhD,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA,EAIzB,OAAO,cACL,SACA,WACA,UACA,OACA,WACA,QAA0B,IACP;AACnB,UAAM,SAA4B,CAAA;AAElC,eAAW,QAAQ,OAAO;AAClB,YAAAM,SAAQ,KAAK,aAAa,SAAS,WAAW,UAAU,OAAO,WAAW,IAAI;AACpF,UAAIA,QAAO;AACT,eAAO,KAAKA,MAAK;AAAA,MACnB;AAAA,IACF;AAEO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,aACb,SACA,WACA,UACA,OACA,YACA,MACwB;AACxB,UAAM,UAAU,UAAU,QAAQ,UAAU,UAAa,UAAU;AAEnE,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,YAAI,SAAS;AACX,iBAAO,KAAK,YAAY,SAAS,WAAW,UAAU,IAAI;AAAA,QAC5D;AACA;AAAA,MAEF,KAAK;AACH,YAAI,CAAC,WAAW,OAAO,UAAU,YAAY,QAAQ,KAAK,OAAO;AAC/D,iBAAO,KAAK,YAAY,SAAS,WAAW,UAAU,IAAI;AAAA,QAC5D;AACA;AAAA,MAEF,KAAK;AACH,YAAI,CAAC,WAAW,OAAO,UAAU,YAAY,QAAQ,KAAK,OAAO;AAC/D,iBAAO,KAAK,YAAY,SAAS,WAAW,UAAU,IAAI;AAAA,QAC5D;AACA;AAAA,MAEF,KAAK;AACC,YAAA,CAAC,WAAW,OAAO,UAAU,YAAY,MAAM,SAAS,KAAK,OAAO;AACtE,iBAAO,KAAK,YAAY,SAAS,WAAW,UAAU,IAAI;AAAA,QAC5D;AACA;AAAA,MAEF,KAAK;AACC,YAAA,CAAC,WAAW,OAAO,UAAU,YAAY,MAAM,SAAS,KAAK,OAAO;AACtE,iBAAO,KAAK,YAAY,SAAS,WAAW,UAAU,IAAI;AAAA,QAC5D;AACA;AAAA,MAEF,KAAK;AACH,YAAI,CAAC,WAAW,OAAO,UAAU,UAAU;AACzC,gBAAM,QAAQ,IAAI,OAAO,KAAK,KAAK;AACnC,cAAI,CAAC,MAAM,KAAK,KAAK,GAAG;AACtB,mBAAO,KAAK,YAAY,SAAS,WAAW,UAAU,IAAI;AAAA,UAC5D;AAAA,QACF;AACA;AAAA,MAEF,KAAK;AACH,YAAI,CAAC,WAAW,OAAO,UAAU,UAAU;AACzC,gBAAM,aAAa;AACnB,cAAI,CAAC,WAAW,KAAK,KAAK,GAAG;AAC3B,mBAAO,KAAK,YAAY,SAAS,WAAW,UAAU,IAAI;AAAA,UAC5D;AAAA,QACF;AACA;AAAA,MAEF,KAAK;AACH,YAAI,CAAC,WAAW,OAAO,UAAU,UAAU;AACrC,cAAA;AACF,gBAAI,IAAI,KAAK;AAAA,UAAA,QACP;AACN,mBAAO,KAAK,YAAY,SAAS,WAAW,UAAU,IAAI;AAAA,UAC5D;AAAA,QACF;AACA;AAAA,MAEF,KAAK;AAEH;AAAA,MAEF;AACE,gBAAQ,KAAK,iCAAiC,KAAK,IAAI,EAAE;AAAA,IAC7D;AAEO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,YACb,SACA,WACA,UACA,MACiB;AACV,WAAA;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,KAAK;AAAA,MACd,UAAU,KAAK,YAAY;AAAA,MAC3B;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,iBAAiB,OAAY,WAAgF;AAClH,QAAI,UAAU,QAAQ,UAAU,UAAa,UAAU,IAAI;AACzD,aAAO,EAAE,OAAO,MAAM,gBAAgB,MAAM;AAAA,IAC9C;AAEA,YAAQ,WAAW;AAAA,MACjB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,cAAc;AACX,cAAA,WAAW,OAAO,KAAK;AACzB,YAAA,MAAM,QAAQ,GAAG;AACnB,iBAAO,EAAE,OAAO,OAAO,OAAO,wBAAwB;AAAA,QACxD;AACA,eAAO,EAAE,OAAO,MAAM,gBAAgB,SAAS;AAAA,MACjD;AAAA,MAEA,KAAK,QAAQ;AACL,cAAA,YAAY,IAAI,KAAK,KAAK;AAChC,YAAI,MAAM,UAAU,QAAQ,CAAC,GAAG;AAC9B,iBAAO,EAAE,OAAO,OAAO,OAAO,sBAAsB;AAAA,QACtD;AACO,eAAA,EAAE,OAAO,MAAM,gBAAgB,UAAU,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE;AAAA,MAC9E;AAAA,MAEA,KAAK,YAAY;AACT,cAAA,gBAAgB,IAAI,KAAK,KAAK;AACpC,YAAI,MAAM,cAAc,QAAQ,CAAC,GAAG;AAClC,iBAAO,EAAE,OAAO,OAAO,OAAO,0BAA0B;AAAA,QAC1D;AACA,eAAO,EAAE,OAAO,MAAM,gBAAgB,cAAc;MACtD;AAAA,MAEA,KAAK;AACC,YAAA,OAAO,UAAU,WAAW;AAC9B,iBAAO,EAAE,OAAO,MAAM,gBAAgB,MAAM;AAAA,QAC9C;AACI,YAAA,OAAO,UAAU,UAAU;AACvB,gBAAA,YAAY,MAAM;AACpB,cAAA,cAAc,UAAU,cAAc,KAAK;AAC7C,mBAAO,EAAE,OAAO,MAAM,gBAAgB,KAAK;AAAA,UAC7C;AACI,cAAA,cAAc,WAAW,cAAc,KAAK;AAC9C,mBAAO,EAAE,OAAO,MAAM,gBAAgB,MAAM;AAAA,UAC9C;AAAA,QACF;AACA,eAAO,EAAE,OAAO,OAAO,OAAO,yBAAyB;AAAA,MAEzD,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,EAAE,OAAO,MAAM,gBAAgB,OAAO,KAAK;MAEpD,KAAK;AAAA,MACL,KAAK;AACH,eAAO,EAAE,OAAO,MAAM,gBAAgB,MAAM;AAAA,MAE9C;AACE,eAAO,EAAE,OAAO,MAAM,gBAAgB,MAAM;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,YAAY,OAAY,WAAsB,SAAS,SAAiB;AACzE,QAAA,UAAU,QAAQ,UAAU;AAAkB,aAAA;AAElD,YAAQ,WAAW;AAAA,MACjB,KAAK;AACI,eAAA,IAAI,KAAK,aAAa,MAAM,EAAE,OAAO,OAAO,KAAK,CAAC;AAAA,MAE3D,KAAK;AACI,eAAA,IAAI,KAAK,aAAa,QAAQ;AAAA,UACnC,uBAAuB;AAAA,UACvB,uBAAuB;AAAA,QACxB,CAAA,EAAE,OAAO,OAAO,KAAK,CAAC;AAAA,MAEzB,KAAK;AACI,eAAA,IAAI,KAAK,aAAa,QAAQ;AAAA,UACnC,OAAO;AAAA,UACP,UAAU;AAAA;AAAA,QACX,CAAA,EAAE,OAAO,OAAO,KAAK,CAAC;AAAA,MAEzB,KAAK;AACI,eAAA,IAAI,KAAK,aAAa,QAAQ;AAAA,UACnC,OAAO;AAAA,UACP,uBAAuB;AAAA,QACxB,CAAA,EAAE,OAAO,OAAO,KAAK,IAAI,GAAG;AAAA,MAE/B,KAAK;AACH,eAAO,IAAI,KAAK,KAAK,EAAE,mBAAmB,MAAM;AAAA,MAElD,KAAK;AACH,eAAO,IAAI,KAAK,KAAK,EAAE,eAAe,MAAM;AAAA,MAE9C;AACE,eAAO,OAAO,KAAK;AAAA,IACvB;AAAA,EACF;AACF;ACvMO,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ3B,OAAe,oBAAoB,WAAmB,SAAyB;AACzE,QAAA,CAAC,aAAa,CAAC,SAAS;AACnB,aAAA,GAAG,SAAS,MAAM,OAAO;AAAA,IAClC;AAEA,UAAM,YAAY,UAAU,UAAU,GAAG,CAAC;AAC1C,UAAM,UAAU,QAAQ,UAAU,GAAG,CAAC;AAGtC,QAAI,cAAc,SAAS;AAClB,aAAA;AAAA,IACT;AAGO,WAAA,GAAG,SAAS,MAAM,OAAO;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAe,sBAAsB,SAAkC,WAA4B;AACjG,QAAI,SAAS,QAAQ;AAGrB,QAAI,QAAQ,kBAAkB,QAAQ,eAAe,WAAW,IAAI;AAElE,YAAM,YAAY,QAAQ,eAAe,MAAM,aAAa;AACtD,YAAA,aAAa,YAAY,UAAU,CAAC,IAAI,QAAQ,eAAe,QAAQ,iBAAiB,GAAG;AACjG,eAAS,GAAG,QAAQ,EAAE,IAAI,UAAU;AAAA,IACtC;AAGA,QAAI,WAAW;AAEP,YAAA,cAAc,KAAK,kBAAkB,SAAS;AAC7C,aAAA,GAAG,MAAM,KAAK,WAAW;AAAA,IAClC;AAEO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,kBAAkB,WAA2B;AAE1D,QAAI,OAAO;AACX,aAASH,KAAI,GAAGA,KAAI,UAAU,QAAQA,MAAK;AACnC,YAAA,OAAO,UAAU,WAAWA,EAAC;AAC1B,cAAA,QAAQ,KAAK,OAAQ;AAC9B,aAAO,OAAO;AAAA,IAChB;AACO,WAAA,KAAK,IAAI,IAAI,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC;AAAA,EAChD;AAAA,EAEA,OAAe,4BAA4B,QAAiD;AAC1F,UAAM,SAAqC,CAAA;AAC3C,UAAM,UAAU;AAChB,WAAO,OAAO,CAAKI,OAAAA,GAAE,SAAS,OAAO,EAAE,QAAQ,CAAKA,OAAA;AAAS,aAAAA,GAAE,IAAI,IAAIA,GAAE;AAAA,IAAA,CAAQ;AAC1E,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,gBACL,WACA,iBACA,eACA,WAAmB,MACnB,mBACgB;;AAChB,QAAI,CAAC,UAAU,gBAAgB,UAAU,aAAa,WAAW,GAAG;AAC5D,YAAA,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAGM,UAAA,mBAAmB,UAAU,aAAa,CAAC;AAG3C,UAAA,iBAAgB,eAAU,eAAV,mBAAuB;AAGvC,UAAA,YAAY,MAAM,QAAQ,UAAU,SAAS,IAC/C,UAAU,cACV,eAAU,cAAV,mBAAqB,aAAY,CAAA;AAErC,UAAM,WAA0B,CAAA;AAGf,qBAAA,MAAM,QAAQ,CAAQ,SAAA;AAC/B,YAAAC,WAAU,KAAK,qBAAqB,MAAM,iBAAiB,eAAe,eAAe,UAAU,iBAAiB;AAGtH,UAAA,aAAa,UAAU,SAAS,GAAG;AACrC,QAAAA,SAAQ,YAAY;AACpB,gBAAQ,IAAI,gCAAgC,UAAU,MAAM,yBAAyBA,SAAQ,EAAE,EAAE;AAAA,MAAA,OAC5F;AACL,gBAAQ,KAAK,2DAA2DA,SAAQ,EAAE,EAAE;AAAA,MACtF;AAGA,WAAK,qBAAqBA,QAAO;AAEjC,eAAS,KAAKA,QAAO;AAAA,IAAA,CACtB;AAEM,WAAA;AAAA,MACL,QAAQ,aAAa,KAAK,IAAK,CAAA;AAAA,MAC/B,OAAO,eAAe,KAAK,kBAAkB,iBAAiB,UAAU,CAAC;AAAA,MACzE,aAAa;AAAA,MACb,SAAS;AAAA,MACT;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAe,qBACb,MACA,iBACA,eACA,eACA,WAAmB,MACnB,mBACa;;AAGb,UAAM,QAAQ,KAAK,iBAAiB,KAAK,QAAQ,KAAK,MAAM,cAAc;AAGpE,UAAA,sBAAsB,KAAK,0BAA0B,IAAI;AAC/D,UAAM,cAAc,IAAI;AAAA,MACtB,oBACG,OAAO,CAAW,YAAA,QAAQ,UAAU,EACpC,IAAI,CAAW,YAAA,QAAQ,UAAU;AAAA,IAAA;AAIlC,QAAA,gBAAgB,+CAAe,MAAM,KAAK,QAAM,GAAG,WAAW,KAAK;AASjE,UAAA,kBAAkB,uDAAoB,KAAK;AACjD,QAAI,kBAAiB,mDAAiB,wBAAuB,gBAAgB,oBAAoB,SAAS,GAAG;AAC3G,cAAQ,IAAI,oCAAoC,KAAK,EAAE,2BAA2B;AAClF,sBAAgB,KAAK,qCAAqC,eAAe,gBAAgB,mBAAmB;AAAA,IAC9G;AAGM,UAAA,UAAU,KAAK,8BAA8B,MAAM,mBAAmB,cAAc,iBAAiB,cAAc,eAAe,qBAAqB,aAAa,eAAe;AAGzL,UAAM,qBAAqB,QAAQ,IAAI,CAAA,QAAO,IAAI,EAAE;AAKpD,UAAM,WAAW,EAAE,aAAa,oBAAoB,kBAAkB,QAAQ;AAC9E,UAAM,eAA8B,CAAA;AAC9B,UAAA,2CAA2B;AAG7B,SAAA,UAAK,yBAAL,mBAA2B,UAAU;AAClC,WAAA,qBAAqB,SAAS,QAAQ,CAAW,YAAA;AAC9C,cAAA,cAAc,KAAK,iBAAiB,SAAS,GAAG,iBAAiB,eAAe,UAAU,KAAK,IAAI,UAAU,oBAAoB;AACvI,YAAI,aAAa;AACf,uBAAa,KAAK,WAAW;AAAA,QAC/B;AAAA,MAAA,CACD;AAAA,IACH;AAMA,SAAK,CAAC,iBAAiB,GAAC,mBAAc,UAAd,mBAAqB,YAAW,eAAe;AACxD,mBAAA;AAAA,QAAQ,iBACnB,KAAK,yBAAyB,aAAa,KAAK,IAAI,eAAe,QAAQ;AAAA,MAAA;AAAA,IAE/E;AAEO,WAAA;AAAA,MACL,IAAI,KAAK;AAAA,MACT;AAAA,MACA,aAAa,KAAK,eAAe,eAAe,KAAK;AAAA,MACrD,UAAU;AAAA,MACV;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,QACR,SAAS,KAAK;AAAA,QACd,cAAc,KAAK;AAAA,MACrB;AAAA,MACA,mBAAmB,YAAY,OAAO;AAAA,MACtC,kBAAmB,KAAa,qBAAqB;AAAA;AAAA,MACrD,SAAU,KAAa,YAAY;AAAA;AAAA,MACnC,UAAW,KAAa,aAAa;AAAA;AAAA,IAAA;AAAA,EAEzC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,iBACb,SACA,OACA,iBACA,eACA,UACA,WACA,WAAmB,MACnB,sBACA,oBACoB;;AACpB,UAAM,QAAQ,KAAK,kBAAkB,QAAQ,QAAQ,UAAU,QAAQ,cAAc;AAKrF,UAAM,oBACJ,aAAQ,mBAAR,mBAAwB,SAAS,uBAAsB,YACrD,aAAQ,mBAAR,mBAAwB,SAAS,qBAAoB,QACrD;AAGJ,UAAM,SAAsB,CAAA;AACxB,QAAA,CAAC,QAAQ,iBAAiB;AAE5B,UAAI,YAAsB,CAAA;AAE1B,WAAI,qCAAU,uBAAsB,SAAS,mBAAmB,SAAS,GAAG;AAG1E,oBAAY,SAAS;AAAA,MAAA,OAChB;AAGL,oBAAY,CAAC,UAAU;AAAA,MACzB;AAIA,gBAAU,QAAQ,CAAY,aAAA;;AAC5B,cAAMC,WAASJ,MAAA,qCAAU,qBAAV,gBAAAA,IAA4B,KAAK,CAAKH,OAAAA,GAAE,OAAO;AACxD,cAAA,gBAAeO,WAAA,gBAAAA,QAAQ,oBAAmB;AAC1C,cAAA,cAAaA,WAAA,gBAAAA,QAAQ,kBAAiB;AACtC,cAAAC,SAAQ,KAAK,uBAAuB,SAAS,cAAc,YAAY,UAAU,oBAAoB,QAAQ;AAC/G,YAAAA;AAAO,iBAAO,KAAKA,MAAK;AAAA,MAAA,CAC7B;AAAA,IACH;AAGA,UAAM,WAA0B,CAAA;AAChC,QAAI,QAAQ,YAAY,QAAQ,SAAS,SAAS,GAAG;AAC3C,cAAA,SAAS,QAAQ,CAAS,UAAA;AAChC,cAAM,YAAY,KAAK,iBAAiB,OAAO,QAAQ,GAAG,iBAAiB,eAAe,UAAU,WAAW,UAAU,sBAAsB,eAAe;AAC9J,YAAI,WAAW;AACb,mBAAS,KAAK,SAAS;AAAA,QACzB;AAAA,MAAA,CACD;AAAA,IACH;AAKA,UAAM,aAAa,OAAO,SAAS,KAAK,SAAS,SAAS;AAE1D,QAAI,CAAC,YAAY;AAER,aAAA;AAAA,IACT;AAEA,QAAI,YAAY,KAAK,sBAAsB,SAAS,SAAS;AAC7D,QAAI,sBAAsB;AACxB,YAAM,QAAQ,qBAAqB,IAAI,SAAS,KAAK;AAChC,2BAAA,IAAI,WAAW,QAAQ,CAAC;AAC7C,UAAI,QAAQ,GAAG;AACb,oBAAY,GAAG,SAAS,QAAQ,QAAQ,CAAC;AAAA,MAC3C;AAAA,IACF;AAEA,UAAM,kBAAmC;AAAA,MACvC,aAAa,QAAQ;AAAA,MACrB,MAAM,QAAQ;AAAA,MACd,mBAAmB,QAAQ;AAAA,MAC3B,YAAY,QAAQ;AAAA,MACpB,SAAS,QAAQ;AAAA,MACjB,qBAAqB,KAAK,4BAA4B,QAAQ,MAAM;AAAA,IAAA;AAG/D,WAAA;AAAA,MACL,IAAI;AAAA,MACJ,mBAAmB,QAAQ;AAAA;AAAA,MAC3B,MAAM,QAAQ;AAAA,MACd;AAAA,MACA,aAAa,GAAG,QAAQ,WAAW,KAAK,QAAQ,IAAI;AAAA,MACpD,MAAM,QAAQ;AAAA;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAQ,QAAgB,SAAS,CAAC;AAAA;AAAA,MAClC,WAAW,QAAQ;AAAA;AAAA,MACnB,UAAU,QAAQ;AAAA,MAClB,YAAY,QAAQ;AAAA,MACpB,SAAS,QAAQ;AAAA;AAAA,MACjB,gBAAgB,QAAQ;AAAA;AAAA,IAAA;AAAA,EAE5B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,uBACb,SACA,iBACA,eACA,gBACA,oBACA,WAAmB,MACD;;AAClB,UAAM,YAAY,KAAK,uBAAuB,QAAQ,IAAI;AAC1D,UAAM,QAAQ,KAAK,kBAAkB,QAAQ,QAAQ,UAAU,QAAQ,cAAc;AAGjF,QAAA;AAEJ,QAAI,gBAAgB;AAEP,iBAAA;AAAA,IAAA,OACN;AAGM,iBAAA;AAAA,IACb;AAAK,UAAMA,SAAmB;AAAA,MAC5B,IAAI,GAAG,QAAQ,EAAE,IAAI,QAAQ;AAAA,MAC7B,WAAW,QAAQ;AAAA,MACnB;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA,aAAa,SAAS,MAAM,YAAa,CAAA;AAAA,MACzC,UAAU;AAAA;AAAA,MACV,UAAU,QAAQ;AAAA,MAClB,cAAc;AAAA;AAAA,MAEd,YAAa,QAAQ,eAAe,aAAa,QAAQ,eAAe,aAAc,QAAQ,aAAa;AAAA;AAAA,MAC3G,iBAAiB,mBAAmB;AAAA,MACpC,eAAe,iBAAiB;AAAA,MAChC,mBAAmB,QAAQ,eAAe,cACrC,aAAQ,mBAAR,mBAAwB,SAAS,wBAAuB,uBAAuB,UAC5E,KAAK,eAAe,mBAAmB,YAAY,IAClD,iBAAiB,mBAAmB,eACzC;AAAA,IAAA;AAIF,QAAA,QAAQ,OAAO,uCAAuC;AACxD,cAAQ,IAAI,iCAAiC,QAAQ,EAAE,8BAA8B,QAAQ,UAAU,uBAAuBA,OAAM,UAAU,eAAe,QAAQ,EAAE;AAAA,IACzK;AAEO,WAAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,uBAAuB,UAA6B;AACjE,UAAM,UAAqC;AAAA,MACzC,wBAAwB;AAAA,MACxB,0BAA0B;AAAA,MAC1B,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,MACzB,sBAAsB;AAAA,MACtB,yBAAyB;AAAA,MACzB,4BAA4B;AAAA,MAC5B,0DAA0D;AAAA,IAAA;AAGrD,WAAA,QAAQ,QAAQ,KAAK;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAe,kBACb,QACA,WAAmB,MACnB,eACQ;AACJ,QAAA,CAAC,UAAU,OAAO,WAAW;AAAU,aAAA;AAG3C,UAAM,iBAAiB,OAAO,OAAO,CAAKH,OAAAA,GAAE,SAAS,QAAQ;AAG7D,UAAM,iBAAiB,eAAe,SAAS,IAAI,iBAAiB;AAIpE,QAAI,eAAe;AACjB,YAAM,yBAAyB,eAAe,KAAK,CAAKA,OAAAA,GAAE,SAAS,aAAa;AAC5E,UAAA;AAAwB,eAAO,uBAAuB;AAE1D,YAAM,0BAA0B,OAAO,KAAK,CAAKA,OAAAA,GAAE,SAAS,aAAa;AACrE,UAAA;AAAyB,eAAO,wBAAwB;AAAA,IAC9D;AAGA,UAAM,YAAY,eAAe,KAAK,CAAAA,OAAKA,GAAE,cAAc;AACvD,QAAA;AAAW,aAAO,UAAU;AAGhC,UAAM,WAAW,eAAe,KAAK,CAAKA,OAAAA,GAAE,SAAS,qCAAqC;AACtF,QAAA;AAAU,aAAO,SAAS;AAG9B,UAAM,QAAQ,eAAe,KAAK,CAAKA,OAAAA,GAAE,SAAS,0CAA0C;AACxF,QAAA;AAAO,aAAO,MAAM;AAGjB,WAAA,eAAe,SAAS,IAAI,eAAe,CAAC,EAAE,QAAQ,OAAO,CAAC,EAAE;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,qBAAqBC,UAA4B;AAC9D,QAAI,CAACA,SAAQ,WAAWA,SAAQ,QAAQ,WAAW,GAAG;AACpD;AAAA,IACF;AAGA,UAAM,YAAYA,SAAQ,QAAQ,IAAI,CAAA,QAAO,IAAI,EAAE;AAG3C,IAAAA,SAAA,SAAS,QAAQ,CAAe,gBAAA;AACjC,WAAA,+BAA+B,aAAa,SAAS;AAAA,IAAA,CAC3D;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,+BAA+B,aAA0B,WAA2B;AAEjG,gBAAY,SAAS,YAAY,OAAO,OAAO,CAASE,WAAA;AAC/C,aAAA,UAAU,SAASA,OAAM,QAAQ;AAAA,IAAA,CACzC;AAGD,QAAI,YAAY,UAAU;AACZ,kBAAA,SAAS,QAAQ,CAAS,UAAA;AAC/B,aAAA,+BAA+B,OAAO,SAAS;AAAA,MAAA,CACrD;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,kBAAkB,aAAkC;AAC7D,QAAA,QAAQ,YAAY,OAAO;AAC/B,QAAI,YAAY,UAAU;AACZ,kBAAA,SAAS,QAAQ,CAAS,UAAA;AAC3B,iBAAA,KAAK,kBAAkB,KAAK;AAAA,MAAA,CACtC;AAAA,IACH;AACO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,0BAA0B,MAAuD;;AACtF,UAAM,sBAAiD,CAAA;AAEnD,SAAA,UAAK,yBAAL,mBAA2B,UAAU;AAClC,WAAA,qBAAqB,SAAS,QAAQ,CAAW,YAAA;AAC/C,aAAA,2BAA2B,SAAS,mBAAmB;AAAA,MAAA,CAC7D;AAAA,IACH;AAEO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,2BACb,SACA,YACM;AAEF,QAAA,CAAC,QAAQ,iBAAiB;AAC5B,iBAAW,KAAK,OAAO;AAAA,IACzB;AAGA,QAAI,QAAQ,YAAY,QAAQ,SAAS,SAAS,GAAG;AAC3C,cAAA,SAAS,QAAQ,CAAS,UAAA;AAC3B,aAAA,2BAA2B,OAAO,UAAU;AAAA,MAAA,CAClD;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,qCACb,eACA,qBACK;AAEL,UAAM,eAAe,KAAK,MAAM,KAAK,UAAU,aAAa,CAAC;AAE7D,QAAI,CAAC,aAAa,SAAS,aAAa,MAAM,WAAW,GAAG;AACnD,aAAA;AAAA,IACT;AAGa,iBAAA,MAAM,QAAQ,CAAC,SAAc;AACxC,UAAI,CAAC,KAAK;AAAY;AAEtB,WAAK,aAAa,KAAK,WAAW,IAAI,CAAC,cAAmB;;AAExD,cAAM,YAAY,oBAAoB,KAAK,QAAKX,GAAE,gBAAgB,UAAU,EAAE;AAE1E,YAAA,CAAC,aAAa,CAAC,UAAU,qBAAqB,UAAU,kBAAkB,WAAW,GAAG;AAEnF,iBAAA;AAAA,QACT;AAGM,cAAA,oBAAoB,EAAE,GAAG;AAC/B,0BAAkB,UAAU,KAAK,yBAAyB,UAAU,SAAS,UAAU,iBAAiB;AAExG,gBAAQ,IAAI,0BAA0B,UAAU,EAAE,OAAK,eAAU,YAAV,mBAAmB,WAAU,CAAC,QAAM,uBAAkB,YAAlB,mBAA2B,WAAU,CAAC,UAAU;AAEpI,eAAA;AAAA,MAAA,CACR;AAAA,IAAA,CACF;AAEM,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,yBAAyB,SAAgB,aAA8B;AACpF,QAAI,CAAC,WAAW,CAAC,MAAM,QAAQ,OAAO;AAAG,aAAO;AAEhD,UAAM,WAAkB,CAAA;AAExB,YAAQ,QAAQ,CAAU,WAAA;AAExB,UAAI,YAAY,SAAS,OAAO,EAAE,GAAG;AAEnC,iBAAS,KAAK;AAAA,UACZ,GAAG;AAAA,UACH,UAAU,CAAC;AAAA;AAAA,QAAA,CACZ;AAAA,MACH;AAGA,UAAI,OAAO,YAAY,OAAO,SAAS,SAAS,GAAG;AACjD,cAAM,mBAAmB,KAAK,yBAAyB,OAAO,UAAU,WAAW;AAC1E,iBAAA,KAAK,GAAG,gBAAgB;AAAA,MACnC;AAAA,IAAA,CACD;AAEM,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAe,wBACb,WACA,eACA,eACA,WAAmB,MAC8E;;AACjG,UAAM,gBAAqC,CAAA;AAEhC,eAAA,QAAQ,cAAc,OAAO;AACtC,UAAI,KAAK,WAAW;AAAe;AAExBY,iBAAAA,SAAQ,KAAK,OAAO;AAC7B,YAAI,GAACA,WAAK,eAALA,mBAAiB,SAAS;AAAY;AAE3C,YAAI,GAACA,WAAK,eAALA,mBAAiB,KAAK,CAAAC,OAAKA,GAAE;AAAc;AAChD,sBAAc,KAAK,IAAI;AACvB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,cAAc,WAAW;AAAU,aAAA;AAEjC,UAAA,eAAe,cAAc,CAAC;AAC9B,UAAA,OAAO,aAAa,MAAM,KAAK,QAAK;;AAAA,cAAAP,MAAAF,GAAE,eAAF,gBAAAE,IAAc,SAAS;AAAA,KAAU;AAC3E,QAAI,CAAC;AAAa,aAAA;AAElB,UAAM,SAAmG,CAAA;AAE9F,eAAA,aAAa,KAAK,YAAY;AACvC,UAAI,CAAC,UAAU;AAAa;AAE5B,YAAM,WACJ,UAAU,OAAO,KAAK,CAAKE,OAAAA,GAAE,SAAS,QAAQ,KAC9C,UAAU,OAAO,KAAK,QAAKA,GAAE,SAAS,IAAI,KAC1C,UAAU,OAAO,CAAC;AACd,YAAA,aAAY,qCAAU,UAAS,UAAU;AAE/C,aAAO,KAAK;AAAA,QACV,QAAQ,UAAU;AAAA,QAClB;AAAA,QACA,eAAe,UAAU,YAAY;AAAA,QACrC,aAAa;AAAA,MAAA,CACd;AAAA,IACH;AAEO,WAAA,OAAO,SAAS,IAAI,SAAS;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAe,yBACb,aACA,eACA,eACA,UACM;;AACF,QAAA,CAAC,YAAY,YAAY,YAAY,UAAU,YAAY,OAAO,SAAS,GAAG;AAChF,YAAM,wBAAwB,KAAK;AAAA,QACjC,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAEF,UAAI,uBAAuB;AACb,oBAAA,OAAO,QAAQ,CAASG,WAAA;AAClC,UAAAA,OAAM,wBAAwB;AAAA,QAAA,CAC/B;AAAA,MACH;AAAA,IACF;AACA,sBAAY,aAAZ,mBAAsB;AAAA,MAAQ,WAC5B,KAAK,yBAAyB,OAAO,eAAe,eAAe,QAAQ;AAAA;AAAA,EAE/E;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,8BACL,MACA,iBACA,eACA,eACA,qBACA,iBACA,mBACc;;AAEd,UAAM,WAAW,uBAAuB,KAAK,0BAA0B,IAAI;AACrE,UAAA,cAAc,mBAAmB,IAAI;AAAA,MACzC,SACG,OAAO,CAAW,YAAA,QAAQ,UAAU,EACpC,IAAI,CAAW,YAAA,QAAQ,UAAU;AAAA,IAAA;AAKlC,QAAA,SAAS,WAAW,GAAG;AAGzB,aAAO,CAAC;AAAA,QACN,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,MAAM;AAAA,QACN,OAAO;AAAA,QACP,WAAW;AAAA,MAAA,CACZ;AAAA,IACH;AAGA,QAAI,mBAAiC,CAAA;AACjC,UAAA,oDAAe,UAAf,mBAAsB,YAAW,GAAG;AAChC,YAAA,OAAO,cAAc,MAAM,CAAC;AAG9B,UAAA,KAAK,WAAW,WAAW,GAAG;AAEb,2BAAA,KAAK,+BAA+B,KAAK,WAAW,CAAC,GAAG,iBAAiB,eAAe,WAAW;AAAA,MAC7G,WAAA,KAAK,WAAW,SAAS,GAAG;AAErC,2BAAmB,KAAK,8BAA8B,KAAK,YAAY,iBAAiB,eAAe,WAAW;AAAA,MACpH;AAGA,UAAI,mBAAmB;AACF,2BAAA,KAAK,iCAAiC,kBAAkB,iBAAiB;AAAA,MAC9F;AAAA,IAAA,aACS,oDAAe,UAAf,mBAAsB,WAAU,cAAc,MAAM,SAAS;AAAG;AAO3E,UAAM,UAAwB,CAAA;AAG1B,QAAA,iBAAiB,SAAS,GAAG;AACvB,cAAA,KAAK,GAAG,gBAAgB;AAAA,IAAA,OAC3B;AAGD,UAAA,YAAY,SAAS,GAAG;AAE1B,gBAAQ,KAAK;AAAA,UACX,IAAI;AAAA,UACJ,OAAO,KAAK,oBAAoB,iBAAiB,aAAa;AAAA,UAC9D,aAAa;AAAA,UACb,MAAM;AAAA,UACN,OAAO;AAAA,UACP,WAAW;AAAA,UACX;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MAAA,OACI;AAEL,gBAAQ,KAAK;AAAA,UACX,IAAI;AAAA,UACJ,OAAO,KAAK,oBAAoB,iBAAiB,aAAa;AAAA,UAC9D,aAAa;AAAA,UACb,MAAM;AAAA,UACN,OAAO;AAAA,UACP,WAAW;AAAA,UACX;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MACH;AAAA,IACF;AAKA,QAAI,kBAAkB;AACtB,QAAI,mBAAmB;AACH,wBAAA,KAAK,iCAAiC,SAAS,iBAAiB;AAAA,IACpF;AAGA,QAAI,uDAAmB,kBAAkB;AACvC,YAAM,sBAAsB,KAAK,4BAA4B,iBAAiB,iBAAiB,aAAa;AAC5G,wBAAkB,CAAC,GAAG,iBAAiB,GAAG,mBAAmB;AAAA,IAC/D;AAEO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,oBAAoB,YAA4B;AACzD,QAAA;AACI,YAAA,OAAO,IAAI,KAAK,UAAU;AAChC,WAAK,YAAY,KAAK,YAAY,IAAI,CAAC;AACvC,aAAO,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,aAC/BJ,QAAO;AACd,cAAQ,MAAM,4CAA4C,UAAU,KAAKA,MAAK;AACvE,aAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAe,eAAe,YAA4B;AACpD,QAAA;AACI,YAAA,OAAO,IAAI,KAAK,UAAU;AAChC,WAAK,QAAQ,KAAK,QAAQ,IAAI,CAAC;AAC/B,aAAO,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,aAC/BA,QAAO;AACd,cAAQ,MAAM,uCAAuC,UAAU,KAAKA,MAAK;AAClE,aAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,4BACb,oBACA,iBACA,eACc;AACd,UAAM,sBAAoC,CAAA;AACpC,UAAA,gBAAgB,KAAK,oBAAoB,eAAe;AACxD,UAAA,cAAc,KAAK,oBAAoB,aAAa;AAEvC,uBAAA,QAAQ,CAACG,SAAQ,UAAU;AAE5C,UAAI,YAAYA,QAAO;AACvB,UAAI,kBAAkB;AACtB,UAAI,SAAS;AAGb,UAAIA,QAAO,eAAe;AAExB,oBAAYA,QAAO;AAGD,0BAAA,KAAK,oBAAoB,eAAe,WAAW;AAC5D,iBAAA,GAAGA,QAAO,EAAE;AAAA,MAAA,OAChB;AAEO,oBAAA,KAAK,oBAAoB,eAAe,WAAW;AAC7C,0BAAA;AAClB,iBAAS,iBAAiB,KAAK;AAAA,MACjC;AAEA,0BAAoB,KAAK;AAAA,QACvB,GAAGA;AAAA,QACH,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,OAAOA,QAAO,QAAQ;AAAA;AAAA,QACtB,WAAW;AAAA;AAAA,QACX,iBAAiB;AAAA;AAAA,QACjB,eAAe;AAAA;AAAA,QACf,eAAeA,QAAO,gBAAgB;AAAA,UACpC,GAAGA,QAAO;AAAA,UACV,aAAa,GAAGA,QAAO,cAAc,WAAW;AAAA,QAC9C,IAAA;AAAA,MAAA,CACL;AAAA,IAAA,CACF;AAEM,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,iCACb,SACA,aACc;AACP,WAAA,QAAQ,OAAO,CAAUA,YAAA;;AAExB,YAAA,aAAaA,QAAO,GAAG,SAAS,UAAU,OAC9B,WAAAA,QAAO,kBAAP,mBAAsB,gBAAtB,mBAAmC,SAAS;AACxD,YAAA,YAAYA,QAAO,GAAG,SAAS,SAAS,OAC7B,WAAAA,QAAO,kBAAP,mBAAsB,gBAAtB,mBAAmC,SAAS;AAGzD,UAAA,CAAC,cAAc,CAAC,WAAW;AACtB,eAAA;AAAA,MACT;AAGI,UAAA,cAAc,CAAC,YAAY,cAAc;AACpC,eAAA;AAAA,MACT;AACI,UAAA,aAAa,CAAC,YAAY,aAAa;AAClC,eAAA;AAAA,MACT;AAEO,aAAA;AAAA,IAAA,CACR;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,+BACb,WACA,iBACA,eACA,aACc;;AAWV,QAAA,UAAU,gBAAgB,CAAC,UAAU,WAAW,UAAU,QAAQ,WAAW,IAAI;AAG7EI,YAAAA,eAAY,eAAU,OAAO,KAAK,CAACN,OAAWA,GAAE,SAAS,qCAAqC,MAAlF,mBAAqF,UAAS,UAAU;AAE1H,YAAMO,iBAAgB;AAAA,QACpB,QAAQ,UAAU;AAAA,QAClB,WAAAD;AAAAA,QACA,eAAe,UAAU,YAAY;AAAA,QACrC,cAAc,GAAGA,UAAS;AAAA,QAC1B,gBAAgB,GAAG,UAAU,EAAE;AAAA,MAAA;AAKjC,YAAME,WAAwB,CAAA;AAE1B,UAAA,YAAY,SAAS,GAAG;AAC1BA,iBAAQ,KAAK;AAAA,UACX,IAAI;AAAA,UACJ,OAAOF;AAAAA,UACP,aAAa;AAAA,UACb,MAAM;AAAA,UACN,eAAe;AAAA,YACb,aAAa;AAAA,YACb,QAAQC,eAAc;AAAA,YACtB,UAAU;AAAA,YACV,aAAa;AAAA,YACb,aAAa;AAAA,YACb,MAAMA,eAAc;AAAA,YACpB,WAAWA,eAAc;AAAA,YACzB,WAAWA,eAAc;AAAA,YACzB,gBAAgBA,eAAc;AAAA,YAC9B,iBAAiB;AAAA,YACjB,eAAeA,eAAc;AAAA,YAC7B,cAAc,CAAC;AAAA,cACb,QAAQA,eAAc;AAAA,cACtB,WAAWA,eAAc;AAAA,cACzB,eAAeA,eAAc;AAAA,cAC7B,aAAaA,eAAc;AAAA,YAAA,CAC5B;AAAA,UACH;AAAA,UACA,OAAO;AAAA,UACP,WAAW;AAAA,UACX;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MAAA,WACQ,YAAY,SAAS,KAAK,YAAY,IAAI,SAAS,GAAG;AAC/DC,iBAAQ,KAAK;AAAA,UACX,IAAI;AAAA,UACJ,OAAO,GAAGF,UAAS;AAAA,UACnB,aAAa;AAAA,UACb,MAAM;AAAA,UACN,eAAe;AAAA,YACb,aAAa;AAAA,YACb,QAAQC,eAAc;AAAA,YACtB,UAAU;AAAA,YACV,aAAa;AAAA,YACb,aAAa;AAAA,YACb,MAAMA,eAAc;AAAA,YACpB,WAAWA,eAAc;AAAA,YACzB,WAAWA,eAAc;AAAA,YACzB,gBAAgBA,eAAc;AAAA,YAC9B,iBAAiB;AAAA,YACjB,eAAeA,eAAc;AAAA,YAC7B,cAAc,CAAC;AAAA,cACb,QAAQA,eAAc;AAAA,cACtB,WAAWA,eAAc;AAAA,cACzB,eAAeA,eAAc;AAAA,cAC7B,aAAaA,eAAc;AAAA,YAAA,CAC5B;AAAA,UACH;AAAA,UACA,OAAO;AAAA,UACP,WAAW;AAAA,UACX,iBAAiB;AAAA,UACjB;AAAA,QAAA,CACD;AAAA,MAAA,WACQ,YAAY,SAAS,KAAK,YAAY,IAAI,UAAU,GAAG;AAChEC,iBAAQ,KAAK;AAAA,UACX,IAAI;AAAA,UACJ,OAAO,GAAGF,UAAS;AAAA,UACnB,aAAa,KAAK,oBAAoB,iBAAiB,aAAa;AAAA,UACpE,MAAM;AAAA,UACN,eAAe;AAAA,YACb,aAAa;AAAA,YACb,QAAQC,eAAc;AAAA,YACtB,UAAU;AAAA,YACV,aAAa;AAAA,YACb,aAAa;AAAA,YACb,MAAMA,eAAc;AAAA,YACpB,WAAWA,eAAc;AAAA,YACzB,WAAWA,eAAc;AAAA,YACzB,gBAAgBA,eAAc;AAAA,YAC9B,iBAAiB;AAAA,YACjB,eAAeA,eAAc;AAAA,YAC7B,cAAc,CAAC;AAAA,cACb,QAAQA,eAAc;AAAA,cACtB,WAAWA,eAAc;AAAA,cACzB,eAAeA,eAAc;AAAA,cAC7B,aAAaA,eAAc;AAAA,YAAA,CAC5B;AAAA,UACH;AAAA,UACA,OAAO;AAAA,UACP,WAAW;AAAA,UACX;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MAAA,OACI;AAELC,iBAAQ,KAAK;AAAA,UACX,IAAI;AAAA,UACJ,OAAO,GAAGF,UAAS;AAAA,UACnB,aAAa,KAAK,oBAAoB,iBAAiB,aAAa;AAAA,UACpE,MAAM;AAAA,UACN,eAAe;AAAA,YACb,aAAa;AAAA,YACb,QAAQC,eAAc;AAAA,YACtB,UAAU;AAAA,YACV,aAAa;AAAA,YACb,aAAa;AAAA,YACb,MAAMA,eAAc;AAAA,YACpB,WAAWA,eAAc;AAAA,YACzB,WAAWA,eAAc;AAAA,YACzB,gBAAgBA,eAAc;AAAA,YAC9B,iBAAiB;AAAA,YACjB,eAAeA,eAAc;AAAA,YAC7B,cAAc,CAAC;AAAA,cACb,QAAQA,eAAc;AAAA,cACtB,WAAWA,eAAc;AAAA,cACzB,eAAeA,eAAc;AAAA,cAC7B,aAAaA,eAAc;AAAA,YAAA,CAC5B;AAAA,UACH;AAAA,UACA,OAAO;AAAA,UACP,WAAW;AAAA,UACX;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MACH;AAGOC,aAAAA;AAAAA,IACT;AAGI,QAAA,CAAC,UAAU,WAAW,CAAC,MAAM,QAAQ,UAAU,OAAO,GAAG;AAE3D,aAAO;IACT;AAQI,QAAA,UAAU,QAAQ,WAAW,GAAG;AAClC,aAAO;IACT;AAEM,UAAA,cAAY,eAAU,OAAO,KAAK,CAACR,OAAWA,GAAE,SAAS,qCAAqC,MAAlF,mBAAqF,UAAS,UAAU;AACpH,UAAA,cAAc,UAAU,QAAQ,CAAC;AACjC,UAAA,gBAAc,iBAAY,OAAO,KAAK,CAACA,OAAWA,GAAE,SAAS,qCAAqC,MAApF,mBAAuF,UAAS,YAAY;AAEhI,UAAM,gBAAgB;AAAA,MACpB,QAAQ,UAAU;AAAA,MAClB;AAAA,MACA,UAAU,YAAY;AAAA,MACtB;AAAA,MACA,cAAc,GAAG,SAAS,MAAM,WAAW;AAAA,MAC3C,gBAAgB,GAAG,UAAU,EAAE,MAAM,YAAY,EAAE;AAAA,IAAA;AAKrD,UAAM,UAAwB,CAAA;AAE1B,QAAA,YAAY,SAAS,GAAG;AAC1B,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,OAAO,cAAc;AAAA,QACrB,aAAa;AAAA,QACb,MAAM;AAAA,QACN,eAAe;AAAA,UACb,aAAa;AAAA,UACb,QAAQ,cAAc;AAAA,UACtB,UAAU,cAAc;AAAA,UACxB,aAAa,cAAc;AAAA,UAC3B,aAAa,cAAc;AAAA,UAC3B,MAAM,cAAc;AAAA,UACpB,WAAW,cAAc;AAAA,UACzB,WAAW,cAAc;AAAA,UACzB,gBAAgB,cAAc;AAAA,QAChC;AAAA,QACA,OAAO;AAAA,QACP,WAAW;AAAA,QACX;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IAAA,WACQ,YAAY,SAAS,KAAK,YAAY,IAAI,SAAS,GAAG;AAC/D,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,OAAO,GAAG,cAAc,WAAW;AAAA,QACnC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,eAAe;AAAA,UACb,aAAa;AAAA,UACb,QAAQ,cAAc;AAAA,UACtB,UAAU,cAAc;AAAA,UACxB,aAAa,cAAc;AAAA,UAC3B,aAAa,cAAc;AAAA,UAC3B,MAAM,cAAc;AAAA,UACpB,WAAW,cAAc;AAAA,UACzB,WAAW,cAAc;AAAA,UACzB,gBAAgB,cAAc;AAAA,QAChC;AAAA,QACA,OAAO;AAAA,QACP,WAAW;AAAA,QACX,iBAAiB;AAAA,QACjB;AAAA,MAAA,CACD;AAAA,IAAA,WACQ,YAAY,SAAS,KAAK,YAAY,IAAI,UAAU,GAAG;AAChE,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,OAAO,GAAG,cAAc,WAAW;AAAA,QACnC,aAAa,GAAG,eAAe,MAAM,aAAa;AAAA,QAClD,MAAM;AAAA,QACN,eAAe;AAAA,UACb,aAAa;AAAA,UACb,QAAQ,cAAc;AAAA,UACtB,UAAU,cAAc;AAAA,UACxB,aAAa,cAAc;AAAA,UAC3B,aAAa,cAAc;AAAA,UAC3B,MAAM,cAAc;AAAA,UACpB,WAAW,cAAc;AAAA,UACzB,WAAW,cAAc;AAAA,UACzB,gBAAgB,cAAc;AAAA,QAChC;AAAA,QACA,OAAO;AAAA,QACP,WAAW;AAAA,QACX;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IAAA,OACI;AAEL,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,OAAO,GAAG,cAAc,WAAW;AAAA,QACnC,aAAa,KAAK,oBAAoB,iBAAiB,aAAa;AAAA,QACpE,MAAM;AAAA,QACN,eAAe;AAAA,UACb,aAAa;AAAA,UACb,QAAQ,cAAc;AAAA,UACtB,UAAU,cAAc;AAAA,UACxB,aAAa,cAAc;AAAA,UAC3B,aAAa,cAAc;AAAA,UAC3B,MAAM,cAAc;AAAA,UACpB,WAAW,cAAc;AAAA,UACzB,WAAW,cAAc;AAAA,UACzB,gBAAgB,cAAc;AAAA,QAChC;AAAA,QACA,OAAO;AAAA,QACP,WAAW;AAAA,QACX;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IACH;AAEO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,8BACb,YACA,iBACA,eACA,aACc;AAUU,eAAW,KAAK,CAAA,cAAa,UAAU,WAAW;AAMpE,UAAA,kBAAkB,WAAW,OAAO,CAAa,cAAA;AAErD,UAAI,UAAU,aAAa;AAElB,eAAA;AAAA,MACT;AAEI,UAAA,UAAU,WAAW,MAAM,QAAQ,UAAU,OAAO,KAAK,UAAU,QAAQ,SAAS,GAAG;AAElF,eAAA;AAAA,MACT;AAGO,aAAA;AAAA,IAAA,CACR;AAEG,QAAA,gBAAgB,WAAW,GAAG;AAEhC,aAAO;IACT;AAGM,UAAA,iBAAiB,gBAAgB,IAAI,CAAa,cAAA;;AAChD,YAAA,cAAY,eAAU,OAAO,KAAK,CAACA,OAAWA,GAAE,SAAS,qCAAqC,MAAlF,mBAAqF,UAAS,UAAU;AAG1H,UAAI,UAAU,aAAa;AAClB,eAAA;AAAA,UACL,IAAI,UAAU;AAAA,UACd;AAAA,UACA,SAAS;AAAA,UACT,eAAe,UAAU,YAAY;AAAA,UACrC,SAAS,CAAC;AAAA,YACR,IAAI;AAAA,YACJ,OAAO,GAAG,SAAS;AAAA,UAAA,CACpB;AAAA,QAAA;AAAA,MAEL;AAGA,YAAM,aAAa,KAAK,uBAAuB,UAAU,OAAO;AAEzD,aAAA;AAAA,QACL,IAAI,UAAU;AAAA,QACd;AAAA,QACA,SAAS;AAAA,QACT,SAAS,WAAW,IAAI,CAAW,WAAA;;AAAA;AAAA,YACjC,IAAI,OAAO;AAAA,YACX,SAAOF,MAAA,OAAO,OAAO,KAAK,CAACE,OAAWA,GAAE,SAAS,qCAAqC,MAA/E,gBAAAF,IAAkF,UAAS,OAAO;AAAA,UAAA;AAAA,SACzG;AAAA,MAAA;AAAA,IACJ,CACD;AAGK,UAAA,eAAe,KAAK,8BAA8B,cAAc;AAQtE,UAAM,UAAwB,CAAA;AAEjB,iBAAA,QAAQ,CAAC,aAAoB,UAAkB;AAEpD,YAAA,cAAc,YAAY,IAAI,CAACH,OAAWA,GAAE,WAAW,EAAE,KAAK,KAAK;AAGzE,YAAM,eAAe,YAAY,OAAO,CAACA,OAAWA,GAAE,OAAO;AAC7D,YAAM,gBAAgB,YAAY,OAAO,CAACA,OAAW,CAACA,GAAE,OAAO;AAa/D,YAAM,gBAAgB;AAAA,QACpB,aAAa,SAAS,KAAK;AAAA,QAC3B,aAAa;AAAA;AAAA,QACb,aAAa;AAAA;AAAA,QACb,cAAc,cAAc,IAAI,CAACA,QAAY;AAAA,UAC3C,QAAQA,GAAE;AAAA,UACV,WAAWA,GAAE;AAAA,UACb,UAAUA,GAAE;AAAA,UACZ,aAAaA,GAAE;AAAA,QAAA,EACf;AAAA;AAAA,QAEF,cAAc,aAAa,IAAI,CAACA,QAAY;AAAA,UAC1C,QAAQA,GAAE;AAAA,UACV,WAAWA,GAAE;AAAA,UACb,eAAeA,GAAE;AAAA,UACjB,aAAaA,GAAE;AAAA,QAAA,EACf;AAAA,QACF,iBAAiB,aAAa,SAAS;AAAA,QACvC,WAAW;AAAA,QACX,gBAAgB;AAAA,UACd,GAAG,cAAc,IAAI,CAACA,OAAW,GAAGA,GAAE,MAAM,IAAIA,GAAE,QAAQ,EAAE;AAAA,UAC5D,GAAG,aAAa,IAAI,CAACA,OAAW,GAAGA,GAAE,MAAM,UAAU;AAAA,QAAA,EACrD,KAAK,IAAI;AAAA,MAAA;AAYb,cAAQ,KAAK;AAAA,QACX,IAAI,YAAY,KAAK;AAAA,QACrB,OAAO,GAAG,WAAW;AAAA,QACrB,aAAa,KAAK,oBAAoB,iBAAiB,aAAa;AAAA,QACpE,MAAM;AAAA,QACN,eAAe;AAAA,UACb,GAAG;AAAA,UACH,aAAa,YAAY,KAAK;AAAA,QAChC;AAAA,QACA,OAAO;AAAA,QACP,WAAW;AAAA,QACX;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IAAA,CACF;AAGM,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,uBAAuB,SAAuB;AAC3D,QAAI,CAAC,WAAW,CAAC,MAAM,QAAQ,OAAO,GAAG;AACvC,aAAO;IACT;AAEA,UAAM,aAAoB,CAAA;AAE1B,YAAQ,QAAQ,CAAU,WAAA;AACxB,iBAAW,KAAK,MAAM;AAEtB,UAAI,OAAO,YAAY,OAAO,SAAS,SAAS,GAAG;AACjD,mBAAW,KAAK,GAAG,KAAK,uBAAuB,OAAO,QAAQ,CAAC;AAAA,MACjE;AAAA,IAAA,CACD;AAEM,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,8BAA8B,gBAA8B;AACzE,QAAI,eAAe,WAAW;AAAG,aAAO;AACpC,QAAA,eAAe,WAAW,GAAG;AAC/B,aAAO,eAAe,CAAC,EAAE,QAAQ,IAAI,CAAC,WAAgB,CAAC;AAAA,QACrD,QAAQ,eAAe,CAAC,EAAE;AAAA,QAC1B,WAAW,eAAe,CAAC,EAAE;AAAA,QAC7B,UAAU,OAAO;AAAA,QACjB,aAAa,OAAO;AAAA,QACpB,SAAS,eAAe,CAAC,EAAE,WAAW;AAAA,QACtC,eAAe,eAAe,CAAC,EAAE;AAAA,MAClC,CAAA,CAAC;AAAA,IACJ;AAGA,UAAM,CAAC,gBAAgB,GAAG,cAAc,IAAI;AACtC,UAAA,mBAAmB,KAAK,8BAA8B,cAAc;AAE1E,UAAM,eAAsB,CAAA;AAEb,mBAAA,QAAQ,QAAQ,CAAC,WAAgB;AAC1C,UAAA,iBAAiB,WAAW,GAAG;AACjC,qBAAa,KAAK,CAAC;AAAA,UACjB,QAAQ,eAAe;AAAA,UACvB,WAAW,eAAe;AAAA,UAC1B,UAAU,OAAO;AAAA,UACjB,aAAa,OAAO;AAAA,UACpB,SAAS,eAAe,WAAW;AAAA,UACnC,eAAe,eAAe;AAAA,QAC/B,CAAA,CAAC;AAAA,MAAA,OACG;AACL,yBAAiB,QAAQ,CAAmB,oBAAA;AAC1C,uBAAa,KAAK;AAAA,YAChB;AAAA,cACE,QAAQ,eAAe;AAAA,cACvB,WAAW,eAAe;AAAA,cAC1B,UAAU,OAAO;AAAA,cACjB,aAAa,OAAO;AAAA,cACpB,SAAS,eAAe,WAAW;AAAA,cACnC,eAAe,eAAe;AAAA,YAChC;AAAA,YACA,GAAG;AAAA,UAAA,CACJ;AAAA,QAAA,CACF;AAAA,MACH;AAAA,IAAA,CACD;AAEM,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,qBAAqB,YAA4B;AAC1D,QAAA;AACI,YAAA,OAAO,IAAI,KAAK,UAAU;AACzB,aAAA,KAAK,mBAAmB,SAAS;AAAA,QACtC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,MAAA,CACN;AAAA,IAAA,QACK;AACC,aAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,kBAAkB,YAA4B;AACvD,QAAA;AACI,YAAA,MAAM,IAAI,IAAI,UAAU;AAC9B,YAAM,YAAY,IAAI,SAAS,MAAM,GAAG;AACxC,YAAM,WAAW,UAAU,UAAU,SAAS,CAAC;AACxC,aAAA,SAAS,QAAQ,QAAQ,EAAE,EAAE,QAAQ,iBAAiB,GAAG,EAAE,KAAA,KAAU;AAAA,IAAA,QACtE;AACC,aAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAe,iBAAiB,MAAsB;AACpD,QAAI,CAAC;AAAa,aAAA;AAGZ,UAAA,QAAQ,KAAK,MAAM,oBAAoB;AAC7C,QAAI,OAAO;AACF,aAAA,MAAM,CAAC,EAAE;IAClB;AAGA,QAAI,KAAK,MAAM,iBAAiB,KAAK,KAAK,MAAM,mBAAmB,GAAG;AAE9D,YAAA,QAAQ,KAAK,MAAM,OAAO;AAChC,YAAM,WAAW,MAAM,MAAM,SAAS,CAAC;AAEhC,aAAA,SACJ,QAAQ,UAAU,GAAG,EACrB,QAAQ,SAAS,CAAAK,OAAKA,GAAE,YAAa,CAAA;AAAA,IAC1C;AAGO,WAAA,KAAK,KAAU,KAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,iBAAiB,MAAsB;AAC9C,UAAA,QAAQ,KAAK,MAAM,cAAc;AACvC,WAAO,QAAQ,SAAS,MAAM,CAAC,GAAG,EAAE,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,6BAA4D;AAGjE,WAAO,CAAC;AAAA,MACN,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,IAAA,CACP;AAAA,EACH;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACt/CA,MAAM,eAA6C;AAAA,EACjD,IAAI;AAAA,EACJ,IAAI;AACN;AAKO,MAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhB,OAAO,YAAY,UAAwB;AACrC,QAAA,aAAa,QAAQ,GAAG;AAC1B,WAAK,kBAAkB;AAAA,IAAA,OAClB;AACG,cAAA,KAAK,aAAa,QAAQ,uCAAuC;AACzE,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,cAAsB;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,EAAE,KAAa,QAAkD;AAChE,UAAA,OAAO,IAAI,MAAM,GAAG;AACtB,QAAA,QAAa,aAAa,KAAK,eAAe;AAGlD,eAAW,KAAK,MAAM;AACpB,UAAI,SAAS,OAAO,UAAU,YAAY,KAAK,OAAO;AACpD,gBAAQ,MAAM,CAAC;AAAA,MAAA,OACV;AACL,gBAAQ,KAAK,oBAAoB,GAAG,6BAA6B,KAAK,eAAe,GAAG;AACjF,eAAA;AAAA,MACT;AAAA,IACF;AAGI,QAAA,UAAU,OAAO,UAAU,UAAU;AAChC,aAAA,KAAK,YAAY,OAAO,MAAM;AAAA,IACvC;AAEO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAe,YAAY,KAAa,QAAiD;AACvF,WAAO,IAAI,QAAQ,kBAAkB,CAAC,OAAO,QAAQ;AACnD,aAAO,OAAO,SAAS,OAAO,OAAO,GAAG,CAAC,IAAI;AAAA,IAAA,CAC9C;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,IAAI,KAAsB;AACzB,UAAA,OAAO,IAAI,MAAM,GAAG;AACtB,QAAA,QAAa,aAAa,KAAK,eAAe;AAElD,eAAW,KAAK,MAAM;AACpB,UAAI,SAAS,OAAO,UAAU,YAAY,KAAK,OAAO;AACpD,gBAAQ,MAAM,CAAC;AAAA,MAAA,OACV;AACE,eAAA;AAAA,MACT;AAAA,IACF;AAEA,WAAO,UAAU;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,wBAAkC;AAChC,WAAA,OAAO,KAAK,YAAY;AAAA,EACjC;AACF;AArFa,KACI,kBAA0B;AC4CpC,MAAM,oBAAoB;AAAA,EAS/B,YAAY,oBAA6B,OAAO;AARhD,SAAiB,iBAAiB;AAClC,SAAiB,qBAAqB;AACtC,SAAiB,kBAAkB;AAO5B,SAAA,WAAW,oBAAoB,iBAAiB;AACrD,YAAQ,IAAI,6CAA6C,oBAAoB,mBAAmB,cAAc,GAAG;AAAA,EACnH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UACE,gBACA,UACS;AACL,QAAA;AACF,YAAM,QAAsB;AAAA,QAC1B,UAAU;AAAA,QACV,UAAU;AAAA,UACR,GAAG;AAAA,UACH,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC;AAAA,QACA,SAAS,KAAK;AAAA,MAAA;AAIX,WAAA,SAAS,QAAQ,KAAK,gBAAgB,KAAK,UAAU,MAAM,QAAQ,CAAC;AACpE,WAAA,SAAS,QAAQ,KAAK,oBAAoB,KAAK,UAAU,MAAM,QAAQ,CAAC;AAE7E,cAAQ,IAAI,8BAA8B;AAAA,QACxC,SAAS,eAAe;AAAA,QACxB,WAAW,MAAM,SAAS;AAAA,QAC1B,OAAO,SAAS,gBAAgB;AAAA,QAChC,eAAe,SAAS,cAAc;AAAA,MAAA,CACvC;AAEM,aAAA;AAAA,aACAD,QAAO;AACN,cAAA,MAAM,2BAA2BA,MAAK;AACvC,aAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAiC;AAC3B,QAAA;AACF,YAAM,UAAU,KAAK,SAAS,QAAQ,KAAK,cAAc;AACzD,YAAM,cAAc,KAAK,SAAS,QAAQ,KAAK,kBAAkB;AAE7D,UAAA,CAAC,WAAW,CAAC,aAAa;AAC5B,gBAAQ,IAAI,yBAAyB;AAC9B,eAAA;AAAA,MACT;AAEM,YAAA,WAAW,KAAK,MAAM,OAAO;AAC7B,YAAA,WAAW,KAAK,MAAM,WAAW;AAEvC,cAAQ,IAAI,+BAA+B;AAAA,QACzC,SAAS,SAAS;AAAA,QAClB,SAAS,SAAS;AAAA,QAClB,OAAO,SAAS,gBAAgB;AAAA,QAChC,eAAe,SAAS,cAAc;AAAA,MAAA,CACvC;AAEM,aAAA;AAAA,QACL;AAAA,QACA;AAAA,QACA,SAAS,KAAK;AAAA,MAAA;AAAA,aAETA,QAAO;AACN,cAAA,MAAM,2BAA2BA,MAAK;AACvC,aAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAoB;AAClB,WAAO,KAAK,SAAS,QAAQ,KAAK,cAAc,MAAM,QAC/C,KAAK,SAAS,QAAQ,KAAK,kBAAkB,MAAM;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAyC;AACnC,QAAA;AACF,YAAM,cAAc,KAAK,SAAS,QAAQ,KAAK,kBAAkB;AACjE,UAAI,CAAC;AAAoB,eAAA;AAElB,aAAA,KAAK,MAAM,WAAW;AAAA,aACtBA,QAAO;AACN,cAAA,MAAM,oCAAoCA,MAAK;AAChD,aAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAsB;AAChB,QAAA;AACG,WAAA,SAAS,WAAW,KAAK,cAAc;AACvC,WAAA,SAAS,WAAW,KAAK,kBAAkB;AAChD,cAAQ,IAAI,gCAAgC;AACrC,aAAA;AAAA,aACAA,QAAO;AACN,cAAA,MAAM,4BAA4BA,MAAK;AACxC,aAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAA6B;AACrB,UAAA,WAAW,KAAK;AACtB,QAAI,CAAC;AAAiB,aAAA;AAEtB,UAAM,UAAU,IAAI,KAAK,SAAS,OAAO;AACnC,UAAA,0BAAU;AAChB,WAAO,IAAI,QAAA,IAAY,QAAQ,QAAQ;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAyB;AAC9B,UAAA,MAAM,KAAK;AACV,WAAA,QAAQ,QAAQ,MAAM;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,aAAoD;AACvE,UAAM,gBAAwC,CAAA;AAE9C,gBAAY,QAAQ,CAAWE,aAAA;AAEzB,UAAA,CAACA,SAAQ,WAAW,CAAC,MAAM,QAAQA,SAAQ,OAAO,GAAG;AACvD;AAAA,MACF;AAEQ,MAAAA,SAAA,QAAQ,QAAQ,CAAUC,YAAA;AAEhC,sBAAc,KAAK;AAAA,UACjB,WAAWD,SAAQ;AAAA,UACnB,UAAUC,QAAO;AAAA,UACjB,OAAOA,QAAO;AAAA;AAAA,UACd,aAAaA,QAAO;AAAA;AAAA,UACpB,YAAY,KAAK,2BAA2BA,OAAM;AAAA,UAClD,MAAMA,QAAO;AAAA;AAAA,UACb,WAAWA,QAAO;AAAA,UAClB,SAASA,QAAO;AAAA,UAChB,eAAeA,QAAO;AAAA,QAAA,CACvB;AAAA,MAAA,CACF;AAAA,IAAA,CACF;AAEM,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAA2BA,SAA4C;AAEzE,QAAAA,QAAO,mBAAmBA,QAAO,eAAe;AAC3C,aAAA;AAAA,IACT;AAEO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,uBACE,iBACA,eACA,UACA,iBACA,aACA,iBACA,mBACA,YACA,UACA,oBAA4B,MAC5B,cACA,cACA,qBACgC;AACzB,WAAA;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MACA,eAAe,KAAK,qBAAqB,WAAW;AAAA,MACpD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe,KAAK;AAAA,IAAA;AAAA,EAExB;AAAA;AAAA;AAAA;AAAA,EAKA,2BAA2B,OAAqB,oBAA4B,kBAG1E;AACA,UAAM,WAAqB,CAAA;AAGvB,QAAA,MAAM,SAAS,oBAAoB,oBAAoB;AACzD,eAAS,KAAK,uBAAuB,MAAM,SAAS,eAAe,2BAA2B,kBAAkB,GAAG;AAAA,IACrH;AAEI,QAAA,MAAM,SAAS,kBAAkB,kBAAkB;AACrD,eAAS,KAAK,qBAAqB,MAAM,SAAS,aAAa,2BAA2B,gBAAgB,GAAG;AAAA,IAC/G;AAGM,UAAA,MAAM,KAAK;AACjB,QAAI,OAAO,MAAM,IAAI,KAAK,KAAK,KAAK,KAAM;AAC/B,eAAA,KAAK,YAAY,KAAK,MAAM,OAAO,KAAK,KAAK,KAAK,IAAK,CAAC,WAAW;AAAA,IAC9E;AAEM,UAAA,aAAa,SAAS,WAAW;AAEhC,WAAA,EAAE,YAAY;EACvB;AACF;AC1QO,MAAM,YAAY;AAAA;AAAA;AAAA;AAAA,EAIvB,OAAO,iBAAiB,OAAmB,SAAuC;AAChF,QAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AACzB,aAAA;AAAA,IACT;AAGA,UAAM,qBAAqB,MAAM;AAAA,MAAO,CACtC,SAAA,KAAK,cAAc,MAAM,OAAO;AAAA,IAAA;AAG9B,QAAA,mBAAmB,WAAW,GAAG;AAC5B,aAAA;AAAA,IACT;AAGA,UAAM,wBAAwB,mBAAmB;AAAA,MAAO,CACtD,SAAA,KAAK,kBAAkB,MAAM,OAAO;AAAA,IAAA;AAGlC,QAAA,sBAAsB,WAAW,GAAG;AAC/B,aAAA;AAAA,IACT;AAGA,QAAI,sBAAsB,SAAS,KAAK,QAAQ,MAAM;AACpD,YAAM,kBAAkB,sBAAsB;AAAA,QAAK,CACjD,SAAA,KAAK,YAAY,MAAM,OAAO;AAAA,MAAA;AAEhC,UAAI,iBAAiB;AACZ,eAAA;AAAA,MACT;AAAA,IACF;AAGA,WAAO,sBAAsB,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,cAAc,MAAgB,SAA+B;AAC1E,UAAM,aAAa,KAAK,YAAY,KAAK,MAAM;AAG/C,QAAI,QAAQ,eAAe,aAAa,QAAQ,mBAAmB;AACjE,aAAO,WAAW,aAAa,WAAW,gBAAgB,QAAQ;AAAA,IACpE;AAGA,QAAI,QAAQ,eAAe,cAAc,QAAQ,mBAAmB,QAAQ,eAAe;AAClF,aAAA,CAAC,WAAW,aACZ,WAAW,cAAc,QAAQ,mBACjC,WAAW,YAAY,QAAQ;AAAA,IACxC;AAGA,QAAI,QAAQ,mBAAmB;AAC7B,aAAO,WAAW,aAAa,WAAW,gBAAgB,QAAQ;AAAA,IACpE;AAEI,QAAA,QAAQ,mBAAmB,QAAQ,eAAe;AAC7C,aAAA,CAAC,WAAW,aACZ,WAAW,cAAc,QAAQ,mBACjC,WAAW,YAAY,QAAQ;AAAA,IACxC;AAGO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,kBAAkB,MAAgB,SAA+B;AACxE,UAAA,iBAAiB,KAAK,cAAc;AACpC,UAAA,iBAAiB,KAAK,6BAA6B,OAAO;AA0B5D,QAAA,eAAe,WAAW,GAAG;AAC/B,aAAO,eAAe,WAAW;AAAA,IACnC;AAGA,QAAI,eAAe,WAAW,KAAK,eAAe,SAAS,GAAG;AACrD,aAAA;AAAA,IACT;AAGI,QAAA,eAAe,WAAW,eAAe,QAAQ;AAO5C,aAAA;AAAA,IACT;AAGM,UAAA,WAAW,eAAe,MAAM,CAAW,YAAA;AACxC,aAAA,eAAe,KAAK,CAAW,YAAA;AAE9B,cAAA,YAAY,KAAK,gBAAgB,QAAQ,SAAS,MAAM,KAAK,gBAAgB,QAAQ,MAAM;AAEjG,YAAI,CAAC,WAAW;AACP,iBAAA;AAAA,QACT;AAGA,YAAI,QAAQ,kBAAkB,cAAc,QAAQ,UAAU;AACtD,gBAAA,cAAc,KAAK,kBAAkB,QAAQ,UAAU,EAAE,MAAM,KAAK,kBAAkB,QAAQ,QAAQ;AASrG,iBAAA;AAAA,QACT;AAGA,YAAI,QAAQ,kBAAkB,WAAW,QAAQ,SAAS;AACjD,iBAAA;AAAA,QACT;AAEO,eAAA;AAAA,MAAA,CACR;AAAA,IAAA,CACF;AAMM,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,YAAY,MAAgB,SAA+B;AACxE,QAAI,CAAC,QAAQ,QAAQ,CAAC,KAAK,aAAa;AAC/B,aAAA;AAAA,IACT;AAGA,UAAM,WAAW,KAAK,cAAc,KAAK,WAAW;AACpD,UAAM,WAAW,KAAK,cAAc,QAAQ,IAAI;AAEhD,WAAO,aAAa;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,YAAY,QAKzB;AAEI,QAAA,OAAO,SAAS,KAAK,GAAG;AAC1B,YAAM,CAAC,WAAW,OAAO,IAAI,OAAO,MAAM,KAAK,EAAE,IAAI,CAAAG,OAAKA,GAAE,KAAM,CAAA;AAC3D,aAAA;AAAA,QACL,WAAW;AAAA,QACX;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAGO,WAAA;AAAA,MACL,WAAW;AAAA,MACX,aAAa,OAAO,KAAK;AAAA,IAAA;AAAA,EAE7B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,6BAA6B,SAIzC;AACG,QAAA,CAAC,QAAQ,eAAe;AAC1B,aAAO;IACT;AAEA,UAAM,aAA6E,CAAA;AAGnF,QAAI,QAAQ,cAAc,gBAAgB,QAAQ,cAAc,aAAa,SAAS,GAAG;AAC/E,cAAA,cAAc,aAAa,QAAQ,CAAS,UAAA;AAClD,mBAAW,KAAK;AAAA,UACd,QAAQ,MAAM;AAAA,UACd,UAAU,MAAM;AAAA,QAAA,CACjB;AAAA,MAAA,CACF;AAAA,IACH;AAGA,QAAI,QAAQ,cAAc,gBAAgB,QAAQ,cAAc,aAAa,SAAS,GAAG;AAC/E,cAAA,cAAc,aAAa,QAAQ,CAAS,UAAA;AAClD,mBAAW,KAAK;AAAA,UACd,QAAQ,MAAM;AAAA,UACd,UAAU;AAAA,UACV,SAAS;AAAA,QAAA,CACV;AAAA,MAAA,CACF;AAAA,IACH;AAEO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAe,gBAAgB,QAAwB;AACrD,QAAI,CAAC;AAAe,aAAA;AAGhB,QAAA,OAAO,SAAS,GAAG,GAAG;AAClB,YAAA,QAAQ,OAAO,MAAM,GAAG;AAC9B,aAAO,MAAM,CAAC,KAAK,MAAM,CAAC;AAAA,IAC5B;AAGI,QAAA,OAAO,SAAS,GAAG,GAAG;AACV,aAAO,MAAM,GAAG;AAIxB,YAAA,sBAAsB,OAAO,YAAY,GAAG;AAClD,UAAI,sBAAsB,GAAG;AACpB,eAAA,OAAO,UAAU,sBAAsB,CAAC;AAAA,MACjD;AAAA,IACF;AAGO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAe,kBAAkB,UAA0B;AACzD,QAAI,CAAC;AAAiB,aAAA;AAGlB,QAAA,SAAS,SAAS,GAAG,GAAG;AACpB,YAAA,QAAQ,SAAS,MAAM,GAAG;AAChC,aAAO,MAAM,CAAC,KAAK,MAAM,CAAC;AAAA,IAC5B;AAGI,QAAA,SAAS,SAAS,GAAG,GAAG;AACpB,YAAA,sBAAsB,SAAS,YAAY,GAAG;AACpD,UAAI,sBAAsB,GAAG;AACpB,eAAA,SAAS,UAAU,sBAAsB,CAAC;AAAA,MACnD;AAAA,IACF;AAGO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAe,cAAc,MAAsB;AACjD,QAAI,CAAC;AAAa,aAAA;AAGZ,UAAA,QAAQ,KAAK,MAAM,GAAG;AAC5B,WAAO,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,mBAAmB,OAAmB,SAA8C;AACzF,UAAM,cAAsC,CAAA;AAE5C,QAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AACzB,aAAA;AAAA,IACT;AAGA,UAAM,eAAe,MAAM;AAAA,MAAO,CAAA,SAChC,KAAK,cAAc,MAAM,OAAO,KAAK,KAAK,kBAAkB,MAAM,OAAO;AAAA,IAAA;AAI3E,iBAAa,QAAQ,CAAQ,SAAA;AAC3B,UAAI,KAAK,YAAY;AACd,aAAA,WAAW,QAAQ,CAAO,QAAA;AAC7B,cAAI,IAAI,kBAAkB,WAAW,IAAI,kBAAkB;AAEzD,kBAAM,SAAS,KAAK,gBAAgB,IAAI,SAAS;AACrC,wBAAA,MAAM,IAAI,IAAI;AAAA,UAC5B;AAAA,QAAA,CACD;AAAA,MACH;AAAA,IAAA,CACD;AAEM,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAW,OAAmB,SAA4B;AAC/D,YAAQ,IAAI,8BAA8B;AAC1C,YAAQ,IAAI,cAAc;AAAA,MACxB,WAAW,QAAQ;AAAA,MACnB,UAAU,QAAQ;AAAA,MAClB,QAAQ,QAAQ,eAAe,YAC3B,QAAQ,oBACR,GAAG,QAAQ,eAAe,MAAM,QAAQ,aAAa;AAAA,MACzD,YAAY,KAAK,6BAA6B,OAAO;AAAA,IAAA,CACtD;AACD,YAAQ,IAAI,YAAY,MAAM,IAAI,CAAMI,OAAA;;AAAA;AAAA,QACtC,OAAOA,GAAE;AAAA,QACT,QAAQA,GAAE;AAAA,QACV,aAAY,KAAAA,GAAE,eAAF,mBAAc,IAAI,CAAAJ,OAAK,GAAGA,GAAE,SAAS,IAAIA,GAAE,MAAM;AAAA;KAC7D,CAAC;AAEH,UAAM,QAAQ,KAAK,iBAAiB,OAAO,OAAO;AAClD,YAAQ,IAAI,mBAAmB,QAAQ,MAAM,QAAQ,UAAU;AAAA,EACjE;AACF;AClYO,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUzB,OAAO,qBACL,aACA,OACA,WACsB;AACtB,UAAM,SAAgC,CAAA;AAGtC,QAAI,UAAU,QAAQ,UAAU,UAAa,UAAU,IAAI;AACzD,aAAO,EAAE,OAAO,MAAM,QAAQ,CAAG,EAAA;AAAA,IACnC;AAGA,QAAI,CAAC,eAAe,CAAC,aAAa,UAAU,WAAW,GAAG;AACxD,aAAO,EAAE,OAAO,MAAM,QAAQ,CAAG,EAAA;AAAA,IACnC;AAGA,UAAM,WAAW,KAAK,aAAa,aAAa,SAAS;AACzD,QAAI,CAAC,YAAY,CAAC,SAAS,YAAY;AAErC,aAAO,EAAE,OAAO,MAAM,QAAQ,CAAG,EAAA;AAAA,IACnC;AAEA,UAAMK,cAAa,SAAS;AACtB,UAAA,cAAc,OAAO,KAAK;AAGhC,QAAIA,YAAW,SAAS;AACtB,YAAM,eAAe,KAAK,gBAAgB,aAAaA,YAAW,OAAO;AACzE,UAAI,cAAc;AAChB,eAAO,KAAK,YAAY;AAAA,MAC1B;AAAA,IACF;AAGI,QAAAA,YAAW,WAAW,QAAW;AACnC,YAAM,cAAc,KAAK,oBAAoB,aAAaA,YAAW,MAAM;AAC3E,UAAI,aAAa;AACf,eAAO,KAAK,WAAW;AAAA,MACzB;AAAA,IACF;AAGI,QAAAA,YAAW,cAAc,QAAW;AACtC,YAAM,iBAAiB,KAAK,kBAAkB,aAAaA,YAAW,SAAS;AAC/E,UAAI,gBAAgB;AAClB,eAAO,KAAK,cAAc;AAAA,MAC5B;AAAA,IACF;AAGI,QAAAA,YAAW,cAAc,QAAW;AACtC,YAAM,iBAAiB,KAAK,kBAAkB,aAAaA,YAAW,SAAS;AAC/E,UAAI,gBAAgB;AAClB,eAAO,KAAK,cAAc;AAAA,MAC5B;AAAA,IACF;AAGI,QAAAA,YAAW,gBAAgB,QAAW;AACxC,YAAM,mBAAmB,KAAK,oBAAoB,aAAaA,YAAW,WAAW;AACrF,UAAI,kBAAkB;AACpB,eAAO,KAAK,gBAAgB;AAAA,MAC9B;AAAA,IACF;AAEO,WAAA;AAAA,MACL,OAAO,OAAO,WAAW;AAAA,MACzB;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAe,aAAa,aAAqB,WAAqD;AAEpG,QAAI,WAAW,UAAU,KAAK,CAAM,OAAA,GAAG,SAAS,WAAW;AAC3D,QAAI,UAAU;AACL,aAAA;AAAA,IACT;AAIM,UAAA,8BAAc;AACpB,QAAI,cAAc;AAElB,WAAO,eAAe,CAAC,QAAQ,IAAI,WAAW,GAAG;AAC/C,cAAQ,IAAI,WAAW;AACvB,iBAAW,UAAU,KAAK,CAAM,OAAA,GAAG,SAAS,WAAW;AAEvD,UAAI,UAAU;AAEZ,YAAK,SAAiB,YAAY;AACzB,iBAAA;AAAA,QACT;AAEA,sBAAc,SAAS;AAAA,MAAA,OAClB;AACL;AAAA,MACF;AAAA,IACF;AAEO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,gBAAgB,OAAe,SAA6C;AACrF,QAAA;AACF,YAAM,QAAQ,IAAI,OAAO,IAAI,OAAO,GAAG;AACvC,UAAI,CAAC,MAAM,KAAK,KAAK,GAAG;AACf,eAAA;AAAA,UACL,MAAM;AAAA,UACN,SAAS,KAAK,EAAE,kCAAkC,EAAE,SAAS;AAAA,UAC7D,eAAe;AAAA,UACf,aAAa;AAAA,QAAA;AAAA,MAEjB;AAAA,aACOX,QAAO;AACd,cAAQ,MAAM,0BAA0B,OAAO,IAAIA,MAAK;AACjD,aAAA;AAAA,QACL,MAAM;AAAA,QACN,SAAS,KAAK,EAAE,iCAAiC,EAAE,SAAS;AAAA,QAC5D,eAAe;AAAA,QACf,aAAa;AAAA,MAAA;AAAA,IAEjB;AACO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,oBAAoB,OAAe,gBAAoD;AAChG,QAAA,MAAM,WAAW,gBAAgB;AAC5B,aAAA;AAAA,QACL,MAAM;AAAA,QACN,SAAS,KAAK,EAAE,8BAA8B,EAAE,UAAU,gBAAgB,SAAS,MAAM,QAAQ;AAAA,QACjG,eAAe;AAAA,QACf,aAAa,MAAM;AAAA,MAAA;AAAA,IAEvB;AACO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,kBAAkB,OAAe,WAA+C;AACzF,QAAA,MAAM,SAAS,WAAW;AACrB,aAAA;AAAA,QACL,MAAM;AAAA,QACN,SAAS,KAAK,EAAE,4BAA4B,EAAE,UAAU,WAAW,SAAS,MAAM,QAAQ;AAAA,QAC1F,eAAe;AAAA,QACf,aAAa,MAAM;AAAA,MAAA;AAAA,IAEvB;AACO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,kBAAkB,OAAe,WAA+C;AACzF,QAAA,MAAM,SAAS,WAAW;AACrB,aAAA;AAAA,QACL,MAAM;AAAA,QACN,SAAS,KAAK,EAAE,4BAA4B,EAAE,UAAU,WAAW,SAAS,MAAM,QAAQ;AAAA,QAC1F,eAAe;AAAA,QACf,aAAa,MAAM;AAAA,MAAA;AAAA,IAEvB;AACO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,oBAAoB,OAAe,aAAiD;AAEjG,UAAM,aAAa,MAAM,QAAQ,UAAU,EAAE;AAEzC,QAAA,WAAW,SAAS,aAAa;AAC5B,aAAA;AAAA,QACL,MAAM;AAAA,QACN,SAAS,KAAK,EAAE,8BAA8B,EAAE,UAAU,aAAa,SAAS,WAAW,QAAQ;AAAA,QACnG,eAAe;AAAA,QACf,aAAa,WAAW;AAAA,MAAA;AAAA,IAE5B;AACO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,0BAA0B,aAAiC,WAAsC;AAClG,QAAA,CAAC,eAAe,CAAC,WAAW;AAC9B,aAAO;IACT;AAEA,UAAM,WAAW,KAAK,aAAa,aAAa,SAAS;AACzD,QAAI,CAAC,YAAY,CAAC,SAAS,YAAY;AACrC,aAAO;IACT;AAEA,UAAMW,cAAa,SAAS;AAC5B,UAAM,QAAkB,CAAA;AAExB,QAAIA,YAAW,SAAS;AAChB,YAAA,KAAK,KAAK,EAAE,qCAAqC,EAAE,SAASA,YAAW,QAAS,CAAA,CAAC;AAAA,IACzF;AACI,QAAAA,YAAW,WAAW,QAAW;AAC7B,YAAA,KAAK,KAAK,EAAE,yCAAyC,EAAE,UAAUA,YAAW,OAAQ,CAAA,CAAC;AAAA,IAC7F;AACI,QAAAA,YAAW,cAAc,QAAW;AAChC,YAAA,KAAK,KAAK,EAAE,uCAAuC,EAAE,UAAUA,YAAW,UAAW,CAAA,CAAC;AAAA,IAC9F;AACI,QAAAA,YAAW,cAAc,QAAW;AAChC,YAAA,KAAK,KAAK,EAAE,uCAAuC,EAAE,UAAUA,YAAW,UAAW,CAAA,CAAC;AAAA,IAC9F;AACI,QAAAA,YAAW,gBAAgB,QAAW;AAClC,YAAA,KAAK,KAAK,EAAE,yCAAyC,EAAE,UAAUA,YAAW,YAAa,CAAA,CAAC;AAAA,IAClG;AAEO,WAAA;AAAA,EACT;AACF;AClNO,MAAM,iBAA8C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzD,yCAAyC;AAAA,IACvC,WAAW;AAAA,IACX,aAAa,KAAK,EAAE,gCAAgC;AAAA,EACtD;AAAA;AAAA,EAGA,yCAAyC;AAAA,IACvC,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,MAAM;AAAA,IACN,aAAa,KAAK,EAAE,6BAA6B;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,0BAA0B;AAAA,IACxB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,MAAM;AAAA,IACN,aAAa,KAAK,EAAE,qBAAqB;AAAA,EAC3C;AAAA;AAAA,EAGA,wBAAwB;AAAA,IACtB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,aAAa,KAAK,EAAE,iBAAiB;AAAA,EACvC;AAAA;AAAA,EAGA,sBAAsB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,EACjB;AAAA,EAEA,0BAA0B;AAAA,IACxB,WAAW;AAAA,IACX,eAAe;AAAA,EACjB;AAAA;AAAA,EAGA,yBAAyB;AAAA,IACvB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,MAAM;AAAA,IACN,aAAa,KAAK,EAAE,wBAAwB;AAAA,EAC9C;AAAA,EAEA,oCAAoC;AAAA,IAClC,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,KAAK;AAAA,IACL,MAAM;AAAA,IACN,aAAa,KAAK,EAAE,2BAA2B;AAAA,EACjD;AAAA,EAEA,iCAAiC;AAAA,IAC/B,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,KAAK;AAAA,IACL,MAAM;AAAA,IACN,aAAa,KAAK,EAAE,2BAA2B;AAAA,EACjD;AAAA;AAAA,EAGA,yBAAyB;AAAA,IACvB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,MAAM;AAAA,IACN,aAAa,KAAK,EAAE,yBAAyB;AAAA,EAC/C;AAAA;AAAA,EAGA,wBAAwB;AAAA,IACtB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,KAAK;AAAA,IACL,MAAM;AAAA,IACN,aAAa,KAAK,EAAE,2BAA2B;AAAA,EACjD;AAAA,EAEA,gBAAgB;AAAA,IACd,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,KAAK;AAAA,IACL,MAAM;AAAA,IACN,aAAa,KAAK,EAAE,2BAA2B;AAAA,EACjD;AAAA;AAAA,EAGA,uBAAuB;AAAA,IACrB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,aAAa,KAAK,EAAE,kBAAkB;AAAA,EACxC;AAAA;AAAA,EAGA,yBAAyB;AAAA,IACvB,WAAW;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAsB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,MAAM;AAAA,IACN,aAAa,KAAK,EAAE,uBAAuB;AAAA,EAC7C;AAAA,EAEA,yBAAyB;AAAA,IACvB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,MAAM;AAAA,IACN,aAAa,KAAK,EAAE,uBAAuB;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAMA,uBAAuB;AAAA,IACrB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,aAAa,KAAK,EAAE,wBAAwB;AAAA,EAC9C;AAAA,EAEA,qBAAqB;AAAA,IACnB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,aAAa,KAAK,EAAE,sBAAsB;AAAA,EAC5C;AAAA,EAEA,2BAA2B;AAAA,IACzB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,aAAa,KAAK,EAAE,wBAAwB;AAAA,EAC9C;AACF;AAoBgB,SAAA,2BACd,aACA,WACa;AACb,MAAI,CAAC,aAAa;AACT,WAAA;AAAA,MACL,WAAW;AAAA,MACX,eAAe;AAAA,MACf,aAAa,KAAK,EAAE,kBAAkB;AAAA,IAAA;AAAA,EAE1C;AAGI,MAAA,aAAa,UAAU,SAAS,GAAG;AAC/B,UAAA,gBAAgB,qBAAqB,aAAa,SAAS;AAE7D,QAAA,cAAc,SAAS,GAAG;AACtB,YAAA,SAAS,gCAAgC,eAAe,SAAS;AAKhE,aAAA;AAAA,IACT;AAAA,EACF;AAGQ,UAAA,IAAI,6DAA6D,WAAW,EAAE;AAGlF,MAAA,eAAe,WAAW,GAAG;AAC/B,WAAO,eAAe,WAAW;AAAA,EACnC;AAGM,QAAA,YAAY,YAAY;AAG1B,MAAA,UAAU,SAAS,UAAU,GAAG;AAClC,QAAI,UAAU,SAAS,YAAY,KAAK,UAAU,SAAS,aAAa,GAAG;AAClE,aAAA;AAAA,QACL,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,MAAM;AAAA,QACN,aAAa,KAAK,EAAE,6BAA6B;AAAA,MAAA;AAAA,IAErD;AACO,WAAA;AAAA,MACL,WAAW;AAAA,MACX,eAAe;AAAA,MACf,eAAe;AAAA,MACf,MAAM;AAAA,MACN,aAAa,KAAK,EAAE,qBAAqB;AAAA,IAAA;AAAA,EAE7C;AAGA,MAAI,UAAU,SAAS,aAAa,KAChC,UAAU,SAAS,aAAa,KAChC,UAAU,SAAS,OAAO,KAC1B,UAAU,SAAS,WAAW,GAAG;AAC5B,WAAA;AAAA,MACL,WAAW;AAAA,MACX,aAAa,KAAK,EAAE,gCAAgC;AAAA,IAAA;AAAA,EAExD;AAGI,MAAA,UAAU,SAAS,MAAM,GAAG;AAC1B,QAAA,UAAU,SAAS,MAAM,GAAG;AACvB,aAAA;AAAA,QACL,WAAW;AAAA,QACX,eAAe;AAAA,MAAA;AAAA,IAEnB;AACO,WAAA;AAAA,MACL,WAAW;AAAA,MACX,eAAe;AAAA,IAAA;AAAA,EAEnB;AAGA,MAAI,UAAU,SAAS,SAAS,KAAK,UAAU,SAAS,MAAM,GAAG;AACxD,WAAA;AAAA,MACL,WAAW;AAAA,IAAA;AAAA,EAEf;AAGA,MAAI,UAAU,SAAS,SAAS,KAAK,UAAU,SAAS,KAAK,GAAG;AAC9D,UAAM,gBAAgB,UAAU,SAAS,aAAa,KAAK,UAAU,SAAS,cAAc;AACtF,UAAA,aAAa,UAAU,SAAS,UAAU;AAEzC,WAAA;AAAA,MACL,WAAW;AAAA,MACX,eAAe;AAAA,MACf,eAAe;AAAA,MACf,KAAK,aAAa,IAAI,gBAAgB,IAAI;AAAA,MAC1C,MAAM;AAAA,MACN,aAAa,KAAK,EAAE,wBAAwB;AAAA,IAAA;AAAA,EAEhD;AAGI,MAAA,UAAU,SAAS,SAAS,KAC5B,UAAU,SAAS,SAAS,KAC5B,UAAU,SAAS,QAAQ,GAAG;AACzB,WAAA;AAAA,MACL,WAAW;AAAA,MACX,eAAe;AAAA,MACf,eAAe;AAAA,MACf,MAAM;AAAA,MACN,aAAa,KAAK,EAAE,yBAAyB;AAAA,IAAA;AAAA,EAEjD;AAGA,MAAI,UAAU,SAAS,SAAS,KAAK,UAAU,SAAS,MAAM,GAAG;AACxD,WAAA;AAAA,MACL,WAAW;AAAA,MACX,eAAe;AAAA,MACf,eAAe;AAAA,MACf,MAAM;AAAA,MACN,aAAa,KAAK,EAAE,uBAAuB;AAAA,IAAA;AAAA,EAE/C;AAGO,SAAA;AAAA,IACL,WAAW;AAAA,IACX,eAAe;AAAA,IACf,aAAa,KAAK,EAAE,kBAAkB;AAAA,EAAA;AAE1C;AAKO,SAAS,eAAe,WAAoC;AACjE,SAAO,cAAc;AACvB;AAKO,SAAS,eAAe,WAAoC;AACjE,SAAO,cAAc;AACvB;AAKO,SAAS,cAAc,WAAoC;AACzD,SAAA,CAAC,UAAU,WAAW,WAAW,YAAY,YAAY,EAAE,SAAS,SAAS;AACtF;AAKO,SAAS,aAAa,WAAoC;AAC/D,SAAO,cAAc;AACvB;AAgBgB,SAAA,qBACd,UACA,WACU;AACV,QAAM,gBAA0B,CAAA;AAGhC,MAAI,CAAC,UAAU;AACN,WAAA;AAAA,EACT;AAEA,MAAI,CAAC,aAAa,UAAU,WAAW,GAAG;AACxC,kBAAc,KAAK,QAAQ;AACpB,WAAA;AAAA,EACT;AAEA,MAAI,cAA6B;AAG3B,QAAA,mCAAmB;AAEzB,SAAO,aAAa;AAElB,kBAAc,KAAK,WAAW;AAG1B,QAAA,aAAa,IAAI,WAAW,GAAG;AACzB,cAAA,KAAK,+DAA+D,WAAW,EAAE;AACzF;AAAA,IACF;AACA,iBAAa,IAAI,WAAW;AAG5B,UAAM,gBAAgB,UAAU,KAAK,CAAM,OAAA,GAAG,SAAS,WAAW;AAG9D,QAAA,CAAC,iBAAiB,CAAC,cAAc,YAAY,cAAc,SAAS,KAAK,MAAM,IAAI;AACrF;AAAA,IACF;AAGA,kBAAc,cAAc;AAAA,EAC9B;AAEO,SAAA;AACT;AAgBgB,SAAA,6BACd,eACA,WACkE;AAC9D,MAAA,CAAC,iBAAiB,cAAc,WAAW,KAAK,CAAC,aAAa,UAAU,WAAW,GAAG;AACjF,WAAA;AAAA,EACT;AAGA,aAAW,YAAY,eAAe;AAEpC,UAAM,WAAW,UAAU,KAAK,CAAM,OAAA,GAAG,SAAS,QAAQ;AAE1D,QAAI,YAAY,SAAS,gBAAgB,SAAS,aAAa,SAAS,GAAG;AAElE,aAAA,SAAS,aAAa,IAAI,CAAa,cAAA;AAAA,QAC5C,IAAI,SAAS,MAAM,SAAS;AAAA;AAAA,QAC5B,OAAO,SAAS;AAAA,QAChB,OAAO,SAAS;AAAA;AAAA,MAChB,EAAA;AAAA,IACJ;AAAA,EACF;AAEO,SAAA;AACT;AAwBgB,SAAA,gCACd,eACA,WACa;AACb,MAAI,CAAC,iBAAiB,cAAc,WAAW,GAAG;AACzC,WAAA;AAAA,MACL,WAAW;AAAA,MACX,eAAe;AAAA,MACf,aAAa,KAAK,EAAE,kBAAkB;AAAA,IAAA;AAAA,EAE1C;AAII,MAAA,aAAa,UAAU,SAAS,GAAG;AAC/B,UAAA,eAAe,6BAA6B,eAAe,SAAS;AAEtE,QAAA,gBAAgB,aAAa,SAAS,GAAG;AACpC,aAAA;AAAA,QACL,WAAW;AAAA,QACX;AAAA,QACA,aAAa,KAAK,EAAE,oBAAoB;AAAA,MAAA;AAAA,IAE5C;AAAA,EACF;AAGA,QAAM,aAAa,cAAc,IAAI,CAAQ,SAAA,KAAK,aAAa;AACzD,QAAA,cAAc,WAAW,KAAK,GAAG;AAIvC,MAAI,cAAc,KAAK,CAAA,SAAQ,SAAS,uCAAuC,KAC3E,YAAY,SAAS,sBAAsB,KAC3C,YAAY,SAAS,WAAW,KAAK,YAAY,SAAS,aAAa,GAAG;AACrE,WAAA;AAAA,MACL,WAAW;AAAA,MACX,aAAa,KAAK,EAAE,gCAAgC;AAAA,IAAA;AAAA,EAExD;AAGA,MAAI,WAAW,KAAK,CAAA,SAAQ,KAAK,SAAS,MAAM,CAAC,GAAG;AAElD,QAAI,YAAY,SAAS,UAAU,KAAK,YAAY,SAAS,MAAM,GAAG;AAC7D,aAAA;AAAA,QACL,WAAW;AAAA,QACX,eAAe;AAAA,MAAA;AAAA,IAEnB;AAEO,WAAA;AAAA,MACL,WAAW;AAAA,MACX,eAAe;AAAA,IAAA;AAAA,EAEnB;AAGI,MAAA,WAAW,KAAK,CAAA,SAAQ,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,MAAM,CAAC,GAAG;AACvE,WAAA;AAAA,MACL,WAAW;AAAA,IAAA;AAAA,EAEf;AAII,MAAA,WAAW,KAAK,CAAQ,SAAA,KAAK,SAAS,SAAS,KAAK,SAAS,SAAS,GAAG;AAC3E,UAAM,gBAAgB,YAAY,SAAS,aAAa,KAAK,YAAY,SAAS,cAAc;AAC1F,UAAA,aAAa,YAAY,SAAS,UAAU;AAE3C,WAAA;AAAA,MACL,WAAW;AAAA,MACX,eAAe;AAAA,MACf,eAAe;AAAA,MACf,KAAK,aAAa,IAAI,gBAAgB,IAAI;AAAA,MAC1C,MAAM;AAAA,MACN,aAAa,KAAK,EAAE,wBAAwB;AAAA,IAAA;AAAA,EAEhD;AAGI,MAAA,WAAW,KAAK,CAAQ,SAAA,KAAK,SAAS,SAAS,KAAK,SAAS,SAAS,GAAG;AAE3E,QAAI,YAAY,SAAS,UAAU,KAAK,YAAY,SAAS,UAAU,GAAG;AAEpE,UAAA,YAAY,SAAS,YAAY,KAAK,YAAY,SAAS,aAAa,KAAK,YAAY,SAAS,cAAc,GAAG;AAC9G,eAAA;AAAA,UACL,WAAW;AAAA,UACX,eAAe;AAAA,UACf,eAAe;AAAA,UACf,MAAM;AAAA,UACN,aAAa,KAAK,EAAE,6BAA6B;AAAA,QAAA;AAAA,MAErD;AAGO,aAAA;AAAA,QACL,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,MAAM;AAAA,QACN,aAAa,KAAK,EAAE,qBAAqB;AAAA,MAAA;AAAA,IAE7C;AAGO,WAAA;AAAA,MACL,WAAW;AAAA,MACX,eAAe;AAAA,MACf,eAAe;AAAA,MACf,MAAM;AAAA,MACN,aAAa,KAAK,EAAE,yBAAyB;AAAA,IAAA;AAAA,EAEjD;AAGA,MAAI,cAAc,KAAK,CAAQ,SAAA,SAAS,sBAAsB,KAC1D,WAAW,KAAK,CAAA,SAAQ,SAAS,YAAY,KAAK,SAAS,YAAY,CAAC,GAAG;AACtE,WAAA;AAAA,MACL,WAAW;AAAA,MACX,eAAe;AAAA,MACf,aAAa,KAAK,EAAE,iBAAiB;AAAA,IAAA;AAAA,EAEzC;AAGO,SAAA;AAAA,IACL,WAAW;AAAA,IACX,eAAe;AAAA,IACf,aAAa,KAAK,EAAE,kBAAkB;AAAA,EAAA;AAE1C;;;;;;;;;;;;AC1oBa,IAAA,mBAAN,cAA+B,WAAW;AAAA,EAA1C,cAAA;AAAA,UAAA,GAAA,SAAA;AAKsB,SAAA,eAA8C;AAEhD,SAAA,QAAA;AACe,SAAA,WAAA;AACH,SAAA,SAAA;AACI,SAAA,YAAA;AAC8B,SAAA,OAAA;AAgB1B,SAAA,iBAAA;AAGjB,SAAA,oBAA4C;AAE/D,SAAQ,UAA6B;AACrC,SAAQ,cAAqC;AAC7C,SAAQ,WAAW;AACnB,SAAQ,mBAAmB;AAC3B,SAAQ,kBAAkG;AAC1G,SAAQ,qBAAoC;AAAA,EAAA;AAAA,EAwb3C,WAAW,mBAAmC;;AACtD,QAAI,kBAAkB,IAAI,OAAO,KAAK,kBAAkB,IAAI,OAAO,GAAG;AACpE,WAAK,eAAe;AAAA,IACtB;AAGA,QAAI,kBAAkB,IAAI,MAAM,KAAK,KAAK,MAAM;AACtC,cAAA,IAAI,wDAAwD,KAAK,IAAI,gBAAgB,KAAK,SAAS,eAAe,KAAK,QAAQ,EAAE;AAEpI,WAAA,cAAc,IAAI,YAAY,eAAe;AAAA,QAChD,QAAQ;AAAA,UACN,UAAS,UAAK,UAAL,mBAAY;AAAA,UACrB,WAAW,KAAK;AAAA,UAChB,UAAU,KAAK;AAAA,UACf,MAAM,KAAK;AAAA,QACb;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,MACX,CAAA,CAAC;AAAA,IACJ;AAGA,QAAI,kBAAkB,IAAI,OAAO,KAAK,KAAK,OAAO;AAC5C,UAAA,KAAK,UAAU,SAAS,uBAAuB,KAAK,KAAK,SAAS,WAAW,MAAM,GAAG;AAChF,gBAAA,IAAI,qCAAqC,KAAK,SAAS,YAAY,KAAK,QAAQ,sBAAsB,KAAK,MAAM,UAAU,2BAA2B,KAAK,MAAM,eAAe,yBAAyB,KAAK,MAAM,aAAa,6BAA6B,KAAK,MAAM,iBAAiB,EAAE;AAAA,MACtS;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBAAiB;;AACnB,SAAA,UAAK,UAAL,mBAAY,YAAY;AAC1B,WAAK,UAAU,cAAc;AAAA,QAC3B,KAAK,MAAM;AAAA,QACX,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK,MAAM;AAAA,QACX,KAAK,MAAM;AAAA,MAAA;AAAA,IAEf;AAAA,EACF;AAAA,EAEQ,0BAAmC;AACzC,WAAO,CAAC,CAAC,KAAK,aAAa,KAAK,UAAU,SAAS,+BAA+B;AAAA,EACpF;AAAA,EAEQ,kBAA2B;;AACjC,UAAM,aAAa,2BAA2B,KAAK,aAAa,KAAK,SAAS;AAC9E,UAAM,qBAAqB,WAAW,eAAa,UAAK,UAAL,mBAAY,SAAQ;AACvE,WAAO,cAAc,kBAAkB,KAAK,KAAK,oBAAoB;AAAA,EACvE;AAAA,EAEQ,4BAA4B,KAAsB;AACxD,WAAO,QAAQ,OAAO,QAAQ,OAAO,QAAQ;AAAA,EAC/C;AAAA,EAEQ,aAAa,OAAc;AACjC,UAAM,SAAS,MAAM;AACrB,UAAM,WAAW,KAAK;AACtB,QAAI,QAAa,OAAO;AAGpB,QAAA,KAAK,mBAAmB;AAC1B,YAAM,WAAW,OAAO;AACxB,WAAK,qBAAqB;AAE1B,UAAI,aAAa,MAAM,KAAK,4BAA4B,QAAQ,GAAG;AACzD,gBAAA;AAAA,MAAA,OACH;AACC,cAAA,SAAS,OAAO,QAAQ;AAC9B,gBAAQ,OAAO,MAAM,MAAM,IAAI,OAAO;AAAA,MACxC;AAAA,IACS,WAAA,KAAK,MAAM,SAAS,WAAW;AACxC,cAAS,OAA4B;AACrC,WAAK,qBAAqB;AAAA,IAAA,OACrB;AACL,WAAK,qBAAqB;AAAA,IAC5B;AAEA,SAAK,QAAQ;AACb,SAAK,WAAW;AAEX,SAAA,cAAc,IAAI,YAAY,gBAAgB;AAAA,MACjD,QAAQ;AAAA,QACN,SAAS,KAAK,MAAM;AAAA,QACpB,WAAW,KAAK;AAAA,QAChB,UAAU,KAAK;AAAA,QACf;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS;AAAA,IACV,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,eAAe;AAChB,SAAA,cAAc,IAAI,YAAY,eAAe;AAAA,MAChD,QAAQ;AAAA,QACN,SAAS,KAAK,MAAM;AAAA,QACpB,WAAW,KAAK;AAAA,QAChB,UAAU,KAAK;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,IACV,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,cAAc;AACpB,QAAI,KAAK,gBAAA,KAAqB,KAAK,uBAAuB,MAAM;AAC9D,YAAM,MAAM,KAAK;AACjB,UAAI,QAAQ,MAAM,KAAK,4BAA4B,GAAG,GAAG;AACvD,aAAK,QAAQ;AAAA,MAAA,OACR;AACC,cAAA,SAAS,OAAO,GAAG;AACzB,aAAK,QAAQ,OAAO,MAAM,MAAM,IAAI,OAAO;AAAA,MAC7C;AACA,WAAK,qBAAqB;AAAA,IAC5B;AAEA,SAAK,WAAW;AAGhB,SAAK,sBAAsB;AAG3B,SAAK,uBAAuB;AAEpB,YAAA,IAAI,wCAAwC,KAAK,MAAM,EAAE,gBAAgB,KAAK,SAAS,eAAe,KAAK,QAAQ,EAAE;AACrH,YAAA,IAAI,uCAAuC,KAAK,WAAW;AAC3D,YAAA,IAAI,iCAAiC,KAAK,KAAK;AAElD,SAAA,cAAc,IAAI,YAAY,cAAc;AAAA,MAC/C,QAAQ;AAAA,QACN,SAAS,KAAK,MAAM;AAAA,QACpB,WAAW,KAAK;AAAA,QAChB,UAAU,KAAK;AAAA,QACf,sBAAsB,KAAK;AAAA,MAC7B;AAAA,MACA,SAAS;AAAA,MACT,UAAU;AAAA;AAAA,IACX,CAAA,CAAC;AAEF,YAAQ,IAAI,mDAAmD,KAAK,YAAY,MAAM,SAAS;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAA2B;AACjC,QAAI,CAAC,KAAK,eAAe,CAAC,KAAK,WAAW;AACjC,aAAA;AAAA,IACT;AAGI,QAAA,KAAK,YAAY,SAAS,UAAU,KAAK,KAAK,YAAY,SAAS,UAAU,GAAG;AAC3E,aAAA;AAAA,IACT;AAGA,UAAM,gBAAgB,qBAAqB,KAAK,aAAa,KAAK,SAAS;AAC3E,WAAO,cAAc;AAAA,MAAK,UACxB,KAAK,SAAS,UAAU,KAAK,KAAK,SAAS,UAAU;AAAA,IAAA;AAAA,EAEzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe,OAAsB;AAC3C,UAAM,SAAS,MAAM;AAGjB,QAAA,OAAO,SAAS,UAAU;AAC5B;AAAA,IACF;AAGA,UAAM,cAAc;AAAA,MAClB;AAAA,MAAa;AAAA,MAAU;AAAA,MAAO;AAAA,MAAU;AAAA,MACxC;AAAA,MAAa;AAAA,MAAc;AAAA,MAAW;AAAA,MACtC;AAAA,MAAQ;AAAA,IAAA;AAGV,QAAI,YAAY,SAAS,MAAM,GAAG,GAAG;AACnC;AAAA,IACF;AAGI,QAAA,MAAM,WAAW,MAAM,SAAS;AAClC;AAAA,IACF;AAGA,QACE,MAAM,QAAQ,OACX,CAAC,OAAO,MAAM,SAAS,GAAG,MACzB,OAAO,mBAAmB,KAAK,OAAO,mBAAmB,QAAQ,OAAO,MAAM,WAAW,IAC7F;AACA;AAAA,IACF;AAGI,QAAA,MAAM,QAAQ,OAAO,CAAC,OAAO,MAAM,SAAS,GAAG,GAAG;AACpD;AAAA,IACF;AAGA,QAAI,MAAM,OAAO,OAAO,MAAM,OAAO,KAAK;AACxC;AAAA,IACF;AAGA,UAAM,eAAe;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,wBAAwB;AAE9B,SAAK,cAAc;AAGf,QAAA,KAAK,UAAU,QAAQ,KAAK,UAAU,UAAa,KAAK,UAAU,IAAI;AACxE;AAAA,IACF;AAGI,QAAA,CAAC,KAAK,eAAe,CAAC,KAAK,aAAa,KAAK,UAAU,WAAW,GAAG;AACvE;AAAA,IACF;AAGA,UAAM,mBAAmB,cAAc;AAAA,MACrC,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IAAA;AAIH,QAAA,CAAC,iBAAiB,OAAO;AAC3B,WAAK,cAAc,iBAAiB;AAGpC,cAAQ,IAAI,4CAA4C,KAAK,SAAS,KAAK;AAAA,QACzE,aAAa,KAAK;AAAA,QAClB,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,MAAA,CACd;AAAA,IAAA,OACI;AACL,cAAQ,IAAI,4CAA4C,KAAK,SAAS,EAAE;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,yBAAyB;AAE3B,QAAA,KAAK,UAAU,QAAQ,KAAK,UAAU,UAAa,KAAK,UAAU,IAAI;AACxE;AAAA,IACF;AAGM,UAAA,iBAAiB,KAAK;AACxB,QAAA,eAAe,WAAW,GAAG;AAC/B;AAAA,IACF;AAGA,QAAI,KAAK;AAAM;AAKf,UAAM,cAAc,eAAe,KAAK,CAAAC,OAAKA,GAAE,cAAc,IAAI,MAC3D,eAAe,WAAW,IAAI,eAAe,CAAC,IAAI;AAExD,QAAI,aAAa;AAEf,WAAK,OAAO,YAAY;AACnB,WAAA,cAAc,IAAI,YAAY,eAAe;AAAA,QAChD,QAAQ,EAAE,SAAS,KAAK,MAAM,IAAI,WAAW,KAAK,WAAW,UAAU,KAAK,UAAU,MAAM,KAAK,KAAK;AAAA,QACtG,SAAS;AAAA,QACT,UAAU;AAAA,MACX,CAAA,CAAC;AACF,cAAQ,IAAI,sDAAsD,KAAK,IAAI,QAAQ,KAAK,SAAS,EAAE;AACnG;AAAA,IACF;AAGA,SAAK,cAAc;AAAA,MACjB,GAAG,KAAK;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,SAAS,KAAK,EAAE,yBAAyB;AAAA,QACzC,eAAe,eAAe,IAAI,CAAAA,OAAKA,GAAE,KAAK,EAAE,KAAK,IAAI;AAAA,QACzD,aAAa;AAAA,MACf;AAAA,IAAA;AAEF,YAAQ,IAAI,4CAA4C,KAAK,SAAS,qCAAqC;AAAA,EAC7G;AAAA,EAEQ,yBAAyB;AAC3B,QAAA,KAAK,2BAA2B;AAClC;AAAA,IACF;AAGK,SAAA,kBAAkB,KAAK;AACpB,YAAA,IAAI,4BAA4B,KAAK,gBAAgB,MAAM,sBAAsB,KAAK,SAAS,KAAK,KAAK,eAAe;AAChI,YAAQ,IAAI,sCAAsC,KAAK,IAAI,EAAE;AAC7D,YAAQ,IAAI,6BAA6B,KAAK,SAAS,eAAe,KAAK,QAAQ,EAAE;AAGrF,QAAI,CAAC,KAAK,QAAQ,KAAK,gBAAgB,SAAS,GAAG;AACjD,UAAI,eAA8B;AAGlC,YAAM,cAAc,KAAK,gBAAgB,KAAK,CAAKA,OAAAA,GAAE,cAAc,IAAI;AACvE,UAAI,aAAa;AACf,uBAAe,YAAY;AAC3B,gBAAQ,IAAI,+CAA+C,YAAY,EAAE,KAAK,YAAY,KAAK,GAAG;AAAA,MAG3F,WAAA,KAAK,gBAAgB,WAAW,GAAG;AAC3B,uBAAA,KAAK,gBAAgB,CAAC,EAAE;AAC/B,gBAAA,IAAI,wDAAwD,YAAY,EAAE;AAAA,MACpF;AAGA,UAAI,cAAc;AAChB,aAAK,OAAO;AACP,aAAA,cAAc,IAAI,YAAY,eAAe;AAAA,UAChD,QAAQ;AAAA,YACN,SAAS,KAAK,MAAM;AAAA,YACpB,WAAW,KAAK;AAAA,YAChB,UAAU,KAAK;AAAA,YACf,MAAM,KAAK;AAAA,UACb;AAAA,UACA,SAAS;AAAA,UACT,UAAU;AAAA,QACX,CAAA,CAAC;AAAA,MACJ;AAAA,IAAA,WAGO,KAAK,MAAM;AAClB,cAAQ,IAAI,wFAAwF,KAAK,IAAI,EAAE;AAC1G,WAAA,cAAc,IAAI,YAAY,eAAe;AAAA,QAChD,QAAQ;AAAA,UACN,SAAS,KAAK,MAAM;AAAA,UACpB,WAAW,KAAK;AAAA,UAChB,UAAU,KAAK;AAAA,UACf,MAAM,KAAK;AAAA,QACb;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,MACX,CAAA,CAAC;AAAA,IACJ;AAEA,SAAK,mBAAmB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,8BAA8G;AACpH,QAAI,CAAC,KAAK,eAAe,CAAC,KAAK,WAAW;AACxC,aAAO;IACT;AAGA,UAAM,gBAAgB,qBAAqB,KAAK,aAAa,KAAK,SAAS;AAEnE,YAAA,IAAI,iCAAiC,KAAK,SAAS,WAAW,KAAK,WAAW,qBAAqB,aAAa;AAGxH,eAAW,YAAY,eAAe;AACpC,YAAM,WAAW,KAAK,UAAU,KAAK,CAAM,OAAA,GAAG,SAAS,QAAQ;AAE3D,UAAA,YAAY,SAAS,SAAS,MAAM,QAAQ,SAAS,KAAK,KAAK,SAAS,MAAM,SAAS,GAAG;AAC5F,gBAAQ,IAAI,6BAA6B,SAAS,MAAM,MAAM,mBAAmB,QAAQ,EAAE;AAC3F,eAAO,SAAS;AAAA,MAClB;AAAA,IACF;AAEA,YAAQ,IAAI,mDAAmD,KAAK,SAAS,EAAE;AAC/E,WAAO;EACT;AAAA,EAEQ,oBAAoB;AAC1B,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEQ,kBAAkB,OAAc;AACtC,UAAM,SAAS,MAAM;AACrB,UAAM,QAAQ,OAAO;AAEb,YAAA,IAAI,+CAA+C,KAAK,eAAe,KAAK,SAAS,cAAc,KAAK,QAAQ,EAAE;AAC1H,YAAQ,IAAI,wCAAwC,KAAK,IAAI,EAAE;AAG/D,SAAK,OAAO;AACZ,YAAQ,IAAI,0CAA0C,KAAK,IAAI,EAAE;AAGjE,UAAM,cAAc;AAAA,MAClB,SAAS,KAAK,MAAM;AAAA,MACpB,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,MAAM,KAAK;AAAA,IAAA;AAEL,YAAA,IAAI,8DAA8D,WAAW;AAEhF,SAAA,cAAc,IAAI,YAAY,eAAe;AAAA,MAChD,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,IACX,CAAA,CAAC;AAEF,YAAQ,IAAI,8CAA8C;AAAA,EAC5D;AAAA,EAEQ,sBAAsB,OAAc;AAC1C,UAAM,MAAO,MAAM,OAA4B,MAAM,KAAK;AAEpD,UAAA,MAAM,WAAW,GAAG;AAC1B,UAAM,QAAQ,OAAO,CAAC,MAAM,GAAG,IAAI,OAAO,KAAK,IAAI,GAAG,CAAC,IAAK,QAAQ,KAAK,KAAK;AAC9E,SAAK,WAAW,SAAS;AACpB,SAAA,cAAc,IAAI,YAAY,mBAAmB;AAAA,MACpD,QAAQ,EAAE,WAAW,KAAK,WAAW,UAAU,KAAK,UAAU,UAAU,KAAK,SAAS;AAAA,MACtF,SAAS;AAAA,MACT,UAAU;AAAA,IACX,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,yBAAyBrB,IAAU;AAErC,QAAAA,GAAE,WAAWA,GAAE,eAAe;AAChC,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,0BAA0B;AAC5B,QAAA,SAAS,eAAe,wBAAwB;AAAG;AACjD,UAAA,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,KAAK;AACX,UAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyDX,aAAA,KAAK,YAAY,KAAK;AAAA,EACjC;AAAA,EAEQ,gBAAgB,cAAsB,YAAoB;;AAChE,SAAK,wBAAwB;AAGpB,mBAAA,eAAe,uBAAuB,MAAtC,mBAAyC;AAE5C,UAAA,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,KAAK;AACZ,WAAO,YAAY;AACZ,WAAA,aAAa,QAAQ,QAAQ;AAC7B,WAAA,aAAa,cAAc,MAAM;AACjC,WAAA,aAAa,mBAAmB,uBAAuB;AAE9D,WAAO,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBnB,UAAM,aAAa;AACnB,WAAO,cAAc,wBAAwB,EAAG,cAAc,cAAc;AAC5E,WAAO,cAAc,yBAAyB,EAAG,cAAc,KAAK,EAAE,cAAc;AACpF,WAAO,cAAc,uBAAuB,EAAG,cAAc,KAAK,EAAE,YAAY;AAE1E,UAAA,WAAW,OAAO,cAAc,2BAA2B;AAC3D,UAAA,YAAY,OAAO,cAAc,6BAA6B;AACpE,aAAS,QAAQ;AACP,cAAA,cAAc,GAAG,aAAa,MAAM,IAAI,KAAK,EAAE,kBAAkB,CAAC;AAEnE,aAAA,iBAAiB,SAAS,MAAM;AAC7B,gBAAA,cAAc,GAAG,SAAS,MAAM,MAAM,IAAI,KAAK,EAAE,kBAAkB,CAAC;AAAA,IAAA,CAC/E;AAEM,WAAA,cAAc,wBAAwB,EAAG,iBAAiB,SAAS,MAAM,OAAO,OAAO;AACvF,WAAA,cAAc,yBAAyB,EAAG,iBAAiB,SAAS,MAAM,OAAO,OAAO;AAE/F,WAAO,cAAc,uBAAuB,EAAG,iBAAiB,SAAS,MAAM;AAC7E,YAAM,WAAW,SAAS;AAC1B,YAAM,WAAW,KAAK;AACtB,WAAK,QAAQ;AACb,WAAK,WAAW;AACX,WAAA,cAAc,IAAI,YAAY,gBAAgB;AAAA,QACjD,QAAQ,EAAE,SAAS,KAAK,MAAM,IAAI,WAAW,KAAK,WAAW,UAAU,KAAK,UAAU,OAAO,UAAU,SAAS;AAAA,QAChH,SAAS;AAAA,MACV,CAAA,CAAC;AACF,aAAO,MAAM;AAAA,IAAA,CACd;AAGM,WAAA,iBAAiB,SAAS,CAAC,OAAmB;AAC7C,YAAA,OAAO,OAAO;AACpB,UAAI,GAAG,UAAU,KAAK,QAAQ,GAAG,UAAU,KAAK,SAC5C,GAAG,UAAU,KAAK,OAAO,GAAG,UAAU,KAAK,QAAQ;AACrD,eAAO,MAAM;AAAA,MACf;AAAA,IAAA,CACD;AAED,WAAO,iBAAiB,SAAS,MAAM,OAAO,OAAQ,CAAA;AAE7C,aAAA,KAAK,YAAY,MAAM;AAChC,WAAO,UAAU;AACjB,aAAS,MAAM;AAAA,EACjB;AAAA,EAEQ,yBAAyB,gBAAqB,mBAA4B;AAC1E,UAAA,WAAW,mBAAmB,QAAQ,mBAAmB,UAAa,OAAO,cAAc,EAAE,KAAA,MAAW;AAC9G,UAAM,cAAc,WAAW,OAAO,cAAc,IAAI;AAExD,QAAI,mBAAmB;AACd,aAAA;AAAA,2CAC8B,WAAW,KAAK,OAAO;AAAA,mBAC/C,WAAW,KAAK,WAAW,cAAc,GAAG;AAAA;AAAA,IAE3D;AAEA,QAAI,CAAC,UAAU;AACN,aAAA;AAAA;AAAA,wBAEW,KAAK,EAAE,eAAe,CAAC;AAAA,oBAC3B,MAAM;;AAAA,oBAAK,gBAAgB,MAAI,UAAK,UAAL,mBAAY,UAAS,EAAE;AAAA,OAAC;AAAA,cAC7D,KAAK,EAAE,eAAe,CAAC;AAAA;AAAA;AAAA,IAGjC;AAEO,WAAA;AAAA;AAAA,iDAEsC,WAAW;AAAA,oBACxC,MAAM;;AAAA,kBAAK,gBAAgB,eAAa,UAAK,UAAL,mBAAY,UAAS,EAAE;AAAA,KAAC;AAAA,YACxE,WAAW;AAAA;AAAA;AAAA,wBAGC,KAAK,EAAE,gBAAgB,CAAC;AAAA,oBAC5B,MAAM;;AAAA,kBAAK,gBAAgB,eAAa,UAAK,UAAL,mBAAY,UAAS,EAAE;AAAA,KAAC;AAAA,cACtE,KAAK,EAAE,gBAAgB,CAAC;AAAA;AAAA;AAAA;AAAA,EAIpC;AAAA,EAEQ,oBAAoB,OAAc,MAAmC;AAC3E,UAAM,SAAS,MAAM;AACrB,UAAM,QAAQ,OAAO;AAEb,YAAA,IAAI,+CAA+C,IAAI,WAAW,KAAK,eAAe,KAAK,SAAS,cAAc,KAAK,QAAQ,EAAE;AAGzI,QAAI,SAAS,WAAW;AACtB,WAAK,oBAAoB;AAAA,IAAA,WAChB,SAAS,SAAS;AAC3B,WAAK,kBAAkB;AAAA,IAAA,WACd,SAAS,OAAO;AACzB,WAAK,gBAAgB;AAAA,IACvB;AAEQ,YAAA,IAAI,yDAAyD,KAAK,eAAe,aAAa,KAAK,aAAa,iBAAiB,KAAK,iBAAiB,EAAE;AAG5J,SAAA,cAAc,IAAI,YAAY,iBAAiB;AAAA,MAClD,QAAQ;AAAA,QACN,SAAS,KAAK,MAAM;AAAA,QACpB,WAAW,KAAK;AAAA,QAChB,UAAU,KAAK;AAAA,QACf,YAAY,KAAK,MAAM;AAAA,QACvB,iBAAiB,KAAK;AAAA,QACtB,eAAe,KAAK;AAAA,QACpB,mBAAmB,KAAK;AAAA,QACxB,MAAM,KAAK;AAAA,MACb;AAAA,MACA,SAAS;AAAA,MACT,UAAU;AAAA;AAAA,IACX,CAAA,CAAC;AAEF,YAAQ,IAAI,8DAA8D;AAAA,MACxE,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,YAAY,KAAK,MAAM;AAAA,IAAA,CACxB;AAAA,EACH;AAAA,EAEQ,kCAAkC,OAAc,QAAgB;AAChE,UAAA,QAAS,MAAM,OAA4B;AAC5C,SAAA,oBAAoB,EAAE,GAAG,KAAK,mBAAmB,CAAC,MAAM,GAAG;AAC3D,SAAA,cAAc,IAAI,YAAY,uBAAuB;AAAA,MACxD,QAAQ;AAAA,QACN,UAAU,KAAK;AAAA,QACf,WAAW,KAAK;AAAA,QAChB;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS;AAAA,MACT,UAAU;AAAA,IACX,CAAA,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,qBAAqB,gBAAqB;AAChD,UAAM,aAAa,2BAA2B,KAAK,aAAa,KAAK,SAAS;AAC9E,UAAM,qBAAqB,WAAW,aAAa,KAAK,MAAM,QAAQ;AAElE,QAAA;AAEJ,QAAI,uBAAuB,aAAa,eAAe,kBAAkB,GAAG;AAE1E,qBAAe,iBAAiB,KAAK,EAAE,UAAU,IAAI,KAAK,EAAE,SAAS;AAAA,IAAA,WAC5D,uBAAuB,YAAY,KAAK,MAAM,SAAS,UAAU;AAE1E,YAAM,gBAAgB,WAAW,gBAAgB,KAAK,MAAM,WAAW;AACvE,YAAM,QAAQ,cAAc,KAAK,CAAKC,OAAAA,GAAE,UAAU,cAAc;AAChE,qBAAe,QAAS,MAAM,SAAS,MAAM,QAAU,kBAAkB;AAAA,IAAA,OACpE;AACL,qBAAe,mBAAmB,QAAQ,mBAAmB,SAAY,OAAO,cAAc,IAAI;AAAA,IACpG;AAEA,UAAM,UAAU,iBAAiB,MAAM,iBAAiB,QAAQ,iBAAiB;AAC3E,UAAA,aAAa,KAAK;AACjB,WAAA,mCAAmC,UAAU,UAAU,EAAE,IAAI,aAAa,aAAa,EAAE,KAAK,UAAU,MAAM,YAAY;AAAA,EACnI;AAAA,EAEQ,aAAa,iBAAsB,KAAK,OAAO,oBAA6B,KAAK,UAAU;AAE7F,QAAA,KAAK,SAAS,YAAY;AACrB,aAAA,KAAK,qBAAqB,cAAc;AAAA,IACjD;AAEA,UAAM,YAAY,KAAK,QAAQ,KAAK,CAAKD,OAAAA,GAAE,aAAa,OAAO;AAC/D,UAAM,cAAc,KAAK,QAAQ,KAAK,CAAKA,OAAAA,GAAE,aAAa,SAAS;AAC7D,UAAA,aAAa,KAAK;AAClB,UAAA,WAAW,eAAe,YAAY,UAAU,cAAc,YAAY,EAAE,IAAI,aAAa,aAAa,EAAE;AAGlH,UAAM,UAAU,GAAG,KAAK,SAAS,KAAK,KAAK,QAAQ;AACnD,UAAM,YAAY,QAAQ,KAAK,SAAS,KAAK,KAAK,QAAQ;AAG1D,UAAM,aAAa,2BAA2B,KAAK,aAAa,KAAK,SAAS;AAG9E,QAAI,KAAK;AAAa;AAKtB,UAAM,qBAAqB,WAAW,aAAa,KAAK,MAAM,QAAQ;AAGtE,QAAI,uBAAuB,cAAc,eAAe,kBAAkB,GAAG;AAC3E,aAAO,KAAK,yBAAyB,gBAAgB,qBAAqB,KAAK,MAAM,YAAY,KAAK;AAAA,IACxG;AAGA,QAAI,uBAAuB,YAAY,KAAK,MAAM,SAAS,UAAU;AAEnE,YAAM,gBAAgB,WAAW,gBAAgB,KAAK,MAAM,WAAW;AAEhE,aAAA;AAAA;AAAA,gBAEG,OAAO;AAAA,kBACL,SAAS;AAAA,mBACR,QAAQ;AAAA,oBACP,kBAAkB,EAAE;AAAA,uBACjB,qBAAqB,KAAK,MAAM,QAAQ;AAAA,qBAC1C,KAAK,YAAY;AAAA,oBAClB,KAAK,YAAY;AAAA,mBAClB,KAAK,WAAW;AAAA;AAAA,6BAEN,WAAW,eAAe,KAAK,EAAE,cAAc,CAAC;AAAA,YACjE,cAAc,IAAI,CAAU,WAAA;AAE5B,cAAM,cAAc,OAAO;AACrB,cAAA,cAAc,OAAO,SAAS,OAAO;AACrC,cAAA,aAAc,OAAe,YAAY;AAExC,eAAA;AAAA;AAAA,yBAEM,WAAW;AAAA,6BACP,UAAU;AAAA,6BACV,mBAAmB,WAAW;AAAA;AAAA,kBAEzC,WAAW;AAAA;AAAA;AAAA,MAAA,CAGlB,CAAC;AAAA;AAAA;AAAA,IAGR;AAGA,QAAI,uBAAuB,aAAa,eAAe,kBAAkB,GAAG;AACnE,aAAA;AAAA;AAAA;AAAA,kBAGK,OAAO;AAAA,oBACL,SAAS;AAAA;AAAA;AAAA,wBAGL,QAAQ,cAAc,CAAC;AAAA,yBACtB,qBAAqB,KAAK,MAAM,QAAQ;AAAA,uBAC1C,KAAK,YAAY;AAAA,sBAClB,KAAK,YAAY;AAAA,qBAClB,KAAK,WAAW;AAAA;AAAA,kBAEnB,KAAK,MAAM,KAAK;AAAA;AAAA;AAAA,IAG9B;AAGA,UAAM,YAAY,WAAW,iBAAiB,KAAK,cAAc;AAC3D,UAAA,OAAO,WAAW,SAAS,SAAY,WAAW,OAC3C,cAAc,kBAAkB,IAAI,QAAQ;AACzD,UAAM,MAAM,WAAW;AACvB,UAAM,MAAM,WAAW;AAEjB,UAAA,qBAAsB,KAAK,gBAAgB,KAAK,KAAK,uBAAuB,OAC9E,KAAK,qBACJ,kBAAkB;AAEhB,WAAA;AAAA;AAAA,cAEG,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,SAAS;AAAA,iBACR,QAAQ;AAAA,kBACP,kBAAkB;AAAA,qBACf,qBAAqB,KAAK,MAAM,QAAQ;AAAA,uBACtC,WAAW,eAAe,KAAK,MAAM,eAAe,EAAE;AAAA,gBAC7D,SAAS,SAAY,OAAO,EAAE;AAAA,eAC/B,QAAQ,SAAY,MAAM,EAAE;AAAA,eAC5B,QAAQ,SAAY,MAAM,EAAE;AAAA,kBACzB,KAAK,YAAY;AAAA,kBACjB,KAAK,YAAY;AAAA,iBAClB,KAAK,WAAW;AAAA,oBACb,KAAK,cAAc;AAAA;AAAA;AAAA,EAGrC;AAAA,EAEQ,gBAAwB;AACtB,YAAA,KAAK,MAAM,MAAM;AAAA,MACvB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACI,eAAA;AAAA,MACT,KAAK;AACI,eAAA;AAAA,MACT,KAAK;AACI,eAAA;AAAA,MACT,KAAK;AACI,eAAA;AAAA,MACT,KAAK;AACI,eAAA;AAAA,MACT,KAAK;AACI,eAAA;AAAA,MACT;AACS,eAAA;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,sBAAsB,WAA2B;AAEjD,UAAA,QAAQ,UAAU,MAAM,IAAI;AAC9B,QAAA,MAAM,SAAS,GAAG;AAEpB,aAAO,MAAM,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI;AAAA,IACrC;AACO,WAAA;AAAA,EACT;AAAA,EAEQ,wBAAwB;AAE1B,QAAA,KAAK,cAAc,uCAAuC;AAC5D,cAAQ,IAAI,kCAAkC,KAAK,SAAS,eAAe,KAAK,QAAQ,uBAAuB,KAAK,MAAM,UAAU,4BAA4B,KAAK,MAAM,eAAe,0BAA0B,KAAK,MAAM,aAAa,EAAE;AAAA,IAChP;AAGI,QAAA,CAAC,KAAK,MAAM,YAAY;AACnB,aAAA;AAAA,IACT;AAEI,QAAA,KAAK,MAAM,eAAe,WAAW;AAChC,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAMW,KAAK,qBAAqB,KAAK,MAAM,qBAAqB,EAAE;AAAA,yBAC3D,CAACA,OAAa,KAAK,oBAAoBA,IAAG,SAAS,CAAC;AAAA,2BAClD,KAAK,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASzB,WAAA,KAAK,MAAM,eAAe,YAAY;AACxC,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAMa,KAAK,mBAAmB,KAAK,MAAM,mBAAmB,EAAE;AAAA,2BACvD,CAACA,OAAa,KAAK,oBAAoBA,IAAG,OAAO,CAAC;AAAA,6BAChD,KAAK,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAWlB,KAAK,iBAAiB,KAAK,MAAM,iBAAiB,EAAE;AAAA,yBACnD,CAACA,OAAa,KAAK,oBAAoBA,IAAG,KAAK,CAAC;AAAA,2BAC9C,KAAK,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASpC;AAEO,WAAA;AAAA,EACT;AAAA,EAEQ,qBAAqB;AACpB,WAAA;AAAA,kDACuC,KAAK,wBAAwB;AAAA,4CACnC,CAACA,OAAaA,GAAE,iBAAiB;AAAA;AAAA;AAAA,yDAGpB,KAAK,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAMjE,KAAK,MAAM,eAAe,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAMtB,KAAK,qBAAqB,KAAK,MAAM,qBAAqB,EAAE;AAAA,+BAC3D,CAACA,OAAa,KAAK,oBAAoBA,IAAG,SAAS,CAAC;AAAA,iCAClD,KAAK,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAQ9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAMc,KAAK,mBAAmB,KAAK,MAAM,mBAAmB,EAAE;AAAA,+BACvD,CAACA,OAAa,KAAK,oBAAoBA,IAAG,OAAO,CAAC;AAAA,iCAChD,KAAK,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAehB,KAAK,iBAAiB,KAAK,MAAM,iBAAiB,EAAE;AAAA,+BACnD,CAACA,OAAa,KAAK,oBAAoBA,IAAG,KAAK,CAAC;AAAA,iCAC9C,KAAK,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAQjC;AAAA;AAAA,cAEC,KAAK,gBAAgB,SAAS,IAAI;AAAA;AAAA;AAAA;AAAA,4BAIpB,KAAK,QAAQ,EAAE;AAAA,6BACd,KAAK,iBAAiB;AAAA,+BACpB,KAAK,QAAQ;AAAA;AAAA;AAAA;AAAA,oBAIxB,KAAK,gBAAgB,IAAI,CAAQ,SAAA;AAAA,qCAChB,KAAK,EAAE,gBAAgB,KAAK,SAAS,KAAK,EAAE;AAAA,wBACzD,KAAK,SAAS,KAAK,EAAE;AAAA;AAAA,mBAE1B,CAAC;AAAA;AAAA;AAAA,gBAGJ,EAAE;AAAA;AAAA,cAEJ,KAAK,gBAAoB,IAAA;AAAA;AAAA,yBAEd,KAAK,EAAE,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAMjB,KAAK,aAAa,UAAa,KAAK,aAAa,QAAQ,KAAK,aAAa,KAClF,KAAK,WACJ,KAAK,mBAAmB,QAAQ,KAAK,iBAAiB,EAAG;AAAA,4BACpD,KAAK,qBAAqB;AAAA,+BACvB,KAAK,QAAQ;AAAA;AAAA;AAAA,gBAG5B,EAAE;AAAA;AAAA,cAEJ,KAAK,MAAM,yBAAyB,KAAK,MAAM,sBAAsB,SAAS,IAAI;AAAA,gBAChF,KAAK,MAAM,sBAAsB,IAAI,CAAM,OAAA;AAAA;AAAA,2BAEhC,GAAG,SAAS;AAAA;AAAA;AAAA;AAAA,8BAIT,KAAK,kBAAkB,GAAG,MAAM,KAAK,EAAE;AAAA,8BACvC,CAACA,OAAa,KAAK,kCAAkCA,IAAG,GAAG,MAAM,CAAC;AAAA,iCAC/D,KAAK,QAAQ;AAAA;AAAA;AAAA,eAG/B,CAAC;AAAA,gBACA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhB;AAAA,EAEA,SAAS;;AAEH,QAAA,CAAC,KAAK,OAAO;AACP,cAAA,MAAM,kCAAkC,EAAE,WAAW,KAAK,WAAW,UAAU,KAAK,SAAA,CAAU;AAC/F,aAAA;AAAA,IACT;AAEA,UAAM,YAAY,CAAC,KAAK,aAAa,KAAK,MAAM,SAAS;AACnD,UAAA,mBAAmB,KAAK,MAAM,eAAe,KAAK,MAAM,eAAe,aAAa,KAAK,MAAM,eAAe;AAIpH,UAAM,gBAAgB,KAAK,sBAAsB,KAAK,SAAS;AAG/D,UAAM,oBAAoB,KAAK,SAAS,WAAW,KAAK,cAAc,iBAAiB,KAAK;AACtF,UAAA,wBAAwB,KAAK;AAGnC,QAAI,YAAiB;AACrB,QAAI,KAAK,SAAS,KAAK,MAAM,SAAS,KAAK,CAAC,mBAAmB;AAC7D,YAAM,cAAc;AAAA,QAClB,WAAW;AAAA,QACX,UAAU,KAAK;AAAA,QACf,iBAAiB,KAAK,mBAAmB,KAAK,MAAM;AAAA,QACpD,eAAe,KAAK,iBAAiB,KAAK,MAAM;AAAA,QAChD,mBAAmB,KAAK,qBAAqB,KAAK,MAAM;AAAA,QACxD,YAAY,KAAK,MAAM;AAAA,QACvB,MAAM,KAAK;AAAA,QACX,gBAAe,UAAK,WAAL,mBAAa;AAAA,MAAA;AAIxB,YAAA,wBAAwB,cAAc,SAAS,cAAc,KACpC,cAAc,SAAS,oBAAoB,KAC3C,cAAc,SAAS,QAAQ;AAE9D,UAAI,yBAAyB,KAAK,MAAM,SAAS,GAAG;AAClD,gBAAQ,IAAI,qEAAqE;AAAA,UAC/E,WAAW;AAAA,UACX,UAAU,KAAK;AAAA,UACf,YAAY,KAAK,MAAM;AAAA,UACvB,aAAa;AAAA,YACX,QAAQ,YAAY,eAAe,YAC/B,YAAY,oBACZ,GAAG,YAAY,eAAe,MAAM,YAAY,aAAa;AAAA,YACjE,eAAe,YAAY;AAAA,UAC7B;AAAA,UACA,OAAO,KAAK,MAAM,IAAI,CAAMmB,OAAA;;AAAA;AAAA,cAC1B,OAAOA,GAAE;AAAA,cACT,QAAQA,GAAE;AAAA,cACV,aAAYX,MAAAW,GAAE,eAAF,gBAAAX,IAAc,IAAI,CAAAO,OAAK,GAAGA,GAAE,SAAS,IAAIA,GAAE,MAAM;AAAA,YAAE;AAAA,WAC/D;AAAA,QAAA,CACH;AAAA,MACH;AAEA,YAAM,cAAc,YAAY,iBAAiB,KAAK,OAAO,WAAW;AACxE,UAAI,aAAa;AACf,oBAAY,YAAY;AAGxB,YAAI,yBAAyB,cAAc,SAAS,YAAY,GAAG;AACjE,kBAAQ,IAAI,+BAA+B;AAAA,YACzC,WAAW;AAAA,YACX,UAAU,KAAK;AAAA,YACf,WAAW,YAAY;AAAA,YACvB,QAAQ,YAAY;AAAA,YACpB,aAAY,iBAAY,eAAZ,mBAAwB,IAAI,CAAAA,OAAK,GAAGA,GAAE,SAAS,IAAIA,GAAE,MAAM;AAAA,UAAE,CAC1E;AAAA,QACH;AAAA,MACS,WAAA,yBAAyB,KAAK,MAAM,SAAS,GAAG;AACzD,gBAAQ,IAAI,0CAA0C;AAAA,UACpD,WAAW;AAAA,UACX,UAAU,KAAK;AAAA,UACf,gBAAgB,KAAK,MAAM;AAAA,QAAA,CAC5B;AAAA,MACH;AAAA,IACF;AAKA,UAAM,eAAe,KAAK,UAAU,QAAQ,KAAK,UAAU;AACrD,UAAA,iBAAiB,oBACnB,KAAK,WAAY,aAAa,IAC7B,eAAe,KAAK,QAAQ;AAGjC,UAAM,oBAAoB,qBAAqB,yBAAyB,KAAK,YAAY,KAAK,SAAS;AAEhG,WAAA;AAAA;AAAA,UAED,YAAY;AAAA,sCACgB,KAAK,MAAM,WAAW,aAAa,EAAE;AAAA,cAC7D,KAAK,MAAM,KAAK;AAAA;AAAA,YAElB,EAAE;AAAA;AAAA;AAAA,YAGF,KAAK,aAAa,gBAAgB,iBAAiB,CAAC;AAAA;AAAA,YAEpD,oBAAoB,KAAK,SAAS,cAAc,CAAC,wBAAwB;AAAA;AAAA;AAAA;AAAA,wBAI7D,KAAK,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA,cAKrC,EAAE;AAAA;AAAA;AAAA,UAGN,KAAK,QAAQ,SAAS,KAAK,KAAK,WAAW;AAAA;AAAA,cAEvC,KAAK,QAAQ,IAAI,CAASN,WAAA;AAAA,yCACCA,OAAM,QAAQ;AAAA,kBACrCA,OAAM,OAAO;AAAA;AAAA,aAElB,CAAC;AAAA;AAAA,YAEF,EAAE;AAAA;AAAA,UAEJ,KAAK,YAAY,SAAS,KAAK,KAAK,WAAW;AAAA;AAAA,cAE3C,KAAK,YAAY,IAAI,CAASA,WAAA;AAAA;AAAA,kBAE1BA,OAAM,OAAO;AAAA;AAAA,aAElB,CAAC;AAAA;AAAA,YAEF,EAAE;AAAA;AAAA;AAAA,QAGN,KAAK,mBAAmB,KAAK,mBAAA,IAAuB,EAAE;AAAA;AAAA,EAE5D;AACF;AAxnDa,iBAuCJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAtCYa,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GADf,iBACiB,WAAA,SAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAFf,iBAEiB,WAAA,aAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAHf,iBAGiB,WAAA,eAAA,CAAA;AACDD,kBAAA;AAAA,EAA1BC,GAAS,EAAE,MAAM,OAAO;AAAA,GAJd,iBAIgB,WAAA,aAAA,CAAA;AACAD,kBAAA;AAAA,EAA1BC,GAAS,EAAE,MAAM,OAAO;AAAA,GALd,iBAKgB,WAAA,gBAAA,CAAA;AACCD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GANf,iBAMiB,WAAA,YAAA,CAAA;AAChBD,kBAAA;AAAA,EAAXC,GAAS;AAAA,GAPC,iBAOC,WAAA,SAAA,CAAA;AACiBD,kBAAA;AAAA,EAA5BC,GAAS,EAAE,MAAM,SAAS;AAAA,GARhB,iBAQkB,WAAA,YAAA,CAAA;AACDD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GATf,iBASiB,WAAA,UAAA,CAAA;AACCD,kBAAA;AAAA,EAA5BC,GAAS,EAAE,MAAM,SAAS;AAAA,GAVhB,iBAUkB,WAAA,aAAA,CAAA;AACDD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAXf,iBAWiB,WAAA,QAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAZf,iBAYiB,WAAA,cAAA,CAAA;AACDD,kBAAA;AAAA,EAA1BC,GAAS,EAAE,MAAM,OAAO;AAAA,GAbd,iBAagB,WAAA,SAAA,CAAA;AACCD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAdf,iBAciB,WAAA,UAAA,CAAA;AAGAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAjBf,iBAiBiB,WAAA,mBAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAlBf,iBAkBiB,WAAA,iBAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAnBf,iBAmBiB,WAAA,qBAAA,CAAA;AAGAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAtBf,iBAsBiB,WAAA,QAAA,CAAA;AAGAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAzBf,iBAyBiB,WAAA,YAAA,CAAA;AAEAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GA3Bf,iBA2BiB,WAAA,kBAAA,CAAA;AAGAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GA9Bf,iBA8BiB,WAAA,qBAAA,CAAA;AAEXD,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GAhCI,iBAgCM,WAAA,WAAA,CAAA;AACAF,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GAjCI,iBAiCM,WAAA,eAAA,CAAA;AACAF,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GAlCI,iBAkCM,WAAA,YAAA,CAAA;AACAF,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GAnCI,iBAmCM,WAAA,oBAAA,CAAA;AACAF,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GApCI,iBAoCM,WAAA,mBAAA,CAAA;AACAF,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GArCI,iBAqCM,WAAA,sBAAA,CAAA;AArCN,mBAANF,kBAAA;AAAA,EADNG,IAAc,oBAAoB;AAAA,GACtB,gBAAA;;;;;;;;;;;;ACHA,IAAA,qBAAN,cAAiC,WAAW;AAAA,EAA5C,cAAA;AAAA,UAAA,GAAA,SAAA;AAEsB,SAAA,UAAwB;AACvB,SAAA,WAAgC;AAChC,SAAA,aAAkD;AAClD,SAAA,WAAmD;AACnD,SAAA,eAAuD;AACtC,SAAA,iBAAA;AAClB,SAAA,eAA8C;AACjC,SAAA,WAAA;AACH,SAAA,SAAA;AACZ,SAAA,uCAAoC;AAEU,SAAA,OAAA;AAG3C,SAAA,kBAA0D;AACzC,SAAA,gBAAA;AACG,SAAA,mBAAA;AAIT,SAAA,WAAA;AAE9B,SAAQ,YAAY;AAAA,EAAA;AAAA,EAyN7B,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,SAAK,YAAY,KAAK,iBAAiB,IAAI,KAAK,QAAQ,EAAE;AAAA,EAC5D;AAAA,EAEA,WAAW,mBAAyC;AAClD,UAAM,WAAW,iBAAiB;AAC9B,QAAA,kBAAkB,IAAI,kBAAkB,GAAG;AAC7C,WAAK,YAAY,KAAK,iBAAiB,IAAI,KAAK,QAAQ,EAAE;AAAA,IAC5D;AAAA,EACF;AAAA,EAEQ,kBAAkB;AACnB,SAAA,YAAY,CAAC,KAAK;AAElB,SAAA,cAAc,IAAI,YAAY,kBAAkB;AAAA,MACnD,QAAQ;AAAA,QACN,WAAW,KAAK,QAAQ;AAAA,QACxB,UAAU,KAAK;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,IACV,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,mBAAmB,UAAyC;;AAClE,YAAO,UAAK,QAAQ,WAAb,mBAAqB,KAAK,CAASZ,WAAAA,OAAM,aAAa;AAAA,EAC/D;AAAA,EAEQ,eAAeA,QAAuB;;AAC5C,YAAO,UAAK,SAAS,KAAK,QAAQ,EAAE,MAA7B,mBAAiCA,OAAM;AAAA,EAChD;AAAA,EAEQ,mBAAmB,OAAoB;AAC7C,UAAM,gBAAgB;AAEjB,SAAA,cAAc,IAAI,YAAY,gBAAgB;AAAA,MACjD,QAAQ,MAAM;AAAA,MACd,SAAS;AAAA,IACV,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,mBAAmB;AACpB,SAAA,cAAc,IAAI,YAAY,sBAAsB;AAAA,MACvD,QAAQ,EAAE,WAAW,KAAK,QAAQ,GAAG;AAAA,MACrC,SAAS;AAAA,MACT,UAAU;AAAA,IACX,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,sBAAsB;AACvB,SAAA,cAAc,IAAI,YAAY,yBAAyB;AAAA,MAC1D,QAAQ,EAAE,WAAW,KAAK,QAAQ,GAAG;AAAA,MACrC,SAAS;AAAA,MACT,UAAU;AAAA,IACX,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,kBAAkB,OAAoB;AAC5C,UAAM,gBAAgB;AACjB,SAAA,cAAc,IAAI,YAAY,eAAe;AAAA,MAChD,QAAQ,MAAM;AAAA,MACd,SAAS;AAAA,IACV,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,oBAAoB,OAAoB;AACtC,YAAA,IAAI,kDAAkD,MAAM,MAAM;AAC1E,UAAM,gBAAgB;AAEjB,SAAA,cAAc,IAAI,YAAY,iBAAiB;AAAA,MAClD,QAAQ,MAAM;AAAA,MACd,SAAS;AAAA,MACT,UAAU;AAAA;AAAA,IACX,CAAA,CAAC;AACF,YAAQ,IAAI,gEAAgE;AAAA,EAC9E;AAAA,EAEQ,eAAuB;AACvB,UAAA,OAAO,KAAK,QAAQ;AAC1B,QAAI,CAAC;AAAa,aAAA;AACZ,UAAA,OAAO,KAAK,YAAY,KAAK,OAAO,MAAM,GAAG,EAAE,CAAC;AAC/C,WAAA,KAAK,oBAAoB,IAAI,KAAK,KAAK,oBAAoB,IAAI,KAAK,KAAK,oBAAoB,IAAI,KAAK;AAAA,EAC/G;AAAA,EAEQ,YAAY,KAAqB;AACvC,WAAO,IAAI,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,QAAQ;AAAA,EACtG;AAAA,EAEQ,sBAAsB;AACxB,QAAA,SAAS,eAAe,gCAAgC;AAAG;AACzD,UAAA,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,KAAK;AACX,UAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCX,aAAA,KAAK,YAAY,KAAK;AAAA,EACjC;AAAA,EAEQ,gBAAgBb,IAAU;;AAChC,IAAAA,GAAE,gBAAgB;AAClB,SAAK,oBAAoB;AAEnB,UAAA,OAAO,KAAK,QAAQ;AACpB,UAAA,WAAW,KAAK;AACtB,UAAM,cAAa,6BAAM,eAAc,KAAK,QAAQ;AACpD,UAAM,WAAU,6BAAM,YAAW,KAAK,QAAQ;AAExC,UAAA,cAAc,eAAe,YAAY,KAAK,EAAE,qBAAqB,IAAI,KAAK,EAAE,sBAAsB;AAE5G,UAAM,OAAqE;AAAA,MACzE,EAAE,OAAO,KAAK,EAAE,yBAAyB,GAAG,WAAW,KAAK,aAAY,6BAAM,gBAAe,KAAK,QAAQ,IAAI,EAAE;AAAA,MAChH,EAAE,OAAO,KAAK,EAAE,kBAAkB,GAAG,WAAW,KAAK,aAAY,6BAAM,SAAQ,KAAK,QAAQ,QAAQ,GAAG,EAAE;AAAA,IAAA;AAE3G,QAAI,6BAAM,mBAAmB;AAC3B,WAAK,KAAK,EAAE,OAAO,KAAK,EAAE,+BAA+B,GAAG,WAAW,KAAK,YAAY,KAAK,iBAAiB,EAAG,CAAA;AAAA,IACnH;AACA,SAAK,KAAK,EAAE,OAAO,KAAK,EAAE,wBAAwB,GAAG,WAAW,gCAAgC,UAAU,KAAK,KAAK,YAAY,WAAW,CAAC,WAAW;AACvJ,QAAI,SAAS;AACX,WAAK,KAAK,EAAE,OAAO,KAAK,EAAE,qBAAqB,GAAG,WAAW,iCAAiC,OAAO,KAAK,KAAK,YAAY,OAAO,CAAC,WAAW;AAAA,IAChJ;AACA,QAAI,UAAU;AACZ,WAAK,KAAK,EAAE,OAAO,KAAK,EAAE,2BAA2B,GAAG,WAAW,KAAK,YAAY,QAAQ,GAAG,OAAO,KAAM,CAAA;AAAA,IAC9G;AAEM,UAAA,WAAW,KAAK,IAAI,CAAKG,OAAA;AAAA;AAAA,qCAEE,KAAK,YAAYA,GAAE,KAAK,CAAC;AAAA,mCAC3BA,GAAE,QAAQ,cAAc,EAAE,KAAKA,GAAE,SAAS;AAAA;AAAA,KAExE,EAAE,KAAK,EAAE;AAEJ,UAAA,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,YAAY;AACnB,WAAO,YAAY;AAAA;AAAA,uCAEgB,KAAK,YAAY,KAAK,EAAE,mBAAmB,CAAC,CAAC;AAAA,yEACX,KAAK,YAAY,KAAK,EAAE,mBAAmB,CAAC,CAAC;AAAA;AAAA;AAAA,wCAG9E,QAAQ;AAAA;AAAA;AAInC,aAAA,KAAK,YAAY,MAAM;AAEzB,iBAAA,cAAc,uBAAuB,MAArC,mBAAwC,iBAAiB,SAAS,MAAM,OAAO;AAE/E,WAAA,iBAAiB,SAAS,CAAC,OAAmB;AAC7C,YAAA,OAAO,OAAO;AACpB,UAAI,GAAG,UAAU,KAAK,QAAQ,GAAG,UAAU,KAAK,SAC5C,GAAG,UAAU,KAAK,OAAO,GAAG,UAAU,KAAK,QAAQ;AACrD,eAAO,MAAM;AAAA,MACf;AAAA,IAAA,CACD;AAED,WAAO,iBAAiB,SAAS,MAAM,SAAS,KAAK,YAAY,MAAM,CAAC;AAExE,WAAO,UAAU;AAAA,EACnB;AAAA,EAEA,SAAS;AACP,UAAM,cAAc,KAAK,QAAQ,YAAY,KAAK,QAAQ,SAAS,SAAS;AACtE,UAAA,QAAQ,KAAK,QAAQ,SAAS;AAC9B,UAAA,aAAa,KAAK,QAAQ,YAAY;AAErC,WAAA;AAAA;AAAA,qCAE0B,aAAa,aAAc,cAAc,KAAK,MAAO;AAAA,uDACnC,KAAK;AAAA;AAAA,uCAErB,cAAe,KAAK,YAAY,aAAa,KAAM,aAAa;AAAA,yBAC9E,KAAK,eAAe;AAAA,cAC/B,cAAc,MAAM,EAAE;AAAA;AAAA;AAAA,yBAGX,KAAK,eAAe;AAAA,wBACrB,KAAK,QAAQ,EAAE,GAAG,KAAK,QAAQ,cAAc,QAAQ,KAAK,QAAQ,cAAc,EAAE;AAAA,cAC5F,KAAK,QAAQ,KAAK;AAAA;AAAA,YAEpB,KAAK,QAAQ,UAAU;AAAA,0CACO,KAAK,QAAQ,OAAO,KAAK,KAAK,QAAQ,OAAO;AAAA,cACzE,EAAE;AAAA,kEACkD,KAAK,EAAE,mBAAmB,CAAC;AAAA,sBACvE,KAAK,eAAe;AAAA,YAC9B,KAAK,gBAAgB;AAAA;AAAA,wBAET,KAAK,gBAAgB;AAAA,cAC/B,EAAE;AAAA,YACJ,KAAK,mBAAmB;AAAA;AAAA,wBAEZ,KAAK,mBAAmB;AAAA,cAClC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,QAKR,KAAK,QAAQ,IAAI,CAAUS,YAAA;;AAC3B,YAAMC,SAAQ,KAAK,mBAAmBD,QAAO,EAAE;AACzC,YAAA,kBAAkB,CAAC,cAAcC;AAGjC,YAAA,cAAa,gBAAK,aAAL,mBAAgB,KAAK,QAAQ,QAA7B,mBAAmCD,QAAO;AACvD,YAAA,kBAAiB,gBAAK,iBAAL,mBAAoB,KAAK,QAAQ,QAAjC,mBAAuCA,QAAO;AAE9D,aAAA;AAAA,kCACmB,CAAC,kBAAkB,UAAU,EAAE,IAAI,aAAa,iBAAiB,EAAE,IAAI,KAAK,iBAAiBA,QAAO,OAAO,KAAK,oBAAoB,eAAe,KAAK,gBAAgB,EAAE,MAAI,UAAK,yBAAL,mBAA2B,IAAI,GAAG,KAAK,QAAQ,EAAE,KAAKA,QAAO,EAAE,OAAM,eAAe,EAAE;AAAA,cACxR,kBAAkB;AAAA;AAAA,0BAENC,MAAK;AAAA,8BACD,KAAK,QAAQ,EAAE;AAAA,gCACb,KAAK,QAAQ,IAAI;AAAA,8BACnB,KAAK,SAAS;AAAA,iCACX,KAAK,YAAY;AAAA,6BACrBD,QAAO,EAAE;AAAA,0BACZ,KAAK,eAAeC,MAAK,CAAC;AAAA,yBAC3B,cAAc,EAAE;AAAA,6BACZ,cAAc;AAAA,mCACR,KAAK,cAAc;AAAA,oCAClBA,OAAM,mBAAmBD,QAAO,eAAe;AAAA,kCACjDC,OAAM,iBAAiBD,QAAO,aAAa;AAAA,sCACvCC,OAAM,sBAAsBA,OAAM,eAAe,YAAaA,OAAM,iBAAiBA,OAAM,kBAAmB,OAAU;AAAA,6BACjI,KAAK,QAAQ;AAAA,2BACf,KAAK,MAAM;AAAA,8BACR,IAAI;AAAA,yBACT,KAAK,IAAI;AAAA,+BACH,KAAK,UAAU;AAAA,0BACpB,KAAK,KAAK;AAAA,2BACTD,OAAM;AAAA,sCACK,KAAK,gBAAgB,GAAG,KAAK,QAAQ,EAAE,KAAKA,QAAO,EAAE,EAAE,KAAK,CAAA,CAAE;AAAA,iCACnE,KAAK,kBAAkB;AAAA,gCACxB,KAAK,iBAAiB;AAAA,kCACpB,KAAK,mBAAmB;AAAA;AAAA,gBAE1C,EAAE;AAAA;AAAA;AAAA,IAAA,CAGX,CAAC;AAAA;AAAA;AAAA,EAGN;AACF;AAhgBa,mBA0BJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzBYU,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GADf,mBACiB,WAAA,WAAA,CAAA;AACDD,kBAAA;AAAA,EAA1BC,GAAS,EAAE,MAAM,OAAO;AAAA,GAFd,mBAEgB,WAAA,WAAA,CAAA;AACCD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAHf,mBAGiB,WAAA,YAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAJf,mBAIiB,WAAA,cAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GALf,mBAKiB,WAAA,YAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GANf,mBAMiB,WAAA,gBAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAPf,mBAOiB,WAAA,kBAAA,CAAA;AACDD,kBAAA;AAAA,EAA1BC,GAAS,EAAE,MAAM,OAAO;AAAA,GARd,mBAQgB,WAAA,gBAAA,CAAA;AACED,kBAAA;AAAA,EAA5BC,GAAS,EAAE,MAAM,SAAS;AAAA,GAThB,mBASkB,WAAA,YAAA,CAAA;AACDD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAVf,mBAUiB,WAAA,UAAA,CAAA;AACHD,kBAAA;AAAA,EAAxBC,GAAS,EAAE,MAAM,KAAK;AAAA,GAXZ,mBAWc,WAAA,oBAAA,CAAA;AACED,kBAAA;AAAA,EAA1BC,GAAS,EAAE,MAAM,OAAO;AAAA,GAZd,mBAYgB,WAAA,aAAA,CAAA;AACCD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAbf,mBAaiB,WAAA,QAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAdf,mBAciB,WAAA,cAAA,CAAA;AACDD,kBAAA;AAAA,EAA1BC,GAAS,EAAE,MAAM,OAAO;AAAA,GAfd,mBAegB,WAAA,SAAA,CAAA;AACCD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAhBf,mBAgBiB,WAAA,mBAAA,CAAA;AACCD,kBAAA;AAAA,EAA5BC,GAAS,EAAE,MAAM,SAAS;AAAA,GAjBhB,mBAiBkB,WAAA,iBAAA,CAAA;AACAD,kBAAA;AAAA,EAA5BC,GAAS,EAAE,MAAM,SAAS;AAAA,GAlBhB,mBAkBkB,WAAA,oBAAA,CAAA;AACDD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAnBf,mBAmBiB,WAAA,iBAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GApBf,mBAoBiB,WAAA,qBAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GArBf,mBAqBiB,WAAA,wBAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAtBf,mBAsBiB,WAAA,YAAA,CAAA;AAEXD,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GAxBI,mBAwBM,WAAA,aAAA,CAAA;AAxBN,qBAANF,kBAAA;AAAA,EADNG,IAAc,sBAAsB;AAAA,GACxB,kBAAA;;;;;;;;;;;;AC8BA,IAAA,yBAAN,cAAqC,WAAW;AAAA,EAAhD,cAAA;AAAA,UAAA,GAAA,SAAA;AACsE,SAAA,aAAA;AACvC,SAAA,OAAA;AACT,SAAA,sBAA4C;AACzB,SAAA,kBAAA;AACF,SAAA,gBAAA;AAEnC,SAAQ,aAAa;AACrB,SAAQ,WAAW;AACnB,SAAQ,eAAe;AACvB,SAAQ,gBAAwC;AACxC,SAAA,0CAA2D;EAAI;AAAA,EAEhF,QAAQ,mBAAmC;AACzC,QAAI,kBAAkB,IAAI,MAAM,KAAK,KAAK,MAAM;AAE9C,WAAK,WAAW;AAAA,IAClB;AAEI,QAAA,kBAAkB,IAAI,qBAAqB;AAAG;AAAA,EAGpD;AAAA,EAkSA,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,WAAW,mBAAyC;AAClD,UAAM,WAAW,iBAAiB;AAClC,QAAI,kBAAkB,IAAI,MAAM,KAAK,KAAK,MAAM;AAC9C,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEQ,gBAAgB;AACtB,SAAK,OAAO;AACP,SAAA,cAAc,IAAI,YAAY,iBAAiB,EAAE,SAAS,KAAM,CAAA,CAAC;AAAA,EACxE;AAAA,EAEQ,iBAAiB;AACnB,QAAA,CAAC,KAAK,aAAa;AAAG;AAG1B,UAAM,UAA4B;AAAA,MAChC,YAAY,KAAK,eAAe,UAAU,aAAa,KAAK;AAAA,IAAA;AAG1D,QAAA,KAAK,eAAe,WAAW;AACjC,cAAQ,cAAc,KAAK;AAAA,IAAA,OACtB;AAEL,cAAQ,YAAY,KAAK;AACzB,cAAQ,UAAU,KAAK;AAAA,IACzB;AAGI,QAAA,KAAK,oBAAoB,OAAO,GAAG;AACrC,cAAQ,qBAAqB,MAAM,KAAK,KAAK,oBAAoB,QAAQ;AAAA,IAC3E;AAEK,SAAA,cAAc,IAAI,YAAY,cAAc;AAAA,MAC/C,QAAQ;AAAA,MACR,SAAS;AAAA,IACV,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,eAAwB;AAE9B,QAAI,KAAK,eAAe,WAAW,KAAK,eAAe,YAAY;AAC1D,aAAA,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,KAAK,YAAY,KAAK,cAAc,KAAK;AAAA,IAAA,WAC9D,KAAK,eAAe,WAAW;AACjC,aAAA,CAAC,CAAC,KAAK;AAAA,IAChB;AACO,WAAA;AAAA,EACT;AAAA,EAEQ,uBAAuBzB,IAAU;AAClC,SAAA,aAAcA,GAAE,OAA4B;AAAA,EACnD;AAAA,EAEQ,qBAAqBA,IAAU;AAChC,SAAA,WAAYA,GAAE,OAA4B;AAAA,EACjD;AAAA,EAEQ,0BAA0BA,IAAU;AACrC,SAAA,gBAAiBA,GAAE,OAA6B;AAAA,EACvD;AAAA,EAEQ,yBAAyBA,IAAU;AACpC,SAAA,eAAgBA,GAAE,OAA4B;AAAA,EACrD;AAAA,EAEQ,uBAAuB,aAAqB,OAAc;AAChE,UAAM,WAAW,MAAM;AAEvB,QAAI,SAAS,SAAS;AACpB,YAAM,YAAY,KAAK,oBAAoB,KAAK,CAAKe,OAAAA,GAAE,OAAO,WAAW;AACzE,UAAI,WAAW;AACb,cAAM,YAAgC;AAAA,UACpC,QAAQ,UAAU;AAAA,UAClB,WAAW,UAAU;AAAA,UACrB,SAAS,CAAC,EAAE,UAAU,gBAAgB,CAAC,UAAU,WAAW,UAAU,QAAQ,WAAW;AAAA,QAAA;AAGtF,aAAA,oBAAoB,IAAI,aAAa,SAAS;AAAA,MACrD;AAAA,IAAA,OACK;AACA,WAAA,oBAAoB,OAAO,WAAW;AAAA,IAC7C;AAEA,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,uBAAuB,aAAqB,UAAkB,aAAqB;AACzF,UAAM,WAAW,KAAK,oBAAoB,IAAI,WAAW;AACzD,QAAI,UAAU;AACZ,eAAS,WAAW;AACpB,eAAS,cAAc;AAClB,WAAA,oBAAoB,IAAI,aAAa,QAAQ;AAClD,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,wBAAwB,aAAqB,OAAc;AACjE,UAAM,QAAQ,MAAM;AACpB,UAAM,WAAW,KAAK,oBAAoB,IAAI,WAAW;AACzD,QAAI,UAAU;AACZ,eAAS,aAAa,MAAM;AACvB,WAAA,oBAAoB,IAAI,aAAa,QAAQ;AAAA,IACpD;AAAA,EACF;AAAA,EAEQ,aAAa;AACd,SAAA,aAAa,KAAK,mBAAmB;AACrC,SAAA,WAAW,KAAK,iBAAiB;AACtC,SAAK,eAAe,KAAK,iBAAiB,KAAK,mBAAmB;AAClE,SAAK,gBAAgB,KAAK,eAAe,YAAY,YAAY;AACjE,SAAK,oBAAoB;AAGzB,SAAK,kCAAkC;AAEvC,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,oCAAoC;AACrC,SAAA,oBAAoB,QAAQ,CAAa,cAAA;AAE5C,UAAI,UAAU,WAAW,UAAU,QAAQ,SAAS,GAAG;AAG/C,cAAA,SAAS,UAAU,QAAQ,CAAC;AAClC,cAAM,YAAgC;AAAA,UACpC,QAAQ,UAAU;AAAA,UAClB,WAAW,UAAU;AAAA,UACrB,UAAU,OAAO;AAAA,UACjB,aAAa,OAAO;AAAA,UACpB,SAAS;AAAA,QAAA;AAEX,aAAK,oBAAoB,IAAI,UAAU,IAAI,SAAS;AACpD,gBAAQ,IAAI,oCAAoC,UAAU,SAAS,OAAO,OAAO,KAAK,EAAE;AAAA,MAAA,WAGjF,UAAU,gBAAgB,CAAC,UAAU,WAAW,UAAU,QAAQ,WAAW,IAAI;AACxF,cAAM,YAAgC;AAAA,UACpC,QAAQ,UAAU;AAAA,UAClB,WAAW,UAAU;AAAA,UACrB,SAAS;AAAA;AAAA,QAAA;AAGX,aAAK,oBAAoB,IAAI,UAAU,IAAI,SAAS;AACpD,gBAAQ,IAAI,qCAAqC,UAAU,SAAS,2CAA2C;AAAA,MACjH;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,SAAS;AACP,QAAI,CAAC,KAAK;AAAa,aAAA;AAEjB,UAAA,UAAU,KAAK;AAEd,WAAA;AAAA,oCACyB,CAACf,OAAaA,GAAE,iBAAiB;AAAA;AAAA,qCAEhC,KAAK,EAAE,kBAAkB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,YAKnD,KAAK,eAAe,YAAY;AAAA;AAAA,mDAEO,KAAK,EAAE,oBAAoB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,4BAKnD,KAAK,YAAY;AAAA,6BAChB,KAAK,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAS5C;AAAA;AAAA;AAAA,qDAGuC,KAAK,EAAE,wBAAwB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,8BAKvD,KAAK,UAAU;AAAA,+BACd,KAAK,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qDAUL,KAAK,EAAE,sBAAsB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,8BAKrD,KAAK,QAAQ;AAAA,+BACZ,KAAK,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAU7C;AAAA;AAAA;AAAA,YAGC,KAAK,oBAAoB,SAAS,IAAI;AAAA;AAAA,oBAE9B,KAAK,EAAE,4BAA4B,CAAC;AAAA,4CACZ,KAAK,EAAE,8BAA8B,CAAC;AAAA;AAAA,gBAElE,KAAK,oBAAoB,IAAI,CAAa,cAAA;AAC1C,YAAM,aAAa,KAAK,oBAAoB,IAAI,UAAU,EAAE;AAC5D,YAAM,YAAY,KAAK,oBAAoB,IAAI,UAAU,EAAE;AACrD,YAAA,mBAAmB,CAAC,EAAE,UAAU,gBAAgB,CAAC,UAAU,WAAW,UAAU,QAAQ,WAAW;AAElG,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAMa,UAAU;AAAA,mCACX,CAACA,OAAa,KAAK,uBAAuB,UAAU,IAAIA,EAAC,CAAC;AAAA,kCAC3D,UAAU,EAAE;AAAA;AAAA,wCAEN,UAAU,EAAE;AAAA,0BAC1B,UAAU,aAAa,UAAU,WAAW;AAAA;AAAA;AAAA;AAAA,sBAIhD,aAAa;AAAA;AAAA,0BAET,mBAAmB;AAAA;AAAA;AAAA,qCAGR,KAAK,EAAE,mBAAmB,CAAC,IAAI,UAAU,WAAW;AAAA;AAAA;AAAA;AAAA,yCAIjD,uCAAW,eAAc,EAAE;AAAA,wCAC3B,CAACA,OAAa,KAAK,wBAAwB,UAAU,IAAIA,EAAC,CAAC;AAAA,6CACtD,KAAK,EAAE,8BAA8B,CAAC;AAAA;AAAA;AAAA,4BAGvD;AAAA;AAAA,4BAEA,UAAU,WAAW,UAAU,QAAQ,SAAS,IAAI;AAAA;AAAA,uCAEzC,KAAK,EAAE,qBAAqB,CAAC;AAAA;AAAA,kCAElC,UAAU,QAAQ,IAAI,CAAU,WAAA;AAAA;AAAA;AAAA;AAAA,qDAIb,UAAU,EAAE;AAAA,mDACf,uCAAW,cAAa,OAAO,EAAE;AAAA,iDAClC,MAAM,KAAK,uBAAuB,UAAU,IAAI,OAAO,IAAI,OAAO,KAAK,CAAC;AAAA,mDACtE,UAAU,EAAE,IAAI,OAAO,EAAE;AAAA;AAAA,yDAEnB,UAAU,EAAE,IAAI,OAAO,EAAE;AAAA,wCAC1C,OAAO,KAAK;AAAA;AAAA;AAAA,iCAGnB,CAAC;AAAA;AAAA;AAAA,8BAGJ;AAAA,0DAC4B,KAAK,EAAE,2BAA2B,CAAC;AAAA,2BAClE;AAAA,yBACF;AAAA;AAAA,wBAED,EAAE;AAAA;AAAA;AAAA,IAAA,CAGX,CAAC;AAAA;AAAA,cAEF,EAAE;AAAA;AAAA;AAAA;AAAA,mDAImC,KAAK,aAAa;AAAA,cACvD,KAAK,EAAE,eAAe,CAAC;AAAA;AAAA;AAAA;AAAA,yBAIZ,CAAC,OAAO;AAAA,sBACX,KAAK,cAAc;AAAA;AAAA,cAE3B,KAAK,EAAE,kBAAkB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKtC;AACF;AA/mBa,uBAwBJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAvBYsB,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GADf,uBACiB,WAAA,cAAA,CAAA;AACCD,kBAAA;AAAA,EAA5BC,GAAS,EAAE,MAAM,SAAS;AAAA,GAFhB,uBAEkB,WAAA,QAAA,CAAA;AACFD,kBAAA;AAAA,EAA1BC,GAAS,EAAE,MAAM,OAAO;AAAA,GAHd,uBAGgB,WAAA,uBAAA,CAAA;AACCD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAJf,uBAIiB,WAAA,mBAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GALf,uBAKiB,WAAA,iBAAA,CAAA;AAEXD,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GAPI,uBAOM,WAAA,cAAA,CAAA;AACAF,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GARI,uBAQM,WAAA,YAAA,CAAA;AACAF,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GATI,uBASM,WAAA,gBAAA,CAAA;AACAF,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GAVI,uBAUM,WAAA,iBAAA,CAAA;AACAF,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GAXI,uBAWM,WAAA,uBAAA,CAAA;AAXN,yBAANF,kBAAA;AAAA,EADNG,IAAc,2BAA2B;AAAA,GAC7B,sBAAA;;;;;;;;;;;;AC7BA,IAAA,qBAAN,cAAiC,WAAW;AAAA,EAA5C,cAAA;AAAA,UAAA,GAAA,SAAA;AAEsB,SAAA,UAAwB;AAEvB,SAAA,WAAgC;AAChC,SAAA,aAAkD;AAClD,SAAA,WAAmD;AACnD,SAAA,eAAuD;AACtC,SAAA,iBAAA;AACjB,SAAA,kBAA0D;AAC1D,SAAA,eAAgD;AACjD,SAAA,eAA8C;AACjC,SAAA,WAAA;AACG,SAAA,cAAA;AACN,SAAA,SAAA;AACS,SAAA,iBAAA;AACnB,SAAA,sBAA4C;AAC7B,SAAA,aAAA;AAC6B,SAAA,OAAA;AAC1B,SAAA,gBAAA;AAGC,SAAA,kBAAA;AACF,SAAA,gBAAA;AACL,SAAA,WAAA;AAE9B,SAAQ,YAAY;AACpB,SAAQ,uBAAuB;AAC/B,SAAQ,qBAAuD;AAC/D,SAAQ,oBAAmC;AAC3C,SAAQ,uBAAsC;AA+Q/C,SAAA,kBAAkB,CAACzB,OAAa;AACtC,WAAK,iBAAiB;AAAA,IAAA;AA4PP,SAAA,wCAAwB;AAChC,SAAQ,mBAAmB;AACnB,SAAA,oCAAiF;AACjF,SAAA,4CAAyC;AAClD,SAAA,wCAA+C;AAC/C,SAAA,uCAA4C;AAC5C,SAAA,uCAAiD;AACjD,SAAA,6CAAyD;EAAI;AAAA,EAhQrE,oBAAoB;AAClB,UAAM,kBAAkB;AACnB,SAAA,YAAY,KAAK,QAAQ,aAAa;AAC3C,SAAK,qBAAqB;AAC1B,SAAK,4BAA4B;AAEjC,aAAS,iBAAiB,SAAS,MAAM,KAAK,iBAAkB,CAAA;AAE3D,SAAA,iBAAiB,cAAc,KAAK,eAAe;AAAA,EAC1D;AAAA,EAEA,uBAAuB;AACrB,UAAM,qBAAqB;AAC3B,aAAS,oBAAoB,SAAS,MAAM,KAAK,iBAAkB,CAAA;AAC9D,SAAA,oBAAoB,cAAc,KAAK,eAAe;AAAA,EAC7D;AAAA,EAEA,QAAQ,mBAAqC;;AAC3C,UAAM,QAAQ,iBAAiB;AAG/B,QAAI,kBAAkB,IAAI,gBAAgB,KAAK,kBAAkB,IAAI,SAAS,GAAG;AAC/E,WAAK,4BAA4B;AAAA,IACnC;AAEA,QAAI,kBAAkB,IAAI,SAAS,OAAK,UAAK,YAAL,mBAAc,WAAU;AACzD,WAAA,gBAAgB,KAAK,QAAQ,QAAQ;AAAA,IAC5C;AAAA,EACF;AAAA,EAEQ,8BAA8B;AAEpC,QAAI,KAAK,kBAAkB,KAAK,WAAW,KAAK,QAAQ,UAAU;AAChE,WAAK,YAAY;AAEjB,iBAAW,MAAM;AACf,aAAK,gBAAgB;AACrB,gBAAQ,IAAI,kEAAkE;AAAA,SAC7E,CAAC;AAAA,IACN;AAAA,EACF;AAAA,EAEQ,uBAAuB;AAE7B,UAAM,sBAAsB,KAAK,2BAA2B,KAAK,QAAQ,QAAQ;AAE7E,QAAA,oBAAoB,WAAW,GAAG;AACpC,WAAK,qBAAqB;AAC1B,cAAQ,IAAI,cAAc,KAAK,QAAQ,EAAE,uCAAuC;AAChF;AAAA,IACF;AAGM,UAAA,cAAc,IAAI,IAAI,oBAAoB,IAAI,CAAKK,OAAAA,GAAE,UAAU,EAAE,OAAO,OAAO,CAAC;AAOlF,QAAA,YAAY,SAAS,GAAG;AAC1B,WAAK,qBAAqB;AAAA,IAAA,WAEjB,YAAY,SAAS,GAAG;AACjC,YAAM,aAAa,MAAM,KAAK,WAAW,EAAE,CAAC;AACvC,WAAA,qBAAqB,eAAe,YAAY,YAAY;AAAA,IAAA,OAE5D;AACL,WAAK,qBAAqB;AAAA,IAE5B;AAAA,EAGF;AAAA,EAEQ,2BAA2B,UAAwC;AACzE,UAAM,SAAwB,CAAA;AAE9B,eAAW,WAAW,UAAU;AAC1B,UAAA,CAAC,QAAQ,UAAU;AACrB,eAAO,KAAK,OAAO;AAAA,MACrB;AACA,UAAI,QAAQ,UAAU;AACpB,eAAO,KAAK,GAAG,KAAK,2BAA2B,QAAQ,QAAQ,CAAC;AAAA,MAClE;AAAA,IACF;AAEO,WAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB;AACxB,QAAI,CAAC,KAAK;AAAa;AAElB,SAAA,YAAY,CAAC,KAAK;AAGvB,QAAI,KAAK,WAAW;AAClB,WAAK,gBAAgB;AAAA,IACvB;AAEK,SAAA,cAAc,IAAI,YAAY,kBAAkB;AAAA,MACnD,QAAQ;AAAA,QACN,WAAW,KAAK,QAAQ;AAAA,QACxB,UAAU,KAAK;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,IACV,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,oBAAoB,UAAkB;AAC5C,SAAK,oBAAoB;AACpB,SAAA,cAAc,IAAI,YAAY,iBAAiB;AAAA,MAClD,QAAQ;AAAA,QACN;AAAA,QACA,WAAW,KAAK,QAAQ;AAAA,MAC1B;AAAA,MACA,SAAS;AAAA,IACV,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,kBAAkB,UAAkB,OAAc;AACxD,UAAM,gBAAgB;AACtB,SAAK,oBAAoB,KAAK,sBAAsB,WAAW,OAAO;AAAA,EACxE;AAAA,EAEQ,mBAAmB;AACzB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEQ,yBAAyB,UAAkB,OAAc;AAC/D,UAAM,gBAAgB;AACtB,SAAK,oBAAoB;AACzB,SAAK,uBAAuB;AAC5B,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,mBAAmB;AAEnB,UAAA,mBAAmB,KAAK;AAG9B,SAAK,qBAAqB;AAC1B,SAAK,uBAAuB;AAAA,EAC9B;AAAA,EAEQ,6BAA+D;AAIrE,UAAM,yBAAyB,KAAK,2BAA2B,KAAK,QAAQ,QAAQ;AAEhF,QAAA,uBAAuB,WAAW,GAAG;AAChC,aAAA;AAAA,IACT;AAGA,UAAM,cAAc,IAAI;AAAA,MACtB,uBACG,IAAI,CAAAA,OAAKA,GAAE,UAAU,EACrB,OAAO,CAAc,eAAA,eAAe,UAAa,eAAe,IAAI;AAAA,IAAA;AAGrE,QAAA,YAAY,SAAS,GAAG;AACnB,aAAA;AAAA,IAAA,WACE,YAAY,SAAS,GAAG;AACjC,YAAM,aAAa,MAAM,KAAK,WAAW,EAAE,CAAC;AACrC,aAAA,eAAe,YAAY,YAAY;AAAA,IAAA,OACzC;AACE,aAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,uBAAuB,UAAwC;AACrE,UAAM,SAAwB,CAAA;AAE9B,eAAW,WAAW,UAAU;AAE1B,UAAA,CAAC,QAAQ,YAAY,QAAQ,UAAU,QAAQ,OAAO,SAAS,GAAG;AACpE,eAAO,KAAK,OAAO;AAAA,MACrB;AAGA,UAAI,QAAQ,UAAU;AACpB,eAAO,KAAK,GAAG,KAAK,uBAAuB,QAAQ,QAAQ,CAAC;AAAA,MAC9D;AAAA,IACF;AAEO,WAAA;AAAA,EACT;AAAA,EAEQ,sBAAsB;AAC5B,SAAK,uBAAuB;AAAA,EAC9B;AAAA,EAEQ,iBAAiB,OAAsC;AAC7D,UAAM,gBAAgB;AACtB,SAAK,uBAAuB;AAGvB,SAAA,cAAc,IAAI,YAAY,sBAAsB;AAAA,MACvD,QAAQ;AAAA,QACN,WAAW,KAAK,QAAQ;AAAA,QACxB,eAAe,MAAM;AAAA,QACrB,qBAAqB,KAAK;AAAA;AAAA,MAC5B;AAAA,MACA,SAAS;AAAA,IACV,CAAA,CAAC;AAGF,SAAK,uBAAuB;AAAA,EAC9B;AAAA,EAEQ,mBAAmB,OAAoB;AAC7C,UAAM,gBAAgB;AACjB,SAAA,cAAc,IAAI,YAAY,gBAAgB;AAAA,MACjD,QAAQ,MAAM;AAAA,MACd,SAAS;AAAA,MACT,UAAU;AAAA,IACX,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,oBAAoB,OAAoB;AACtC,YAAA,IAAI,kDAAkD,MAAM,MAAM;AAC1E,UAAM,gBAAgB;AAEjB,SAAA,cAAc,IAAI,YAAY,iBAAiB;AAAA,MAClD,QAAQ,MAAM;AAAA,MACd,SAAS;AAAA,MACT,UAAU;AAAA;AAAA,IACX,CAAA,CAAC;AACF,YAAQ,IAAI,gEAAgE;AAAA,EAC9E;AAAA,EAEQ,iBAAiB,UAAyB,WAAwB,oBAAI,OAAsB;AAClG,UAAM,SAAwB,CAAA;AAE9B,eAAW,WAAW,UAAU;AAC9B,aAAO,KAAK,OAAO;AAGf,UAAA,QAAQ,YAAY,QAAQ,SAAS,SAAS,KAAK,SAAS,IAAI,QAAQ,EAAE,GAAG;AAC/E,cAAM,oBAAoB,KAAK,iBAAiB,QAAQ,UAAU,QAAQ;AACnE,eAAA,KAAK,GAAG,iBAAiB;AAAA,MAClC;AAAA,IACF;AAEO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAeQ,mBAAmB,SAA+B;;AAC7C,eAAAO,WAAU,KAAK,SAAS;AACjC,YAAM,SAAQ,UAAK,SAAS,QAAQ,EAAE,MAAxB,mBAA4BA,QAAO;AACjD,UAAI,UAAU,QAAQ,UAAU,UAAa,UAAU,IAAI;AAClD,eAAA;AAAA,MACT;AAAA,IACF;AACO,WAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,UAAmC;AAC3D,UAAM,SAAmB,CAAA;AAEzB,eAAW,WAAW,UAAU;AAC9B,UAAI,QAAQ,YAAY,QAAQ,SAAS,SAAS,GAAG;AAC5C,eAAA,KAAK,QAAQ,EAAE;AACtB,eAAO,KAAK,GAAG,KAAK,kBAAkB,QAAQ,QAAQ,CAAC;AAAA,MACzD;AAAA,IACF;AAEO,WAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB;AACxB,UAAM,gBAAgB,KAAK,kBAAkB,KAAK,QAAQ,YAAY,CAAA,CAAE;AACnE,SAAA,wCAAwB,IAAI,CAAC,GAAG,KAAK,mBAAmB,GAAG,aAAa,CAAC;AAC9E,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEQ,oBAAoB;AACrB,SAAA,wCAAwB;AAC7B,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEQ,qBAAqB,OAAoB;AAC/C,UAAM,gBAAgB;AACtB,UAAM,EAAE,WAAW,aAAa,MAAM;AAEtC,UAAM,OAAO,IAAI,IAAI,KAAK,iBAAiB;AAC3C,QAAI,UAAU;AACZ,WAAK,IAAI,SAAS;AAAA,IAAA,OACb;AACL,WAAK,OAAO,SAAS;AAAA,IACvB;AACA,SAAK,oBAAoB;AAEzB,UAAM,gBAAgB,KAAK,kBAAkB,KAAK,QAAQ,YAAY,CAAA,CAAE;AACnE,SAAA,mBAAmB,cAAc,SAAS,KAAK,cAAc,MAAM,CAAM,OAAA,KAAK,IAAI,EAAE,CAAC;AAErF,SAAA,cAAc,IAAI,YAAY,kBAAkB;AAAA,MACnD,QAAQ,MAAM;AAAA,MACd,SAAS;AAAA,IACV,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,gBAAgB,UAA+B;AACrD,SAAK,kBAAkB;AACvB,SAAK,iBAAiB;AACtB,SAAK,iBAAiB;AACtB,SAAK,uBAAuB;AAC5B,SAAK,qBAAqB,QAAQ;AAAA,EACpC;AAAA,EAEQ,qBAAqB,UAA+B;;AAC1D,aAASN,KAAI,GAAGA,KAAI,SAAS,QAAQA,MAAK;AAClC,YAAA,UAAU,SAASA,EAAC;AAC1B,WAAI,aAAQ,mBAAR,mBAAwB,SAAS,eAAe;AAC9C,aAAA,aAAQ,aAAR,mBAAkB,QAAQ;AAE5B,gBAAM,WAAW,QAAQ,SAAS,IAAI,CAAAD,OAAKA,GAAE,EAAE;AAC/C,eAAK,kBAAkB,IAAI,QAAQ,IAAI,QAAQ;AAC/C,eAAK,iBAAiB,IAAI,QAAQ,IAAI,OAAO;AAC7C,eAAK,uBAAuB,IAAI,QAAQ,IAAI,QAAQ,QAAQ;AAC5D,qBAAW,WAAW,UAAU;AAC9B,iBAAK,iBAAiB,IAAI,SAAS,QAAQ,EAAE;AAAA,UAC/C;AAAA,QAAA,OACK;AAGL,cAAI,eAAe;AACnB,mBAAS,IAAIC,KAAI,GAAG,KAAK,GAAG,KAAK;AAC/B,iBAAI,cAAS,CAAC,EAAE,mBAAZ,mBAA4B,SAAS,eAAe;AACvC,6BAAA;AACf;AAAA,YACF;AAAA,UACF;AACA,gBAAM,WAAW,SAAS,MAAM,eAAe,GAAGA,EAAC;AAC/C,cAAA,SAAS,SAAS,GAAG;AACvB,kBAAM,aAAa,SAAS,IAAI,CAAAJ,OAAKA,GAAE,EAAE;AACzC,iBAAK,kBAAkB,IAAI,QAAQ,IAAI,UAAU;AACjD,iBAAK,iBAAiB,IAAI,QAAQ,IAAI,OAAO;AAC7C,iBAAK,uBAAuB,IAAI,QAAQ,IAAI,QAAQ;AACpD,uBAAW,aAAa,YAAY;AAClC,mBAAK,iBAAiB,IAAI,WAAW,QAAQ,EAAE;AAAA,YACjD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACI,WAAA,aAAQ,aAAR,mBAAkB,QAAQ;AACvB,aAAA,qBAAqB,QAAQ,QAAQ;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBAAqB,WAAmB,UAAwB;;AACtE,UAAM,cAAc,KAAK,iBAAiB,IAAI,SAAS;AACvD,UAAM,iBAAiB,cAAc,YAAY,KAAK,iBAAiB,IAAI,SAAS;AACpF,QAAI,CAAC;AAAgB;AAErB,UAAM,eAAe,KAAK,iBAAiB,IAAI,cAAc;AAC7D,UAAM,YAAW,UAAK,SAAS,cAAc,MAA5B,mBAAgC;AACjD,UAAM,WAAW,GAAG,cAAc,KAAK,QAAQ;AAE/C,QAAI,aAAa,QAAQ,aAAa,UAAa,aAAa,IAAI;AAClE,UAAI,KAAK,sBAAsB,IAAI,QAAQ,GAAG;AAC5C,cAAMwB,QAAO,IAAI,IAAI,KAAK,qBAAqB;AAC/CA,cAAK,OAAO,QAAQ;AACpB,aAAK,wBAAwBA;AAAAA,MAC/B;AACA;AAAA,IACF;AAEM,UAAA,aAAa,WAAW,QAAQ;AACtC,QAAI,MAAM,UAAU;AAAG;AAEvB,UAAM,WAAW,KAAK,uBAAuB,IAAI,cAAc,KAAK;AAC9D,UAAA,YAAY,SAAS,IAAI,CAAU,UAAA;;AAAA;AAAA,QACvC,QAAOlB,MAAA,KAAK,SAAS,MAAM,EAAE,MAAtB,gBAAAA,IAA0B;AAAA,QACjC,SAAS,MAAM;AAAA,MACf;AAAA,KAAA;AAEF,UAAM,UAAU,mBAAmB,YAAY,YAAY,WAAW,aAAa,OAAO;AAE1F,UAAM,OAAO,IAAI,IAAI,KAAK,qBAAqB;AAC/C,QAAI,CAAC,SAAS;AACZ,WAAK,IAAI,QAAQ;AAAA,IAAA,OACZ;AACL,WAAK,OAAO,QAAQ;AAAA,IACtB;AACA,SAAK,wBAAwB;AAAA,EAC/B;AAAA,EAEA,OAAe,YACb,YACA,UACA,cACS;AACT,QAAI,gBAAgB;AACpB,QAAI,cAAc;AAClB,eAAW,SAAS,UAAU;AACtB,YAAA,MAAM,WAAW,MAAM,KAAK;AAClC,UAAI,MAAM,GAAG;AAAG;AACF,oBAAA;AACR,YAAA,SAAU,CAAC,gBAAgB,CAAC,MAAM,WAAW,iBAAiB,MAAM,UAAW,IAAI;AACzF,uBAAiB,SAAS;AAAA,IAC5B;AACA,QAAI,CAAC;AAAoB,aAAA;AACzB,WAAO,KAAK,IAAI,gBAAgB,UAAU,IAAI;AAAA,EAChD;AAAA,EAGQ,8BAA8B,OAA0B;;AACxD,UAAA,aAAoB,WAAM,WAAN,mBAAc;AAClC,UAAA,YAAmB,WAAM,WAAN,mBAAc;AACnC,QAAA,CAAC,aAAa,CAAC;AAAU;AAEvB,UAAA,6BAAa;AACnB,UAAM,cAAc,KAAK,kBAAkB,IAAI,SAAS;AAExD,QAAI,aAAa;AAEf,aAAO,IAAI,WAAW,EAAE,MAAM,SAAS,UAAU;AACjD,iBAAW,WAAW,KAAK,kBAAkB,IAAI,SAAS,GAAI;AAC5D,eAAO,IAAI,SAAS,EAAE,MAAM,UAAU,UAAU;AAAA,MAClD;AAAA,IAAA,OACK;AAEL,YAAM,WAAW,KAAK,iBAAiB,IAAI,SAAS;AACpD,UAAI,UAAU;AACZ,eAAO,IAAI,UAAU,EAAE,MAAM,SAAS,UAAU;AAChD,mBAAW,aAAa,KAAK,kBAAkB,IAAI,QAAQ,GAAI;AAC7D,iBAAO,IAAI,WAAW,EAAE,MAAM,UAAU,UAAU;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAEA,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEQ,mBAAyB;AAC3B,QAAA,KAAK,cAAc,OAAO,GAAG;AAC1B,WAAA,oCAAoB;IAC3B;AAAA,EACF;AAAA,EAEQ,2BAA2B,UAAkB,QAAwB;;AAE3E,aAAO,UAAK,gBAAgB,QAAQ,MAA7B,mBAAiC,YAAW;AAAA,EACrD;AAAA,EAEQ,+BAA+B,OAAc,UAAkB,QAAgB;AACrF,UAAM,SAAS,MAAM;AACrB,UAAM,QAAQ,OAAO;AAErB,YAAQ,IAAI,yDAAyD,QAAQ,YAAY,MAAM,WAAW,KAAK,EAAE;AAG5G,SAAA,cAAc,IAAI,YAAY,uBAAuB;AAAA,MACxD,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS;AAAA,IACV,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,iBAAiB,OAAoB;AAC3C,UAAM,gBAAgB;AACjB,SAAA,cAAc,IAAI,YAAY,sBAAsB;AAAA,MACvD,QAAQ,MAAM;AAAA,MACd,SAAS;AAAA,IACV,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,oBAAoB,OAAoB;AAC9C,UAAM,gBAAgB;AACjB,SAAA,cAAc,IAAI,YAAY,yBAAyB;AAAA,MAC1D,QAAQ,MAAM;AAAA,MACd,SAAS;AAAA,IACV,CAAA,CAAC;AAAA,EACJ;AAAA;AAAA,EAGQ,mBAAmB,SAAsB;;AAC/C,UAAM,eAAe,KAAK,SAAS,cACjC,CAAC,QAAQ,cACT,aAAQ,WAAR,mBAAgB,KAAK,CAAAW,OAAM;;AAAA,eAAAX,MAAAW,GAAU,0BAAV,gBAAAX,IAAiC,UAAS;AAAA;AACvE,UAAM,cAAc,eAAgB,KAAK,aAAa,QAAQ,EAAE,KAAK,IAAK;AAEpE,UAAA,cAAc,CAAC,iBAA8B,SAAsD;;AAAA;AAAA;AAAA,oBAEzF,eAAe;AAAA,oBACf,KAAK,OAAO;AAAA,sBACV,KAAK,SAAS;AAAA,qBACf,KAAK,QAAQ;AAAA,uBACX,KAAK,UAAU;AAAA,qBACjB,KAAK,QAAQ;AAAA,yBACT,KAAK,YAAY;AAAA,2BACf,KAAK,cAAc;AAAA,yBACrB,KAAK,YAAY;AAAA,qBACrB,KAAK,QAAQ;AAAA,mBACf,KAAK,MAAM;AAAA,qBACT,KAAK,QAAQ;AAAA,6BACL,KAAK,iBAAiB;AAAA,iBAClC,KAAK,IAAI;AAAA,uBACH,KAAK,UAAU;AAAA,kBACpB,gBAAgB,KAAK;AAAA,4BACX,KAAK,eAAe;AAAA,0BACtB,KAAK,WAAW,KAAK;AAAA,6BAClB,KAAK,cAAc,KAAK;AAAA,2BAC3BA,MAAA,KAAK,cAAc,IAAI,gBAAgB,EAAE,MAAzC,gBAAAA,IAA4C,IAAI;AAAA,+BAC5C,UAAK,cAAc,IAAI,gBAAgB,EAAE,MAAzC,mBAA4C,QAAQ;AAAA,iCACjD,KAAK,qBAAqB;AAAA,yBAClC,KAAK,kBAAkB;AAAA,wBACxB,KAAK,6BAA6B;AAAA,0BAChC,KAAK,mBAAmB;AAAA,2BACvB,KAAK,oBAAoB;AAAA,+BACrB,KAAK,gBAAgB;AAAA,kCAClB,KAAK,mBAAmB;AAAA;AAAA;AAAA;AAItD,UAAM,OAAO,CAAC;AAAA,YACN,YAAY,SAAS,EAAE,SAAS,aAAc,CAAA,CAAC;AAAA,KACtD;AAED,aAASJ,KAAI,GAAGA,MAAK,aAAaA,MAAK;AACrC,YAAM,kBAA+B;AAAA,QACnC,GAAG;AAAA,QACH,IAAI,GAAG,QAAQ,EAAE,YAAYA,EAAC;AAAA,QAC9B,OAAO;AAAA,QACP,UAAU,CAAC;AAAA,QACX,UAAU;AAAA,MAAA;AAEZ,WAAK,KAAK;AAAA,cACF,YAAY,iBAAiB,EAAE,YAAY,KAAM,CAAA,CAAC;AAAA,OACzD;AAAA,IACH;AAEO,WAAA;AAAA,EACT;AAAA,EAEA,SAAS;AACH,QAAA,CAAC,KAAK,QAAQ,YAAY,KAAK,QAAQ,SAAS,WAAW,GAAG;AACzD,aAAA;AAAA,qCACwB,CAAC,KAAK,cAAc,oBAAoB,EAAE;AAAA,uBACxD,KAAK,eAAe;AAAA;AAAA,wCAEH,KAAK,QAAQ,KAAK;AAAA,cAC5C,KAAK,QAAQ,cAAc;AAAA,+CACM,KAAK,QAAQ,WAAW;AAAA,gBACvD,EAAE;AAAA;AAAA;AAAA,yCAGuB,KAAK,cAAe,KAAK,YAAY,aAAa,KAAM,QAAQ;AAAA,gBACzF,KAAK,cAAc,MAAM,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,sCAKL,CAAC,KAAK,YAAY,cAAc,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMpE;AAEO,WAAA;AAAA,QACH,CAAC,KAAK,aAAa;AAAA,qCACU,CAAC,KAAK,cAAc,oBAAoB,EAAE;AAAA,uBACxD,KAAK,eAAe;AAAA;AAAA,wCAEH,KAAK,QAAQ,KAAK;AAAA,cAC5C,KAAK,QAAQ,cAAc;AAAA,+CACM,KAAK,QAAQ,WAAW;AAAA,gBACvD,EAAE;AAAA;AAAA;AAAA,yCAGuB,KAAK,cAAe,KAAK,YAAY,aAAa,KAAM,QAAQ;AAAA,gBACzF,KAAK,cAAc,MAAM,EAAE;AAAA;AAAA;AAAA;AAAA,UAIjC,EAAE;AAAA;AAAA,oCAEwB,CAAC,KAAK,YAAY,cAAc,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAMpD,KAAK,QAAQ,IAAI,CAAUQ,YAAA;;AAAA;AAAA,2CACFA,QAAO,YAAY,cAAc,EAAE;AAAA;AAAA;AAAA,0BAGpDA,QAAO,KAAK;AAAA,0BACZA,QAAO,cAAc,sGAAsGA,QAAO,WAAW,WAAW,EAAE;AAAA;AAAA;AAAA;AAAA,0BAI5J,KAAAA,QAAO,kBAAP,mBAAsB,mBAAkB;AAAA;AAAA,6BAEpC,WAAAA,QAAO,kBAAP,mBAAsB,iBAAtB,mBAAoC,IAAI,CAAC,gBAAqB;AAAA;AAAA,gCAE1D,KAAK,SAAS,aAAa;AAAA;AAAA,oCAEvB,KAAK,2BAA2BA,QAAO,IAAI,YAAY,MAAM,KAAK,GAAG;AAAA;AAAA,kCAEvE;AAAA;AAAA;AAAA;AAAA,iDAIe,KAAK,EAAE,0BAA0B,CAAC,IAAI,YAAY,SAAS;AAAA,4CAChE,KAAK,2BAA2BA,QAAO,IAAI,YAAY,MAAM,CAAC;AAAA,4CAC9D,CAACZ,OAAa,KAAK,+BAA+BA,IAAGY,QAAO,IAAI,YAAY,MAAM,CAAC;AAAA;AAAA,+BAEhG;AAAA;AAAA,4BAEH;AAAA;AAAA,0BAEF,EAAE;AAAA;AAAA;AAAA;AAAA,sBAIN,KAAK,SAAS,aAAa;AAAA;AAAA;AAAA,gCAGjB,CAACZ,OAAa,KAAK,kBAAkBY,QAAO,IAAIZ,EAAC,CAAC;AAAA,+BACnD,KAAK,EAAE,sBAAsB,CAAC;AAAA;AAAA;AAAA;AAAA,sBAIvC,KAAK,sBAAsBY,QAAO,KAAK;AAAA;AAAA;AAAA;AAAA,oCAIzB,CAACZ,OAAa,KAAK,yBAAyBY,QAAO,IAAIZ,EAAC,CAAC;AAAA;AAAA,4BAEjE,KAAK,EAAE,kBAAkB,CAAC;AAAA;AAAA,0BAE5BY,QAAO,YAAY;AAAA;AAAA;AAAA,sCAGP,CAACZ,OAAa;AACtB,QAAAA,GAAE,gBAAgB;AACb,aAAA,oBAAoBY,QAAO,EAAE;AAAA,MAAA,CACnC;AAAA;AAAA,8BAEC,KAAK,EAAE,qBAAqB,CAAC;AAAA;AAAA,4BAE/B,EAAE;AAAA;AAAA,wBAEN,EAAE;AAAA,wBACF,EAAE;AAAA;AAAA;AAAA,KAET,CAAC;AAAA;AAAA;AAAA;AAAA,gBAIF,KAAK,iBAAiB,KAAK,QAAQ,UAAU,KAAK,iBAAiB,EAClE,OAAO,CAAW,YAAA;;AACb,YAAA,UAAK,oBAAL,mBAAsB,SAAQ,CAAC,KAAK,gBAAgB,IAAI,QAAQ,iBAAiB;AAAU,eAAA;AAC3F,UAAA,KAAK,SAAS,cAAc,KAAK;AAAsB,eAAA,CAAC,KAAK,mBAAmB,OAAO;AACpF,aAAA;AAAA,IAAA,CACR,EACA,QAAQ,CAAA,YAAW,KAAK,mBAAmB,OAAO,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAQ9C,KAAK,kBAAkB;AAAA,iBAC7B,KAAK,oBAAoB;AAAA,gCACV,KAAK,mBAAmB;AAAA,4BAC5B,KAAK,eAAe;AAAA,0BACtB,KAAK,aAAa;AAAA,0BAClB,KAAK,mBAAmB;AAAA,uBAC3B,KAAK,gBAAgB;AAAA;AAAA;AAAA,EAG1C;AACF;AA1+Ba,mBAgCJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA/BYU,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GADf,mBACiB,WAAA,WAAA,CAAA;AACDD,kBAAA;AAAA,EAA1BC,GAAS,EAAE,MAAM,OAAO;AAAA,GAFd,mBAEgB,WAAA,WAAA,CAAA;AACAD,kBAAA;AAAA,EAA1BC,GAAS,EAAE,MAAM,OAAO;AAAA,GAHd,mBAGgB,WAAA,aAAA,CAAA;AACCD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAJf,mBAIiB,WAAA,YAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GALf,mBAKiB,WAAA,cAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GANf,mBAMiB,WAAA,YAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAPf,mBAOiB,WAAA,gBAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GARf,mBAQiB,WAAA,kBAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GATf,mBASiB,WAAA,mBAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAVf,mBAUiB,WAAA,gBAAA,CAAA;AACDD,kBAAA;AAAA,EAA1BC,GAAS,EAAE,MAAM,OAAO;AAAA,GAXd,mBAWgB,WAAA,gBAAA,CAAA;AACED,kBAAA;AAAA,EAA5BC,GAAS,EAAE,MAAM,SAAS;AAAA,GAZhB,mBAYkB,WAAA,YAAA,CAAA;AACAD,kBAAA;AAAA,EAA5BC,GAAS,EAAE,MAAM,SAAS;AAAA,GAbhB,mBAakB,WAAA,eAAA,CAAA;AACDD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAdf,mBAciB,WAAA,UAAA,CAAA;AACCD,kBAAA;AAAA,EAA5BC,GAAS,EAAE,MAAM,SAAS;AAAA,GAfhB,mBAekB,WAAA,kBAAA,CAAA;AACFD,kBAAA;AAAA,EAA1BC,GAAS,EAAE,MAAM,OAAO;AAAA,GAhBd,mBAgBgB,WAAA,uBAAA,CAAA;AACED,kBAAA;AAAA,EAA5BC,GAAS,EAAE,MAAM,SAAS;AAAA,GAjBhB,mBAiBkB,WAAA,cAAA,CAAA;AACDD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAlBf,mBAkBiB,WAAA,QAAA,CAAA;AACCD,kBAAA;AAAA,EAA5BC,GAAS,EAAE,MAAM,SAAS;AAAA,GAnBhB,mBAmBkB,WAAA,iBAAA,CAAA;AACDD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GApBf,mBAoBiB,WAAA,mBAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GArBf,mBAqBiB,WAAA,cAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAtBf,mBAsBiB,WAAA,mBAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAvBf,mBAuBiB,WAAA,iBAAA,CAAA;AACAD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAxBf,mBAwBiB,WAAA,YAAA,CAAA;AAEXD,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GA1BI,mBA0BM,WAAA,aAAA,CAAA;AACAF,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GA3BI,mBA2BM,WAAA,wBAAA,CAAA;AACAF,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GA5BI,mBA4BM,WAAA,sBAAA,CAAA;AACAF,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GA7BI,mBA6BM,WAAA,qBAAA,CAAA;AACAF,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GA9BI,mBA8BM,WAAA,wBAAA,CAAA;AA4gBAF,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GA1iBI,mBA0iBM,WAAA,qBAAA,CAAA;AACAF,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GA3iBI,mBA2iBM,WAAA,oBAAA,CAAA;AACAF,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GA5iBI,mBA4iBM,WAAA,iBAAA,CAAA;AACAF,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GA7iBI,mBA6iBM,WAAA,yBAAA,CAAA;AA7iBN,qBAANF,kBAAA;AAAA,EADNG,IAAc,sBAAsB;AAAA,GACxB,kBAAA;;;;;;;;;;;;ACJA,IAAA,wBAAN,cAAoC,WAAW;AAAA,EAA/C,cAAA;AAAA,UAAA,GAAA,SAAA;AACwC,SAAA,gBAAA;AACG,SAAA,oBAAA;AAEvC,SAAQ,0BAA0B;AAAA,EAAA;AAAA,EAuG3C,QAAQ,mBAAqC;AAC3C,QAAI,kBAAkB,IAAI,mBAAmB,KAAK,KAAK,sBAAsB,KAAK,yBAAyB;AACzG,WAAK,0BAA0B,KAAK;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,2BAA2BzB,IAAU;AACrC,UAAA,UAAWA,GAAE,OAA4B;AAC1C,SAAA,cAAc,IAAI,YAAY,iBAAiB;AAAA,MAClD,QAAQ,EAAE,eAAe,SAAS,mBAAmB,KAAK,wBAAwB;AAAA,MAClF,SAAS;AAAA,MACT,UAAU;AAAA,IACX,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,0BAA0BA,IAAU;AACrC,SAAA,0BAA2BA,GAAE,OAA4B;AACzD,SAAA,cAAc,IAAI,YAAY,iBAAiB;AAAA,MAClD,QAAQ,EAAE,eAAe,KAAK,eAAe,mBAAmB,KAAK,wBAAwB;AAAA,MAC7F,SAAS;AAAA,MACT,UAAU;AAAA,IACX,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,sBAAsB;;AAC5B,SAAK,0BAA0B;AAC/B,UAAM,SAAQ,UAAK,eAAL,mBAAiB,cAAc;AAC7C,QAAI,OAAO;AACT,YAAM,QAAQ;AACd,YAAM,MAAM;AAAA,IACd;AACK,SAAA,cAAc,IAAI,YAAY,iBAAiB;AAAA,MAClD,QAAQ,EAAE,eAAe,KAAK,eAAe,mBAAmB,GAAG;AAAA,MACnE,SAAS;AAAA,MACT,UAAU;AAAA,IACX,CAAA,CAAC;AAAA,EACJ;AAAA,EAEA,SAAS;AACA,WAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAKa,KAAK,aAAa;AAAA,uBACnB,KAAK,0BAA0B;AAAA;AAAA;AAAA,+CAGP,KAAK,EAAE,sBAAsB,CAAC;AAAA,mDAC1B,KAAK,EAAE,iCAAiC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+CAM7C,KAAK,EAAE,wBAAwB,CAAC;AAAA,mDAC5B,KAAK,EAAE,mCAAmC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,+BAK/D,KAAK,EAAE,mCAAmC,CAAC;AAAA,0BAChD,KAAK,uBAAuB;AAAA,0BAC5B,KAAK,yBAAyB;AAAA;AAAA,gBAExC,KAAK,0BAA0B;AAAA;AAAA;AAAA,4BAGnB,KAAK,mBAAmB;AAAA,2BACzB,KAAK,EAAE,oBAAoB,CAAC;AAAA;AAAA,kBAErC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlB;AACF;AAzLa,sBAMJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AALasB,kBAAA;AAAA,EAA5BC,GAAS,EAAE,MAAM,SAAS;AAAA,GADhB,sBACkB,WAAA,iBAAA,CAAA;AACDD,kBAAA;AAAA,EAA3BC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAFf,sBAEiB,WAAA,qBAAA,CAAA;AAEXD,kBAAA;AAAA,EAAhBE,EAAM;AAAA,GAJI,sBAIM,WAAA,2BAAA,CAAA;AAJN,wBAANF,kBAAA;AAAA,EADNG,IAAc,yBAAyB;AAAA,GAC3B,qBAAA;;;;;;;;;;;;ACsBA,IAAA,2BAAN,cAAuC,WAAW;AAAA,EAAlD,cAAA;AAAA,UAAA,GAAA,SAAA;AAC8C,SAAA,OAAA;AACxB,SAAA,iBAAgC;AAChC,SAAA,kBAA4B;AAC3B,SAAA,oBAA2C;AACA,SAAA,OAAA;AACtB,SAAA,gBAAA;AACJ,SAAA,gBAAA;AACG,SAAA,oBAAA;AAE/B,SAAA,yCAAyB;AACjC,SAAQ,eAAe;AACvB,SAAQ,iBAAgC;AACxC,SAAQ,yBAAgD;AACxD,SAAQ,yBAAwC;AAChD,SAAQ,sBAAqC;AAC7C,SAAQ,qBAAqB;AAC7B,SAAQ,iBAAgC;AACxC,SAAQ,kBAAiC;AACzC,SAAQ,mBAA6B;AACrC,SAAQ,sBAAsB;AAC9B,SAAQ,iBAAiB;AACzB,SAAQ,qBAAqB;AAAA,EAAA;AAAA,EAojBtC,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,SAAK,yBAAyB;AAC9B,SAAK,6BAA6B;AAAA,EACpC;AAAA,EAEA,QAAQ,mBAAqC;AAC3C,QAAI,kBAAkB,IAAI,iBAAiB,KAAK,kBAAkB,IAAI,MAAM,GAAG;AAC7E,WAAK,yBAAyB;AAAA,IAChC;AACA,QAAI,kBAAkB,IAAI,gBAAgB,KAAK,kBAAkB,IAAI,cAAc,GAAG;AACpF,WAAK,qBAAqB;AAAA,IAC5B;AACI,QAAA,kBAAkB,IAAI,gBAAgB,KAAK,kBAAkB,IAAI,mBAAmB,KAAK,kBAAkB,IAAI,MAAM,GAAG;AAC1H,WAAK,6BAA6B;AAAA,IACpC;AACI,QAAA,kBAAkB,IAAI,MAAM,GAAG;AAC7B,UAAA,CAAC,KAAK,MAAM;AACd,aAAK,sBAAsB;AAAA,MAAA,OACtB;AACL,aAAK,iBAAiB,KAAK;AAC3B,aAAK,qBAAqB,KAAK;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,uBAAuB;AAC7B,QAAI,CAAC,KAAK,aAAa,QAAQ;AAE7B,WAAK,iBAAiB,CAAC,GAAG,KAAK,cAAc;AAC7C;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,aAAa,cAAc,KAAK;AACnD,UAAM,WAAW,KAAK,eAAe,OAAO,CAAQ,SAAA;;AAElD,YAAM,aAAa,KAAK,MAAM,YAAY,EAAE,SAAS,KAAK;AAG1D,YAAM,UAAU,KAAK,GAAG,YAAY,EAAE,SAAS,KAAK;AAGpD,YAAM,qBAAmB,UAAK,gBAAL,mBAAkB,cAAc,SAAS,WAAU;AAI5E,YAAM,WAAW,KAAK,iBAAiB,MAAM,KAAK;AAE3C,aAAA,cAAc,WAAW,oBAAoB;AAAA,IAAA,CACrD;AAGD,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,iBAAiB,MAAmB,OAAwB;;AAE9D,SAAA,UAAK,aAAL,mBAAe,SAAS;AAC1B,aAAO,KAAK,SAAS,QAAQ,YAAY,EAAE,SAAS,KAAK;AAAA,IAC3D;AAGA,UAAM,aAAa;AACnB,UAAM,cAAc,WAAW,KAAK,KAAK,KAAK;AAC9C,UAAM,WAAW,WAAW,KAAK,KAAK,EAAE;AAExC,QAAI,eAAe,UAAU;AAC3B,aAAO,KAAK,MAAM,YAAY,EAAE,SAAS,KAAK,KAAK,KAAK,GAAG,YAAA,EAAc,SAAS,KAAK;AAAA,IACzF;AAGA,QAAI,KAAK,GAAG,SAAS,GAAG,KAAK,KAAK,GAAG,SAAS,GAAG,KAAK,KAAK,GAAG,SAAS,GAAG,GAAG;AAC3E,aAAO,KAAK,GAAG,YAAY,EAAE,SAAS,KAAK;AAAA,IAC7C;AAEO,WAAA;AAAA,EACT;AAAA,EAEQ,mBAAmB,OAAc;AACvC,UAAM,QAAQ,MAAM;AACpB,SAAK,eAAe,MAAM;AAAA,EAC5B;AAAA,EAEQ,eAAe;;AACrB,SAAK,eAAe;AACpB,UAAM,eAAc,UAAK,eAAL,mBAAiB,cAAc;AACnD,QAAI,aAAa;AACf,kBAAY,QAAQ;AACpB,kBAAY,MAAM;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,yBAAyB,OAAc;AAC7C,UAAM,QAAQ,MAAM;AACpB,SAAK,qBAAqB,MAAM;AAAA,EAClC;AAAA,EAEQ,qBAAqB;;AAC3B,SAAK,qBAAqB;AAC1B,UAAM,eAAc,UAAK,eAAL,mBAAiB,cAAc;AACnD,QAAI,aAAa;AACf,kBAAY,QAAQ;AACpB,kBAAY,MAAM;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,qBAAqB,MAAsB;AACjD,QAAI,CAAC,KAAK,aAAa,QAAQ;AACtB,aAAA;AAAA,IACT;AAEM,UAAA,QAAQ,KAAK,aAAa,KAAK;AAC/B,UAAA,QAAQ,IAAI,OAAO,IAAI,MAAM,QAAQ,uBAAuB,MAAM,CAAC,KAAK,IAAI;AAC3E,WAAA,KAAK,QAAQ,OAAO,iBAAiB;AAAA,EAC9C;AAAA,EAEQ,uBAAuB,MAAc;AAEpC,WAAA;AAAA,EACT;AAAA,EAEQ,4BAAoC;AACnC,WAAA,KAAK,eAAe,OAAO,CAAQ,SAAA,KAAK,mBAAmB,IAAI,KAAK,EAAE,CAAC,EAAE;AAAA,EAClF;AAAA,EAEQ,2BAA2B;AACjC,SAAK,qBAAqB,IAAI,IAAI,KAAK,eAAe;AAEtD,SAAK,mBAAmB,CAAC,GAAG,KAAK,eAAe;AAAA,EAClD;AAAA,EAEQ,+BAA+B;AAErC,UAAM,cAAqC,CAAA;AACtC,SAAA,eAAe,QAAQ,CAAQ,SAAA;AAElC,YAAM,gBAAgB,KAAK,kBAAkB,KAAK,EAAE;AAEpD,UAAI,eAAe;AAEjB,oBAAY,KAAK,EAAE,IAAI,EAAE,GAAG,cAAc;AAAA,MAAA,OACrC;AAGC,cAAA,kBAAkB,KAAK,sBAAsB;AAG/C,YAAA;AACA,YAAA;AAEJ,YAAI,KAAK,aAAa,UAAa,KAAK,YAAY,QAAW;AAE7D,yBAAe,KAAK,aAAa;AACjC,wBAAc,KAAK,YAAY;AAAA,QAAA,OAC1B;AAEL,yBAAe,mBAAmB,KAAK,2BAA2B,MAAM,UAAU;AAClF,wBAAc,mBAAmB,KAAK,2BAA2B,MAAM,SAAS;AAAA,QAClF;AAEY,oBAAA,KAAK,EAAE,IAAI;AAAA,UACrB;AAAA,UACA;AAAA,UACA,kBAAkB,KAAK,qBAAqB;AAAA;AAAA,QAAA;AAAA,MAEhD;AAGA,YAAM,aAAa,KAAK,sBAAsB,KAAK,EAAE;AACrD,UAAI,WAAW,SAAS,KAAK,EAAC,+CAAe,sBAAqB;AAEhE,YAAI,CAAC,YAAY,KAAK,EAAE,EAAE,qBAAqB;AAC7C,sBAAY,KAAK,EAAE,EAAE,sBAAsB,CAAA;AAAA,QAC7C;AAEW,mBAAA,QAAQ,CAAC,cAAmB;;AACrC,gBAAM,aAAa,KAAK,wBAAwB,UAAU,OAAO;AAC7D,cAAA,WAAW,SAAS,GAAG;AAEnB,kBAAA,mBAAiB,qBAAU,WAAV,mBAAkB,KAAK,CAACf,OAAWA,GAAE,SAAS,2CAA9C,mBAAsF,UAAS,UAAU;AAChI,kBAAM,eAAe,WAAW,IAAI,CAAC,MAAW,EAAE,EAAE;AAEpD,kBAAM,qBAAqB;AAAA,cACzB,aAAa,UAAU;AAAA,cACvB;AAAA,cACA,mBAAmB;AAAA,YAAA;AAGrB,wBAAY,KAAK,EAAE,EAAE,oBAAqB,KAAK,kBAAkB;AACjE,oBAAQ,IAAI,uBAAuB,aAAa,MAAM,2BAA2B,cAAc,EAAE;AAAA,UACnG;AAAA,QAAA,CACD;AAAA,MACH;AAAA,IAAA,CACD;AACD,SAAK,yBAAyB;AAAA,EAChC;AAAA,EAEQ,2BAA2B,MAAmB,YAA6C;AAC3F,UAAA,gBAAgB,CAAC,aAAqC;AACnD,aAAA,SAAS,KAAK,CAAW,YAAA;AAC9B,YAAI,CAAC,QAAQ,YAAY,QAAQ,eAAe,YAAY;AACnD,iBAAA;AAAA,QACT;AACA,YAAI,QAAQ,UAAU;AACb,iBAAA,cAAc,QAAQ,QAAQ;AAAA,QACvC;AACO,eAAA;AAAA,MAAA,CACR;AAAA,IAAA;AAEI,WAAA,cAAc,KAAK,QAAQ;AAAA,EACpC;AAAA,EAEQ,4BAA4B,OAAc,QAAgB,YAAqD;AACrH,UAAM,gBAAgB;AACtB,UAAM,WAAW,MAAM;AAEvB,UAAM,iBAAiB,EAAE,GAAG,KAAK,uBAAuB;AACpD,QAAA,CAAC,eAAe,MAAM,GAAG;AACZ,qBAAA,MAAM,IAAI,EAAE,cAAc,MAAM,aAAa,MAAM,kBAAkB;IACtF;AAEA,QAAI,eAAe,YAAY;AACd,qBAAA,MAAM,EAAE,eAAe,SAAS;AAAA,IAAA,WACtC,eAAe,WAAW;AACpB,qBAAA,MAAM,EAAE,cAAc,SAAS;AAAA,IAAA,WACrC,eAAe,gBAAgB;AACzB,qBAAA,MAAM,EAAE,mBAAmB,SAAS;AAAA,IACrD;AAEA,SAAK,yBAAyB;AAC9B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,sBAAsB,OAAc,QAAgB;AAC1D,UAAM,WAAW,MAAM;AACvB,UAAM,eAAe,IAAI,IAAI,KAAK,kBAAkB;AAEpD,QAAI,SAAS,SAAS;AACpB,mBAAa,IAAI,MAAM;AAAA,IAAA,OAClB;AACL,mBAAa,OAAO,MAAM;AAAA,IAC5B;AAEA,SAAK,qBAAqB;AAC1B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,aAAa;AAEnB,UAAM,eAAe,IAAI,IAAI,KAAK,kBAAkB;AACpD,SAAK,eAAe,QAAQ,CAAA,SAAQ,aAAa,IAAI,KAAK,EAAE,CAAC;AAC7D,SAAK,qBAAqB;AAC1B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,cAAc;AAEpB,UAAM,eAAe,IAAI,IAAI,KAAK,kBAAkB;AACpD,SAAK,eAAe,QAAQ,CAAA,SAAQ,aAAa,OAAO,KAAK,EAAE,CAAC;AAChE,SAAK,qBAAqB;AAC1B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,mBAAmB;AAEpB,SAAA,qBAAqB,IAAI,IAAI,KAAK,eAAe,IAAI,CAAA,SAAQ,KAAK,EAAE,CAAC;AAC1E,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,oBAAoB;AAErB,SAAA,yCAAyB;AAC9B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,mBAAmB;AACzB,SAAK,qBAAqB,IAAI,IAAI,KAAK,eAAe;AACtD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,gBAAgB;AACtB,SAAK,yBAAyB;AACzB,SAAA,cAAc,IAAI,YAAY,iBAAiB;AAAA,MAClD,SAAS;AAAA,IACV,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,eAAe;AAIf,UAAA,kBAAkB,KAAK,iBAAiB,OAAO,QAAM,KAAK,mBAAmB,IAAI,EAAE,CAAC;AAC1F,UAAM,aAAa,MAAM,KAAK,KAAK,kBAAkB,EAAE,OAAO,CAAA,OAAM,CAAC,KAAK,iBAAiB,SAAS,EAAE,CAAC;AACvG,SAAK,mBAAmB,CAAC,GAAG,iBAAiB,GAAG,UAAU;AAG1D,UAAM,2BAA2B,KAAK,iBAAiB,IAAI,CAAC,QAAQ,UAAU;;AAC5E,YAAM,OAAO,KAAK,eAAe,KAAK,CAAKP,OAAAA,GAAE,OAAO,MAAM;AACnD,aAAA;AAAA,QACL;AAAA,QACA,WAAS,kCAAM,aAAN,mBAAgB,YAAW;AAAA,QACpC,OAAO;AAAA,MAAA;AAAA,IACT,CACD;AAEO,YAAA,IAAI,sDAAsD,wBAAwB;AAClF,YAAA,IAAI,mBAAmB,KAAK,gBAAgB;AAC5C,YAAA,IAAI,2CAA2C,KAAK,sBAAsB;AAE7E,SAAA,cAAc,IAAI,YAAY,sBAAsB;AAAA,MACvD,QAAQ;AAAA,QACN,iBAAiB;AAAA,QACjB,mBAAmB,KAAK;AAAA,MAC1B;AAAA,MACA,SAAS;AAAA,IACV,CAAA,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,QAAuB;;AAC3C,YAAA,IAAI,iDAAiD,MAAM;AACnE,YAAQ,IAAI,mDAAmD,CAAC,CAAC,KAAK,aAAa;AACnF,YAAQ,IAAI,iDAAiD,OAAO,KAAK,aAAa;AAC9E,YAAA,IAAI,kDAAkD,KAAK,aAAa;AAE5E,QAAA,CAAC,KAAK,eAAe;AACvB,cAAQ,MAAM,0EAA0E;AACxF,cAAQ,MAAM,uEAAuE;AACrF,cAAQ,MAAM,4EAA4E;AAC1F,aAAO;IACT;AAGA,QAAI,mBAAmB,KAAK;AACxB,QAAA,MAAM,QAAQ,KAAK,aAAa,KAAK,KAAK,cAAc,SAAS,GAAG;AACtE,cAAQ,IAAI,wEAAwE;AACjE,yBAAA,KAAK,cAAc,CAAC;AAAA,IACzC;AAEA,YAAQ,IAAI,4DAA4D,CAAC,EAAC,qDAAkB,MAAK;AAE7F,QAAA,EAAC,qDAAkB,QAAO;AAC5B,cAAQ,KAAK,sEAAsE;AACnF,cAAQ,KAAK,+DAA+D;AAC5E,aAAO;IACT;AAEQ,YAAA;AAAA,MAAI;AAAA,MACV,iBAAiB,MAAM,IAAI,CAACA,OAAWA,GAAE,MAAM;AAAA,IAAA;AAG3C,UAAA,gBAAgB,iBAAiB,MAAM,KAAK,CAACA,OAAWA,GAAE,WAAW,MAAM;AACjF,YAAQ,IAAI,mDAAmD,CAAC,CAAC,aAAa;AAE1E,QAAA,GAAC,oDAAe,UAAf,mBAAsB,SAAQ;AACzB,cAAA,KAAK,mEAAmE,MAAM;AACtF,aAAO;IACT;AAEA,YAAQ,IAAI,0CAA0C,cAAc,MAAM,MAAM;AAGhF,UAAM,eAAa,mBAAc,MAAM,CAAC,MAArB,mBAAwB,eAAc;AACjD,YAAA,IAAI,qDAAqD,WAAW,MAAM;AAClF,YAAQ,IAAI,gDAAgD,WAAW,IAAI,CAACY,OAAY;;AAAA;AAAA,QACtF,IAAIA,GAAE;AAAA,QACN,MAAMA,GAAE;AAAA,QACR,YAAY,CAAC,EAAEA,GAAE,WAAWA,GAAE,QAAQ,SAAS;AAAA,QAC/C,gBAAcP,MAAAO,GAAE,YAAF,gBAAAP,IAAW,WAAU;AAAA;KACnC,CAAC;AAGH,UAAM,WAAW,WAAW;AAAA,MAAO,CAAC,QAClC,IAAI,kBAAkB,cACtB,IAAI,WACJ,MAAM,QAAQ,IAAI,OAAO,KACzB,IAAI,QAAQ,SAAS;AAAA,IAAA;AAGf,YAAA,IAAI,uDAAuD,SAAS,MAAM;AAC1E,YAAA,IAAI,oDAAoD,SAAS,IAAI,CAACO,OAAWA,GAAE,EAAE,CAAC;AAEvF,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,SAAuB;AACrD,QAAI,CAAC,WAAW,CAAC,MAAM,QAAQ,OAAO,GAAG;AACvC,aAAO;IACT;AAEA,UAAM,aAAoB,CAAA;AAE1B,YAAQ,QAAQ,CAAU,WAAA;AACxB,iBAAW,KAAK,MAAM;AAEtB,UAAI,OAAO,YAAY,OAAO,SAAS,SAAS,GAAG;AACjD,mBAAW,KAAK,GAAG,KAAK,wBAAwB,OAAO,QAAQ,CAAC;AAAA,MAClE;AAAA,IAAA,CACD;AAEM,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAyB,WAAyB;AACxD,UAAM,aAAa,KAAK,wBAAwB,UAAU,OAAO;AACjE,WAAO,WAAW,WAAW;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKQ,6BAA6B,OAAc,QAAgB,aAAqB,UAAkB;;AACxG,UAAM,gBAAgB;AACtB,UAAM,WAAW,MAAM;AAEvB,UAAM,iBAAiB,EAAE,GAAG,KAAK,uBAAuB;AACpD,QAAA,CAAC,eAAe,MAAM,GAAG;AAC3B,qBAAe,MAAM,IAAI;AAAA,QACvB,cAAc;AAAA,QACd,aAAa;AAAA,QACb,kBAAkB;AAAA,QAClB,qBAAqB,CAAC;AAAA,MAAA;AAAA,IAE1B;AAGA,QAAI,CAAC,eAAe,MAAM,EAAE,qBAAqB;AAChC,qBAAA,MAAM,EAAE,sBAAsB;IAC/C;AAGA,QAAI,qBAAqB,eAAe,MAAM,EAAE,oBAAqB;AAAA,MACnE,CAAA,OAAM,GAAG,gBAAgB;AAAA,IAAA;AAG3B,QAAI,CAAC,oBAAoB;AAEjB,YAAA,aAAa,KAAK,sBAAsB,MAAM;AACpD,YAAM,YAAY,WAAW,KAAK,CAACA,OAAWA,GAAE,OAAO,WAAW;AAC5D,YAAA,mBAAiB,kDAAW,WAAX,mBAAmB,KAAK,CAACL,OAAWA,GAAE,SAAS,2CAA/C,mBAAuF,UAAS;AAElG,2BAAA;AAAA,QACnB;AAAA,QACA;AAAA,QACA,mBAAmB,CAAC;AAAA,MAAA;AAEtB,qBAAe,MAAM,EAAE,oBAAqB,KAAK,kBAAkB;AAAA,IACrE;AAGA,QAAI,SAAS,SAAS;AACpB,UAAI,CAAC,mBAAmB,kBAAkB,SAAS,QAAQ,GAAG;AACzC,2BAAA,kBAAkB,KAAK,QAAQ;AAAA,MACpD;AAAA,IAAA,OACK;AACc,yBAAA,oBAAoB,mBAAmB,kBAAkB;AAAA,QAC1E,QAAM,OAAO;AAAA,MAAA;AAAA,IAEjB;AAEA,SAAK,yBAAyB;AAC9B,YAAQ,IAAI,oCAAoC,eAAe,MAAM,EAAE,mBAAmB;AAC1F,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAA2B,QAAgB,aAAqB,UAA2B;AAC3F,UAAA,cAAc,KAAK,uBAAuB,MAAM;AAClD,QAAA,EAAC,2CAAa,sBAAqB;AAC9B,aAAA;AAAA,IACT;AAEM,UAAA,qBAAqB,YAAY,oBAAoB;AAAA,MACzD,CAAA,OAAM,GAAG,gBAAgB;AAAA,IAAA;AAG3B,YAAO,yDAAoB,kBAAkB,SAAS,cAAa;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAA2B,QAAgB,aAAqB;;AAChE,UAAA,aAAa,KAAK,sBAAsB,MAAM;AACpD,UAAM,YAAY,WAAW,KAAK,CAACK,OAAWA,GAAE,OAAO,WAAW;AAClE,QAAI,CAAC;AAAW;AAEhB,UAAM,aAAa,KAAK,wBAAwB,UAAU,OAAO;AACjE,UAAM,eAAe,WAAW,IAAI,CAAC,MAAW,EAAE,EAAE;AAEpD,UAAM,iBAAiB,EAAE,GAAG,KAAK,uBAAuB;AACpD,QAAA,CAAC,eAAe,MAAM,GAAG;AAC3B,qBAAe,MAAM,IAAI;AAAA,QACvB,cAAc;AAAA,QACd,aAAa;AAAA,QACb,kBAAkB;AAAA,QAClB,qBAAqB,CAAC;AAAA,MAAA;AAAA,IAE1B;AAEA,QAAI,CAAC,eAAe,MAAM,EAAE,qBAAqB;AAChC,qBAAA,MAAM,EAAE,sBAAsB;IAC/C;AAGA,QAAI,qBAAqB,eAAe,MAAM,EAAE,oBAAqB;AAAA,MACnE,CAAA,OAAM,GAAG,gBAAgB;AAAA,IAAA;AAG3B,QAAI,CAAC,oBAAoB;AACjB,YAAA,mBAAiB,qBAAU,WAAV,mBAAkB,KAAK,CAACL,OAAWA,GAAE,SAAS,2CAA9C,mBAAsF,UAAS;AACjG,2BAAA;AAAA,QACnB;AAAA,QACA;AAAA,QACA,mBAAmB,CAAC;AAAA,MAAA;AAEtB,qBAAe,MAAM,EAAE,oBAAqB,KAAK,kBAAkB;AAAA,IACrE;AAEA,uBAAmB,oBAAoB;AACvC,SAAK,yBAAyB;AAC9B,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKQ,6BAA6B,QAAgB,aAAqB;;AACxE,UAAM,iBAAiB,EAAE,GAAG,KAAK,uBAAuB;AACxD,QAAI,GAAC,oBAAe,MAAM,MAArB,mBAAwB,sBAAqB;AAChD;AAAA,IACF;AAEA,UAAM,qBAAqB,eAAe,MAAM,EAAE,oBAAqB;AAAA,MACrE,CAAA,OAAM,GAAG,gBAAgB;AAAA,IAAA;AAG3B,QAAI,oBAAoB;AACtB,yBAAmB,oBAAoB;IACzC;AAEA,SAAK,yBAAyB;AAC9B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,0BAA0B;AAChC,SAAK,sBAAsB;AAC3B,SAAK,eAAe;AAAA,EACtB;AAAA,EAEQ,uBAAuB;AAC7B,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEQ,oBAAoBV,IAAgB;AACrC,SAAA,iBAAiBA,GAAE,OAAO;AAC1B,SAAA,qBAAqBA,GAAE,OAAO,qBAAqB;AAAA,EAC1D;AAAA,EAEQ,6BAA6B;AAC9B,SAAA,cAAc,IAAI,YAAY,yBAAyB;AAAA,MAC1D,QAAQ,EAAE,eAAe,KAAK,gBAAgB,mBAAmB,KAAK,mBAAmB;AAAA,MACzF,SAAS;AAAA,IACV,CAAA,CAAC;AAAA,EACJ;AAAA,EAEQ,qBAAqB,OAAc;AACrC,QAAA,MAAM,WAAW,MAAM;AACzB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA,EAGQ,0BAA0B,QAAgB;AAChD,SAAK,yBAAyB;AAC9B,SAAK,sBAAsB;AAC3B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,uBAAuB,QAAgB;AAC7C,SAAK,sBAAsB;AAC3B,SAAK,yBAAyB;AAC9B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,gBAAgB;AACtB,QAAI,CAAC,KAAK;AAAwB;AAElC,UAAM,eAAe,IAAI,IAAI,KAAK,kBAAkB;AACvC,iBAAA,IAAI,KAAK,sBAAsB;AAC5C,SAAK,qBAAqB;AAG1B,QAAI,CAAC,KAAK,iBAAiB,SAAS,KAAK,sBAAsB,GAAG;AAChE,WAAK,mBAAmB,CAAC,GAAG,KAAK,kBAAkB,KAAK,sBAAsB;AAAA,IAChF;AAEA,SAAK,yBAAyB;AAC9B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,mBAAmB;AACzB,QAAI,CAAC,KAAK;AAAqB;AAE/B,UAAM,eAAe,IAAI,IAAI,KAAK,kBAAkB;AACvC,iBAAA,OAAO,KAAK,mBAAmB;AAC5C,SAAK,qBAAqB;AAG1B,SAAK,mBAAmB,KAAK,iBAAiB,OAAO,CAAM,OAAA,OAAO,KAAK,mBAAmB;AAE1F,SAAK,sBAAsB;AAC3B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,mBAAmB;AACzB,UAAM,eAAe,IAAI,IAAI,KAAK,kBAAkB;AAC/C,SAAA,eAAe,QAAQ,CAAQ,SAAA;AACrB,mBAAA,IAAI,KAAK,EAAE;AACxB,UAAI,CAAC,KAAK,iBAAiB,SAAS,KAAK,EAAE,GAAG;AACvC,aAAA,iBAAiB,KAAK,KAAK,EAAE;AAAA,MACpC;AAAA,IAAA,CACD;AACD,SAAK,qBAAqB;AAC1B,SAAK,yBAAyB;AAC9B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,sBAAsB;AACvB,SAAA,yCAAyB;AAC9B,SAAK,mBAAmB;AACxB,SAAK,sBAAsB;AAC3B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,qBAAoC;AACnC,WAAA,KAAK,eAAe,OAAO,CAAQ,SAAA,CAAC,KAAK,mBAAmB,IAAI,KAAK,EAAE,CAAC;AAAA,EACjF;AAAA,EAEQ,kBAAiC;AACjC,UAAA,cAAc,KAAK,eAAe,OAAO,CAAA,SAAQ,KAAK,mBAAmB,IAAI,KAAK,EAAE,CAAC;AAG3F,UAAM,eAAe,KAAK,iBACvB,IAAI,CAAA,WAAU,YAAY,KAAK,CAAA,SAAQ,KAAK,OAAO,MAAM,CAAC,EAC1D,OAAO,CAAA,SAAQ,SAAS,MAAS;AAG9B,UAAA,iBAAiB,YAAY,OAAO,CAAQ,SAAA,CAAC,KAAK,iBAAiB,SAAS,KAAK,EAAE,CAAC;AAC1F,UAAM,kBAAkB,CAAC,GAAG,cAAc,GAAG,cAAc;AAE3D,QAAI,CAAC,KAAK,mBAAmB,QAAQ;AAC5B,aAAA;AAAA,IACT;AAEA,UAAM,QAAQ,KAAK,mBAAmB,cAAc,KAAK;AAClD,WAAA,gBAAgB,OAAO,CAAQ,SAAA;;AACpC,YAAM,aAAa,KAAK,MAAM,YAAY,EAAE,SAAS,KAAK;AAC1D,YAAM,UAAU,KAAK,GAAG,YAAY,EAAE,SAAS,KAAK;AACpD,YAAM,qBAAmB,UAAK,gBAAL,mBAAkB,cAAc,SAAS,WAAU;AAC5E,YAAM,WAAW,KAAK,iBAAiB,MAAM,KAAK;AAE3C,aAAA,cAAc,WAAW,oBAAoB;AAAA,IAAA,CACrD;AAAA,EACH;AAAA;AAAA,EAGQ,iBAAiB,OAAkB,QAAgB;AACzD,SAAK,iBAAiB;AACtB,QAAI,MAAM,cAAc;AACtB,YAAM,aAAa,gBAAgB;AAC7B,YAAA,aAAa,QAAQ,cAAc,MAAM;AAAA,IACjD;AACA,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,gBAAgB,OAAkB,QAAgB;AACxD,UAAM,eAAe;AACrB,QAAI,MAAM,cAAc;AACtB,YAAM,aAAa,aAAa;AAAA,IAClC;AACA,QAAI,KAAK,kBAAkB,KAAK,mBAAmB,QAAQ;AACzD,WAAK,kBAAkB;AACvB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,iBAAiB,OAAkB;AACzC,SAAK,kBAAkB;AACvB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,YAAY,OAAkB,cAAsB;AAC1D,UAAM,eAAe;AAErB,QAAI,CAAC,KAAK,kBAAkB,KAAK,mBAAmB,cAAc;AAChE,WAAK,iBAAiB;AACtB,WAAK,kBAAkB;AACvB,WAAK,cAAc;AACnB;AAAA,IACF;AAGA,UAAM,WAAW,CAAC,GAAG,KAAK,gBAAgB;AAC1C,UAAM,eAAe,SAAS,QAAQ,KAAK,cAAc;AACnD,UAAA,cAAc,SAAS,QAAQ,YAAY;AAE7C,QAAA,iBAAiB,MAAM,gBAAgB,IAAI;AAEpC,eAAA,OAAO,cAAc,CAAC;AAE/B,YAAM,iBAAiB,eAAe,cAAc,cAAc,IAAI;AACtE,eAAS,OAAO,gBAAgB,GAAG,KAAK,cAAc;AACtD,WAAK,mBAAmB;AAEhB,cAAA,IAAI,uBAAuB,KAAK,gBAAgB;AAAA,IAC1D;AAEA,SAAK,iBAAiB;AACtB,SAAK,kBAAkB;AACvB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,eAAe,OAAkB;AACvC,SAAK,iBAAiB;AACtB,SAAK,kBAAkB;AACvB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,SAAS;AACD,UAAA,gBAAgB,KAAK,mBAAmB;AACxC,UAAA,aAAa,KAAK,eAAe;AACjC,UAAA,gBAAgB,KAAK,eAAe;AAC1C,UAAM,iBAAiB,KAAK,aAAa,OAAO,SAAS;AAElD,WAAA;AAAA,oCACyB,CAACA,OAAaA,GAAE,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAMhC,KAAK,EAAE,cAAc,CAAC;AAAA,iDACV,KAAK,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,YAKvD,KAAK,SAAS,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAMhB,KAAK,EAAE,uBAAuB,CAAC,KAAK,KAAK,qBAAqB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAOnD,KAAK,EAAE,0BAA0B,CAAC;AAAA,gCACvC,KAAK,YAAY;AAAA,gCACjB,KAAK,kBAAkB;AAAA;AAAA,sBAEjC,KAAK,eAAe;AAAA,6DACmB,KAAK,YAAY,YAAY,KAAK,EAAE,oBAAoB,CAAC;AAAA;AAAA;AAAA,wBAG9F;AAAA;AAAA;AAAA;AAAA,qBAIH;AAAA;AAAA;AAAA;AAAA,oBAID,KAAK,mBAAqB,EAAA,IAAI,CAAQ,SAAA;;AAAA;AAAA;AAAA,6CAEb,KAAK,2BAA2B,KAAK,KAAK,aAAa,EAAE;AAAA,gCACtE,MAAM,KAAK,0BAA0B,KAAK,EAAE,CAAC;AAAA,mCAC1C,MAAM;AAAO,aAAA,0BAA0B,KAAK,EAAE;AAAG,aAAK,cAAc;AAAA,MAAA,CAAI;AAAA;AAAA,yDAElD,KAAK,KAAK;AAAA,0BAC3C,UAAK,aAAL,mBAAe,WAAU;AAAA,2DACU,KAAK,SAAS,OAAO;AAAA,0BACtD,EAAE;AAAA;AAAA;AAAA,KAET,CAAC;AAAA;AAAA;AAAA,oBAGA,KAAK,qBAAqB,MAAM,IAAI,KAAK,EAAE,kBAAkB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAQtD,KAAK,aAAa;AAAA,+BACf,CAAC,KAAK,sBAAsB;AAAA,2BAChC,KAAK,EAAE,wBAAwB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAM/B,KAAK,gBAAgB;AAAA,+BAClB,KAAK,qBAAqB,WAAW,CAAC;AAAA,2BAC1C,KAAK,EAAE,oBAAoB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAM3B,KAAK,gBAAgB;AAAA,+BAClB,CAAC,KAAK,mBAAmB;AAAA,2BAC7B,KAAK,EAAE,2BAA2B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAMlC,KAAK,mBAAmB;AAAA,+BACrB,KAAK,mBAAmB,SAAS,CAAC;AAAA,2BACtC,KAAK,EAAE,uBAAuB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAStC,KAAK,EAAE,oBAAoB,CAAC,KAAK,KAAK,mBAAmB,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAO5C,KAAK,EAAE,0BAA0B,CAAC;AAAA,gCACvC,KAAK,kBAAkB;AAAA,gCACvB,KAAK,wBAAwB;AAAA;AAAA,sBAEvC,KAAK,qBAAqB;AAAA,6DACa,KAAK,kBAAkB,YAAY,KAAK,EAAE,oBAAoB,CAAC;AAAA;AAAA;AAAA,wBAGpG;AAAA;AAAA;AAAA;AAAA,qBAIH;AAAA;AAAA;AAAA;AAAA,oBAID,KAAK,gBAAkB,EAAA,IAAI,CAAQ,SAAA;;AAAA;AAAA;AAAA,6CAEV,KAAK,wBAAwB,KAAK,KAAK,aAAa,EAAE,IAAI,KAAK,mBAAmB,KAAK,KAAK,aAAa,EAAE,IAAI,KAAK,oBAAoB,KAAK,KAAK,cAAc,EAAE;AAAA;AAAA,gCAE/K,MAAM,KAAK,uBAAuB,KAAK,EAAE,CAAC;AAAA,mCACvC,MAAM;AAAO,aAAA,uBAAuB,KAAK,EAAE;AAAG,aAAK,iBAAiB;AAAA,MAAA,CAAI;AAAA,oCACvE,CAACA,OAAiB,KAAK,iBAAiBA,IAAG,KAAK,EAAE,CAAC;AAAA,mCACpD,CAACA,OAAiB,KAAK,gBAAgBA,IAAG,KAAK,EAAE,CAAC;AAAA,oCACjD,CAACA,OAAiB,KAAK,iBAAiBA,EAAC,CAAC;AAAA,+BAC/C,CAACA,OAAiB,KAAK,YAAYA,IAAG,KAAK,EAAE,CAAC;AAAA,kCAC3C,CAACA,OAAiB,KAAK,eAAeA,EAAC,CAAC;AAAA;AAAA,yDAEjB,KAAK,KAAK;AAAA,0BAC3C,UAAK,aAAL,mBAAe,WAAU;AAAA,2DACU,KAAK,SAAS,OAAO;AAAA,0BACtD,EAAE;AAAA;AAAA;AAAA,KAET,CAAC;AAAA;AAAA;AAAA,oBAGA,KAAK,mBAAmB,IAAI,IAAI,KAAK,EAAE,sBAAsB,CAAC;AAAA;AAAA;AAAA;AAAA,cAIpE,KAAK,sBAAsB;AAAA;AAAA,gCAET,KAAK,cAAc;AAAA,oCACf,KAAK,kBAAkB;AAAA,gCAC3B,KAAK,mBAAmB;AAAA;AAAA,cAE1C;AAAA;AAAA,cAEA,KAAK,EAAE,oBAAoB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAQb,KAAK,EAAE,0BAA0B,CAAC;AAAA,wBACvC,KAAK,YAAY;AAAA,wBACjB,KAAK,kBAAkB;AAAA;AAAA,cAEjC,KAAK,eAAe;AAAA,qDACmB,KAAK,YAAY,YAAY,KAAK,EAAE,oBAAoB,CAAC;AAAA;AAAA;AAAA,gBAG9F;AAAA;AAAA;AAAA;AAAA,aAIH;AAAA;AAAA;AAAA;AAAA,YAID,iBAAiB;AAAA;AAAA,gBAEb,KAAK,EAAE,uBAAuB,CAAC,IAAI,aAAa,IAAI,KAAK,EAAE,WAAW,CAAC,IAAI,UAAU,IAAI,KAAK,EAAE,cAAc,CAAC;AAAA,gBAC/G,kBAAkB,aAAa,OAAO,KAAK,EAAE,iBAAiB,CAAC,KAAK,KAAK,YAAY,MAAM,EAAE;AAAA;AAAA,cAE/F,EAAE;AAAA;AAAA;AAAA;AAAA,cAIF,iBAAiB;AAAA,0DAC2B,KAAK,UAAU;AAAA,kBACvD,KAAK,EAAE,uBAAuB,CAAC,KAAK,aAAa;AAAA;AAAA,0DAET,KAAK,WAAW;AAAA,kBACxD,KAAK,EAAE,yBAAyB,CAAC;AAAA;AAAA,0DAEO,KAAK,gBAAgB;AAAA,kBAC7D,KAAK,EAAE,kBAAkB,CAAC,KAAK,UAAU;AAAA;AAAA,0DAED,KAAK,iBAAiB;AAAA,kBAC9D,KAAK,EAAE,oBAAoB,CAAC;AAAA;AAAA,gBAE9B;AAAA,0DAC0C,KAAK,UAAU;AAAA,kBACvD,KAAK,EAAE,kBAAkB,CAAC;AAAA;AAAA,0DAEc,KAAK,WAAW;AAAA,kBACxD,KAAK,EAAE,mBAAmB,CAAC;AAAA;AAAA,aAEhC;AAAA,wDAC2C,KAAK,gBAAgB;AAAA,gBAC7D,KAAK,EAAE,cAAc,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAMxB,KAAK,eAAe,WAAW,IAAI;AAAA;AAAA,kBAE/B,iBAAiB;AAAA,oBACf,KAAK,EAAE,qBAAqB,CAAC,KAAK,KAAK,YAAY;AAAA,oBACnD,KAAK,EAAE,2BAA2B,CAAC;AAAA,oBACnC;AAAA,oBACA,KAAK,EAAE,yBAAyB,CAAC;AAAA,iBACpC;AAAA;AAAA,gBAED;AAAA,gBACA,KAAK,eAAe,IAAI,CAAQ,SAAA;;AAChC,YAAM,aAAa,KAAK,mBAAmB,IAAI,KAAK,EAAE;AAC3B,WAAK,sBAAsB;AAChD,YAAA,cAAc,KAAK,uBAAuB,KAAK,EAAE,KAAK,EAAE,cAAc,MAAM,aAAa,KAAK;AAGpG,cAAQ,IAAI,gCAAgC,KAAK,OAAO,OAAO,KAAK,EAAE;AAEtE,YAAM,aAAa,KAAK,sBAAsB,KAAK,EAAE;AAC/C,YAAA,gBAAgB,WAAW,SAAS;AAElC,cAAA,IAAI,qBAAqB,KAAK,OAAO,qBAAqB,eAAe,YAAY,WAAW,MAAM;AAEvG,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAKW,UAAU;AAAA,iCACX,CAACA,OAAa,KAAK,sBAAsBA,IAAG,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA,+CAGtC,KAAK,KAAK;AAAA,0BACjC,UAAK,aAAL,mBAAe,WAAU;AAAA,sDACK,KAAK,EAAE,YAAY,CAAC,KAAK,KAAK,SAAS,OAAO;AAAA,0BAC1E,EAAE;AAAA;AAAA;AAAA,2DAG+B,KAAK,EAAE,0BAA0B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0CAMnD,YAAY,gBAAgB;AAAA,yCAC7B,CAACA,OAAa,KAAK,4BAA4BA,IAAG,KAAK,IAAI,cAAc,CAAC;AAAA;AAAA,kEAEjD,KAAK,EAAE,yBAAyB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,wBAK3E,gBAAgB;AAAA;AAAA,6DAEqB,KAAK,EAAE,iCAAiC,CAAC;AAAA,4BAC1E,WAAW,IAAI,CAAC,cAAmB;;AACnC,cAAM,aAAa,KAAK,wBAAwB,UAAU,OAAO;AAG7D,YAAA,WAAW,WAAW,GAAG;AACpB,iBAAA;AAAA,QACT;AAEM,cAAA,mBAAiB,MAAAQ,MAAA,UAAU,WAAV,gBAAAA,IAAkB,KAAK,CAACE,OAAWA,GAAE,SAAS,2CAA9C,mBAAsF,UAAS,UAAU;AAC1H,cAAA,iBAAiB,KAAK,yBAAyB,SAAS;AAEvD,eAAA;AAAA;AAAA,+DAE4B,cAAc;AAAA;AAAA,oCAEzC,WAAW,IAAI,CAAC,WAAgB;;AAC1B,gBAAA,gBAAciB,OAAAnB,MAAA,OAAO,WAAP,gBAAAA,IAAe,KAAK,CAACE,OAAWA,GAAE,SAAS,2CAA3C,gBAAAiB,IAAmF,UAAS,OAAO;AACjH,gBAAA,YAAY,KAAK,2BAA2B,KAAK,IAAI,UAAU,IAAI,OAAO,EAAE;AAE3E,iBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sDAKW,SAAS;AAAA,uDACR,cAAc;AAAA,qDAChB,CAAC3B,OAAa,KAAK,6BAA6BA,IAAG,KAAK,IAAI,UAAU,IAAI,OAAO,EAAE,CAAC;AAAA;AAAA,8EAE3D,WAAW;AAAA;AAAA;AAAA,QAAA,CAGtD,CAAC;AAAA;AAAA,kCAEF,CAAC,iBAAiB;AAAA;AAAA;AAAA;AAAA,gDAIJ,MAAM,KAAK,2BAA2B,KAAK,IAAI,UAAU,EAAE,CAAC;AAAA;AAAA,wCAEpE,KAAK,EAAE,yBAAyB,CAAC;AAAA;AAAA;AAAA;AAAA,gDAIzB,MAAM,KAAK,6BAA6B,KAAK,IAAI,UAAU,EAAE,CAAC;AAAA;AAAA,wCAEtE,KAAK,EAAE,qBAAqB,CAAC;AAAA;AAAA;AAAA,oCAGjC,EAAE;AAAA;AAAA;AAAA,MAAA,CAGX,CAAC;AAAA;AAAA,0BAEF,EAAE;AAAA;AAAA;AAAA;AAAA,IAAA,CAIb,CAAC;AAAA,aACH;AAAA;AAAA,WAEF;AAAA;AAAA;AAAA;AAAA;AAAA,YAKC,KAAK,SAAS,WAAW,KAAK,SAAS,aAAa;AAAA,cAClD,KAAK,sBAAsB;AAAA,iDACQ,KAAK,oBAAoB;AAAA,kBACxD,KAAK,EAAE,0BAA0B,CAAC;AAAA;AAAA,gBAEpC;AAAA,iDACiC,KAAK,uBAAuB;AAAA,kBAC3D,KAAK,EAAE,uBAAuB,CAAC;AAAA;AAAA,aAEpC;AAAA,cACC,EAAE;AAAA,kDACkC,KAAK,aAAa;AAAA,cACtD,KAAK,EAAE,eAAe,CAAC;AAAA;AAAA,YAEzB,KAAK,sBAAsB;AAAA,kDACW,KAAK,0BAA0B;AAAA,gBACjE,KAAK,EAAE,oBAAoB,CAAC;AAAA;AAAA,cAE9B;AAAA;AAAA;AAAA,wBAGU,KAAK,YAAY;AAAA,2BACd,kBAAkB,CAAC;AAAA;AAAA,gBAE9B,KAAK,EAAE,oBAAoB,CAAC,KAAK,aAAa;AAAA;AAAA,WAEnD;AAAA;AAAA;AAAA;AAAA,EAIT;AACF;AAjqDa,yBAwBJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","x_google_ignoreList":[0,1,2,3,4]}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../node_modules/@lit/reactive-element/decorators/custom-element.js","../node_modules/@lit/reactive-element/css-tag.js","../node_modules/@lit/reactive-element/reactive-element.js","../node_modules/@lit/reactive-element/decorators/property.js","../node_modules/@lit/reactive-element/decorators/state.js","../src/utils/validation.ts","../src/utils/xbrl-form-builder.ts","../src/utils/i18n.ts","../src/services/DraftStorageService.ts","../src/utils/fact-matcher.ts","../src/utils/xbrl-validation.ts","../src/utils/type-input-mapping.ts","../src/core/form-field.ts","../src/core/concept-tree.ts","../src/core/add-column-dialog.ts","../src/core/form-section.ts","../src/core/advanced-filter.ts","../src/core/filter-roles-dialog.ts","../src/core/dynamic-form.ts","../src/index.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer((()=>{customElements.define(t,e)})):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce(((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1]),t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet));else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach((t=>t(this)))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach((t=>t.hostConnected?.()))}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach((t=>t.hostDisconnected?.()))}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i){if(void 0!==t){const e=this.constructor,h=this[t];if(i??=e.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(e._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach((t=>t.hostUpdate?.())),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach((t=>t.hostUpdated?.())),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach((t=>this._$ET(t,this[t]))),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.1\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","import{defaultConverter as t,notEqual as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:t,reflect:!1,hasChanged:e},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","import { ValidationRule, ValidationError, FieldType } from '../schema/types';\n\nexport class FormValidator {\n /**\n * Validates a field value against its validation rules\n */\n static validateField(\n fieldId: string,\n conceptId: string,\n columnId: string,\n value: any,\n fieldType: FieldType,\n rules: ValidationRule[] = []\n ): ValidationError[] {\n const errors: ValidationError[] = [];\n\n for (const rule of rules) {\n const error = this.validateRule(fieldId, conceptId, columnId, value, fieldType, rule);\n if (error) {\n errors.push(error);\n }\n }\n\n return errors;\n }\n\n /**\n * Validates a single rule against a value\n */\n private static validateRule(\n fieldId: string,\n conceptId: string,\n columnId: string,\n value: any,\n _fieldType: FieldType,\n rule: ValidationRule\n ): ValidationError | null {\n const isEmpty = value === null || value === undefined || value === '';\n\n switch (rule.type) {\n case 'required':\n if (isEmpty) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'min':\n if (!isEmpty && typeof value === 'number' && value < rule.value) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'max':\n if (!isEmpty && typeof value === 'number' && value > rule.value) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'minLength':\n if (!isEmpty && typeof value === 'string' && value.length < rule.value) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'maxLength':\n if (!isEmpty && typeof value === 'string' && value.length > rule.value) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n break;\n\n case 'pattern':\n if (!isEmpty && typeof value === 'string') {\n const regex = new RegExp(rule.value);\n if (!regex.test(value)) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n }\n break;\n\n case 'email':\n if (!isEmpty && typeof value === 'string') {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n }\n break;\n\n case 'url':\n if (!isEmpty && typeof value === 'string') {\n try {\n new URL(value);\n } catch {\n return this.createError(fieldId, conceptId, columnId, rule);\n }\n }\n break;\n\n case 'custom':\n // Custom validation would be handled by consuming application\n break;\n\n default:\n console.warn(`Unknown validation rule type: ${rule.type}`);\n }\n\n return null;\n }\n\n /**\n * Creates a validation error object\n */\n private static createError(\n fieldId: string,\n conceptId: string,\n columnId: string,\n rule: ValidationRule\n ): ValidationError {\n return {\n fieldId,\n conceptId,\n columnId,\n message: rule.message,\n severity: rule.severity || 'error',\n rule\n };\n }\n\n /**\n * Validates data type conversion\n */\n static validateDataType(value: any, fieldType: FieldType): { valid: boolean; convertedValue?: any; error?: string } {\n if (value === null || value === undefined || value === '') {\n return { valid: true, convertedValue: value };\n }\n\n switch (fieldType) {\n case 'number':\n case 'decimal':\n case 'currency':\n case 'percentage': {\n const numValue = Number(value);\n if (isNaN(numValue)) {\n return { valid: false, error: 'Invalid number format' };\n }\n return { valid: true, convertedValue: numValue };\n }\n\n case 'date': {\n const dateValue = new Date(value);\n if (isNaN(dateValue.getTime())) {\n return { valid: false, error: 'Invalid date format' };\n }\n return { valid: true, convertedValue: dateValue.toISOString().split('T')[0] };\n }\n\n case 'datetime': {\n const datetimeValue = new Date(value);\n if (isNaN(datetimeValue.getTime())) {\n return { valid: false, error: 'Invalid datetime format' };\n }\n return { valid: true, convertedValue: datetimeValue.toISOString() };\n }\n\n case 'boolean':\n if (typeof value === 'boolean') {\n return { valid: true, convertedValue: value };\n }\n if (typeof value === 'string') {\n const boolValue = value.toLowerCase();\n if (boolValue === 'true' || boolValue === '1') {\n return { valid: true, convertedValue: true };\n }\n if (boolValue === 'false' || boolValue === '0') {\n return { valid: true, convertedValue: false };\n }\n }\n return { valid: false, error: 'Invalid boolean format' };\n\n case 'text':\n case 'textarea':\n case 'email':\n case 'url':\n case 'tel':\n return { valid: true, convertedValue: String(value) };\n\n case 'select':\n case 'multiselect':\n return { valid: true, convertedValue: value };\n\n default:\n return { valid: true, convertedValue: value };\n }\n }\n\n /**\n * Formats value for display based on field type\n */\n static formatValue(value: any, fieldType: FieldType, locale = 'en-US'): string {\n if (value === null || value === undefined) return '';\n\n switch (fieldType) {\n case 'number':\n return new Intl.NumberFormat(locale).format(Number(value));\n\n case 'decimal':\n return new Intl.NumberFormat(locale, { \n minimumFractionDigits: 2,\n maximumFractionDigits: 2 \n }).format(Number(value));\n\n case 'currency':\n return new Intl.NumberFormat(locale, { \n style: 'currency',\n currency: 'USD' // Should be configurable\n }).format(Number(value));\n\n case 'percentage':\n return new Intl.NumberFormat(locale, { \n style: 'percent',\n minimumFractionDigits: 2\n }).format(Number(value) / 100);\n\n case 'date':\n return new Date(value).toLocaleDateString(locale);\n\n case 'datetime':\n return new Date(value).toLocaleString(locale);\n\n default:\n return String(value);\n }\n }\n}\n","import { \n XBRLFormInput, \n XBRLPresentationRole,\n XBRLPresentationConcept,\n XBRLLabel,\n XBRLHypercubeData,\n XBRLHypercubeRole\n} from '../schema/xbrl-types';\nimport {\n XBRLFormSchema,\n FormSection,\n FormField,\n FormColumn,\n ConceptTree,\n ConceptMetadata,\n FieldType\n} from '../schema/types';\n\n/**\n * XBRL Form B private static assignColumnIdsToConceptFields(conceptTree: ConceptTree, columnIds: string[]): void {\n // Filter fields to only keep those that match available columns\n conceptTree.fields = conceptTree.fields.filter(field => {\n return columnIds.includes(field.columnId);\n });\n\n // Recursively process children\n if (conceptTree.children) {\n conceptTree.children.forEach(child => {\n this.assignColumnIdsToConceptFields(child, columnIds);\n });\n }\n }ransforms XBRL taxonomy data into Jupiter Dynamic Form schemas\n * Updated to handle actual presentation.json structure with roles\n */\nexport class XBRLFormBuilder {\n \n /**\n * Format period range for display - shows only year when both dates are in same year\n * @param startDate - Period start date in YYYY-MM-DD format\n * @param endDate - Period end date in YYYY-MM-DD format\n * @returns Formatted period string (e.g., \"2025\" or \"2025-01-01 / 2026-12-31\")\n */\n private static formatPeriodDisplay(startDate: string, endDate: string): string {\n if (!startDate || !endDate) {\n return `${startDate} / ${endDate}`;\n }\n \n const startYear = startDate.substring(0, 4);\n const endYear = endDate.substring(0, 4);\n \n // If both dates are in the same year, show only the year\n if (startYear === endYear) {\n return startYear;\n }\n \n // Otherwise, show the full date range\n return `${startDate} / ${endDate}`;\n }\n \n /**\n * Create unique concept ID by combining original ID with preferred label suffix\n * This handles cases where the same concept appears multiple times with different labels\n */\n private static createUniqueConceptId(concept: XBRLPresentationConcept, sectionId?: string): string {\n let baseId = concept.id;\n \n // Add preferred label suffix if exists\n if (concept.preferredLabel && concept.preferredLabel.trim() !== '') {\n // Extract the last part of the role URL as suffix\n const roleMatch = concept.preferredLabel.match(/\\/([^\\/]+)$/);\n const roleSuffix = roleMatch ? roleMatch[1] : concept.preferredLabel.replace(/[^a-zA-Z0-9]/g, '_');\n baseId = `${concept.id}_${roleSuffix}`;\n }\n \n // Add section context to avoid conflicts across roles\n if (sectionId) {\n // Create a short hash of the section ID to keep concept IDs manageable\n const sectionHash = this.createSectionHash(sectionId);\n return `${baseId}__${sectionHash}`;\n }\n \n return baseId;\n }\n \n /**\n * Create a short hash from section ID for concept uniqueness\n */\n private static createSectionHash(sectionId: string): string {\n // Simple hash to create a short identifier from the section ID\n let hash = 0;\n for (let i = 0; i < sectionId.length; i++) {\n const char = sectionId.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(36).substr(0, 6);\n }\n\n private static _extractDocumentationLabels(labels: XBRLLabel[]): { [lang: string]: string } {\n const result: { [lang: string]: string } = {};\n const docRole = 'http://www.xbrl.org/2003/role/documentation';\n labels.filter(l => l.role === docRole).forEach(l => { result[l.lang] = l.label; });\n return result;\n }\n\n /**\n * Build form schema from XBRL input data\n * Creates accordion sections for each presentation role\n * @param xbrlInput - XBRL taxonomy data\n * @param periodStartDate - Start date for the reporting period\n * @param periodEndDate - End date for the reporting period\n * @param language - ISO language code for labels (e.g., 'en', 'nl', 'de')\n * @param periodPreferences - User preferences for which period columns to show per role\n */\n static buildFormSchema(\n xbrlInput: XBRLFormInput, \n periodStartDate?: string, \n periodEndDate?: string,\n language: string = 'en',\n periodPreferences?: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }>\n ): XBRLFormSchema {\n if (!xbrlInput.presentation || xbrlInput.presentation.length === 0) {\n throw new Error('XBRL presentation data is required');\n }\n\n // Use the first entrypoint (typically there's only one)\n const presentationData = xbrlInput.presentation[0];\n \n // Extract hypercube data for dimension processing\n const hypercubeData = xbrlInput.hypercubes?.[0]; // Use first entrypoint\n \n // Extract datatypes for validation (handle both array and wrapped formats)\n const datatypes = Array.isArray(xbrlInput.datatypes) \n ? xbrlInput.datatypes \n : xbrlInput.datatypes?.concepts || [];\n \n const sections: FormSection[] = [];\n\n // Create a form section for each presentation role (using natural order from XBRL data)\n presentationData.roles.forEach(role => {\n const section = this.buildSectionFromRole(role, periodStartDate, periodEndDate, hypercubeData, language, periodPreferences);\n \n // CRITICAL: Attach datatypes to section for XBRL validation\n if (datatypes && datatypes.length > 0) {\n section.datatypes = datatypes;\n console.log(`✅ [buildFormSchema] Attached ${datatypes.length} datatypes to section ${section.id}`);\n } else {\n console.warn(`⚠️ [buildFormSchema] No datatypes available for section ${section.id}`);\n }\n \n // Post-process fields to assign correct column IDs based on generated columns\n this.assignFieldColumnIds(section);\n \n sections.push(section);\n });\n\n return {\n formId: `xbrl-form-${Date.now()}`,\n title: `XBRL Form - ${this.extractEntityName(presentationData.entrypoint)}`,\n description: `Dynamic form generated from XBRL taxonomy data`,\n version: '1.0.0',\n sections: sections\n };\n }\n\n /**\n * Extract section title from role name (remove role number prefix)\n * Handle missing role property gracefully by using role ID as fallback\n */\n private static buildSectionFromRole(\n role: XBRLPresentationRole, \n periodStartDate?: string, \n periodEndDate?: string,\n hypercubeData?: XBRLHypercubeData,\n language: string = 'en',\n periodPreferences?: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean; dimensionSelections?: any[] }>\n ): FormSection {\n // Use localised label from labels array if available, else fall back to role string\n let title: string;\n if (role.labels && role.labels.length > 0) {\n const langLabel = role.labels.find(l => l.lang === language);\n const fallbackLabel = role.labels.find(l => l.lang === 'en') || role.labels[0];\n title = (langLabel || fallbackLabel).label;\n } else {\n title = this.extractRoleTitle(role.role || role.id || 'Unknown Role');\n }\n \n // Analyze period types in this role first to determine consistent column strategy\n const nonAbstractConcepts = this.getAllNonAbstractConcepts(role);\n const periodTypes = new Set(\n nonAbstractConcepts\n .filter(concept => concept.periodType)\n .map(concept => concept.periodType)\n );\n\n // Find matching hypercube role for dimension processing\n let hypercubeRole = hypercubeData?.roles.find(hr => hr.roleId === role.id);\n \n if (hypercubeRole) {\n //console.log(`🏷️ Found matching hypercube role \"${role.id}\"`);\n } else {\n //console.log(`❌ No hypercube role found for \"${role.id}\"`);\n }\n \n // Filter hypercube dimensions based on user selections\n const rolePreferences = periodPreferences?.[role.id];\n if (hypercubeRole && rolePreferences?.dimensionSelections && rolePreferences.dimensionSelections.length > 0) {\n console.log(`🔍 Filtering dimensions for role ${role.id} based on user selections`);\n hypercubeRole = this.filterHypercubeDimensionsBySelection(hypercubeRole, rolePreferences.dimensionSelections);\n }\n \n // Generate appropriate columns based on concept period types and hypercube dimensions FIRST\n const columns = this.generateDefaultColumnsForRole(role, periodStartDate || '2025-01-01', periodEndDate || '2025-12-31', hypercubeRole, nonAbstractConcepts, periodTypes, rolePreferences, language);\n\n // Extract column IDs for field creation\n const availableColumnIds = columns.map(col => col.id);\n //console.log(`📋 Available column IDs for role \"${role.id}\":`, availableColumnIds);\n \n\n \n const roleInfo = { periodTypes, availableColumnIds, availableColumns: columns };\n const conceptTrees: ConceptTree[] = [];\n const conceptIdOccurrences = new Map<string, number>();\n\n // Process root concepts and build tree structure with knowledge of available columns\n if (role.presentationLinkbase?.concepts) {\n role.presentationLinkbase.concepts.forEach(concept => {\n const conceptTree = this.buildConceptTree(concept, 0, periodStartDate, periodEndDate, roleInfo, role.id, language, conceptIdOccurrences);\n if (conceptTree) {\n conceptTrees.push(conceptTree);\n }\n });\n }\n\n // JDF-021: When the current role has no hypercube dimensions (either no entry at all,\n // or entry exists but items array is empty), check if any other role contains the same\n // concept with typed dimensions. If exactly one such role exists, annotate each field\n // with crossRoleTypedMembers so the Edit Period dialog can show the typed member inputs.\n if ((!hypercubeRole || !hypercubeRole.items?.length) && hypercubeData) {\n conceptTrees.forEach(conceptTree =>\n this.applyCrossRoleDimensions(conceptTree, role.id, hypercubeData, language)\n );\n }\n\n return {\n id: role.id,\n title: title,\n description: role.description || `Section for ${title}`,\n concepts: conceptTrees,\n columns: columns,\n expanded: false,\n metadata: {\n roleURI: role.roleURI,\n originalRole: role.role\n },\n showPeriodControl: periodTypes.size > 1,\n showPreviousYear: (role as any).showPreviousYear === true, // Read from presentation.json\n instant: (role as any).instant === true, // Read from presentation.json\n duration: (role as any).duration === true // Read from presentation.json\n };\n }\n\n /**\n * Build concept tree from XBRL presentation concept\n */\n private static buildConceptTree(\n concept: XBRLPresentationConcept,\n level: number,\n periodStartDate?: string,\n periodEndDate?: string,\n roleInfo?: { periodTypes: Set<string>, availableColumnIds?: string[], availableColumns?: FormColumn[] },\n sectionId?: string,\n language: string = 'en',\n conceptIdOccurrences?: Map<string, number>,\n ancestorPeriodHint?: 'start' | 'end'\n ): ConceptTree | null {\n const label = this.getPreferredLabel(concept.labels, language, concept.preferredLabel);\n\n // Determine the period hint to pass down to children based on this concept's preferredLabel.\n // Children of a periodStartLabel parent share the same instant context (start of period).\n // Children of a periodEndLabel parent share the end-of-period context (or pass through inherited hint).\n const childPeriodHint: 'start' | 'end' | undefined =\n concept.preferredLabel?.includes('periodStartLabel') ? 'start'\n : concept.preferredLabel?.includes('periodEndLabel') ? 'end'\n : ancestorPeriodHint;\n\n // Build fields for this concept (if not abstract)\n const fields: FormField[] = [];\n if (!concept.elementAbstract) {\n // Use available column IDs if provided, otherwise fall back to period-based logic\n let columnIds: string[] = [];\n\n if (roleInfo?.availableColumnIds && roleInfo.availableColumnIds.length > 0) {\n // Use all available columns - period type filtering removed since columns are now merged\n // Each field has its own period controls, so all concepts (instant/duration) can appear in the same column\n columnIds = roleInfo.availableColumnIds;\n } else {\n // Fallback to single default column\n // Since columns are now merged, we use 'duration' as the unified column ID\n columnIds = ['duration'];\n }\n\n // Create fields for appropriate column IDs, using each column's own period dates\n // so that previous-year columns get 2024 dates instead of the current year's dates.\n columnIds.forEach(columnId => {\n const column = roleInfo?.availableColumns?.find(c => c.id === columnId);\n const colStartDate = column?.periodStartDate || periodStartDate;\n const colEndDate = column?.periodEndDate || periodEndDate;\n const field = this.createFieldFromConcept(concept, colStartDate, colEndDate, columnId, ancestorPeriodHint, language);\n if (field) fields.push(field);\n });\n }\n\n // Process children recursively, propagating the period hint derived from this concept\n const children: ConceptTree[] = [];\n if (concept.children && concept.children.length > 0) {\n concept.children.forEach(child => {\n const childTree = this.buildConceptTree(child, level + 1, periodStartDate, periodEndDate, roleInfo, sectionId, language, conceptIdOccurrences, childPeriodHint);\n if (childTree) {\n children.push(childTree);\n }\n });\n }\n\n // Check if this concept should be included in the tree\n // For abstract concepts: only include if they have fields OR have children with content\n // For non-abstract concepts: always include if they have fields\n const hasContent = fields.length > 0 || children.length > 0;\n \n if (!hasContent) {\n // Abstract concept with no fields and no children with content - omit from tree\n return null;\n }\n\n let conceptId = this.createUniqueConceptId(concept, sectionId);\n if (conceptIdOccurrences) {\n const count = conceptIdOccurrences.get(conceptId) ?? 0;\n conceptIdOccurrences.set(conceptId, count + 1);\n if (count > 0) {\n conceptId = `${conceptId}__occ${count + 1}`;\n }\n }\n\n const conceptMetadata: ConceptMetadata = {\n conceptName: concept.conceptName,\n type: concept.type,\n substitutionGroup: concept.substitutionGroup,\n periodType: concept.periodType as 'instant' | 'duration',\n balance: concept.balance,\n documentationLabels: this._extractDocumentationLabels(concept.labels)\n };\n\n return {\n id: conceptId,\n originalConceptId: concept.id, // Store original for submission data\n name: concept.conceptName,\n label: label,\n description: `${concept.conceptName} (${concept.type})`,\n type: concept.type, // XBRL concept type for input field rendering\n level: level,\n children: children,\n fields: fields,\n conceptMetadata,\n facts: (concept as any).facts || [], // Pass facts array from presentation concept for pre-population\n collapsed: level > 0, // Collapse nested levels by default\n abstract: concept.elementAbstract,\n periodType: concept.periodType as 'instant' | 'duration',\n balance: concept.balance, // Pass through balance attribute from XBRL data\n preferredLabel: concept.preferredLabel // Pass through for period date calculation in manual columns\n };\n }\n\n /**\n * Create form field from XBRL concept\n */\n private static createFieldFromConcept(\n concept: XBRLPresentationConcept,\n periodStartDate?: string,\n periodEndDate?: string,\n forcedColumnId?: string,\n ancestorPeriodHint?: 'start' | 'end',\n language: string = 'en'\n ): FormField | null {\n const fieldType = this.mapXBRLTypeToFieldType(concept.type);\n const label = this.getPreferredLabel(concept.labels, language, concept.preferredLabel);\n\n // Determine appropriate column ID based on concept's period type or forced value\n let columnId: string;\n \n if (forcedColumnId) {\n // Use the forced column ID if provided\n columnId = forcedColumnId;\n } else {\n // Always use 'duration' column since we merged instant and duration into one column per year\n // Each field now has its own period controls, so no need for separate columns\n columnId = 'duration';\n } const field: FormField = {\n id: `${concept.id}_${columnId}_field`,\n conceptId: concept.id,\n columnId: columnId,\n type: fieldType,\n label: label,\n placeholder: `Enter ${label.toLowerCase()}`,\n required: false, // Will be determined by validation rules\n disabled: concept.elementAbstract,\n defaultValue: null,\n // Add period information - each field has its own period (defaults from column)\n periodType: (concept.periodType === 'instant' || concept.periodType === 'duration') ? concept.periodType : undefined, // Validate and set the period type\n periodStartDate: periodStartDate || '2025-01-01',\n periodEndDate: periodEndDate || '2025-12-31',\n periodInstantDate: concept.periodType === 'instant'\n ? (concept.preferredLabel?.includes('periodStartLabel') || ancestorPeriodHint === 'start'\n ? this.subtractOneDay(periodStartDate || '2025-01-01')\n : (periodEndDate || periodStartDate || '2025-01-01'))\n : undefined\n };\n\n // Debug: Log field creation for specific concepts\n if (concept.id === 'nl-cd_DescriptionLocationNL__a64trl') {\n console.log(`🏗️ [Field Creation] Concept: ${concept.id}, periodType from concept: ${concept.periodType}, Field periodType: ${field.periodType}, ColumnId: ${columnId}`);\n }\n\n return field;\n }\n\n /**\n * Map XBRL data type to form field type\n */\n private static mapXBRLTypeToFieldType(xbrlType: string): FieldType {\n const typeMap: Record<string, FieldType> = {\n 'xbrli:stringItemType': 'text',\n 'xbrli:monetaryItemType': 'currency',\n 'xbrli:integerItemType': 'number',\n 'xbrli:decimalItemType': 'decimal',\n 'xbrli:percentItemType': 'percentage',\n 'xbrli:dateItemType': 'date',\n 'xbrli:booleanItemType': 'boolean',\n 'dtr-types:domainItemType': 'select',\n 'bw2-titel9:chamberOfCommerceRegistrationNumberItemType': 'text'\n };\n\n return typeMap[xbrlType] || 'text';\n }\n\n /**\n * Get preferred label from labels array with language support\n * @param labels - Array of XBRL labels\n * @param language - ISO language code (e.g., 'en', 'nl', 'de')\n */\n private static getPreferredLabel(\n labels: XBRLLabel[],\n language: string = 'en',\n preferredRole?: string\n ): string {\n if (!labels || labels.length === 0) return 'Unnamed Concept';\n\n // Filter labels by language\n const languageLabels = labels.filter(l => l.lang === language);\n \n // If no labels found for the specified language, fall back to all labels\n const labelsToSearch = languageLabels.length > 0 ? languageLabels : labels;\n\n // First priority: match arc-level preferred role (e.g. totalLabel/periodStartLabel)\n // for the requested language, then across all labels.\n if (preferredRole) {\n const roleSpecificInLanguage = languageLabels.find(l => l.role === preferredRole);\n if (roleSpecificInLanguage) return roleSpecificInLanguage.label;\n\n const roleSpecificAnyLanguage = labels.find(l => l.role === preferredRole);\n if (roleSpecificAnyLanguage) return roleSpecificAnyLanguage.label;\n }\n\n // Try to find preferred label\n const preferred = labelsToSearch.find(l => l.preferredLabel);\n if (preferred) return preferred.label;\n\n // Try to find standard label\n const standard = labelsToSearch.find(l => l.role === 'http://www.xbrl.org/2003/role/label');\n if (standard) return standard.label;\n\n // Try to find terse label\n const terse = labelsToSearch.find(l => l.role === 'http://www.xbrl.org/2003/role/terseLabel');\n if (terse) return terse.label;\n\n // Return first available label from language-specific labels or fallback to any label\n return labelsToSearch.length > 0 ? labelsToSearch[0].label : labels[0].label;\n }\n\n /**\n * Assign appropriate column IDs to fields based on section's generated columns\n */\n private static assignFieldColumnIds(section: FormSection): void {\n if (!section.columns || section.columns.length === 0) {\n return;\n }\n\n // Get available column IDs\n const columnIds = section.columns.map(col => col.id);\n \n // Process all fields in all concept trees\n section.concepts.forEach(conceptTree => {\n this.assignColumnIdsToConceptFields(conceptTree, columnIds);\n });\n }\n\n /**\n * Recursively assign column IDs to fields in a concept tree\n */\n private static assignColumnIdsToConceptFields(conceptTree: ConceptTree, columnIds: string[]): void {\n // Filter fields to only keep those that match available columns\n conceptTree.fields = conceptTree.fields.filter(field => {\n return columnIds.includes(field.columnId);\n });\n\n // Process children recursively\n if (conceptTree.children) {\n conceptTree.children.forEach(child => {\n this.assignColumnIdsToConceptFields(child, columnIds);\n });\n }\n }\n\n /**\n * Count total fields in a concept tree recursively\n */\n private static countFieldsInTree(conceptTree: ConceptTree): number {\n let count = conceptTree.fields.length;\n if (conceptTree.children) {\n conceptTree.children.forEach(child => {\n count += this.countFieldsInTree(child);\n });\n }\n return count;\n }\n\n /**\n * Get all non-abstract concepts from a role recursively\n */\n static getAllNonAbstractConcepts(role: XBRLPresentationRole): XBRLPresentationConcept[] {\n const nonAbstractConcepts: XBRLPresentationConcept[] = [];\n \n if (role.presentationLinkbase?.concepts) {\n role.presentationLinkbase.concepts.forEach(concept => {\n this.collectNonAbstractConcepts(concept, nonAbstractConcepts);\n });\n }\n \n return nonAbstractConcepts;\n }\n\n /**\n * Recursively collect non-abstract concepts from a concept tree\n */\n private static collectNonAbstractConcepts(\n concept: XBRLPresentationConcept, \n collection: XBRLPresentationConcept[]\n ): void {\n // Add this concept if it's not abstract\n if (!concept.elementAbstract) {\n collection.push(concept);\n }\n \n // Recursively process children\n if (concept.children && concept.children.length > 0) {\n concept.children.forEach(child => {\n this.collectNonAbstractConcepts(child, collection);\n });\n }\n }\n\n /**\n * Filter hypercube dimensions to only include selected members\n */\n private static filterHypercubeDimensionsBySelection(\n hypercubeRole: any,\n dimensionSelections: Array<{ dimensionId: string; selectedMemberIds: string[] }>\n ): any {\n // Create a deep copy to avoid mutating original data\n const filteredRole = JSON.parse(JSON.stringify(hypercubeRole));\n \n if (!filteredRole.items || filteredRole.items.length === 0) {\n return filteredRole;\n }\n \n // Filter each item's dimensions\n filteredRole.items.forEach((item: any) => {\n if (!item.dimensions) return;\n \n item.dimensions = item.dimensions.map((dimension: any) => {\n // Find selection for this dimension\n const selection = dimensionSelections.find(s => s.dimensionId === dimension.id);\n \n if (!selection || !selection.selectedMemberIds || selection.selectedMemberIds.length === 0) {\n // No selection for this dimension, keep all members\n return dimension;\n }\n \n // Filter members to only include selected ones\n const filteredDimension = { ...dimension };\n filteredDimension.members = this.filterMembersBySelection(dimension.members, selection.selectedMemberIds);\n \n console.log(` ✅ Filtered dimension ${dimension.id}: ${dimension.members?.length || 0} → ${filteredDimension.members?.length || 0} members`);\n \n return filteredDimension;\n });\n });\n \n return filteredRole;\n }\n\n /**\n * Recursively filter dimension members to only include selected IDs\n */\n private static filterMembersBySelection(members: any[], selectedIds: string[]): any[] {\n if (!members || !Array.isArray(members)) return [];\n \n const filtered: any[] = [];\n \n members.forEach(member => {\n // Check if this member is selected\n if (selectedIds.includes(member.id)) {\n // Include this member (without children for now to avoid nested selection complexity)\n filtered.push({\n ...member,\n children: [] // Reset children as we're doing flat selection\n });\n }\n \n // Also check children recursively\n if (member.children && member.children.length > 0) {\n const filteredChildren = this.filterMembersBySelection(member.children, selectedIds);\n filtered.push(...filteredChildren);\n }\n });\n \n return filtered;\n }\n\n /**\n * Find typed dimension members from another role that shares the same concept.\n * Called when the current role has no hypercube dimensions.\n * Returns typed member info only when EXACTLY ONE other role matches.\n */\n private static findCrossRoleDimensions(\n conceptId: string,\n currentRoleId: string,\n hypercubeData: XBRLHypercubeData,\n language: string = 'en'\n ): Array<{ axisId: string; axisLabel: string; typedMemberId: string; memberLabel: string }> | null {\n const matchingRoles: XBRLHypercubeRole[] = [];\n\n for (const role of hypercubeData.roles) {\n if (role.roleId === currentRoleId) continue;\n\n for (const item of role.items) {\n if (!item.conceptIds?.includes(conceptId)) continue;\n // Only consider items with at least one typed dimension\n if (!item.dimensions?.some(d => d.typedMember)) continue;\n matchingRoles.push(role);\n break; // one match per role is enough\n }\n }\n\n if (matchingRoles.length !== 1) return null;\n\n const matchingRole = matchingRoles[0];\n const item = matchingRole.items.find(i => i.conceptIds?.includes(conceptId));\n if (!item) return null;\n\n const result: Array<{ axisId: string; axisLabel: string; typedMemberId: string; memberLabel: string }> = [];\n\n for (const dimension of item.dimensions) {\n if (!dimension.typedMember) continue;\n\n const labelObj =\n dimension.labels.find(l => l.lang === language) ||\n dimension.labels.find(l => l.lang === 'en') ||\n dimension.labels[0];\n const axisLabel = labelObj?.label || dimension.id;\n\n result.push({\n axisId: dimension.id,\n axisLabel,\n typedMemberId: dimension.typedMember.id,\n memberLabel: axisLabel\n });\n }\n\n return result.length > 0 ? result : null;\n }\n\n /**\n * Recursively walk a concept tree and set crossRoleTypedMembers on every field\n * whose concept appears in exactly one other hypercube role with typed dimensions.\n */\n private static applyCrossRoleDimensions(\n conceptTree: ConceptTree,\n currentRoleId: string,\n hypercubeData: XBRLHypercubeData,\n language: string\n ): void {\n if (!conceptTree.abstract && conceptTree.fields && conceptTree.fields.length > 0) {\n const crossRoleTypedMembers = this.findCrossRoleDimensions(\n conceptTree.originalConceptId,\n currentRoleId,\n hypercubeData,\n language\n );\n if (crossRoleTypedMembers) {\n conceptTree.fields.forEach(field => {\n field.crossRoleTypedMembers = crossRoleTypedMembers;\n });\n }\n }\n conceptTree.children?.forEach(child =>\n this.applyCrossRoleDimensions(child, currentRoleId, hypercubeData, language)\n );\n }\n\n /**\n * Generate default columns based on period types of non-abstract concepts in a role\n */\n static generateDefaultColumnsForRole(\n role: XBRLPresentationRole,\n periodStartDate: string,\n periodEndDate: string,\n hypercubeRole?: XBRLHypercubeRole,\n nonAbstractConcepts?: XBRLPresentationConcept[],\n rolePeriodTypes?: Set<string>,\n periodPreferences?: { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean },\n language: string = 'en'\n ): FormColumn[] {\n // Use pre-calculated values if provided, otherwise calculate them\n const concepts = nonAbstractConcepts || this.getAllNonAbstractConcepts(role);\n const periodTypes = rolePeriodTypes || new Set(\n concepts\n .filter(concept => concept.periodType) // Only concepts with period type\n .map(concept => concept.periodType)\n );\n \n //console.log(`📊 Analyzing role \"${role.role}\" with ${concepts.length} non-abstract concepts`);\n \n if (concepts.length === 0) {\n // No non-abstract concepts, return single default column\n //console.log('📊 No non-abstract concepts found, using default column');\n return [{\n id: 'default',\n title: 'Value',\n description: 'Default value column',\n type: 'base',\n order: 0,\n removable: false\n }];\n }\n \n // Check for hypercube dimensions and generate appropriate columns\n let dimensionColumns: FormColumn[] = [];\n if (hypercubeRole?.items?.length === 1) {\n const item = hypercubeRole.items[0];\n \n \n if (item.dimensions.length === 1) {\n // Single dimension - existing logic\n dimensionColumns = this.generateSingleDimensionColumns(item.dimensions[0], periodStartDate, periodEndDate, periodTypes, language);\n } else if (item.dimensions.length > 1) {\n // Multiple dimensions - generate combination columns\n dimensionColumns = this.generateMultiDimensionColumns(item.dimensions, periodStartDate, periodEndDate, periodTypes, language);\n }\n \n // Filter columns based on period preferences\n if (periodPreferences) {\n dimensionColumns = this.filterColumnsByPeriodPreferences(dimensionColumns, periodPreferences);\n }\n } else if (hypercubeRole?.items?.length && hypercubeRole.items.length > 1) {\n //console.log(`⚠️ Multiple items found (${hypercubeRole.items.length}), skipping for now`);\n }\n \n // Analyze period types (use the pre-calculated or newly calculated set)\n //console.log(`📅 Found period types: ${Array.from(periodTypes).join(', ')}`);\n \n const columns: FormColumn[] = [];\n \n // If we have dimension columns, use them\n if (dimensionColumns.length > 0) {\n columns.push(...dimensionColumns);\n } else {\n // Create ONE column per year regardless of period types\n // Since each field now has its own period controls, we don't need separate columns for duration/instant\n if (periodTypes.size === 0) {\n // No period types specified, use single default column\n columns.push({\n id: 'default',\n title: this.formatPeriodDisplay(periodStartDate, periodEndDate),\n description: '',\n type: 'base',\n order: 0,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n } else {\n // Create single column for all period types (duration and instant combined)\n columns.push({\n id: 'duration',\n title: this.formatPeriodDisplay(periodStartDate, periodEndDate),\n description: '',\n type: 'base',\n order: 0,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n }\n }\n \n //console.log(`📊 Generated ${columns.length} columns for role \"${role.role}\":`, columns.map(c => c.title));\n \n // Apply period preferences filter if provided\n let filteredColumns = columns;\n if (periodPreferences) {\n filteredColumns = this.filterColumnsByPeriodPreferences(columns, periodPreferences);\n }\n \n // Generate previous year columns if requested\n if (periodPreferences?.showPreviousYear) {\n const previousYearColumns = this.generatePreviousYearColumns(filteredColumns, periodStartDate, periodEndDate);\n filteredColumns = [...filteredColumns, ...previousYearColumns];\n }\n \n return filteredColumns;\n }\n\n /**\n * Calculate previous year date by subtracting one year\n */\n private static getPreviousYearDate(dateString: string): string {\n try {\n const date = new Date(dateString);\n date.setFullYear(date.getFullYear() - 1);\n return date.toISOString().split('T')[0];\n } catch (error) {\n console.error(`Error calculating previous year for date ${dateString}:`, error);\n return dateString;\n }\n }\n\n private static subtractOneDay(dateString: string): string {\n try {\n const date = new Date(dateString);\n date.setDate(date.getDate() - 1);\n return date.toISOString().split('T')[0];\n } catch (error) {\n console.error(`Error subtracting one day from date ${dateString}:`, error);\n return dateString;\n }\n }\n\n /**\n * Generate previous year columns based on current year columns\n */\n private static generatePreviousYearColumns(\n currentYearColumns: FormColumn[],\n periodStartDate: string,\n periodEndDate: string\n ): FormColumn[] {\n const previousYearColumns: FormColumn[] = [];\n const prevStartDate = this.getPreviousYearDate(periodStartDate);\n const prevEndDate = this.getPreviousYearDate(periodEndDate);\n\n currentYearColumns.forEach((column, index) => {\n // Create a previous year version of each column\n let prevTitle = column.title; // Keep original title (dimension labels)\n let prevDescription = '';\n let prevId = '';\n\n // Determine the description and ID based on column type\n if (column.dimensionData) {\n // Column has dimensions - keep the title (dimension labels), update description (date)\n prevTitle = column.title; // Keep dimension labels like \"Commercial\" or \"Commercial | Separate\"\n \n // Update description with previous year dates (always use period range now)\n prevDescription = this.formatPeriodDisplay(prevStartDate, prevEndDate);\n prevId = `${column.id}_prev`;\n } else {\n // Column has no dimensions - always use period range format now\n prevTitle = this.formatPeriodDisplay(prevStartDate, prevEndDate);\n prevDescription = '';\n prevId = `duration_prev_${index}`;\n }\n\n previousYearColumns.push({\n ...column,\n id: prevId,\n title: prevTitle,\n description: prevDescription,\n order: column.order + 100, // Place after current year columns\n removable: false, // User explicitly chose this via filter dialog\n periodStartDate: prevStartDate, // Set previous year start date\n periodEndDate: prevEndDate, // Set previous year end date\n dimensionData: column.dimensionData ? {\n ...column.dimensionData,\n dimensionId: `${column.dimensionData.dimensionId}_prev`\n } : undefined\n });\n });\n\n return previousYearColumns;\n }\n\n /**\n * Filter columns based on user's period preferences\n */\n private static filterColumnsByPeriodPreferences(\n columns: FormColumn[],\n preferences: { showDuration: boolean; showInstant: boolean; showPreviousYear?: boolean }\n ): FormColumn[] {\n return columns.filter(column => {\n // Check if column is duration or instant based on its ID or dimensionData\n const isDuration = column.id.includes('duration') || \n column.dimensionData?.dimensionId?.includes('duration');\n const isInstant = column.id.includes('instant') || \n column.dimensionData?.dimensionId?.includes('instant');\n \n // If column is neither duration nor instant, keep it (default columns)\n if (!isDuration && !isInstant) {\n return true;\n }\n \n // Filter based on preferences\n if (isDuration && !preferences.showDuration) {\n return false;\n }\n if (isInstant && !preferences.showInstant) {\n return false;\n }\n \n return true;\n });\n }\n\n /**\n * Generate columns for single dimension scenarios\n */\n private static generateSingleDimensionColumns(\n dimension: any,\n periodStartDate: string,\n periodEndDate: string,\n periodTypes: Set<string>,\n language: string = 'en'\n ): FormColumn[] {\n // //console.log(`📊 Processing single dimension:`, {\n // id: dimension.id,\n // conceptName: dimension.conceptName,\n // hasMembers: !!(dimension.members && Array.isArray(dimension.members)),\n // membersCount: dimension.members?.length || 0,\n // hasTypedMember: !!dimension.typedMember,\n // typedMemberId: dimension.typedMember?.id\n // });\n\n // Handle typed dimensions (no explicit members)\n if (dimension.typedMember && (!dimension.members || dimension.members.length === 0)) {\n //console.log(`🔤 Processing typed dimension: ${dimension.id} with typed member: ${dimension.typedMember.id}`);\n\n const axisLabel = this.getPreferredLabel(dimension.labels, language) || dimension.conceptName;\n \n const dimensionInfo = {\n axisId: dimension.id,\n axisLabel,\n typedMemberId: dimension.typedMember.id,\n dimensionKey: `${axisLabel} | [Typed Input]`,\n dimensionIdKey: `${dimension.id}|[typed]`\n };\n \n //console.log(`🔤 Generated typed dimension info:`, dimensionInfo);\n \n const columns: FormColumn[] = [];\n \n if (periodTypes.size === 0) {\n columns.push({\n id: 'typed-default',\n title: axisLabel,\n description: 'Typed dimension input column',\n type: 'dimension',\n dimensionData: {\n dimensionId: 'typed-default',\n axisId: dimensionInfo.axisId,\n memberId: '[typed]',\n memberValue: 'Typed Input',\n memberLabel: 'Typed Input',\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey,\n hasTypedMembers: true,\n typedMemberId: dimensionInfo.typedMemberId,\n typedMembers: [{\n axisId: dimensionInfo.axisId,\n axisLabel: dimensionInfo.axisLabel,\n typedMemberId: dimensionInfo.typedMemberId,\n memberLabel: dimensionInfo.axisLabel\n }]\n },\n order: 0,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n } else if (periodTypes.size === 1 && periodTypes.has('instant')) {\n columns.push({\n id: 'typed-instant',\n title: `${axisLabel} `,\n description: periodEndDate,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'typed-instant',\n axisId: dimensionInfo.axisId,\n memberId: '[typed]',\n memberValue: 'Typed Input',\n memberLabel: 'Typed Input',\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey,\n hasTypedMembers: true,\n typedMemberId: dimensionInfo.typedMemberId,\n typedMembers: [{\n axisId: dimensionInfo.axisId,\n axisLabel: dimensionInfo.axisLabel,\n typedMemberId: dimensionInfo.typedMemberId,\n memberLabel: dimensionInfo.axisLabel\n }]\n },\n order: 0,\n removable: false,\n periodStartDate: periodEndDate,\n periodEndDate: periodEndDate\n });\n } else if (periodTypes.size === 1 && periodTypes.has('duration')) {\n columns.push({\n id: 'typed-duration',\n title: `${axisLabel} `,\n description: this.formatPeriodDisplay(periodStartDate, periodEndDate),\n type: 'dimension',\n dimensionData: {\n dimensionId: 'typed-duration',\n axisId: dimensionInfo.axisId,\n memberId: '[typed]',\n memberValue: 'Typed Input',\n memberLabel: 'Typed Input',\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey,\n hasTypedMembers: true,\n typedMemberId: dimensionInfo.typedMemberId,\n typedMembers: [{\n axisId: dimensionInfo.axisId,\n axisLabel: dimensionInfo.axisLabel,\n typedMemberId: dimensionInfo.typedMemberId,\n memberLabel: dimensionInfo.axisLabel\n }]\n },\n order: 0,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n } else {\n // All period types - create only ONE column (field-level period controls handle the rest)\n columns.push({\n id: 'typed-duration',\n title: `${axisLabel} `,\n description: this.formatPeriodDisplay(periodStartDate, periodEndDate),\n type: 'dimension',\n dimensionData: {\n dimensionId: 'typed-duration',\n axisId: dimensionInfo.axisId,\n memberId: '[typed]',\n memberValue: 'Typed Input',\n memberLabel: 'Typed Input',\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey,\n hasTypedMembers: true,\n typedMemberId: dimensionInfo.typedMemberId,\n typedMembers: [{\n axisId: dimensionInfo.axisId,\n axisLabel: dimensionInfo.axisLabel,\n typedMemberId: dimensionInfo.typedMemberId,\n memberLabel: dimensionInfo.axisLabel\n }]\n },\n order: 0,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n }\n \n //console.log(`🔤 Generated ${columns.length} typed dimension columns`);\n return columns;\n }\n\n // Handle explicit dimensions (existing logic)\n if (!dimension.members || !Array.isArray(dimension.members)) {\n //console.log(`⚠️ Dimension ${dimension.id} has no members defined and no typed member, skipping column generation`);\n return [];\n }\n\n // //console.log(`📊 Found single dimension:`, {\n // id: dimension.id,\n // conceptName: dimension.conceptName,\n // membersCount: dimension.members.length\n // });\n \n if (dimension.members.length === 0) {\n return [];\n }\n \n const axisLabel = this.getPreferredLabel(dimension.labels, language) || dimension.conceptName;\n const firstMember = dimension.members[0];\n const memberLabel = this.getPreferredLabel(firstMember.labels, language) || firstMember.conceptName;\n \n const dimensionInfo = {\n axisId: dimension.id,\n axisLabel,\n memberId: firstMember.id,\n memberLabel,\n dimensionKey: `${axisLabel} | ${memberLabel}`,\n dimensionIdKey: `${dimension.id} | ${firstMember.id}`\n };\n \n //console.log(`📊 Generated dimension info:`, dimensionInfo);\n \n const columns: FormColumn[] = [];\n \n if (periodTypes.size === 0) {\n columns.push({\n id: 'default',\n title: dimensionInfo.memberLabel,\n description: 'Default value column',\n type: 'dimension',\n dimensionData: {\n dimensionId: 'default',\n axisId: dimensionInfo.axisId,\n memberId: dimensionInfo.memberId,\n memberValue: dimensionInfo.memberLabel,\n memberLabel: dimensionInfo.memberLabel,\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey\n },\n order: 0,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n } else if (periodTypes.size === 1 && periodTypes.has('instant')) {\n columns.push({\n id: 'instant',\n title: `${dimensionInfo.memberLabel}`,\n description: periodEndDate,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'instant',\n axisId: dimensionInfo.axisId,\n memberId: dimensionInfo.memberId,\n memberValue: dimensionInfo.memberLabel,\n memberLabel: dimensionInfo.memberLabel,\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey\n },\n order: 0,\n removable: false,\n periodStartDate: periodEndDate,\n periodEndDate: periodEndDate\n });\n } else if (periodTypes.size === 1 && periodTypes.has('duration')) {\n columns.push({\n id: 'duration',\n title: `${dimensionInfo.memberLabel}`,\n description: `${periodStartDate} / ${periodEndDate}`,\n type: 'dimension',\n dimensionData: {\n dimensionId: 'duration',\n axisId: dimensionInfo.axisId,\n memberId: dimensionInfo.memberId,\n memberValue: dimensionInfo.memberLabel,\n memberLabel: dimensionInfo.memberLabel,\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey\n },\n order: 0,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n } else {\n // All period types - create only ONE column (field-level period controls handle the rest)\n columns.push({\n id: 'duration',\n title: `${dimensionInfo.memberLabel}`,\n description: this.formatPeriodDisplay(periodStartDate, periodEndDate),\n type: 'dimension',\n dimensionData: {\n dimensionId: 'duration',\n axisId: dimensionInfo.axisId,\n memberId: dimensionInfo.memberId,\n memberValue: dimensionInfo.memberLabel,\n memberLabel: dimensionInfo.memberLabel,\n axis: dimensionInfo.axisLabel,\n axisLabel: dimensionInfo.axisLabel,\n memberKey: dimensionInfo.dimensionKey,\n dimensionIdKey: dimensionInfo.dimensionIdKey\n },\n order: 0,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n }\n \n return columns;\n }\n\n /**\n * Generate columns for multi-dimension scenarios - creates combinations of all dimension members\n */\n private static generateMultiDimensionColumns(\n dimensions: any[],\n periodStartDate: string,\n periodEndDate: string,\n periodTypes: Set<string>,\n language: string = 'en'\n ): FormColumn[] {\n //console.log(`📊 Processing ${dimensions.length} dimensions for multi-dimensional columns`);\n // console.log(`🔍 [DEBUG] Input dimensions:`, dimensions.map(d => ({\n // id: d.id,\n // label: d.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label,\n // membersCount: d.members?.length || 0,\n // hasTypedMember: !!d.typedMember\n // })));\n \n // Detect typed members for header indication\n const hasTypedMembers = dimensions.some(dimension => dimension.typedMember);\n if (hasTypedMembers) {\n //console.log(`🔤 Found typed members in dimensions - will indicate in column headers`);\n }\n \n // Filter out dimensions without members (but keep typed dimensions)\n const validDimensions = dimensions.filter(dimension => {\n // Keep dimensions with typed members even if they don't have domain members\n if (dimension.typedMember) {\n //console.log(`🔤 Keeping typed dimension: ${dimension.id} with typed member: ${dimension.typedMember.id}`);\n return true;\n }\n // Keep dimensions with domain members\n if (dimension.members && Array.isArray(dimension.members) && dimension.members.length > 0) {\n //console.log(`📂 Keeping domain dimension: ${dimension.id} with ${dimension.members.length} members`);\n return true;\n }\n // Skip dimensions without any members\n //console.log(`⚠️ Skipping dimension ${dimension.id} - no members or typed member defined`);\n return false;\n });\n\n if (validDimensions.length === 0) {\n //console.log(`⚠️ No valid dimensions with members found, skipping multi-dimensional column generation`);\n return [];\n }\n \n // Get all dimension information\n const dimensionInfos = validDimensions.map(dimension => {\n const axisLabel = this.getPreferredLabel(dimension.labels, language) || dimension.conceptName;\n\n // Handle typed dimensions differently\n if (dimension.typedMember) {\n return {\n id: dimension.id,\n axisLabel,\n isTyped: true,\n typedMemberId: dimension.typedMember.id,\n members: [{\n id: '[typed]',\n label: `${axisLabel}`\n }]\n };\n }\n\n // Handle domain dimensions (existing logic)\n const allMembers = this.getAllDimensionMembers(dimension.members);\n\n return {\n id: dimension.id,\n axisLabel,\n isTyped: false,\n members: allMembers.map(member => ({\n id: member.id,\n label: this.getPreferredLabel(member.labels, language) || member.conceptName\n }))\n };\n });\n \n // Generate all combinations of dimension members\n const combinations = this.generateDimensionCombinations(dimensionInfos);\n //console.log(`📊 Generated ${combinations.length} dimension combinations`);\n // //console.log(`🔍 [DEBUG] Generated combinations:`, combinations.map(combo => ({\n // memberLabels: combo.map((c: any) => c.memberLabel),\n // axisIds: combo.map((c: any) => c.axisId),\n // memberIds: combo.map((c: any) => c.memberId)\n // })));\n \n const columns: FormColumn[] = [];\n \n combinations.forEach((combination: any[], index: number) => {\n // Create column title from combination\n const columnTitle = combination.map((c: any) => c.memberLabel).join(' | ');\n \n // Identify typed and domain members in this combination\n const typedMembers = combination.filter((c: any) => c.isTyped);\n const domainMembers = combination.filter((c: any) => !c.isTyped);\n \n // console.log(`🔍 [Column ${index}] Combination analysis:`, {\n // totalMembers: combination.length,\n // typedMembers: typedMembers.length,\n // domainMembers: domainMembers.length,\n // hasTypedMembers: typedMembers.length > 0,\n // columnTitle: columnTitle,\n // memberLabels: combination.map((c: any) => c.memberLabel),\n // memberIds: combination.map((c: any) => c.memberId)\n // });\n \n // Create dimension data for this combination\n const dimensionData = {\n dimensionId: `multi_${index}`,\n memberValue: columnTitle, // Required field\n memberLabel: columnTitle, // Required field\n combinations: domainMembers.map((c: any) => ({\n axisId: c.axisId,\n axisLabel: c.axisLabel,\n memberId: c.memberId,\n memberLabel: c.memberLabel\n })),\n // Add typed member information for form fields\n typedMembers: typedMembers.map((c: any) => ({\n axisId: c.axisId,\n axisLabel: c.axisLabel,\n typedMemberId: c.typedMemberId,\n memberLabel: c.memberLabel\n })),\n hasTypedMembers: typedMembers.length > 0,\n memberKey: columnTitle,\n dimensionIdKey: [\n ...domainMembers.map((c: any) => `${c.axisId}|${c.memberId}`),\n ...typedMembers.map((c: any) => `${c.axisId}|[typed]`)\n ].join('::')\n };\n \n // console.log(`🔍 [Column ${index}] Final dimension data:`, {\n // dimensionId: dimensionData.dimensionId,\n // memberLabel: dimensionData.memberLabel,\n // dimensionIdKey: dimensionData.dimensionIdKey,\n // combinationsCount: dimensionData.combinations?.length,\n // typedMembersCount: dimensionData.typedMembers?.length\n // });\n \n // Create columns based on period types - always create ONE column per combination\n columns.push({\n id: `duration_${index}`,\n title: `${columnTitle}`,\n description: this.formatPeriodDisplay(periodStartDate, periodEndDate),\n type: 'dimension',\n dimensionData: {\n ...dimensionData,\n dimensionId: `duration_${index}`\n },\n order: index,\n removable: false,\n periodStartDate: periodStartDate,\n periodEndDate: periodEndDate\n });\n });\n \n //console.log(`📊 Generated ${columns.length} multi-dimensional columns`);\n return columns;\n }\n\n /**\n * Get all members including children recursively\n */\n private static getAllDimensionMembers(members: any[]): any[] {\n if (!members || !Array.isArray(members)) {\n return [];\n }\n\n const allMembers: any[] = [];\n \n members.forEach(member => {\n allMembers.push(member);\n \n if (member.children && member.children.length > 0) {\n allMembers.push(...this.getAllDimensionMembers(member.children));\n }\n });\n \n return allMembers;\n }\n\n /**\n * Generate all combinations of dimension members\n */\n private static generateDimensionCombinations(dimensionInfos: any[]): any[] {\n if (dimensionInfos.length === 0) return [];\n if (dimensionInfos.length === 1) {\n return dimensionInfos[0].members.map((member: any) => [{\n axisId: dimensionInfos[0].id,\n axisLabel: dimensionInfos[0].axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: dimensionInfos[0].isTyped || false,\n typedMemberId: dimensionInfos[0].typedMemberId\n }]);\n }\n \n // Generate combinations recursively\n const [firstDimension, ...restDimensions] = dimensionInfos;\n const restCombinations = this.generateDimensionCombinations(restDimensions);\n \n const combinations: any[] = [];\n \n firstDimension.members.forEach((member: any) => {\n if (restCombinations.length === 0) {\n combinations.push([{\n axisId: firstDimension.id,\n axisLabel: firstDimension.axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: firstDimension.isTyped || false,\n typedMemberId: firstDimension.typedMemberId\n }]);\n } else {\n restCombinations.forEach(restCombination => {\n combinations.push([\n {\n axisId: firstDimension.id,\n axisLabel: firstDimension.axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: firstDimension.isTyped || false,\n typedMemberId: firstDimension.typedMemberId\n },\n ...restCombination\n ]);\n });\n }\n });\n \n return combinations;\n }\n\n /**\n * Format date for display in column headers\n */\n private static formatDateForDisplay(dateString: string): string {\n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n });\n } catch {\n return dateString;\n }\n }\n\n /**\n * Extract entity name from entrypoint URL\n */\n private static extractEntityName(entrypoint: string): string {\n try {\n const url = new URL(entrypoint);\n const pathParts = url.pathname.split('/');\n const filename = pathParts[pathParts.length - 1];\n return filename.replace('.xsd', '').replace(/[^a-zA-Z0-9]/g, ' ').trim() || 'Entity';\n } catch {\n return 'Entity';\n }\n }\n\n /**\n * Extract role title from role string\n * Handles various role formats and missing data gracefully\n */\n private static extractRoleTitle(role: string): string {\n if (!role) return 'Unnamed Section';\n \n // Remove role number prefix like \"[000001] \" and return the title\n const match = role.match(/^\\[[\\d]+\\]\\s*(.+)$/);\n if (match) {\n return match[1].trim();\n }\n \n // If it's clearly a URI (starts with protocol-like pattern), extract a readable name\n if (role.match(/^[a-z]+:[^:]*$/i) || role.match(/^urn:[^:]+:[^:]+/i)) {\n // Extract the last part after the last colon or hyphen for URI-like identifiers\n const parts = role.split(/[:\\-]/);\n const lastPart = parts[parts.length - 1];\n // Convert from snake_case or kebab-case to Title Case\n return lastPart\n .replace(/[_\\-]/g, ' ')\n .replace(/\\b\\w/g, l => l.toUpperCase());\n }\n \n // For regular role titles, return as is (they may contain colons and hyphens as part of the text)\n return role.trim() || 'Unnamed Section';\n }\n\n /**\n * Extract role order from role string\n */\n private static extractRoleOrder(role: string): number {\n const match = role.match(/^\\[([\\d]+)\\]/);\n return match ? parseInt(match[1], 10) : 0;\n }\n\n /**\n * Build columns from XBRL hypercube data (placeholder for now)\n */\n static buildColumnsFromHypercubes(/* _hypercubes: any[] */): any[] {\n // For now, return default column structure\n // This will be expanded when we implement hypercube support\n return [{\n id: 'default',\n label: 'Values',\n type: 'data'\n }];\n }\n}\n","import enTranslations from '../i18n/en.json';\nimport nlTranslations from '../i18n/nl.json';\n\nexport type TranslationKey = string;\n\ninterface Translations {\n [key: string]: any;\n}\n\nconst translations: Record<string, Translations> = {\n en: enTranslations,\n nl: nlTranslations\n};\n\n/**\n * I18n utility class for managing translations\n */\nexport class I18n {\n private static currentLanguage: string = 'en';\n \n /**\n * Set the current language\n * @param language Language code ('en' or 'nl')\n */\n static setLanguage(language: string): void {\n if (translations[language]) {\n this.currentLanguage = language;\n } else {\n console.warn(`Language '${language}' not supported, falling back to 'en'`);\n this.currentLanguage = 'en';\n }\n }\n \n /**\n * Get the current language\n */\n static getLanguage(): string {\n return this.currentLanguage;\n }\n \n /**\n * Translate a key to the current language\n * @param key Translation key in dot notation (e.g., 'form.submit')\n * @param params Optional parameters to replace in the translation\n * @returns Translated string\n */\n static t(key: string, params?: Record<string, string | number>): string {\n const keys = key.split('.');\n let value: any = translations[this.currentLanguage];\n \n // Navigate through the nested object\n for (const k of keys) {\n if (value && typeof value === 'object' && k in value) {\n value = value[k];\n } else {\n console.warn(`Translation key '${key}' not found for language '${this.currentLanguage}'`);\n return key; // Return the key itself as fallback\n }\n }\n \n // If we have parameters, replace them in the string\n if (params && typeof value === 'string') {\n return this.interpolate(value, params);\n }\n \n return value;\n }\n \n /**\n * Interpolate parameters into a string\n * Supports {{paramName}} syntax\n */\n private static interpolate(str: string, params: Record<string, string | number>): string {\n return str.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) => {\n return key in params ? String(params[key]) : match;\n });\n }\n \n /**\n * Check if a translation exists for a key\n */\n static has(key: string): boolean {\n const keys = key.split('.');\n let value: any = translations[this.currentLanguage];\n \n for (const k of keys) {\n if (value && typeof value === 'object' && k in value) {\n value = value[k];\n } else {\n return false;\n }\n }\n \n return value !== undefined;\n }\n \n /**\n * Get all available languages\n */\n static getAvailableLanguages(): string[] {\n return Object.keys(translations);\n }\n}\n\n// Export a convenience function\nexport const t = (key: string, params?: Record<string, string | number>) => I18n.t(key, params);\n","import { \n FormData, \n FormSection, \n FormColumn, \n SubmissionData \n} from '../schema/types';\n\n/**\n * Interface for draft metadata - stores the current form state configuration\n */\nexport interface DraftMetadata {\n savedAt: string; // ISO timestamp\n periodStartDate: string;\n periodEndDate: string;\n language: string;\n reportingLanguage: string;\n selectedRoleIds: Array<{ roleId: string; roleURI: string; order: number }> | string[]; // Enhanced structure with roleURI and order, or legacy string array\n customColumns: CustomColumnMetadata[];\n typedMemberData: { [columnId: string]: { [axisId: string]: string } };\n periodPreferences?: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }>; // Period preferences for each role\n periodData?: { [conceptId: string]: { [columnId: string]: { startDate?: string; endDate?: string; instantDate?: string } } }; // Custom field-level period dates\n unitData?: { [conceptId: string]: { [columnId: string]: string } }; // Custom field-level unit selections\n decimalsData?: { [conceptId: string]: { [columnId: string]: string } }; // Per-fact decimals values\n repeatCounts?: { [conceptId: string]: number }; // Extra repeat row counts per concept (JDF-022)\n roleCompletedStates?: Record<string, boolean>; // Manually marked completed roles\n schemaVersion?: string;\n}\n\n/**\n * Interface for custom column metadata\n */\nexport interface CustomColumnMetadata {\n sectionId: string;\n columnId: string;\n label: string;\n description?: string; // Period display (e.g., \"2025\")\n periodType: 'instant' | 'duration';\n date?: string;\n startDate?: string;\n endDate?: string;\n dimensionData?: any;\n}\n\n/**\n * Interface for complete draft storage\n */\nexport interface DraftStorage {\n formData: SubmissionData; // Same format as submit\n metadata: DraftMetadata;\n version: string; // Storage format version\n}\n\n/**\n * DraftStorageService - Manages saving and loading form drafts\n * \n * Responsibilities:\n * - Save form data to localStorage/sessionStorage\n * - Save form metadata (columns, roles, configuration)\n * - Load saved drafts\n * - Clear draft storage\n * - Validate draft compatibility\n */\nexport class DraftStorageService {\n private readonly DRAFT_DATA_KEY = 'jupiter-form-draft-data';\n private readonly DRAFT_METADATA_KEY = 'jupiter-form-draft-metadata';\n private readonly STORAGE_VERSION = '1.0';\n \n // Use localStorage by default (survives browser restart)\n // Can be switched to sessionStorage if needed\n private _storage: Storage;\n\n constructor(useSessionStorage: boolean = false) {\n this._storage = useSessionStorage ? sessionStorage : localStorage;\n console.log(`💾 DraftStorageService initialized (using ${useSessionStorage ? 'sessionStorage' : 'localStorage'})`);\n }\n\n // ===========================================\n // Public API Methods\n // ===========================================\n\n /**\n * Save complete draft including data and metadata\n */\n saveDraft(\n submissionData: SubmissionData,\n metadata: Omit<DraftMetadata, 'savedAt'>\n ): boolean {\n try {\n const draft: DraftStorage = {\n formData: submissionData,\n metadata: {\n ...metadata,\n savedAt: new Date().toISOString()\n },\n version: this.STORAGE_VERSION\n };\n\n // Save to storage\n this._storage.setItem(this.DRAFT_DATA_KEY, JSON.stringify(draft.formData));\n this._storage.setItem(this.DRAFT_METADATA_KEY, JSON.stringify(draft.metadata));\n\n console.log('✅ Draft saved successfully', {\n entries: submissionData.length,\n timestamp: draft.metadata.savedAt,\n roles: metadata.selectedRoleIds.length,\n customColumns: metadata.customColumns.length\n });\n\n return true;\n } catch (error) {\n console.error('❌ Failed to save draft:', error);\n return false;\n }\n }\n\n /**\n * Load saved draft\n */\n loadDraft(): DraftStorage | null {\n try {\n const dataStr = this._storage.getItem(this.DRAFT_DATA_KEY);\n const metadataStr = this._storage.getItem(this.DRAFT_METADATA_KEY);\n\n if (!dataStr || !metadataStr) {\n console.log('ℹ️ No saved draft found');\n return null;\n }\n\n const formData = JSON.parse(dataStr) as SubmissionData;\n const metadata = JSON.parse(metadataStr) as DraftMetadata;\n\n console.log('✅ Draft loaded successfully', {\n entries: formData.length,\n savedAt: metadata.savedAt,\n roles: metadata.selectedRoleIds.length,\n customColumns: metadata.customColumns.length\n });\n\n return {\n formData,\n metadata,\n version: this.STORAGE_VERSION\n };\n } catch (error) {\n console.error('❌ Failed to load draft:', error);\n return null;\n }\n }\n\n /**\n * Check if a draft exists\n */\n hasDraft(): boolean {\n return this._storage.getItem(this.DRAFT_DATA_KEY) !== null &&\n this._storage.getItem(this.DRAFT_METADATA_KEY) !== null;\n }\n\n /**\n * Get draft metadata only (without full data)\n */\n getDraftMetadata(): DraftMetadata | null {\n try {\n const metadataStr = this._storage.getItem(this.DRAFT_METADATA_KEY);\n if (!metadataStr) return null;\n\n return JSON.parse(metadataStr) as DraftMetadata;\n } catch (error) {\n console.error('❌ Failed to load draft metadata:', error);\n return null;\n }\n }\n\n /**\n * Clear saved draft\n */\n clearDraft(): boolean {\n try {\n this._storage.removeItem(this.DRAFT_DATA_KEY);\n this._storage.removeItem(this.DRAFT_METADATA_KEY);\n console.log('🗑️ Draft cleared successfully');\n return true;\n } catch (error) {\n console.error('❌ Failed to clear draft:', error);\n return false;\n }\n }\n\n /**\n * Get draft age in milliseconds\n */\n getDraftAge(): number | null {\n const metadata = this.getDraftMetadata();\n if (!metadata) return null;\n\n const savedAt = new Date(metadata.savedAt);\n const now = new Date();\n return now.getTime() - savedAt.getTime();\n }\n\n /**\n * Check if draft is older than specified time (in milliseconds)\n */\n isDraftStale(maxAge: number): boolean {\n const age = this.getDraftAge();\n return age !== null && age > maxAge;\n }\n\n /**\n * Extract custom columns from all sections\n */\n extractCustomColumns(allSections: FormSection[]): CustomColumnMetadata[] {\n const customColumns: CustomColumnMetadata[] = [];\n\n allSections.forEach(section => {\n // Check if section has columns\n if (!section.columns || !Array.isArray(section.columns)) {\n return;\n }\n\n section.columns.forEach(column => {\n // Store all columns to preserve exact state\n customColumns.push({\n sectionId: section.id,\n columnId: column.id,\n label: column.title, // FormColumn uses 'title' not 'label'\n description: column.description, // Save description (period display)\n periodType: this._inferPeriodTypeFromColumn(column),\n date: column.periodStartDate, // Use periodStartDate for instant\n startDate: column.periodStartDate,\n endDate: column.periodEndDate,\n dimensionData: column.dimensionData\n });\n });\n });\n\n return customColumns;\n }\n\n /**\n * Infer period type from column data\n */\n private _inferPeriodTypeFromColumn(column: FormColumn): 'instant' | 'duration' {\n // If column has both start and end dates, it's duration\n if (column.periodStartDate && column.periodEndDate) {\n return 'duration';\n }\n // Otherwise default to instant\n return 'instant';\n }\n\n /**\n * Create metadata snapshot from current form state\n */\n createMetadataSnapshot(\n periodStartDate: string,\n periodEndDate: string,\n language: string,\n selectedRoleIds: Array<{ roleId: string; roleURI: string; order: number }> | string[], // Accept both enhanced and legacy formats\n allSections: FormSection[],\n typedMemberData: { [columnId: string]: { [axisId: string]: string } },\n periodPreferences?: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }>,\n periodData?: { [conceptId: string]: { [columnId: string]: { startDate?: string; endDate?: string; instantDate?: string } } },\n unitData?: { [conceptId: string]: { [columnId: string]: string } },\n reportingLanguage: string = 'en',\n repeatCounts?: { [conceptId: string]: number },\n decimalsData?: { [conceptId: string]: { [columnId: string]: string } },\n roleCompletedStates?: Record<string, boolean>\n ): Omit<DraftMetadata, 'savedAt'> {\n return {\n periodStartDate,\n periodEndDate,\n language,\n reportingLanguage,\n selectedRoleIds, // Store enhanced structure (with roleURI and order) or legacy string array\n customColumns: this.extractCustomColumns(allSections),\n typedMemberData,\n periodPreferences,\n periodData,\n unitData,\n decimalsData,\n repeatCounts,\n roleCompletedStates,\n schemaVersion: this.STORAGE_VERSION\n };\n }\n\n /**\n * Validate draft compatibility with current schema\n */\n validateDraftCompatibility(draft: DraftStorage, currentPeriodStart: string, currentPeriodEnd: string): {\n compatible: boolean;\n warnings: string[];\n } {\n const warnings: string[] = [];\n\n // Check if period dates match\n if (draft.metadata.periodStartDate !== currentPeriodStart) {\n warnings.push(`Draft period start (${draft.metadata.periodStartDate}) differs from current (${currentPeriodStart})`);\n }\n\n if (draft.metadata.periodEndDate !== currentPeriodEnd) {\n warnings.push(`Draft period end (${draft.metadata.periodEndDate}) differs from current (${currentPeriodEnd})`);\n }\n\n // Check draft age\n const age = this.getDraftAge();\n if (age && age > 7 * 24 * 60 * 60 * 1000) { // 7 days\n warnings.push(`Draft is ${Math.floor(age / (24 * 60 * 60 * 1000))} days old`);\n }\n\n const compatible = warnings.length === 0;\n\n return { compatible, warnings };\n }\n}\n","/**\n * Fact Matcher Utility\n * \n * Matches XBRL facts to form fields based on contextual information:\n * - Period (duration or instant)\n * - Dimensions (explicit and typed)\n * - Unit (for monetary types)\n */\n\nexport interface XBRLFact {\n name: string;\n value: any;\n period: string; // \"2025-01-01 / 2025-12-31\" or \"2025-12-31\"\n unitMeasure?: string; // e.g., \"iso4217:EUR\"\n contextId: string;\n prefix: string;\n dimensions?: Array<{\n dimensionType: 'explicit' | 'typed';\n dimension: string; // Axis ID (e.g., \"jenv-bw2-dim:BasisOfPreparationAxis\")\n member?: string; // For explicit dimensions (e.g., \"jenv-bw2-dm:CommercialMember\")\n typedMember?: string; // For typed dimensions - member reference\n typedMemberValue?: string; // For typed dimensions - actual value\n }>;\n}\n\nexport interface CellContext {\n conceptId: string;\n columnId: string;\n periodStartDate?: string;\n periodEndDate?: string;\n periodInstantDate?: string;\n periodType?: 'duration' | 'instant';\n unit?: string;\n dimensionData?: {\n dimensionIdKey?: string; // Format: \"axis1|member1::axis2|member2\"\n combinations?: Array<{\n axisId: string;\n memberId: string;\n memberLabel: string;\n }>;\n typedMembers?: Array<{\n axisId: string;\n axisLabel: string;\n typedMemberId: string;\n }>;\n };\n}\n\nexport class FactMatcher {\n /**\n * Find a matching fact for a given cell context\n */\n static findMatchingFact(facts: XBRLFact[], context: CellContext): XBRLFact | null {\n if (!facts || facts.length === 0) {\n return null;\n }\n\n // Filter facts that match the period\n const periodMatchedFacts = facts.filter(fact => \n this.matchesPeriod(fact, context)\n );\n\n if (periodMatchedFacts.length === 0) {\n return null;\n }\n\n // Filter facts that match dimensions\n const dimensionMatchedFacts = periodMatchedFacts.filter(fact =>\n this.matchesDimensions(fact, context)\n );\n\n if (dimensionMatchedFacts.length === 0) {\n return null;\n }\n\n // If multiple facts match, prefer one with matching unit (if applicable)\n if (dimensionMatchedFacts.length > 1 && context.unit) {\n const unitMatchedFact = dimensionMatchedFacts.find(fact =>\n this.matchesUnit(fact, context)\n );\n if (unitMatchedFact) {\n return unitMatchedFact;\n }\n }\n\n // Return first matching fact\n return dimensionMatchedFacts[0];\n }\n\n /**\n * Check if fact period matches cell period\n */\n private static matchesPeriod(fact: XBRLFact, context: CellContext): boolean {\n const factPeriod = this.parsePeriod(fact.period);\n \n // Match instant period\n if (context.periodType === 'instant' && context.periodInstantDate) {\n return factPeriod.isInstant && factPeriod.instantDate === context.periodInstantDate;\n }\n\n // Match duration period\n if (context.periodType === 'duration' && context.periodStartDate && context.periodEndDate) {\n return !factPeriod.isInstant && \n factPeriod.startDate === context.periodStartDate &&\n factPeriod.endDate === context.periodEndDate;\n }\n\n // If no period type specified, try to match by dates\n if (context.periodInstantDate) {\n return factPeriod.isInstant && factPeriod.instantDate === context.periodInstantDate;\n }\n\n if (context.periodStartDate && context.periodEndDate) {\n return !factPeriod.isInstant && \n factPeriod.startDate === context.periodStartDate &&\n factPeriod.endDate === context.periodEndDate;\n }\n\n // No period context to match against\n return true;\n }\n\n /**\n * Check if fact dimensions match cell dimensions\n */\n private static matchesDimensions(fact: XBRLFact, context: CellContext): boolean {\n const factDimensions = fact.dimensions || [];\n const cellDimensions = this.extractDimensionsFromContext(context);\n\n // Debug logging for dimension matching\n const shouldDebug = false; // Set to true to enable detailed logging\n if (shouldDebug) {\n console.log('🔍 [FactMatcher] Dimension Match Check:', {\n factDimensions: factDimensions.map(d => ({\n axis: d.dimension,\n member: d.member,\n normalized: {\n axis: this.normalizeAxisId(d.dimension),\n member: this.normalizeMemberId(d.member || '')\n }\n })),\n cellDimensions: cellDimensions.map(d => ({\n axisId: d.axisId,\n memberId: d.memberId,\n normalized: {\n axis: this.normalizeAxisId(d.axisId),\n member: this.normalizeMemberId(d.memberId)\n }\n }))\n });\n }\n\n // If cell has no dimensions, fact should also have no dimensions\n if (cellDimensions.length === 0) {\n return factDimensions.length === 0;\n }\n\n // If fact has no dimensions but cell has dimensions, no match\n if (factDimensions.length === 0 && cellDimensions.length > 0) {\n return false;\n }\n\n // Both must have same number of dimensions\n if (factDimensions.length !== cellDimensions.length) {\n if (shouldDebug) {\n console.log('❌ [FactMatcher] Dimension count mismatch:', {\n factCount: factDimensions.length,\n cellCount: cellDimensions.length\n });\n }\n return false;\n }\n\n // Check if all cell dimensions are present in fact dimensions\n const allMatch = cellDimensions.every(cellDim => {\n return factDimensions.some(factDim => {\n // Match axis\n const axisMatch = this.normalizeAxisId(factDim.dimension) === this.normalizeAxisId(cellDim.axisId);\n \n if (!axisMatch) {\n return false;\n }\n\n // Match member (explicit)\n if (factDim.dimensionType === 'explicit' && cellDim.memberId) {\n const memberMatch = this.normalizeMemberId(factDim.member || '') === this.normalizeMemberId(cellDim.memberId);\n if (shouldDebug && !memberMatch) {\n console.log('❌ [FactMatcher] Member mismatch:', {\n factMember: factDim.member,\n cellMember: cellDim.memberId,\n factNormalized: this.normalizeMemberId(factDim.member || ''),\n cellNormalized: this.normalizeMemberId(cellDim.memberId)\n });\n }\n return memberMatch;\n }\n\n // Match typed dimension\n if (factDim.dimensionType === 'typed' && cellDim.isTyped) {\n return true; // Typed dimensions match by axis only\n }\n\n return false;\n });\n });\n\n if (shouldDebug) {\n console.log(allMatch ? '✅ [FactMatcher] All dimensions matched' : '❌ [FactMatcher] Some dimensions did not match');\n }\n\n return allMatch;\n }\n\n /**\n * Check if fact unit matches cell unit\n */\n private static matchesUnit(fact: XBRLFact, context: CellContext): boolean {\n if (!context.unit || !fact.unitMeasure) {\n return true; // No unit to match\n }\n\n // Normalize units for comparison (e.g., \"iso4217:EUR\" -> \"EUR\")\n const factUnit = this.normalizeUnit(fact.unitMeasure);\n const cellUnit = this.normalizeUnit(context.unit);\n\n return factUnit === cellUnit;\n }\n\n /**\n * Parse period string into structured format\n */\n private static parsePeriod(period: string): {\n isInstant: boolean;\n instantDate?: string;\n startDate?: string;\n endDate?: string;\n } {\n // Check if it's a duration period (contains \" / \")\n if (period.includes(' / ')) {\n const [startDate, endDate] = period.split(' / ').map(d => d.trim());\n return {\n isInstant: false,\n startDate,\n endDate\n };\n }\n\n // It's an instant period\n return {\n isInstant: true,\n instantDate: period.trim()\n };\n }\n\n /**\n * Extract dimensions from cell context\n */\n private static extractDimensionsFromContext(context: CellContext): Array<{\n axisId: string;\n memberId: string;\n isTyped?: boolean;\n }> {\n if (!context.dimensionData) {\n return [];\n }\n\n const dimensions: Array<{ axisId: string; memberId: string; isTyped?: boolean }> = [];\n\n // Extract from combinations (explicit dimensions)\n if (context.dimensionData.combinations && context.dimensionData.combinations.length > 0) {\n context.dimensionData.combinations.forEach(combo => {\n dimensions.push({\n axisId: combo.axisId,\n memberId: combo.memberId\n });\n });\n }\n\n // Extract from typed members\n if (context.dimensionData.typedMembers && context.dimensionData.typedMembers.length > 0) {\n context.dimensionData.typedMembers.forEach(typed => {\n dimensions.push({\n axisId: typed.axisId,\n memberId: '[typed]',\n isTyped: true\n });\n });\n }\n\n return dimensions;\n }\n\n /**\n * Normalize axis ID for comparison\n * Handles both formats: \"jenv-bw2-dim:BasisOfPreparationAxis\" and \"jenv-bw2-dim_BasisOfPreparationAxis\"\n * Returns: \"BasisOfPreparationAxis\"\n */\n private static normalizeAxisId(axisId: string): string {\n if (!axisId) return '';\n \n // Try colon separator first (fact format)\n if (axisId.includes(':')) {\n const parts = axisId.split(':');\n return parts[1] || parts[0];\n }\n \n // Try underscore separator (hypercube format)\n if (axisId.includes('_')) {\n const parts = axisId.split('_');\n // Find the last part after the last underscore (e.g., \"jenv-bw2-dim_BasisOfPreparationAxis\" -> \"BasisOfPreparationAxis\")\n // But we need to be smarter - the namespace is typically \"prefix-type_\" followed by the actual name\n // Look for pattern: {prefix}-{type}_{ConceptName}\n const lastUnderscoreIndex = axisId.lastIndexOf('_');\n if (lastUnderscoreIndex > 0) {\n return axisId.substring(lastUnderscoreIndex + 1);\n }\n }\n \n // No separator found, return as-is\n return axisId;\n }\n\n /**\n * Normalize member ID for comparison\n * Handles both formats: \"jenv-bw2-dm:CommercialMember\" and \"jenv-bw2-dm_CommercialMember\"\n * Returns: \"CommercialMember\"\n */\n private static normalizeMemberId(memberId: string): string {\n if (!memberId) return '';\n \n // Try colon separator first (fact format)\n if (memberId.includes(':')) {\n const parts = memberId.split(':');\n return parts[1] || parts[0];\n }\n \n // Try underscore separator (hypercube format)\n if (memberId.includes('_')) {\n const lastUnderscoreIndex = memberId.lastIndexOf('_');\n if (lastUnderscoreIndex > 0) {\n return memberId.substring(lastUnderscoreIndex + 1);\n }\n }\n \n // No separator found, return as-is\n return memberId;\n }\n\n /**\n * Normalize unit for comparison\n * Converts \"iso4217:EUR\" to \"EUR\"\n */\n private static normalizeUnit(unit: string): string {\n if (!unit) return '';\n \n // Remove namespace prefix\n const parts = unit.split(':');\n return parts.length > 1 ? parts[1] : parts[0];\n }\n\n /**\n * Extract typed dimension values from facts\n * Returns a map of axis IDs to typed values\n */\n static extractTypedValues(facts: XBRLFact[], context: CellContext): Record<string, string> {\n const typedValues: Record<string, string> = {};\n \n if (!facts || facts.length === 0) {\n return typedValues;\n }\n \n // Find facts that match period and dimensions (excluding typed values)\n const matchedFacts = facts.filter(fact => \n this.matchesPeriod(fact, context) && this.matchesDimensions(fact, context)\n );\n \n // Extract typed values from matched facts\n matchedFacts.forEach(fact => {\n if (fact.dimensions) {\n fact.dimensions.forEach(dim => {\n if (dim.dimensionType === 'typed' && dim.typedMemberValue) {\n // Normalize axis ID for consistent key\n const axisId = this.normalizeAxisId(dim.dimension);\n typedValues[axisId] = dim.typedMemberValue;\n }\n });\n }\n });\n \n return typedValues;\n }\n\n /**\n * Debug helper: Log matching process\n */\n static debugMatch(facts: XBRLFact[], context: CellContext): void {\n console.log('🔍 [FactMatcher] Debug Match');\n console.log(' Context:', {\n conceptId: context.conceptId,\n columnId: context.columnId,\n period: context.periodType === 'instant' \n ? context.periodInstantDate \n : `${context.periodStartDate} / ${context.periodEndDate}`,\n dimensions: this.extractDimensionsFromContext(context)\n });\n console.log(' Facts:', facts.map(f => ({\n value: f.value,\n period: f.period,\n dimensions: f.dimensions?.map(d => `${d.dimension}:${d.member}`)\n })));\n \n const match = this.findMatchingFact(facts, context);\n console.log(' Match Result:', match ? match.value : 'No match');\n }\n}\n","/**\n * XBRL Datatype Validation Utility\n * Validates input values against XBRL datatype validation rules\n */\n\nimport { XBRLDatatype } from '../schema/xbrl-types';\nimport { I18n } from './i18n';\n\nexport interface XBRLValidationResult {\n valid: boolean;\n errors: XBRLValidationError[];\n}\n\nexport interface XBRLValidationError {\n type: 'pattern' | 'minLength' | 'maxLength' | 'length' | 'totalDigits' | 'unit';\n message: string;\n expectedValue?: string | number;\n actualValue?: string | number;\n}\n\nexport interface XBRLDatatypeValidation {\n pattern?: string;\n minLength?: number;\n maxLength?: number;\n length?: number;\n totalDigits?: number;\n}\n\nexport class XBRLValidator {\n /**\n * Validates a value against XBRL datatype validation rules\n * Only validates when value is not blank\n * \n * @param conceptType - The XBRL concept type (e.g., \"nl-types:houseNumberNLItemType\")\n * @param value - The input value to validate\n * @param datatypes - Array of XBRL datatypes from taxonomy\n * @returns Validation result with errors if any\n */\n static validateConceptValue(\n conceptType: string | undefined,\n value: any,\n datatypes?: XBRLDatatype[]\n ): XBRLValidationResult {\n const errors: XBRLValidationError[] = [];\n\n // Skip validation if value is blank\n if (value === null || value === undefined || value === '') {\n return { valid: true, errors: [] };\n }\n\n // Skip validation if no concept type provided\n if (!conceptType || !datatypes || datatypes.length === 0) {\n return { valid: true, errors: [] };\n }\n\n // Find the datatype definition for this concept type\n const datatype = this.findDatatype(conceptType, datatypes);\n if (!datatype || !datatype.validation) {\n // No validation rules found for this datatype\n return { valid: true, errors: [] };\n }\n\n const validation = datatype.validation as XBRLDatatypeValidation;\n const stringValue = String(value);\n\n // 1. Pattern validation - check if value matches regex pattern\n if (validation.pattern) {\n const patternError = this.validatePattern(stringValue, validation.pattern);\n if (patternError) {\n errors.push(patternError);\n }\n }\n\n // 2. Exact length validation - value must have exact length\n if (validation.length !== undefined) {\n const lengthError = this.validateExactLength(stringValue, validation.length);\n if (lengthError) {\n errors.push(lengthError);\n }\n }\n\n // 3. minLength validation - value must be at least this length\n if (validation.minLength !== undefined) {\n const minLengthError = this.validateMinLength(stringValue, validation.minLength);\n if (minLengthError) {\n errors.push(minLengthError);\n }\n }\n\n // 4. maxLength validation - value must not exceed this length\n if (validation.maxLength !== undefined) {\n const maxLengthError = this.validateMaxLength(stringValue, validation.maxLength);\n if (maxLengthError) {\n errors.push(maxLengthError);\n }\n }\n\n // 5. totalDigits validation (for numeric types)\n if (validation.totalDigits !== undefined) {\n const totalDigitsError = this.validateTotalDigits(stringValue, validation.totalDigits);\n if (totalDigitsError) {\n errors.push(totalDigitsError);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n }\n\n /**\n * Finds the datatype definition for a given concept type\n * Handles both exact matches and base type chain resolution\n */\n private static findDatatype(conceptType: string, datatypes: XBRLDatatype[]): XBRLDatatype | undefined {\n // First try exact match\n let datatype = datatypes.find(dt => dt.type === conceptType);\n if (datatype) {\n return datatype;\n }\n\n // If not found, try to resolve through basetype chain\n // This handles cases where validation is defined on a base type\n const visited = new Set<string>();\n let currentType = conceptType;\n\n while (currentType && !visited.has(currentType)) {\n visited.add(currentType);\n datatype = datatypes.find(dt => dt.type === currentType);\n \n if (datatype) {\n // If this datatype has validation, return it\n if ((datatype as any).validation) {\n return datatype;\n }\n // Otherwise, continue up the basetype chain\n currentType = datatype.basetype;\n } else {\n break;\n }\n }\n\n return undefined;\n }\n\n /**\n * Validates that value matches the regex pattern\n */\n private static validatePattern(value: string, pattern: string): XBRLValidationError | null {\n try {\n const regex = new RegExp(`^${pattern}$`);\n if (!regex.test(value)) {\n return {\n type: 'pattern',\n message: I18n.t('xbrlValidation.patternMismatch', { pattern }),\n expectedValue: pattern,\n actualValue: value\n };\n }\n } catch (error) {\n console.error(`Invalid regex pattern: ${pattern}`, error);\n return {\n type: 'pattern',\n message: I18n.t('xbrlValidation.invalidPattern', { pattern }),\n expectedValue: pattern,\n actualValue: value\n };\n }\n return null;\n }\n\n /**\n * Validates that value has exact length\n */\n private static validateExactLength(value: string, requiredLength: number): XBRLValidationError | null {\n if (value.length !== requiredLength) {\n return {\n type: 'length',\n message: I18n.t('xbrlValidation.exactLength', { required: requiredLength, current: value.length }),\n expectedValue: requiredLength,\n actualValue: value.length\n };\n }\n return null;\n }\n\n /**\n * Validates minimum length\n */\n private static validateMinLength(value: string, minLength: number): XBRLValidationError | null {\n if (value.length < minLength) {\n return {\n type: 'minLength',\n message: I18n.t('xbrlValidation.minLength', { required: minLength, current: value.length }),\n expectedValue: minLength,\n actualValue: value.length\n };\n }\n return null;\n }\n\n /**\n * Validates maximum length\n */\n private static validateMaxLength(value: string, maxLength: number): XBRLValidationError | null {\n if (value.length > maxLength) {\n return {\n type: 'maxLength',\n message: I18n.t('xbrlValidation.maxLength', { required: maxLength, current: value.length }),\n expectedValue: maxLength,\n actualValue: value.length\n };\n }\n return null;\n }\n\n /**\n * Validates total digits (for numeric values)\n */\n private static validateTotalDigits(value: string, totalDigits: number): XBRLValidationError | null {\n // Remove non-digit characters except decimal point\n const digitsOnly = value.replace(/[^\\d]/g, '');\n\n if (digitsOnly.length > totalDigits) {\n return {\n type: 'totalDigits',\n message: I18n.t('xbrlValidation.totalDigits', { required: totalDigits, current: digitsOnly.length }),\n expectedValue: totalDigits,\n actualValue: digitsOnly.length\n };\n }\n return null;\n }\n\n /**\n * Gets a human-readable summary of validation rules for a concept type\n * Useful for displaying validation hints to users\n */\n static getValidationRulesSummary(conceptType: string | undefined, datatypes?: XBRLDatatype[]): string[] {\n if (!conceptType || !datatypes) {\n return [];\n }\n\n const datatype = this.findDatatype(conceptType, datatypes);\n if (!datatype || !datatype.validation) {\n return [];\n }\n\n const validation = datatype.validation as XBRLDatatypeValidation;\n const rules: string[] = [];\n\n if (validation.pattern) {\n rules.push(I18n.t('xbrlValidation.ruleSummaryPattern', { pattern: validation.pattern }));\n }\n if (validation.length !== undefined) {\n rules.push(I18n.t('xbrlValidation.ruleSummaryExactLength', { required: validation.length }));\n }\n if (validation.minLength !== undefined) {\n rules.push(I18n.t('xbrlValidation.ruleSummaryMinLength', { required: validation.minLength }));\n }\n if (validation.maxLength !== undefined) {\n rules.push(I18n.t('xbrlValidation.ruleSummaryMaxLength', { required: validation.maxLength }));\n }\n if (validation.totalDigits !== undefined) {\n rules.push(I18n.t('xbrlValidation.ruleSummaryTotalDigits', { required: validation.totalDigits }));\n }\n\n return rules;\n }\n}\n","/**\n * Type-to-Input Field Mapping Configuration\n * \n * This module defines the mapping between XBRL concept types and HTML input field types.\n * The mapping determines which UI control should be rendered for each XBRL data type.\n * \n * Usage:\n * 1. Add new type mappings to the TYPE_INPUT_MAP constant\n * 2. Use getInputTypeForConceptType() to get the appropriate field type\n * 3. Mapping is extensible - add more types as needed\n */\n\nimport { XBRLDatatype } from '../schema/xbrl-types';\nimport { I18n } from './i18n';\n\nexport type InputFieldType = \n | 'text'\n | 'textarea'\n | 'number'\n | 'decimal'\n | 'integer'\n | 'currency'\n | 'percentage'\n | 'date'\n | 'datetime'\n | 'email'\n | 'url'\n | 'tel'\n | 'boolean'\n | 'select';\n\nexport interface TypeMapping {\n /** The input field type to render */\n fieldType: InputFieldType;\n /** Optional HTML input type attribute (for input elements) */\n htmlInputType?: string;\n /** inputmode attribute for mobile keyboard hints (e.g. 'decimal', 'numeric') */\n inputMode?: string;\n /** Whether to allow decimal values (for number fields) */\n allowDecimals?: boolean;\n /** Minimum allowed value (for number fields) */\n min?: number;\n /** Maximum allowed value (for number fields) */\n max?: number;\n /** Step value for number inputs */\n step?: string | number;\n /** Placeholder text suggestion */\n placeholder?: string;\n /** Enumeration options for dropdown/select fields */\n enumerations?: Array<{\n id: string;\n value: string;\n label?: string;\n }>;\n}\n\n/**\n * Type-to-Input Field Mapping\n * \n * Maps XBRL concept types to appropriate input field configurations.\n * Types are matched in order of specificity (most specific first).\n */\nexport const TYPE_INPUT_MAP: Record<string, TypeMapping> = {\n // ==========================================\n // Dutch XBRL Types (nl-types namespace)\n // ==========================================\n \n // Text area for long-form explanations\n 'nl-types:formattedExplanationItemType': {\n fieldType: 'textarea',\n placeholder: I18n.t('field.enterDetailedExplanation'),\n },\n \n // Monetary values without decimals (whole numbers only)\n 'nl-types:monetaryNoDecimals20ItemType': {\n fieldType: 'number',\n htmlInputType: 'text',\n inputMode: 'decimal',\n allowDecimals: false,\n step: 1,\n placeholder: I18n.t('field.enterAmountNoDecimals'),\n },\n\n // ==========================================\n // Standard XBRL Types (xbrli namespace)\n // ==========================================\n\n // Monetary with decimals\n 'xbrli:monetaryItemType': {\n fieldType: 'currency',\n htmlInputType: 'text',\n inputMode: 'decimal',\n allowDecimals: true,\n step: 0.01,\n placeholder: I18n.t('field.enterCurrency'),\n },\n\n // String/text types\n 'xbrli:stringItemType': {\n fieldType: 'text',\n htmlInputType: 'text',\n placeholder: I18n.t('field.enterText'),\n },\n\n // Date types\n 'xbrli:dateItemType': {\n fieldType: 'date',\n htmlInputType: 'date',\n },\n\n 'xbrli:dateTimeItemType': {\n fieldType: 'datetime',\n htmlInputType: 'datetime-local',\n },\n\n // Numeric types - integers\n 'xbrli:integerItemType': {\n fieldType: 'integer',\n htmlInputType: 'text',\n inputMode: 'numeric',\n allowDecimals: false,\n step: 1,\n placeholder: I18n.t('field.enterWholeNumber'),\n },\n\n 'xbrli:nonNegativeIntegerItemType': {\n fieldType: 'integer',\n htmlInputType: 'text',\n inputMode: 'numeric',\n allowDecimals: false,\n min: 0,\n step: 1,\n placeholder: I18n.t('field.enterPositiveNumber'),\n },\n\n 'xbrli:positiveIntegerItemType': {\n fieldType: 'integer',\n htmlInputType: 'text',\n inputMode: 'numeric',\n allowDecimals: false,\n min: 1,\n step: 1,\n placeholder: I18n.t('field.enterPositiveNumber'),\n },\n\n // Numeric types - decimals\n 'xbrli:decimalItemType': {\n fieldType: 'decimal',\n htmlInputType: 'text',\n inputMode: 'decimal',\n allowDecimals: true,\n step: 'any',\n placeholder: I18n.t('field.enterDecimalValue'),\n },\n\n // Shares (typically whole numbers or with limited decimals)\n 'xbrli:sharesItemType': {\n fieldType: 'number',\n htmlInputType: 'text',\n inputMode: 'decimal',\n allowDecimals: true,\n min: 0,\n step: 0.01,\n placeholder: I18n.t('field.enterNumberOfShares'),\n },\n\n 'xbrli:shares': {\n fieldType: 'number',\n htmlInputType: 'text',\n inputMode: 'decimal',\n allowDecimals: true,\n min: 0,\n step: 0.01,\n placeholder: I18n.t('field.enterNumberOfShares'),\n },\n\n // Year (gYear)\n 'xbrli:gYearItemType': {\n fieldType: 'number',\n htmlInputType: 'text',\n inputMode: 'numeric',\n allowDecimals: false,\n min: 1900,\n max: 2100,\n step: 1,\n placeholder: I18n.t('field.yearFormat'),\n },\n\n // Boolean types\n 'xbrli:booleanItemType': {\n fieldType: 'boolean',\n },\n\n // ==========================================\n // Percentage types\n // ==========================================\n\n 'xbrli:pureItemType': {\n fieldType: 'percentage',\n htmlInputType: 'text',\n inputMode: 'decimal',\n allowDecimals: true,\n step: 0.01,\n placeholder: I18n.t('field.enterPercentage'),\n },\n\n 'xbrli:percentItemType': {\n fieldType: 'percentage',\n htmlInputType: 'text',\n inputMode: 'decimal',\n allowDecimals: true,\n step: 0.01,\n placeholder: I18n.t('field.enterPercentage'),\n },\n \n // ==========================================\n // Contact/Communication types\n // ==========================================\n \n 'xbrli:emailItemType': {\n fieldType: 'email',\n htmlInputType: 'email',\n placeholder: I18n.t('field.emailPlaceholder'),\n },\n \n 'xbrli:urlItemType': {\n fieldType: 'url',\n htmlInputType: 'url',\n placeholder: I18n.t('field.urlPlaceholder'),\n },\n \n 'xbrli:telephoneItemType': {\n fieldType: 'tel',\n htmlInputType: 'tel',\n placeholder: I18n.t('field.phonePlaceholder'),\n },\n};\n\n/**\n * Get input field configuration for a given XBRL concept type.\n * \n * This method now supports two modes:\n * 1. With datatypes: Uses baseType chain resolution for accurate type determination\n * 2. Without datatypes: Falls back to pattern matching on the concept type name\n * \n * @param conceptType - The XBRL concept type (e.g., \"nl-types:monetaryNoDecimals20ItemType\")\n * @param datatypes - Optional array of XBRL datatypes for baseType chain resolution\n * @returns TypeMapping configuration or default text input\n * \n * @example\n * // With datatypes (preferred - accurate baseType chain resolution)\n * const config = getInputTypeForConceptType('nl-types:monetaryNoDecimals20ItemType', datatypes);\n * \n * // Without datatypes (fallback - pattern matching)\n * const config = getInputTypeForConceptType('nl-types:monetaryNoDecimals20ItemType');\n */\nexport function getInputTypeForConceptType(\n conceptType: string | undefined, \n datatypes?: XBRLDatatype[]\n): TypeMapping {\n if (!conceptType) {\n return {\n fieldType: 'text',\n htmlInputType: 'text',\n placeholder: I18n.t('field.enterValue'),\n };\n }\n \n // NEW: If datatypes are provided, use baseType chain resolution (preferred method)\n if (datatypes && datatypes.length > 0) {\n const baseTypeChain = resolveBaseTypeChain(conceptType, datatypes);\n \n if (baseTypeChain.length > 0) {\n const config = determineInputTypeFromBaseChain(baseTypeChain, datatypes);\n \n // Log for debugging (can be removed in production)\n// console.log(`🔍 [Type Resolution] ${conceptType} → Chain:`, baseTypeChain, '→ Type:', config.fieldType, config.enumerations ? `(${config.enumerations.length} options)` : '');\n \n return config;\n }\n }\n \n // FALLBACK: If no datatypes provided or chain resolution fails, use legacy pattern matching\n console.log(`⚠️ [Type Resolution Fallback] Using pattern matching for: ${conceptType}`);\n \n // Direct match in TYPE_INPUT_MAP\n if (TYPE_INPUT_MAP[conceptType]) {\n return TYPE_INPUT_MAP[conceptType];\n }\n \n // Pattern matching for common suffixes (legacy behavior)\n const lowerType = conceptType.toLowerCase();\n \n // Monetary types\n if (lowerType.includes('monetary')) {\n if (lowerType.includes('nodecimals') || lowerType.includes('no-decimals')) {\n return {\n fieldType: 'number',\n htmlInputType: 'text',\n inputMode: 'decimal',\n allowDecimals: false,\n step: 1,\n placeholder: I18n.t('field.enterAmountNoDecimals'),\n };\n }\n return {\n fieldType: 'currency',\n htmlInputType: 'text',\n inputMode: 'decimal',\n allowDecimals: true,\n step: 0.01,\n placeholder: I18n.t('field.enterCurrency'),\n };\n }\n \n // Text area types (explanation, description, notes)\n if (lowerType.includes('explanation') || \n lowerType.includes('description') || \n lowerType.includes('notes') ||\n lowerType.includes('formatted')) {\n return {\n fieldType: 'textarea',\n placeholder: I18n.t('field.enterDetailedInformation'),\n };\n }\n \n // Date types\n if (lowerType.includes('date')) {\n if (lowerType.includes('time')) {\n return {\n fieldType: 'datetime',\n htmlInputType: 'datetime-local',\n };\n }\n return {\n fieldType: 'date',\n htmlInputType: 'date',\n };\n }\n \n // Boolean types\n if (lowerType.includes('boolean') || lowerType.includes('bool')) {\n return {\n fieldType: 'boolean',\n };\n }\n \n // Integer types\n if (lowerType.includes('integer') || lowerType.includes('int')) {\n const isNonNegative = lowerType.includes('nonnegative') || lowerType.includes('non-negative');\n const isPositive = lowerType.includes('positive');\n\n return {\n fieldType: 'integer',\n htmlInputType: 'text',\n inputMode: 'numeric',\n allowDecimals: false,\n min: isPositive ? 1 : isNonNegative ? 0 : undefined,\n step: 1,\n placeholder: I18n.t('field.enterWholeNumber'),\n };\n }\n\n // Decimal/numeric types\n if (lowerType.includes('decimal') ||\n lowerType.includes('numeric') ||\n lowerType.includes('number')) {\n return {\n fieldType: 'decimal',\n htmlInputType: 'text',\n inputMode: 'decimal',\n allowDecimals: true,\n step: 'any',\n placeholder: I18n.t('field.enterDecimalValue'),\n };\n }\n\n // Percentage types\n if (lowerType.includes('percent') || lowerType.includes('pure')) {\n return {\n fieldType: 'percentage',\n htmlInputType: 'text',\n inputMode: 'decimal',\n allowDecimals: true,\n step: 0.01,\n placeholder: I18n.t('field.enterPercentage'),\n };\n }\n \n // Default to text input\n return {\n fieldType: 'text',\n htmlInputType: 'text',\n placeholder: I18n.t('field.enterValue'),\n };\n}\n\n/**\n * Check if a field type should display as a textarea\n */\nexport function isTextareaType(fieldType: InputFieldType): boolean {\n return fieldType === 'textarea';\n}\n\n/**\n * Check if a field type should display as a checkbox\n */\nexport function isCheckboxType(fieldType: InputFieldType): boolean {\n return fieldType === 'boolean';\n}\n\n/**\n * Check if a field type is numeric\n */\nexport function isNumericType(fieldType: InputFieldType): boolean {\n return ['number', 'decimal', 'integer', 'currency', 'percentage'].includes(fieldType);\n}\n\n/**\n * Check if a field type should display as a select dropdown\n */\nexport function isSelectType(fieldType: InputFieldType): boolean {\n return fieldType === 'select';\n}\n\n/**\n * Recursively resolves all baseTypes in the hierarchy by traversing the datatypes chain.\n * Continues to look up baseTypes until finding a datatype with no baseType.\n * \n * @param typeName The initial type name to resolve\n * @param datatypes Array of all available datatypes from XBRL taxonomy\n * @returns Array of all baseTypes in the hierarchy chain (including the original type)\n * \n * @example\n * // For type \"nl-types:monetaryNoDecimals20ItemType\"\n * // Returns: [\"nl-types:monetaryNoDecimals20ItemType\", \"dtr-types:noDecimalsMonetaryItemType\", \"xbrli:monetaryItemType\", \"xbrli:monetary\", \"decimal\"]\n * \n * const baseTypeChain = resolveBaseTypeChain(\"nl-types:monetaryNoDecimals20ItemType\", datatypes);\n */\nexport function resolveBaseTypeChain(\n typeName: string | undefined,\n datatypes: XBRLDatatype[] | undefined\n): string[] {\n const baseTypeChain: string[] = [];\n \n // Handle null/undefined inputs\n if (!typeName) {\n return baseTypeChain;\n }\n \n if (!datatypes || datatypes.length === 0) {\n baseTypeChain.push(typeName);\n return baseTypeChain;\n }\n \n let currentType: string | null = typeName;\n \n // Keep track of visited types to prevent infinite loops\n const visitedTypes = new Set<string>();\n \n while (currentType) {\n // Add current type to the chain\n baseTypeChain.push(currentType);\n \n // Prevent infinite loops in case of circular references\n if (visitedTypes.has(currentType)) {\n console.warn(`Circular reference detected in datatype hierarchy for type: ${currentType}`);\n break;\n }\n visitedTypes.add(currentType);\n \n // Find the datatype in the datatypes array\n const foundDatatype = datatypes.find(dt => dt.type === currentType);\n \n // If datatype not found or has no baseType, we're done\n if (!foundDatatype || !foundDatatype.basetype || foundDatatype.basetype.trim() === '') {\n break;\n }\n \n // Move to the baseType for next iteration\n currentType = foundDatatype.basetype;\n }\n \n return baseTypeChain;\n}\n\n/**\n * Collects enumerations from any type in the baseType chain.\n * Traverses the entire chain and returns the first set of enumerations found.\n * This allows types to inherit enumerations from their base types.\n * \n * @param baseTypeChain Array of types from most specific to most general\n * @param datatypes Array of all available datatypes from XBRL taxonomy\n * @returns Array of enumeration options or undefined if no enumerations found\n * \n * @example\n * const chain = [\"nl-codes:yesNoItemType\", \"xbrli:stringItemType\", \"string\"];\n * const enums = collectEnumerationsFromChain(chain, datatypes);\n * // Returns: [{ id: \"nl-codes_Yes\", value: \"Ja\" }, { id: \"nl-codes_No\", value: \"Nee\" }]\n */\nexport function collectEnumerationsFromChain(\n baseTypeChain: string[],\n datatypes: XBRLDatatype[] | undefined\n): Array<{ id: string; value: string; label?: string }> | undefined {\n if (!baseTypeChain || baseTypeChain.length === 0 || !datatypes || datatypes.length === 0) {\n return undefined;\n }\n \n // Traverse the chain from most specific to most general\n for (const typeName of baseTypeChain) {\n // Find the datatype definition\n const datatype = datatypes.find(dt => dt.type === typeName);\n \n if (datatype && datatype.enumerations && datatype.enumerations.length > 0) {\n // Map enumerations to the format expected by TypeMapping\n return datatype.enumerations.map(enumItem => ({\n id: enumItem.id || enumItem.value, // Use value as fallback if id not present\n value: enumItem.value,\n label: enumItem.value // Use value as display label\n }));\n }\n }\n \n return undefined;\n}\n\n/**\n * Determines the appropriate input type configuration based on the baseType chain.\n * This method centralizes the logic for mapping XBRL type hierarchies to HTML input types.\n * \n * Priority order (checked from most specific to most general):\n * 0. Dropdown/Select for types with enumerations (HIGHEST PRIORITY)\n * 1. Textarea for formatted explanations\n * 2. Date picker for date types\n * 3. Integer input for integer types (no decimals)\n * 4. Decimal input for decimal/numeric types (with decimals)\n * 5. Boolean/checkbox for boolean types\n * 6. Textbox as default fallback\n * \n * @param baseTypeChain Array of types from most specific to most general (from resolveBaseTypeChain)\n * @param datatypes Optional array of XBRL datatypes for enumeration collection\n * @returns TypeMapping configuration for the appropriate input type\n * \n * @example\n * const chain = [\"nl-codes:yesNoItemType\", \"xbrli:stringItemType\", \"string\"];\n * const config = determineInputTypeFromBaseChain(chain, datatypes);\n * // Returns: { fieldType: 'select', enumerations: [{ id: \"nl-codes_Yes\", value: \"Ja\" }, ...] }\n */\nexport function determineInputTypeFromBaseChain(\n baseTypeChain: string[],\n datatypes?: XBRLDatatype[]\n): TypeMapping {\n if (!baseTypeChain || baseTypeChain.length === 0) {\n return {\n fieldType: 'text',\n htmlInputType: 'text',\n placeholder: I18n.t('field.enterValue'),\n };\n }\n \n // PRIORITY 0: Check for enumerations (HIGHEST PRIORITY - must be checked first)\n // If any type in the chain has enumerations, create a dropdown/select\n if (datatypes && datatypes.length > 0) {\n const enumerations = collectEnumerationsFromChain(baseTypeChain, datatypes);\n \n if (enumerations && enumerations.length > 0) {\n return {\n fieldType: 'select',\n enumerations: enumerations,\n placeholder: I18n.t('field.selectOption'),\n };\n }\n }\n \n // Convert chain to lowercase for case-insensitive matching\n const chainLower = baseTypeChain.map(type => type.toLowerCase());\n const chainString = chainLower.join('|'); // For easier contains checks\n \n // Priority 1: Check for formatted explanation (textarea)\n // Must check exact type name first, then patterns\n if (baseTypeChain.some(type => type === 'nl-types:formattedExplanationItemType') ||\n chainString.includes('formattedexplanation') ||\n chainString.includes('formatted') && chainString.includes('explanation')) {\n return {\n fieldType: 'textarea',\n placeholder: I18n.t('field.enterDetailedExplanation'),\n };\n }\n \n // Priority 2: Check for date types (calendar picker)\n if (chainLower.some(type => type.includes('date'))) {\n // Check if it's datetime\n if (chainString.includes('datetime') || chainString.includes('time')) {\n return {\n fieldType: 'datetime',\n htmlInputType: 'datetime-local',\n };\n }\n // Regular date\n return {\n fieldType: 'date',\n htmlInputType: 'date',\n };\n }\n \n // Priority 3: Check for boolean types (checkbox)\n if (chainLower.some(type => type.includes('boolean') || type.includes('bool'))) {\n return {\n fieldType: 'boolean',\n };\n }\n \n // Priority 4: Check for integer types (no decimals)\n // Must come before decimal check\n if (chainLower.some(type => type.includes('integer') || type === 'integer')) {\n const isNonNegative = chainString.includes('nonnegative') || chainString.includes('non-negative');\n const isPositive = chainString.includes('positive');\n \n return {\n fieldType: 'integer',\n htmlInputType: 'text',\n inputMode: 'numeric',\n allowDecimals: false,\n min: isPositive ? 1 : isNonNegative ? 0 : undefined,\n step: 1,\n placeholder: I18n.t('field.enterWholeNumber'),\n };\n }\n\n // Priority 5: Check for decimal/numeric types (with decimals)\n if (chainLower.some(type => type.includes('decimal') || type === 'decimal')) {\n // Check if it's monetary (currency)\n if (chainString.includes('monetary') || chainString.includes('currency')) {\n // Check if no decimals explicitly mentioned\n if (chainString.includes('nodecimals') || chainString.includes('no-decimals') || chainString.includes('nodecimals20')) {\n return {\n fieldType: 'number',\n htmlInputType: 'text',\n inputMode: 'decimal',\n allowDecimals: false,\n step: 1,\n placeholder: I18n.t('field.enterAmountNoDecimals'),\n };\n }\n\n // Regular monetary with decimals\n return {\n fieldType: 'currency',\n htmlInputType: 'text',\n inputMode: 'decimal',\n allowDecimals: true,\n step: 0.01,\n placeholder: I18n.t('field.enterCurrency'),\n };\n }\n\n // Regular decimal number\n return {\n fieldType: 'decimal',\n htmlInputType: 'text',\n inputMode: 'decimal',\n allowDecimals: true,\n step: 'any',\n placeholder: I18n.t('field.enterDecimalValue'),\n };\n }\n \n // Priority 6: Check for string types (textbox)\n if (baseTypeChain.some(type => type === 'xbrli:stringItemType') ||\n chainLower.some(type => type === 'string' || type.includes('stringitem'))) {\n return {\n fieldType: 'text',\n htmlInputType: 'text',\n placeholder: I18n.t('field.enterText'),\n };\n }\n \n // Default fallback: textbox\n return {\n fieldType: 'text',\n htmlInputType: 'text',\n placeholder: I18n.t('field.enterValue'),\n };\n}\n","import { LitElement, html, css, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { FormField, ValidationError } from '../schema/types';\nimport { XBRLDatatype } from '../schema/xbrl-types';\nimport { FormValidator } from '../utils/validation';\nimport { XBRLValidator, XBRLValidationError } from '../utils/xbrl-validation';\nimport { getInputTypeForConceptType, isTextareaType, isCheckboxType, isNumericType, resolveBaseTypeChain } from '../utils/type-input-mapping';\nimport { I18n } from '../utils/i18n';\nimport { FactMatcher, XBRLFact } from '../utils/fact-matcher';\n\n@customElement('jupiter-form-field')\nexport class JupiterFormField extends LitElement {\n @property({ type: Object }) field!: FormField;\n @property({ type: String }) conceptId!: string;\n @property({ type: String }) conceptType?: string; // XBRL concept type for input type determination\n @property({ type: Array }) datatypes?: XBRLDatatype[]; // XBRL datatypes for baseType chain resolution\n @property({ type: Array }) defaultUnits: Array<Record<string, string>> = []; // Developer-provided default units per datatype\n @property({ type: String }) columnId!: string;\n @property() value: any = null;\n @property({ type: Boolean }) disabled = false;\n @property({ type: String }) locale = 'en-US';\n @property({ type: Boolean }) hideLabel = false;\n @property({ type: String }) mode: 'inputForm' | 'admin' | 'readonly' = 'inputForm';\n @property({ type: Object }) masterData?: Record<string, any>;\n @property({ type: Array }) facts?: XBRLFact[]; // XBRL facts for pre-populating values based on context\n @property({ type: Object }) column?: any;\n\n // Period properties for field-level period control\n @property({ type: String }) periodStartDate?: string;\n @property({ type: String }) periodEndDate?: string;\n @property({ type: String }) periodInstantDate?: string;\n \n // Unit property for field-level unit selection\n @property({ type: String }) unit?: string;\n\n // Decimals property for XBRL decimals attribute (per-fact value)\n @property({ type: String }) decimals?: string;\n // Global decimals default ('INF' means no default, show blank)\n @property({ type: String }) globalDecimals = 'INF';\n\n // Typed member values for cross-role dimensions (axisId → value)\n @property({ type: Object }) typedMemberValues: Record<string, string> = {};\n\n @state() private _errors: ValidationError[] = [];\n @state() private _xbrlErrors: XBRLValidationError[] = [];\n @state() private _touched = false;\n @state() private _showPeriodPopup = false;\n @state() private _availableUnits: Array<{ id: string; label: string; definition?: string; isDefault?: boolean }> = [];\n @state() private _numericDraftValue: string | null = null;\n\n static styles = css`\n :host {\n display: block;\n margin-bottom: 0px; /* Remove bottom margin for table layout */\n overflow: hidden;\n min-width: 0;\n }\n\n :host([hideLabel]) {\n margin-bottom: 0px;\n }\n\n .field-container {\n position: relative;\n }\n\n .field-label {\n display: block;\n font-weight: 500;\n margin-bottom: 4px;\n color: var(--jupiter-text-primary, #333);\n font-size: 14px;\n }\n\n .field-label.required::after {\n content: ' *';\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .field-wrapper {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n overflow: hidden;\n }\n\n .period-icon-btn {\n background: transparent;\n border: none;\n cursor: pointer;\n font-size: 16px;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: background-color 0.2s;\n opacity: 0.7;\n }\n\n .period-icon-btn:hover {\n background-color: rgba(0, 0, 0, 0.05);\n opacity: 1;\n }\n\n .period-popup-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n }\n\n .period-popup {\n background: var(--bg-color-2, var(--jupiter-card-background, #fff));\n border-radius: 8px;\n padding: 24px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);\n max-width: 800px;\n width: 90%;\n }\n\n .period-popup-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n }\n\n .period-popup-title {\n font-size: 18px;\n font-weight: 600;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n }\n\n .period-popup-close {\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n background: transparent;\n border: none;\n font-size: 24px;\n cursor: pointer;\n padding: 0;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: background-color 0.2s;\n }\n\n .period-popup-close:hover {\n opacity: 0.9;\n }\n\n .period-popup-content {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .period-popup-content .period-controls {\n display: grid;\n grid-template-columns: 200px 1fr;\n gap: 12px;\n align-items: center;\n margin-top: 0;\n }\n\n .period-popup-content .period-controls label {\n font-size: 14px;\n font-weight: 500;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n text-align: right;\n white-space: normal;\n word-break: break-word;\n }\n\n .date-wrapper {\n position: relative;\n width: min-content;\n }\n\n /* hide native icon */\n input[type=\"date\"]::-webkit-calendar-picker-indicator {\n opacity: 0;\n position: absolute;\n right: 10px;\n width: 20px;\n height: 20px;\n cursor: pointer;\n }\n\n .calendar-icon-svg {\n position: absolute;\n right: 3px;\n top: 18px;\n transform: translateY(-50%);\n width: 20px;\n height: 20px;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n pointer-events: none;\n }\n\n .period-popup-content .period-controls input[type=\"date\"] {\n padding: 8px 10px;\n font-size: 14px;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 4px;\n background: var(--bg-color-2, var(--jupiter-card-background, #fff));\n }\n\n .period-popup-content .period-controls input[type=\"date\"]:focus {\n outline: none;\n border-color: var(--jupiter-primary-color, #1976d2);\n box-shadow: 0 0 0 2px var(--jupiter-primary-color-light, rgba(25, 118, 210, 0.2));\n }\n\n .period-popup-content .period-controls .unit-select {\n padding: 8px 10px;\n font-size: 14px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 4px;\n background: var(--bg-color-2, var(--jupiter-input-background, #fff));\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n cursor: pointer;\n }\n\n .period-popup-content .period-controls .unit-select:focus {\n outline: none;\n box-shadow: 0 0 0 2px var(--jupiter-primary-color-light, rgba(25, 118, 210, 0.2));\n }\n\n .period-popup-content .period-controls .unit-select:disabled {\n background: var(--jupiter-disabled-background, #f5f5f5);\n color: var(--jupiter-disabled-text, #999);\n cursor: not-allowed;\n }\n\n .period-popup-content .period-controls .typed-member-input {\n flex: 1;\n padding: 6px 8px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n font-size: 13px;\n font-family: inherit;\n background: var(--jupiter-input-background, #fff);\n }\n\n .period-popup-content .period-controls .typed-member-input:focus {\n outline: none;\n border-color: var(--jupiter-primary-color, #1976d2);\n box-shadow: 0 0 0 2px var(--jupiter-primary-color-light, rgba(25, 118, 210, 0.2));\n }\n\n .period-popup-content .period-controls .typed-member-input:disabled {\n background: var(--jupiter-disabled-background, #f5f5f5);\n color: var(--jupiter-disabled-text, #999);\n cursor: not-allowed;\n }\n\n .field-input {\n width: 100%;\n padding: 6px 8px; /* Reduced padding for table cells */\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 4px;\n font-size: 13px; /* Slightly smaller font for table */\n font-family: inherit;\n background: transparent !important;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n box-sizing: border-box;\n }\n\n .field-input:focus {\n outline: none;\n border-color: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));\n box-shadow: 0 0 0 2px var(--boxShadowColor, var(--jupiter-primary-color-light, rgba(25, 118, 210, 0.2)));\n }\n\n .field-input:disabled {\n background: var(--jupiter-disabled-background, #f5f5f5);\n color: var(--jupiter-disabled-text, #999);\n cursor: not-allowed;\n }\n\n .field-input.error {\n border-color: var(--jupiter-error-color, #d32f2f);\n }\n\n .field-input.warning {\n border-color: var(--jupiter-warning-color, #ff9800);\n }\n\n .field-input.monetary {\n text-align: right;\n }\n\n .field-errors {\n margin-top: 4px;\n }\n\n .field-error {\n display: block;\n font-size: 12px;\n margin-bottom: 2px;\n }\n\n .field-error.error {\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .field-error.warning {\n color: var(--jupiter-warning-color, #ff9800);\n }\n\n .field-error.info {\n color: var(--jupiter-info-color, #2196f3);\n }\n\n select.field-input {\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e\");\n background-position: right 8px center;\n background-repeat: no-repeat;\n background-size: 16px;\n padding-right: 32px;\n }\n\n textarea.field-input {\n resize: vertical;\n min-height: 60px;\n }\n\n .readonly-value {\n display: block;\n padding: 6px 0;\n color: var(--jupiter-text-primary, #333);\n font-size: inherit;\n line-height: 1.4;\n word-break: break-word;\n min-height: 1.4em;\n text-align: left;\n }\n\n .readonly-value.empty {\n color: var(--jupiter-text-secondary, #999);\n font-style: italic;\n }\n\n .readonly-value.monetary {\n text-align: right;\n width: 100%;\n }\n\n .checkbox-container {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .checkbox-container input[type=\"checkbox\"] {\n margin: 0;\n width: auto;\n }\n\n \n\n \n\n .period-controls {\n margin-top: 4px;\n display: flex;\n gap: 8px;\n align-items: center;\n font-size: 12px;\n }\n\n .period-controls label {\n color: var(--jupiter-text-secondary, #666);\n font-weight: 500;\n font-size: 11px;\n margin: 0;\n }\n\n .period-controls input[type=\"date\"] {\n padding: 4px 6px;\n font-size: 11px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 3px;\n width: 120px;\n }\n\n .period-controls input[type=\"date\"]:focus {\n outline: none;\n border-color: var(--jupiter-primary-color, #1976d2);\n }\n\n /* Text dialog trigger — empty state */\n .text-trigger-btn {\n flex: 1;\n min-width: 0;\n padding: 5px 8px;\n border: 1px dashed var(--jupiter-border-color, #bbb);\n border-radius: 4px;\n background: transparent;\n color: var(--jupiter-text-secondary, #888);\n font-size: 12px;\n cursor: pointer;\n text-align: center;\n font-family: inherit;\n box-sizing: border-box;\n }\n\n .text-trigger-btn:hover {\n border-color: var(--jupiter-primary-color, #1976d2);\n color: var(--jupiter-primary-color, #1976d2);\n background: rgba(25, 118, 210, 0.04);\n }\n\n /* Text dialog trigger — filled state */\n .text-filled {\n display: flex;\n align-items: center;\n gap: 4px;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n }\n\n .text-filled-label {\n flex: 1;\n font-size: 13px;\n color: var(--jupiter-text-primary, #333);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n cursor: pointer;\n min-width: 0;\n }\n\n .text-filled-label:hover {\n color: var(--jupiter-primary-color, #1976d2);\n }\n\n .text-edit-btn {\n flex-shrink: 0;\n padding: 2px 7px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 3px;\n background: transparent;\n color: var(--jupiter-text-secondary, #666);\n font-size: 11px;\n cursor: pointer;\n font-family: inherit;\n white-space: nowrap;\n }\n\n .text-edit-btn:hover {\n border-color: var(--jupiter-primary-color, #1976d2);\n color: var(--jupiter-primary-color, #1976d2);\n background: rgba(25, 118, 210, 0.04);\n }\n\n /* Read-only filled text (disabled/inputForm) */\n .text-readonly-label {\n display: block;\n font-size: 13px;\n color: var(--jupiter-text-primary, #333);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n min-width: 0;\n }\n\n .text-readonly-label.empty {\n color: var(--jupiter-text-secondary, #999);\n font-style: italic;\n }\n `;\n\n protected willUpdate(changedProperties: PropertyValues) {\n if (changedProperties.has('value') || changedProperties.has('field')) {\n this._validateField();\n }\n \n // CRITICAL: If unit property changes (from draft restore or parent update), notify parent\n if (changedProperties.has('unit') && this.unit) {\n console.log(`🏷️ [FormField willUpdate] Unit property changed to: ${this.unit}, conceptId: ${this.conceptId}, columnId: ${this.columnId}`);\n // Dispatch unit-change event to ensure parent stores it\n this.dispatchEvent(new CustomEvent('unit-change', {\n detail: {\n fieldId: this.field?.id,\n conceptId: this.conceptId,\n columnId: this.columnId,\n unit: this.unit\n },\n bubbles: true,\n composed: true\n }));\n }\n \n // Debug period date changes\n if (changedProperties.has('field') && this.field) {\n if (this.conceptId.includes('DescriptionLocationNL') || this.columnId.startsWith('col-')) {\n console.log(`📅 [FormField willUpdate] Concept ${this.conceptId}, Column ${this.columnId}: field.periodType=${this.field.periodType}, field.periodStartDate=${this.field.periodStartDate}, field.periodEndDate=${this.field.periodEndDate}, field.periodInstantDate=${this.field.periodInstantDate}`);\n }\n }\n }\n\n private _validateField() {\n if (this.field?.validation) {\n this._errors = FormValidator.validateField(\n this.field.id,\n this.conceptId,\n this.columnId,\n this.value,\n this.field.type,\n this.field.validation\n );\n }\n }\n\n private _isRoundingLevelConcept(): boolean {\n return !!this.conceptId && this.conceptId.includes('DocumentIntendedRoundingLevel');\n }\n\n private _isNumericField(): boolean {\n const typeConfig = getInputTypeForConceptType(this.conceptType, this.datatypes);\n const effectiveFieldType = typeConfig.fieldType || this.field?.type || 'text';\n return isNumericType(effectiveFieldType) || this._getInputType() === 'number';\n }\n\n private _isIntermediateNumericValue(raw: string): boolean {\n return raw === '-' || raw === '.' || raw === '-.';\n }\n\n private _handleInput(event: Event) {\n const target = event.target as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n const oldValue = this.value;\n let value: any = target.value;\n\n // Convert value based on field type\n if (this._isNumericField()) {\n const rawValue = target.value;\n this._numericDraftValue = rawValue;\n\n if (rawValue === '' || this._isIntermediateNumericValue(rawValue)) {\n value = null;\n } else {\n const parsed = Number(rawValue);\n value = Number.isNaN(parsed) ? null : parsed;\n }\n } else if (this.field.type === 'boolean') {\n value = (target as HTMLInputElement).checked;\n this._numericDraftValue = null;\n } else {\n this._numericDraftValue = null;\n }\n\n this.value = value;\n this._touched = true;\n \n this.dispatchEvent(new CustomEvent('field-change', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId,\n value,\n oldValue\n },\n bubbles: true\n }));\n }\n\n private _handleFocus() {\n this.dispatchEvent(new CustomEvent('field-focus', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId\n },\n bubbles: true\n }));\n }\n\n private _handleBlur() {\n if (this._isNumericField() && this._numericDraftValue !== null) {\n const raw = this._numericDraftValue;\n if (raw === '' || this._isIntermediateNumericValue(raw)) {\n this.value = null;\n } else {\n const parsed = Number(raw);\n this.value = Number.isNaN(parsed) ? null : parsed;\n }\n this._numericDraftValue = null;\n }\n\n this._touched = true;\n\n // Perform XBRL datatype validation on blur (only when value is not blank)\n this._validateXBRLDatatype();\n\n // Validate unit selection: if units are available but none selected, add error\n this._validateUnitSelection();\n\n console.log(`🟦 [FormField] Blur event - fieldId: ${this.field.id}, conceptId: ${this.conceptId}, columnId: ${this.columnId}`);\n console.log(`🟦 [FormField] Current _xbrlErrors:`, this._xbrlErrors);\n console.log(`🟦 [FormField] Current value:`, this.value);\n \n this.dispatchEvent(new CustomEvent('field-blur', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId,\n xbrlValidationErrors: this._xbrlErrors\n },\n bubbles: true,\n composed: true // CRITICAL: Allow event to cross Shadow DOM boundaries\n }));\n \n console.log(`🟦 [FormField] Dispatched field-blur event with ${this._xbrlErrors.length} errors`);\n }\n\n /**\n * Checks if the concept type or its baseType chain contains monetary type\n */\n private _isMonetaryType(): boolean {\n if (!this.conceptType || !this.datatypes) {\n return false;\n }\n\n // Check if current type is monetary\n if (this.conceptType.includes('monetary') || this.conceptType.includes('Monetary')) {\n return true;\n }\n\n // Check baseType chain for monetary type\n const baseTypeChain = resolveBaseTypeChain(this.conceptType, this.datatypes);\n return baseTypeChain.some(type => \n type.includes('monetary') || type.includes('Monetary')\n );\n }\n\n /**\n * Prevents non-numeric input in number fields for Firefox compatibility\n * Firefox allows typing any character in type=\"number\" inputs\n */\n private _handleKeyDown(event: KeyboardEvent) {\n const target = event.target as HTMLInputElement;\n\n // Only apply to numeric fields (now rendered as type=\"text\")\n if (!this._isNumericField()) {\n return;\n }\n\n // Allow control keys: backspace, delete, tab, escape, enter, arrows\n const allowedKeys = [\n 'Backspace', 'Delete', 'Tab', 'Escape', 'Enter',\n 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown',\n 'Home', 'End'\n ];\n\n if (allowedKeys.includes(event.key)) {\n return;\n }\n\n // Allow Ctrl/Cmd shortcuts (copy, paste, select all, etc.)\n if (event.ctrlKey || event.metaKey) {\n return;\n }\n\n // Allow negative sign at the start, unless min >= 0 (non-negative types)\n const typeConfig = getInputTypeForConceptType(this.conceptType, this.datatypes);\n const allowNegative = typeConfig.min === undefined || typeConfig.min < 0;\n if (\n event.key === '-'\n && allowNegative\n && !target.value.includes('-')\n && (target.selectionStart === 0 || target.value.length === 0)\n ) {\n return;\n }\n\n // Allow decimal point if type supports decimals and not already present\n if (event.key === '.' && typeConfig.allowDecimals !== false && !target.value.includes('.')) {\n return;\n }\n\n // Allow digits\n if (event.key >= '0' && event.key <= '9') {\n return;\n }\n\n // Block all other characters\n event.preventDefault();\n }\n\n /**\n * Validates the current value against XBRL datatype validation rules\n * Called on blur event when user loses focus on the input field\n */\n private _validateXBRLDatatype() {\n // Clear previous XBRL validation errors\n this._xbrlErrors = [];\n\n // Skip if value is blank (validation only runs on non-empty values)\n if (this.value === null || this.value === undefined || this.value === '') {\n return;\n }\n\n // Skip if no concept type or datatypes available\n if (!this.conceptType || !this.datatypes || this.datatypes.length === 0) {\n return;\n }\n\n // Perform validation\n const validationResult = XBRLValidator.validateConceptValue(\n this.conceptType,\n this.value,\n this.datatypes\n );\n\n // Store XBRL validation errors\n if (!validationResult.valid) {\n this._xbrlErrors = validationResult.errors;\n \n // Log validation errors for debugging\n console.log(`❌ [FormField] XBRL Validation failed for ${this.conceptId}:`, {\n conceptType: this.conceptType,\n value: this.value,\n errors: this._xbrlErrors\n });\n } else {\n console.log(`✅ [FormField] XBRL Validation passed for ${this.conceptId}`);\n }\n }\n\n /**\n * Validates that a unit is selected when units are available and a value has been entered.\n * Appends a unit error to _xbrlErrors if validation fails.\n * Called after _validateXBRLDatatype() so it can append to existing errors.\n */\n private _validateUnitSelection() {\n // Only validate when a value has been entered\n if (this.value === null || this.value === undefined || this.value === '') {\n return;\n }\n\n // Check if this concept type has available units\n const availableUnits = this._collectUnitsForConceptType();\n if (availableUnits.length === 0) {\n return;\n }\n\n // If a unit is already selected there is nothing to validate\n if (this.unit) return;\n\n // Try to auto-resolve a default unit (same priority logic as _handlePeriodIconClick):\n // Priority 1: unit with isDefault=true (set by defaultUnits input prop via _applyDefaultUnitsToData)\n // Priority 2: single available unit\n const defaultUnit = availableUnits.find(u => u.isDefault === true)\n ?? (availableUnits.length === 1 ? availableUnits[0] : null);\n\n if (defaultUnit) {\n // Silently auto-select the default unit and notify the parent — no error\n this.unit = defaultUnit.id;\n this.dispatchEvent(new CustomEvent('unit-change', {\n detail: { fieldId: this.field.id, conceptId: this.conceptId, columnId: this.columnId, unit: this.unit },\n bubbles: true,\n composed: true\n }));\n console.log(`🎯 [FormField] Auto-selected default unit on blur: ${this.unit} for ${this.conceptId}`);\n return;\n }\n\n // No default unit available and user has not selected one — require selection\n this._xbrlErrors = [\n ...this._xbrlErrors,\n {\n type: 'unit',\n message: I18n.t('validation.unitRequired'),\n expectedValue: availableUnits.map(u => u.label).join(', '),\n actualValue: ''\n }\n ];\n console.log(`❌ [FormField] Unit validation failed for ${this.conceptId}: unit is required but not selected`);\n }\n\n private _handlePeriodIconClick() {\n if (this._isRoundingLevelConcept()) {\n return;\n }\n\n // Collect available units for this concept type\n this._availableUnits = this._collectUnitsForConceptType();\n console.log(`📊 [FormField] Collected ${this._availableUnits.length} units for concept ${this.conceptId}:`, this._availableUnits);\n console.log(`📊 [FormField] Current unit value: ${this.unit}`);\n console.log(`📊 [FormField] ConceptId: ${this.conceptId}, ColumnId: ${this.columnId}`);\n \n // Auto-select unit if no unit is currently set\n if (!this.unit && this._availableUnits.length > 0) {\n let unitToSelect: string | null = null;\n \n // Priority 1: Unit with isDefault=true from XBRL datatype (includes developer overrides)\n const defaultUnit = this._availableUnits.find(u => u.isDefault === true);\n if (defaultUnit) {\n unitToSelect = defaultUnit.id;\n console.log(`🎯 [FormField] Auto-selecting default unit: ${defaultUnit.id} (${defaultUnit.label})`);\n }\n // Priority 2: If only one unit available, select it\n else if (this._availableUnits.length === 1) {\n unitToSelect = this._availableUnits[0].id;\n console.log(`🎯 [FormField] Auto-selecting single available unit: ${unitToSelect}`);\n }\n \n // Set the selected unit and dispatch event\n if (unitToSelect) {\n this.unit = unitToSelect;\n this.dispatchEvent(new CustomEvent('unit-change', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId,\n unit: this.unit\n },\n bubbles: true,\n composed: true\n }));\n }\n }\n // CRITICAL: If unit is already set (from draft or previous selection), ensure parent knows about it\n else if (this.unit) {\n console.log(`📊 [FormField] Unit already set, dispatching unit-change to ensure parent stores it: ${this.unit}`);\n this.dispatchEvent(new CustomEvent('unit-change', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId,\n unit: this.unit\n },\n bubbles: true,\n composed: true\n }));\n }\n \n this._showPeriodPopup = true;\n }\n\n /**\n * Collects units from the concept's type or its basetype chain\n * @returns Array of unit objects with id, label, and isDefault\n */\n private _collectUnitsForConceptType(): Array<{ id: string; label: string; definition?: string; isDefault?: boolean }> {\n if (!this.conceptType || !this.datatypes) {\n return [];\n }\n\n // Use the imported resolveBaseTypeChain function\n const baseTypeChain = resolveBaseTypeChain(this.conceptType, this.datatypes);\n \n console.log(`🔍 [Unit Resolution] Concept: ${this.conceptId}, Type: ${this.conceptType}, BaseType Chain:`, baseTypeChain);\n \n // Search for units in the basetype chain\n for (const typeName of baseTypeChain) {\n const datatype = this.datatypes.find(dt => dt.type === typeName);\n \n if (datatype && datatype.units && Array.isArray(datatype.units) && datatype.units.length > 0) {\n console.log(`✅ [Unit Resolution] Found ${datatype.units.length} units in type: ${typeName}`);\n return datatype.units;\n }\n }\n \n console.log(`ℹ️ [Unit Resolution] No units found for concept ${this.conceptId}`);\n return [];\n }\n\n private _closePeriodPopup() {\n this._showPeriodPopup = false;\n }\n\n private _handleUnitChange(event: Event) {\n const target = event.target as HTMLSelectElement;\n const value = target.value;\n\n console.log(`🏷️ [FormField] Unit change detected: value=${value}, conceptId=${this.conceptId}, columnId=${this.columnId}`);\n console.log(`🏷️ [FormField] Previous unit value: ${this.unit}`);\n\n // Update local unit value\n this.unit = value;\n console.log(`🏷️ [FormField] Updated unit value to: ${this.unit}`);\n\n // Dispatch unit change event\n const eventDetail = {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId,\n unit: this.unit\n };\n console.log(`🏷️ [FormField] Dispatching unit-change event with detail:`, eventDetail);\n \n this.dispatchEvent(new CustomEvent('unit-change', {\n detail: eventDetail,\n bubbles: true,\n composed: true\n }));\n \n console.log(`🏷️ [FormField] unit-change event dispatched`);\n }\n\n private _handleDecimalsChange(event: Event) {\n const raw = (event.target as HTMLInputElement).value.trim();\n // Only allow non-negative integers\n const num = parseFloat(raw);\n const value = raw && !isNaN(num) ? String(Math.abs(num)) : (raw === '' ? '' : raw);\n this.decimals = value || undefined;\n this.dispatchEvent(new CustomEvent('decimals-change', {\n detail: { conceptId: this.conceptId, columnId: this.columnId, decimals: this.decimals },\n bubbles: true,\n composed: true\n }));\n }\n\n private _handlePopupOverlayClick(e: Event) {\n // Close popup if clicking outside the popup content\n if (e.target === e.currentTarget) {\n this._closePeriodPopup();\n }\n }\n\n private _ensureTextDialogStyles() {\n if (document.getElementById('jdf-text-dialog-styles')) return;\n const style = document.createElement('style');\n style.id = 'jdf-text-dialog-styles';\n style.textContent = `\n dialog.jdf-text-entry-dialog {\n border: none; border-radius: 8px; padding: 0;\n max-width: 600px; width: 90vw;\n box-shadow: 0 8px 32px rgba(0,0,0,0.2); overflow: hidden;\n font-family: inherit;\n }\n dialog.jdf-text-entry-dialog::backdrop { background: rgba(0,0,0,0.35); }\n .jdf-text-dialog-header {\n background: #f0f2f5; padding: 14px 20px;\n display: flex; align-items: center; justify-content: space-between;\n border-bottom: 1px solid #ddd;\n }\n .jdf-text-dialog-title {\n font-size: 15px; font-weight: 600; color: #333; margin: 0;\n font-family: inherit; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n }\n .jdf-text-dialog-close {\n flex-shrink: 0; width: 28px; height: 28px; border: none; background: transparent;\n font-size: 20px; line-height: 1; cursor: pointer; color: #666;\n border-radius: 4px; display: flex; align-items: center; justify-content: center;\n padding: 0; font-family: inherit; margin-left: 8px;\n }\n .jdf-text-dialog-close:hover { background: #ddd; color: #333; }\n .jdf-text-dialog-body { padding: 20px 20px 12px; }\n .jdf-text-dialog-textarea {\n width: 100%; min-height: 200px; max-height: 50vh;\n padding: 10px 12px; font-size: 14px; font-family: inherit;\n border: 1px solid #ddd; border-radius: 4px;\n box-sizing: border-box; resize: vertical; line-height: 1.5;\n color: #333; background: #fff;\n }\n .jdf-text-dialog-textarea:focus {\n outline: none; border-color: #1976d2;\n box-shadow: 0 0 0 2px rgba(25,118,210,0.2);\n }\n .jdf-text-dialog-char-count {\n margin-top: 4px; font-size: 12px; color: #888; text-align: right;\n font-family: inherit;\n }\n .jdf-text-dialog-actions {\n display: flex; justify-content: flex-end; gap: 8px;\n padding: 12px 20px 16px; border-top: 1px solid #eee;\n }\n .jdf-text-dialog-cancel {\n padding: 7px 18px; border: 1px solid #ddd; border-radius: 4px;\n background: transparent; color: #555; font-size: 14px;\n cursor: pointer; font-family: inherit;\n }\n .jdf-text-dialog-cancel:hover { background: #f5f5f5; }\n .jdf-text-dialog-save {\n padding: 7px 18px; border: none; border-radius: 4px;\n background: #1976d2; color: #fff; font-size: 14px;\n cursor: pointer; font-family: inherit; font-weight: 500;\n }\n .jdf-text-dialog-save:hover { background: #1565c0; }\n `;\n document.head.appendChild(style);\n }\n\n private _openTextDialog(currentValue: string, fieldLabel: string) {\n this._ensureTextDialogStyles();\n\n // Single-instance guard\n document.getElementById('jdf-text-entry-dialog')?.remove();\n\n const dialog = document.createElement('dialog');\n dialog.id = 'jdf-text-entry-dialog';\n dialog.className = 'jdf-text-entry-dialog';\n dialog.setAttribute('role', 'dialog');\n dialog.setAttribute('aria-modal', 'true');\n dialog.setAttribute('aria-labelledby', 'jdf-text-dialog-title');\n\n dialog.innerHTML = `\n <div class=\"jdf-text-dialog-header\">\n <h3 class=\"jdf-text-dialog-title\" id=\"jdf-text-dialog-title\"></h3>\n <button class=\"jdf-text-dialog-close\" type=\"button\" aria-label=\"Close\">×</button>\n </div>\n <div class=\"jdf-text-dialog-body\">\n <textarea class=\"jdf-text-dialog-textarea\" spellcheck=\"true\"></textarea>\n <div class=\"jdf-text-dialog-char-count\"></div>\n </div>\n <div class=\"jdf-text-dialog-actions\">\n <button class=\"jdf-text-dialog-cancel\" type=\"button\"></button>\n <button class=\"jdf-text-dialog-save\" type=\"button\"></button>\n </div>\n `;\n\n // Safely set dynamic text (no XSS). Strip \"Description of …\" / \"Beschrijving van …\" prefixes.\n const cleanTitle = fieldLabel\n dialog.querySelector('.jdf-text-dialog-title')!.textContent = cleanTitle || fieldLabel;\n dialog.querySelector('.jdf-text-dialog-cancel')!.textContent = I18n.t('field.cancel');\n dialog.querySelector('.jdf-text-dialog-save')!.textContent = I18n.t('field.save');\n\n const textarea = dialog.querySelector('.jdf-text-dialog-textarea') as HTMLTextAreaElement;\n const charCount = dialog.querySelector('.jdf-text-dialog-char-count') as HTMLElement;\n textarea.value = currentValue;\n charCount.textContent = `${currentValue.length} ${I18n.t('field.characters')}`;\n\n textarea.addEventListener('input', () => {\n charCount.textContent = `${textarea.value.length} ${I18n.t('field.characters')}`;\n });\n\n dialog.querySelector('.jdf-text-dialog-close')!.addEventListener('click', () => dialog.close());\n dialog.querySelector('.jdf-text-dialog-cancel')!.addEventListener('click', () => dialog.close());\n\n dialog.querySelector('.jdf-text-dialog-save')!.addEventListener('click', () => {\n const newValue = textarea.value;\n const oldValue = this.value;\n this.value = newValue;\n this._touched = true;\n this.dispatchEvent(new CustomEvent('field-change', {\n detail: { fieldId: this.field.id, conceptId: this.conceptId, columnId: this.columnId, value: newValue, oldValue },\n bubbles: true\n }));\n dialog.close();\n });\n\n // Close on backdrop click\n dialog.addEventListener('click', (ev: MouseEvent) => {\n const rect = dialog.getBoundingClientRect();\n if (ev.clientX < rect.left || ev.clientX > rect.right ||\n ev.clientY < rect.top || ev.clientY > rect.bottom) {\n dialog.close();\n }\n });\n\n dialog.addEventListener('close', () => dialog.remove());\n\n document.body.appendChild(dialog);\n dialog.showModal();\n textarea.focus();\n }\n\n private _renderTextDialogTrigger(effectiveValue: any, effectiveDisabled: boolean) {\n const hasValue = effectiveValue !== null && effectiveValue !== undefined && String(effectiveValue).trim() !== '';\n const displayText = hasValue ? String(effectiveValue) : '';\n\n if (effectiveDisabled) {\n return html`\n <span class=\"text-readonly-label ${hasValue ? '' : 'empty'}\"\n title=\"${displayText}\">${hasValue ? displayText : '—'}</span>\n `;\n }\n\n if (!hasValue) {\n return html`\n <button class=\"text-trigger-btn\" type=\"button\"\n aria-label=\"${I18n.t('field.addText')}\"\n @click=\"${() => this._openTextDialog('', this.field?.label || '')}\">\n + ${I18n.t('field.addText')}\n </button>\n `;\n }\n\n return html`\n <div class=\"text-filled\">\n <span class=\"text-filled-label\" title=\"${displayText}\"\n @click=\"${() => this._openTextDialog(displayText, this.field?.label || '')}\">\n ${displayText}\n </span>\n <button class=\"text-edit-btn\" type=\"button\"\n aria-label=\"${I18n.t('field.editText')}\"\n @click=\"${() => this._openTextDialog(displayText, this.field?.label || '')}\">\n ✎ ${I18n.t('field.editText')}\n </button>\n </div>\n `;\n }\n\n private _handlePeriodChange(event: Event, type: 'start' | 'end' | 'instant') {\n const target = event.target as HTMLInputElement;\n const value = target.value;\n\n console.log(`📅 [FormField] Period change detected: type=${type}, value=${value}, conceptId=${this.conceptId}, columnId=${this.columnId}`);\n\n // Update local period values\n if (type === 'instant') {\n this.periodInstantDate = value;\n } else if (type === 'start') {\n this.periodStartDate = value;\n } else if (type === 'end') {\n this.periodEndDate = value;\n }\n\n console.log(`📅 [FormField] Updated local period values: startDate=${this.periodStartDate}, endDate=${this.periodEndDate}, instantDate=${this.periodInstantDate}`);\n\n // Dispatch period change event with composed:true to cross shadow DOM boundaries\n this.dispatchEvent(new CustomEvent('period-change', {\n detail: {\n fieldId: this.field.id,\n conceptId: this.conceptId,\n columnId: this.columnId,\n periodType: this.field.periodType,\n periodStartDate: this.periodStartDate,\n periodEndDate: this.periodEndDate,\n periodInstantDate: this.periodInstantDate,\n unit: this.unit\n },\n bubbles: true,\n composed: true // CRITICAL: Allows event to cross shadow DOM boundaries\n }));\n \n console.log(`🚀 [FormField] Dispatched period-change event with detail:`, {\n conceptId: this.conceptId,\n columnId: this.columnId,\n periodType: this.field.periodType\n });\n }\n\n private _handleCrossRoleTypedMemberChange(event: Event, axisId: string) {\n const value = (event.target as HTMLInputElement).value;\n this.typedMemberValues = { ...this.typedMemberValues, [axisId]: value };\n this.dispatchEvent(new CustomEvent('typed-member-change', {\n detail: {\n columnId: this.columnId,\n conceptId: this.conceptId,\n axisId,\n value\n },\n bubbles: true,\n composed: true\n }));\n }\n\n /**\n * Renders a plain text label for readonly mode instead of an interactive input.\n * Resolves the display value for selects (shows label, not raw id) and\n * booleans (shows Yes/No).\n */\n private _renderReadonlyValue(effectiveValue: any) {\n const typeConfig = getInputTypeForConceptType(this.conceptType, this.datatypes);\n const effectiveFieldType = typeConfig.fieldType || this.field.type || 'text';\n\n let displayValue: string;\n\n if (effectiveFieldType === 'boolean' || isCheckboxType(effectiveFieldType)) {\n // Boolean: show Yes / No\n displayValue = effectiveValue ? I18n.t('form.yes') : I18n.t('form.no');\n } else if (effectiveFieldType === 'select' || this.field.type === 'select') {\n // Select: resolve the label for the stored value\n const selectOptions = typeConfig.enumerations || this.field.options || [];\n const match = selectOptions.find(o => o.value === effectiveValue);\n displayValue = match ? (match.label || match.value) : (effectiveValue ?? '');\n } else {\n displayValue = effectiveValue !== null && effectiveValue !== undefined ? String(effectiveValue) : '';\n }\n\n const isEmpty = displayValue === '' || displayValue === null || displayValue === undefined;\n const isMonetary = this._isMonetaryType();\n return html`<span class=\"readonly-value ${isEmpty ? 'empty' : ''} ${isMonetary ? 'monetary' : ''}\">${isEmpty ? '—' : displayValue}</span>`;\n }\n\n private _renderInput(effectiveValue: any = this.value, effectiveDisabled: boolean = this.disabled) {\n // In readonly mode, render a plain label instead of any input element\n if (this.mode === 'readonly') {\n return this._renderReadonlyValue(effectiveValue);\n }\n\n const hasErrors = this._errors.some(e => e.severity === 'error');\n const hasWarnings = this._errors.some(e => e.severity === 'warning');\n const isMonetary = this._isMonetaryType();\n const cssClass = `field-input ${hasErrors ? 'error' : hasWarnings ? 'warning' : ''} ${isMonetary ? 'monetary' : ''}`;\n\n // Generate unique field identifiers for form submission\n const fieldId = `${this.conceptId}__${this.columnId}`;\n const fieldName = `data[${this.conceptId}][${this.columnId}]`;\n\n // Get type mapping configuration based on concept type with baseType chain resolution\n const typeConfig = getInputTypeForConceptType(this.conceptType, this.datatypes);\n \n // Debug logging\n if (this.conceptType) {\n //console.log(`🔍 [FormField] Concept: ${this.conceptId}, Type: ${this.conceptType}, Config:`, typeConfig);\n }\n \n // Determine which field type to use (from type mapping or field.type)\n const effectiveFieldType = typeConfig.fieldType || this.field.type || 'text';\n \n // Handle textarea — dialog-based entry instead of inline textarea\n if (effectiveFieldType === 'textarea' || isTextareaType(effectiveFieldType)) {\n return this._renderTextDialogTrigger(effectiveValue, effectiveDisabled || this.field.disabled || false);\n }\n\n // Handle select dropdown (from field options OR from type mapping enumerations)\n if (effectiveFieldType === 'select' || this.field.type === 'select') {\n // Use enumerations from type mapping if available, otherwise use field options\n const selectOptions = typeConfig.enumerations || this.field.options || [];\n \n return html`\n <select\n id=\"${fieldId}\"\n name=\"${fieldName}\"\n class=\"${cssClass}\"\n .value=\"${effectiveValue ?? ''}\"\n ?disabled=\"${effectiveDisabled || this.field.disabled}\"\n @change=\"${this._handleInput}\"\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\n >\n <option value=\"\">${typeConfig.placeholder || I18n.t('field.select')}</option>\n ${selectOptions.map(option => {\n // Handle both enumeration format and field option format\n const optionValue = option.value;\n const optionLabel = option.label || option.value;\n const isDisabled = (option as any).disabled || false;\n \n return html`\n <option \n value=\"${optionValue}\"\n ?disabled=\"${isDisabled}\"\n ?selected=\"${effectiveValue === optionValue}\"\n >\n ${optionLabel}\n </option>\n `;\n })}\n </select>\n `;\n }\n\n // Handle checkbox/boolean based on type mapping\n if (effectiveFieldType === 'boolean' || isCheckboxType(effectiveFieldType)) {\n return html`\n <div class=\"checkbox-container\">\n <input\n id=\"${fieldId}\"\n name=\"${fieldName}\"\n type=\"checkbox\"\n class=\"field-input\"\n .checked=\"${Boolean(effectiveValue)}\"\n ?disabled=\"${effectiveDisabled || this.field.disabled}\"\n @change=\"${this._handleInput}\"\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\n />\n <span>${this.field.label}</span>\n </div>\n `;\n }\n\n // Handle all other input types (text, number, date, etc.)\n const inputType = typeConfig.htmlInputType || this._getInputType();\n const step = typeConfig.step !== undefined ? typeConfig.step : \n isNumericType(effectiveFieldType) ? 'any' : undefined;\n const min = typeConfig.min;\n const max = typeConfig.max;\n \n const renderedInputValue = (this._isNumericField() && this._numericDraftValue !== null)\n ? this._numericDraftValue\n : (effectiveValue ?? '');\n\n return html`\n <input\n id=\"${fieldId}\"\n name=\"${fieldName}\"\n type=\"${inputType}\"\n inputmode=\"${typeConfig.inputMode || ''}\"\n class=\"${cssClass}\"\n .value=\"${renderedInputValue}\"\n ?disabled=\"${effectiveDisabled || this.field.disabled}\"\n placeholder=\"${typeConfig.placeholder || this.field.placeholder || ''}\"\n step=\"${step !== undefined ? step : ''}\"\n min=\"${min !== undefined ? min : ''}\"\n max=\"${max !== undefined ? max : ''}\"\n @input=\"${this._handleInput}\"\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\n @keydown=\"${this._handleKeyDown}\"\n />\n `;\n }\n\n private _getInputType(): string {\n switch (this.field.type) {\n case 'number':\n case 'decimal':\n case 'currency':\n case 'percentage':\n return 'text';\n case 'date':\n return 'date';\n case 'datetime':\n return 'datetime-local';\n case 'email':\n return 'email';\n case 'url':\n return 'url';\n case 'tel':\n return 'tel';\n default:\n return 'text';\n }\n }\n\n /**\n * Extract base concept ID by removing column suffix\n * Example: \"nl-cd_LegalEntityName__4qukyf\" -> \"nl-cd_LegalEntityName\"\n */\n private _extractBaseConceptId(conceptId: string): string {\n // If conceptId contains \"__\", extract everything before the last \"__\"\n const parts = conceptId.split('__');\n if (parts.length > 1) {\n // Remove the last part (column suffix) and rejoin\n return parts.slice(0, -1).join('__');\n }\n return conceptId;\n }\n\n private _renderPeriodControls() {\n // Debug: Log field period info\n if (this.conceptId === 'nl-cd_DescriptionLocationNL__a64trl') {\n console.log(`🔍 [FormField Render] Concept: ${this.conceptId}, ColumnId: ${this.columnId}, Field periodType: ${this.field.periodType}, Field periodStartDate: ${this.field.periodStartDate}, Field periodEndDate: ${this.field.periodEndDate}`);\n }\n\n // Only show period controls if field has period type defined\n if (!this.field.periodType) {\n return html``;\n }\n\n if (this.field.periodType === 'instant') {\n return html`\n <div class=\"period-controls\">\n <label>Date:</label>\n <div class=\"date-wrapper\">\n <input\n type=\"date\"\n .value=\"${this.periodInstantDate || this.field.periodInstantDate || ''}\"\n @change=\"${(e: Event) => this._handlePeriodChange(e, 'instant')}\"\n ?disabled=\"${this.disabled}\"\n />\n <svg class=\"calendar-icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M19 4h-1V2h-2v2H8V2H6v2H5\n a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14\n a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V9h14z\"/>\n </div>\n </div>\n `;\n } else if (this.field.periodType === 'duration') {\n return html`\n <div class=\"period-controls\">\n <label>From:</label>\n <div class=\"date-wrapper\">\n <input\n type=\"date\"\n .value=\"${this.periodStartDate || this.field.periodStartDate || ''}\"\n @change=\"${(e: Event) => this._handlePeriodChange(e, 'start')}\"\n ?disabled=\"${this.disabled}\"\n />\n <svg class=\"calendar-icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M19 4h-1V2h-2v2H8V2H6v2H5\n a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14\n a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V9h14z\"/>\n </div>\n <label>To:</label>\n <div class=\"date-wrapper\">\n <input\n type=\"date\"\n .value=\"${this.periodEndDate || this.field.periodEndDate || ''}\"\n @change=\"${(e: Event) => this._handlePeriodChange(e, 'end')}\"\n ?disabled=\"${this.disabled}\"\n />\n <svg class=\"calendar-icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M19 4h-1V2h-2v2H8V2H6v2H5\n a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14\n a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V9h14z\"/>\n </div>\n </div>\n `;\n }\n\n return html``;\n }\n\n private _renderPeriodPopup() {\n return html`\n <div class=\"period-popup-overlay\" @click=\"${this._handlePopupOverlayClick}\">\n <div class=\"period-popup\" @click=\"${(e: Event) => e.stopPropagation()}\">\n <div class=\"period-popup-header\">\n <div class=\"period-popup-title\">Edit Period</div>\n <button class=\"period-popup-close\" @click=\"${this._closePeriodPopup}\">\n ×\n </button>\n </div>\n \n <div class=\"period-popup-content\">\n ${this.field.periodType === 'instant' ? html`\n <div class=\"period-controls\">\n <label>Date:</label>\n <div class=\"date-wrapper\">\n <input\n type=\"date\"\n .value=\"${this.periodInstantDate || this.field.periodInstantDate || ''}\"\n @change=\"${(e: Event) => this._handlePeriodChange(e, 'instant')}\"\n ?disabled=\"${this.disabled}\"\n />\n <svg class=\"calendar-icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M19 4h-1V2h-2v2H8V2H6v2H5\n a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14\n a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V9h14z\"/>\n </div>\n </div>\n ` : html`\n <div class=\"period-controls\">\n <label>From:</label>\n <div class=\"date-wrapper\">\n <input\n type=\"date\"\n .value=\"${this.periodStartDate || this.field.periodStartDate || ''}\"\n @change=\"${(e: Event) => this._handlePeriodChange(e, 'start')}\"\n ?disabled=\"${this.disabled}\"\n />\n <svg class=\"calendar-icon-svg\" viewBox=\"0 0 24 24\">\n <path\n fill=\"currentColor\"\n d=\"M19 4h-1V2h-2v2H8V2H6v2H5\n a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14\n a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V9h14z\"/>\n </div>\n </div>\n <div class=\"period-controls\">\n <label>To:</label>\n <div class=\"date-wrapper\">\n <input\n type=\"date\"\n .value=\"${this.periodEndDate || this.field.periodEndDate || ''}\"\n @change=\"${(e: Event) => this._handlePeriodChange(e, 'end')}\"\n ?disabled=\"${this.disabled}\"\n />\n <svg class=\"calendar-icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M19 4h-1V2h-2v2H8V2H6v2H5\n a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14\n a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V9h14z\"/>\n </div>\n </div>\n `}\n \n ${this._availableUnits.length > 0 ? html`\n <div class=\"period-controls\">\n <label>Unit:</label>\n <select\n .value=\"${this.unit || ''}\"\n @change=\"${this._handleUnitChange}\"\n ?disabled=\"${this.disabled}\"\n class=\"unit-select\"\n >\n <option value=\"\">Select Unit</option>\n ${this._availableUnits.map(unit => html`\n <option value=\"${unit.id}\" ?selected=\"${this.unit === unit.id}\">\n ${unit.label || unit.id}\n </option>\n `)}\n </select>\n </div>\n ` : ''}\n\n ${this._isMonetaryType() ? html`\n <div class=\"period-controls\">\n <label>${I18n.t('field.scale')}:</label>\n <input\n type=\"number\"\n min=\"0\"\n class=\"typed-member-input\"\n placeholder=\"Leave blank for INF\"\n .value=\"${(this.decimals !== undefined && this.decimals !== null && this.decimals !== '')\n ? this.decimals\n : (this.globalDecimals !== 'INF' ? this.globalDecimals : '')}\"\n @input=\"${this._handleDecimalsChange}\"\n ?disabled=\"${this.disabled}\"\n />\n </div>\n ` : ''}\n\n ${this.field.crossRoleTypedMembers && this.field.crossRoleTypedMembers.length > 0 ? html`\n ${this.field.crossRoleTypedMembers.map(tm => html`\n <div class=\"period-controls\">\n <label>${tm.axisLabel}:</label>\n <input\n type=\"text\"\n class=\"typed-member-input\"\n .value=\"${this.typedMemberValues[tm.axisId] || ''}\"\n @input=\"${(e: Event) => this._handleCrossRoleTypedMemberChange(e, tm.axisId)}\"\n ?disabled=\"${this.disabled}\"\n />\n </div>\n `)}\n ` : ''}\n </div>\n </div>\n </div>\n `;\n }\n\n render() {\n // Add defensive check\n if (!this.field) {\n console.error('[FormField] No field provided!', { conceptId: this.conceptId, columnId: this.columnId });\n return html`<div>Error: No field data</div>`;\n }\n \n const showLabel = !this.hideLabel && this.field.type !== 'boolean';\n const hasPeriodControl = this.field.periodType && (this.field.periodType === 'instant' || this.field.periodType === 'duration');\n \n // Extract base concept ID (remove column suffix if present)\n // conceptId may be \"nl-cd_LegalEntityName__4qukyf\" but masterData uses \"nl-cd_LegalEntityName\"\n const baseConceptId = this._extractBaseConceptId(this.conceptId);\n \n // Check if this field should be pre-populated based on masterData\n const isPredefinedValue = this.mode !== 'admin' && this.masterData && baseConceptId in this.masterData;\n const isRoundingLevelLocked = this._isRoundingLevelConcept();\n \n // Check if we should pre-populate from facts (XBRL instance data)\n let factValue: any = null;\n if (this.facts && this.facts.length > 0 && !isPredefinedValue) {\n const cellContext = {\n conceptId: baseConceptId,\n columnId: this.columnId,\n periodStartDate: this.periodStartDate || this.field.periodStartDate,\n periodEndDate: this.periodEndDate || this.field.periodEndDate,\n periodInstantDate: this.periodInstantDate || this.field.periodInstantDate,\n periodType: this.field.periodType,\n unit: this.unit,\n dimensionData: this.column?.dimensionData\n };\n \n // Debug logging for facts with dimensions\n const shouldDebugDimensions = baseConceptId.includes('BalanceSheet') || \n baseConceptId.includes('CostsIncorporation') ||\n baseConceptId.includes('Assets');\n \n if (shouldDebugDimensions && this.facts.length > 0) {\n console.log('🔍 [FormField] Attempting fact match for concept with dimensions:', {\n conceptId: baseConceptId,\n columnId: this.columnId,\n factsCount: this.facts.length,\n cellContext: {\n period: cellContext.periodType === 'instant' \n ? cellContext.periodInstantDate \n : `${cellContext.periodStartDate} / ${cellContext.periodEndDate}`,\n dimensionData: cellContext.dimensionData\n },\n facts: this.facts.map(f => ({\n value: f.value,\n period: f.period,\n dimensions: f.dimensions?.map(d => `${d.dimension}:${d.member}`)\n }))\n });\n }\n \n const matchedFact = FactMatcher.findMatchingFact(this.facts, cellContext);\n if (matchedFact) {\n factValue = matchedFact.value;\n \n // Debug log for fact matching\n if (shouldDebugDimensions || baseConceptId.includes('StreetName')) {\n console.log('✅ [FormField] Fact matched:', {\n conceptId: baseConceptId,\n columnId: this.columnId,\n factValue: matchedFact.value,\n period: matchedFact.period,\n dimensions: matchedFact.dimensions?.map(d => `${d.dimension}:${d.member}`)\n });\n }\n } else if (shouldDebugDimensions && this.facts.length > 0) {\n console.log('❌ [FormField] No fact match found for:', {\n conceptId: baseConceptId,\n columnId: this.columnId,\n factsAvailable: this.facts.length\n });\n }\n }\n \n // Determine effective value with priority: masterData > currentValue (draft/user input) > facts\n // Draft-restored values (this.value) must take priority over initial JSON facts so that\n // saving a draft and refreshing shows the saved value, not the original fact value.\n const hasUserValue = this.value !== null && this.value !== undefined;\n const effectiveValue = isPredefinedValue \n ? this.masterData![baseConceptId] \n : (hasUserValue ? this.value : factValue);\n \n // Only disable for masterData, not for facts (facts should remain editable)\n const effectiveDisabled = isPredefinedValue || isRoundingLevelLocked || this.disabled || this.mode === 'readonly';\n\n return html`\n <div class=\"field-container\">\n ${showLabel ? html`\n <label class=\"field-label ${this.field.required ? 'required' : ''}\">\n ${this.field.label}\n </label>\n ` : ''}\n \n <div class=\"field-wrapper\">\n ${this._renderInput(effectiveValue, effectiveDisabled)}\n \n ${hasPeriodControl && this.mode !== 'readonly' && !isRoundingLevelLocked ? html`\n <button\n class=\"period-icon-btn\"\n type=\"button\"\n @click=\"${this._handlePeriodIconClick}\"\n title=\"Edit period\"\n >\n 📅\n </button>\n ` : ''}\n </div>\n \n ${this._errors.length > 0 && this._touched ? html`\n <div class=\"field-errors\">\n ${this._errors.map(error => html`\n <span class=\"field-error ${error.severity}\">\n ${error.message}\n </span>\n `)}\n </div>\n ` : ''}\n \n ${this._xbrlErrors.length > 0 && this._touched ? html`\n <div class=\"field-errors\">\n ${this._xbrlErrors.map(error => html`\n <span class=\"field-error error\">\n ${error.message}\n </span>\n `)}\n </div>\n ` : ''}\n </div>\n \n ${this._showPeriodPopup ? this._renderPeriodPopup() : ''}\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { ConceptTree, FormColumn, FormField } from '../schema/types';\nimport { XBRLDatatype } from '../schema/xbrl-types';\nimport { I18n } from '../utils/i18n';\nimport './form-field';\n\n@customElement('jupiter-concept-tree')\nexport class JupiterConceptTree extends LitElement {\n @property({ type: Object }) concept!: ConceptTree;\n @property({ type: Array }) columns: FormColumn[] = [];\n @property({ type: Object }) formData: Record<string, any> = {};\n @property({ type: Object }) periodData: Record<string, Record<string, any>> = {};\n @property({ type: Object }) unitData: Record<string, Record<string, string>> = {};\n @property({ type: Object }) decimalsData: Record<string, Record<string, string>> = {};\n @property({ type: String }) globalDecimals = 'INF';\n @property({ type: Array }) defaultUnits: Array<Record<string, string>> = [];\n @property({ type: Boolean }) disabled = false;\n @property({ type: String }) locale = 'en-US';\n @property({ type: Set }) expandedConcepts: Set<string> = new Set();\n @property({ type: Array }) datatypes?: XBRLDatatype[];\n @property({ type: String }) mode: 'inputForm' | 'admin' | 'readonly' = 'inputForm';\n @property({ type: Object }) masterData?: Record<string, any>;\n @property({ type: Array }) facts?: Array<any>; // XBRL facts for pre-populating values\n @property({ type: Object }) typedMemberData: Record<string, Record<string, string>> = {};\n @property({ type: Boolean }) showAddButton = false;\n @property({ type: Boolean }) showRemoveButton = false;\n @property({ type: String }) highlightType?: 'total' | 'member';\n @property({ type: String }) highlightColumnId?: string;\n @property({ type: Object }) calculationErrorKeys?: Set<string>;\n @property({ type: String }) language = 'en';\n\n @state() private _expanded = true;\n\n static styles = css`\n :host {\n /* Component renders table cells directly */\n display: contents;\n }\n\n .concept-name-cell {\n vertical-align: top;\n padding: 2px 4px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-bottom: none;\n background: var(--jupiter-concept-background, #f8f9fa);\n position: sticky;\n left: 0;\n z-index: 1;\n width: 300px;\n min-width: 300px;\n max-width: 300px;\n }\n\n .concept-name-cell.abstract {\n background: var(--bg-color-1, var(--jupiter-abstract-background, #f0f2f5));\n font-weight: 600;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n }\n\n .concept-name-cell.leaf {\n background: var(--bg-color-2, var(--jupiter-leaf-background, #fff));\n font-weight: 400;\n }\n\n .concept-content {\n display: flex;\n align-items: center;\n min-height: 28px;\n font-size: 13px;\n line-height: 1.3;\n width: 100%;\n overflow: hidden;\n }\n\n .concept-indent {\n width: calc(var(--level, 0) * 16px);\n flex-shrink: 0;\n }\n\n .concept-toggle {\n width: 14px;\n height: 14px;\n margin-right: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n transition: transform 0.2s ease;\n cursor: pointer;\n }\n\n .concept-toggle.expanded {\n transform: rotate(90deg);\n }\n\n .concept-toggle.no-children {\n visibility: hidden;\n }\n\n .concept-label {\n flex: 1;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n cursor: pointer;\n word-wrap: break-word;\n overflow-wrap: break-word;\n hyphens: auto;\n line-height: 1.3;\n min-width: 0; /* Allows flex item to shrink below content size */\n }\n\n .concept-balance {\n margin-left: 8px;\n font-size: 11px;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 3px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n flex-shrink: 0;\n }\n\n .concept-balance.debit {\n color: #d32f2f;\n background: rgba(211, 47, 47, 0.1);\n border: 1px solid rgba(211, 47, 47, 0.3);\n }\n\n .concept-balance.credit {\n color: #388e3c;\n background: rgba(56, 142, 60, 0.1);\n border: 1px solid rgba(56, 142, 60, 0.3);\n }\n\n .field-cell {\n vertical-align: middle;\n padding: 2px 6px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-bottom: none;\n background: var(--bg-color-2, var(--jupiter-cell-background, #fff));\n min-height: 28px;\n text-align: center;\n min-width: 180px;\n width: 180px;\n }\n\n .field-cell.empty {\n background: var(--bg-color-2, var(--jupiter-empty-cell-background, #f8f9fa));\n }\n\n .field-cell.abstract-row {\n background: var(--bg-color-2, var(--jupiter-abstract-cell-background, #f0f2f5));\n }\n\n /* Children are rendered as separate table rows, not nested */\n .children-wrapper {\n display: none;\n }\n\n .repeat-btn {\n flex-shrink: 0;\n margin-left: 4px;\n width: 20px;\n height: 20px;\n padding: 0;\n border-radius: 3px;\n border: 1px solid var(--jupiter-primary-color, #1976d2);\n color: var(--jupiter-primary-color, #1976d2);\n background: transparent;\n cursor: pointer;\n font-size: 14px;\n line-height: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .repeat-btn:hover {\n background: var(--jupiter-primary-color, #1976d2);\n color: #fff;\n }\n\n .repeat-btn.remove {\n border-color: var(--jupiter-error-color, #d32f2f);\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .repeat-btn.remove:hover {\n background: var(--jupiter-error-color, #d32f2f);\n color: #fff;\n }\n\n .field-cell.highlight-total {\n background: rgba(25, 118, 210, 0.15);\n }\n\n .field-cell.highlight-member {\n background: rgba(25, 118, 210, 0.07);\n }\n\n .field-cell.calc-error {\n box-shadow: inset 0 0 0 2px var(--jupiter-error-color, #d32f2f);\n }\n\n .concept-info-btn {\n flex-shrink: 0;\n width: 22px;\n height: 22px;\n border-radius: 50%;\n border: 1px solid var(--jupiter-border-color, #cfd8dc);\n background: var(--jupiter-card-background, #fff);\n color: var(--jupiter-primary-color, #1976d2);\n font-size: 13px;\n font-weight: 700;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.15s, background 0.15s, color 0.15s, border-color 0.15s, box-shadow 0.15s;\n padding: 0;\n margin-left: 4px;\n line-height: 1;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n pointer-events: auto;\n }\n\n .concept-content:hover .concept-info-btn,\n .concept-info-btn:hover,\n .concept-info-btn:focus-visible {\n opacity: 1;\n }\n\n .concept-info-btn:hover {\n background: var(--jupiter-primary-color, #1976d2);\n color: #fff;\n border-color: var(--jupiter-primary-color, #1976d2);\n box-shadow: 0 2px 6px rgba(25, 118, 210, 0.25);\n }\n\n .concept-info-btn:focus-visible {\n outline: none;\n border-color: var(--jupiter-primary-color, #1976d2);\n box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.25);\n opacity: 1;\n }\n\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this._expanded = this.expandedConcepts.has(this.concept.id);\n }\n\n willUpdate(changedProperties: Map<string, unknown>) {\n super.willUpdate(changedProperties);\n if (changedProperties.has('expandedConcepts')) {\n this._expanded = this.expandedConcepts.has(this.concept.id);\n }\n }\n\n private _toggleExpanded() {\n this._expanded = !this._expanded;\n \n this.dispatchEvent(new CustomEvent('concept-expand', {\n detail: {\n conceptId: this.concept.id,\n expanded: this._expanded\n },\n bubbles: true\n }));\n }\n\n private _getFieldForColumn(columnId: string): FormField | undefined {\n return this.concept.fields?.find(field => field.columnId === columnId);\n }\n\n private _getFieldValue(field: FormField): any {\n return this.formData[this.concept.id]?.[field.columnId];\n }\n\n private _handleFieldChange(event: CustomEvent) {\n event.stopPropagation();\n // Re-dispatch with updated detail\n this.dispatchEvent(new CustomEvent('field-change', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _handleAddRepeat() {\n this.dispatchEvent(new CustomEvent('add-concept-repeat', {\n detail: { conceptId: this.concept.id },\n bubbles: true,\n composed: true\n }));\n }\n\n private _handleRemoveRepeat() {\n this.dispatchEvent(new CustomEvent('remove-concept-repeat', {\n detail: { conceptId: this.concept.id },\n bubbles: true,\n composed: true\n }));\n }\n\n private _handleFieldFocus(event: CustomEvent) {\n event.stopPropagation();\n this.dispatchEvent(new CustomEvent('field-focus', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _handlePeriodChange(event: CustomEvent) {\n console.log(`🌲 [ConceptTree] Received period-change event:`, event.detail);\n event.stopPropagation();\n // Forward period change event to parent with composed:true for shadow DOM\n this.dispatchEvent(new CustomEvent('period-change', {\n detail: event.detail,\n bubbles: true,\n composed: true // CRITICAL: Allows event to cross shadow DOM boundaries\n }));\n console.log(`🌲 [ConceptTree] Forwarded period-change event to form-section`);\n }\n\n private _getDocLabel(): string {\n const meta = this.concept.conceptMetadata;\n if (!meta) return '';\n const lang = this.language || this.locale.split('-')[0];\n return meta.documentationLabels[lang] || meta.documentationLabels['en'] || meta.documentationLabels['nl'] || '';\n }\n\n private _escapeHtml(str: string): string {\n return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n }\n\n private _ensureDialogStyles() {\n if (document.getElementById('jdf-concept-info-dialog-styles')) return;\n const style = document.createElement('style');\n style.id = 'jdf-concept-info-dialog-styles';\n style.textContent = `\n dialog.jdf-concept-info-dialog {\n border: none; border-radius: 8px; padding: 0;\n max-width: 480px; width: 90vw;\n box-shadow: 0 8px 32px rgba(0,0,0,0.2); overflow: hidden;\n }\n dialog.jdf-concept-info-dialog::backdrop { background: rgba(0,0,0,0.35); }\n .jdf-dialog-header {\n background: #f0f2f5; padding: 14px 20px;\n display: flex; align-items: center; justify-content: space-between;\n border-bottom: 1px solid #ddd;\n }\n .jdf-dialog-title { font-size: 15px; font-weight: 600; color: #333; margin: 0; font-family: inherit; }\n .jdf-dialog-close-btn {\n width: 28px; height: 28px; border: none; background: transparent;\n font-size: 20px; line-height: 1; cursor: pointer; color: #666;\n border-radius: 4px; display: flex; align-items: center; justify-content: center;\n padding: 0; font-family: inherit;\n }\n .jdf-dialog-close-btn:hover { background: #ddd; color: #333; }\n .jdf-dialog-body { padding: 20px; }\n .jdf-info-table { width: 100%; border-collapse: collapse; font-size: 14px; font-family: inherit; }\n .jdf-info-table tr:not(:last-child) td { border-bottom: 1px solid #f0f0f0; }\n .jdf-info-table td { padding: 9px 4px; vertical-align: top; }\n .jdf-info-label { font-weight: 600; color: #666; width: 40%; white-space: nowrap; padding-right: 16px; }\n .jdf-info-value { color: #333; word-break: break-all; }\n .jdf-info-value.doc-text { font-style: italic; color: #555; line-height: 1.5; word-break: normal; }\n .jdf-period-pill { display: inline-block; padding: 2px 8px; border-radius: 10px; font-size: 12px; font-weight: 600; }\n .jdf-period-pill.instant { background: rgba(25,118,210,0.1); color: #1565c0; border: 1px solid rgba(25,118,210,0.3); }\n .jdf-period-pill.duration { background: rgba(56,142,60,0.1); color: #2e7d32; border: 1px solid rgba(56,142,60,0.3); }\n .jdf-balance-pill { display: inline-block; padding: 2px 8px; border-radius: 10px; font-size: 12px; font-weight: 600; text-transform: capitalize; }\n .jdf-balance-pill.debit { background: rgba(211,47,47,0.1); color: #c62828; border: 1px solid rgba(211,47,47,0.3); }\n .jdf-balance-pill.credit { background: rgba(56,142,60,0.1); color: #2e7d32; border: 1px solid rgba(56,142,60,0.3); }\n `;\n document.head.appendChild(style);\n }\n\n private _openInfoDialog(e: Event) {\n e.stopPropagation();\n this._ensureDialogStyles();\n\n const meta = this.concept.conceptMetadata;\n const docLabel = this._getDocLabel();\n const periodType = meta?.periodType || this.concept.periodType;\n const balance = meta?.balance || this.concept.balance;\n\n const periodLabel = periodType === 'instant' ? I18n.t('conceptInfo.instant') : I18n.t('conceptInfo.duration');\n\n const rows: Array<{ label: string; valueHtml: string; isDoc?: boolean }> = [\n { label: I18n.t('conceptInfo.conceptName'), valueHtml: this._escapeHtml(meta?.conceptName || this.concept.name) },\n { label: I18n.t('conceptInfo.type'), valueHtml: this._escapeHtml(meta?.type || this.concept.type || '—') },\n ];\n if (meta?.substitutionGroup) {\n rows.push({ label: I18n.t('conceptInfo.substitutionGroup'), valueHtml: this._escapeHtml(meta.substitutionGroup) });\n }\n rows.push({ label: I18n.t('conceptInfo.periodType'), valueHtml: `<span class=\"jdf-period-pill ${periodType}\">${this._escapeHtml(periodLabel)}</span>` });\n if (balance) {\n rows.push({ label: I18n.t('conceptInfo.balance'), valueHtml: `<span class=\"jdf-balance-pill ${balance}\">${this._escapeHtml(balance)}</span>` });\n }\n if (docLabel) {\n rows.push({ label: I18n.t('conceptInfo.documentation'), valueHtml: this._escapeHtml(docLabel), isDoc: true });\n }\n\n const rowsHtml = rows.map(r => `\n <tr>\n <td class=\"jdf-info-label\">${this._escapeHtml(r.label)}</td>\n <td class=\"jdf-info-value${r.isDoc ? ' doc-text' : ''}\">${r.valueHtml}</td>\n </tr>\n `).join('');\n\n const dialog = document.createElement('dialog');\n dialog.className = 'jdf-concept-info-dialog';\n dialog.innerHTML = `\n <div class=\"jdf-dialog-header\">\n <h3 class=\"jdf-dialog-title\">${this._escapeHtml(I18n.t('conceptInfo.title'))}</h3>\n <button class=\"jdf-dialog-close-btn\" type=\"button\" aria-label=\"${this._escapeHtml(I18n.t('conceptInfo.close'))}\">×</button>\n </div>\n <div class=\"jdf-dialog-body\">\n <table class=\"jdf-info-table\">${rowsHtml}</table>\n </div>\n `;\n\n document.body.appendChild(dialog);\n\n dialog.querySelector('.jdf-dialog-close-btn')?.addEventListener('click', () => dialog.close());\n\n dialog.addEventListener('click', (ev: MouseEvent) => {\n const rect = dialog.getBoundingClientRect();\n if (ev.clientX < rect.left || ev.clientX > rect.right ||\n ev.clientY < rect.top || ev.clientY > rect.bottom) {\n dialog.close();\n }\n });\n\n dialog.addEventListener('close', () => document.body.removeChild(dialog));\n\n dialog.showModal();\n }\n\n render() {\n const hasChildren = this.concept.children && this.concept.children.length > 0;\n const level = this.concept.level || 0;\n const isAbstract = this.concept.abstract || false;\n\n return html`\n <!-- Concept Name Cell (Left Column) -->\n <td class=\"concept-name-cell ${isAbstract ? 'abstract' : (hasChildren ? '' : 'leaf')}\">\n <div class=\"concept-content\" style=\"--level: ${level}\">\n <div class=\"concept-indent\"></div>\n <div class=\"concept-toggle ${hasChildren ? (this._expanded ? 'expanded' : '') : 'no-children'}\"\n @click=\"${this._toggleExpanded}\">\n ${hasChildren ? '▶' : ''}\n </div>\n <div class=\"concept-label\"\n @click=\"${this._toggleExpanded}\"\n title=\"${this.concept.id}${this.concept.description ? ' - ' + this.concept.description : ''}\">\n ${this.concept.label}\n </div>\n ${this.concept.balance ? html`\n <div class=\"concept-balance ${this.concept.balance}\">${this.concept.balance}</div>\n ` : ''}\n <button class=\"concept-info-btn\" type=\"button\" title=\"${I18n.t('conceptInfo.title')}\"\n @click=\"${this._openInfoDialog}\">ℹ</button>\n ${this.showAddButton ? html`\n <button class=\"repeat-btn\" type=\"button\" title=\"Add row\"\n @click=\"${this._handleAddRepeat}\">+</button>\n ` : ''}\n ${this.showRemoveButton ? html`\n <button class=\"repeat-btn remove\" type=\"button\" title=\"Remove row\"\n @click=\"${this._handleRemoveRepeat}\">−</button>\n ` : ''}\n </div>\n </td>\n\n <!-- Input Field Cells (Period Columns) - Only for non-abstract concepts -->\n ${this.columns.map(column => {\n const field = this._getFieldForColumn(column.id);\n const shouldShowField = !isAbstract && field;\n\n // Get stored unit and decimals for this field\n const storedUnit = this.unitData?.[this.concept.id]?.[column.id];\n const storedDecimals = this.decimalsData?.[this.concept.id]?.[column.id];\n\n return html`\n <td class=\"field-cell ${!shouldShowField ? 'empty' : ''} ${isAbstract ? 'abstract-row' : ''} ${this.highlightType && column.id === this.highlightColumnId ? 'highlight-' + this.highlightType : ''} ${this.calculationErrorKeys?.has(`${this.concept.id}__${column.id}`) ? 'calc-error' : ''}\">\n ${shouldShowField ? html`\n <jupiter-form-field\n .field=\"${field}\"\n .conceptId=\"${this.concept.id}\"\n .conceptType=\"${this.concept.type}\"\n .datatypes=\"${this.datatypes}\"\n .defaultUnits=\"${this.defaultUnits}\"\n .columnId=\"${column.id}\"\n .value=\"${this._getFieldValue(field)}\"\n .unit=\"${storedUnit || ''}\"\n .decimals=\"${storedDecimals}\"\n .globalDecimals=\"${this.globalDecimals}\"\n .periodStartDate=\"${field.periodStartDate || column.periodStartDate}\"\n .periodEndDate=\"${field.periodEndDate || column.periodEndDate}\"\n .periodInstantDate=\"${field.periodInstantDate || (field.periodType === 'instant' ? (field.periodEndDate || field.periodStartDate) : undefined)}\"\n .disabled=\"${this.disabled}\"\n .locale=\"${this.locale}\"\n .hideLabel=\"${true}\"\n .mode=\"${this.mode}\"\n .masterData=\"${this.masterData}\"\n .facts=\"${this.facts}\"\n .column=\"${column}\"\n .typedMemberValues=\"${this.typedMemberData[`${this.concept.id}__${column.id}`] || {}}\"\n @field-change=\"${this._handleFieldChange}\"\n @field-focus=\"${this._handleFieldFocus}\"\n @period-change=\"${this._handlePeriodChange}\"\n ></jupiter-form-field>\n ` : ''}\n </td>\n `;\n })}\n\n `;\n }\n}\n","import { LitElement, html, css, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { I18n } from '../utils/i18n';\n\nexport interface AddColumnRequest {\n periodType: 'duration' | 'instant' | 'mixed';\n startDate?: string;\n endDate?: string;\n instantDate?: string;\n selectedDimensions?: DimensionSelection[];\n}\n\nexport interface DimensionSelection {\n axisId: string;\n axisLabel: string;\n memberId?: string;\n memberLabel?: string;\n isTyped?: boolean;\n typedValue?: string;\n}\n\nexport interface AvailableDimension {\n id: string;\n conceptName: string;\n axisLabel: string;\n members?: AvailableDimensionMember[];\n typedMember?: {\n id: string;\n dataType: string;\n };\n}\n\nexport interface AvailableDimensionMember {\n id: string;\n label: string;\n}\n\n@customElement('jupiter-add-column-dialog')\nexport class JupiterAddColumnDialog extends LitElement {\n @property({ type: String }) periodType: 'duration' | 'instant' | 'mixed' = 'duration';\n @property({ type: Boolean }) open = false;\n @property({ type: Array }) availableDimensions: AvailableDimension[] = [];\n @property({ type: String }) periodStartDate = '';\n @property({ type: String }) periodEndDate = '';\n\n @state() private _startDate = '';\n @state() private _endDate = '';\n @state() private _instantDate = '';\n @state() private _selectedType: 'duration' | 'instant' = 'duration';\n @state() private _selectedDimensions: Map<string, DimensionSelection> = new Map();\n\n updated(changedProperties: PropertyValues) {\n if (changedProperties.has('open') && this.open) {\n // Reset form when dialog opens\n this._resetForm();\n }\n \n if (changedProperties.has('availableDimensions')) {\n //////console.log(`🎯 Add Column Dialog received ${this.availableDimensions.length} dimensions:`, this.availableDimensions.map(d => d.axisLabel));\n }\n }\n\n static styles = css`\n :host {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.5);\n z-index: 1100;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.3s ease, visibility 0.3s ease;\n }\n\n :host([open]) {\n opacity: 1;\n visibility: visible;\n }\n\n .dialog {\n background: var(--bg-color-2, var(--jupiter-card-background, #fff));\n border-radius: 8px;\n padding: 24px;\n min-width: 400px;\n max-width: 500px;\n max-height: 90vh;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n transform: scale(0.9);\n transition: transform 0.3s ease;\n display: flex;\n flex-direction: column;\n }\n\n :host([open]) .dialog {\n transform: scale(1);\n }\n\n .dialog-header {\n margin-bottom: 20px;\n flex-shrink: 0;\n }\n\n .dialog-title {\n font-size: 20px;\n font-weight: 600;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n margin: 0 0 8px 0;\n }\n\n .dialog-description {\n font-size: 14px;\n color: var(--jupiter-text-secondary, #666);\n margin: 0;\n }\n\n .dialog-content {\n margin-bottom: 24px;\n flex: 1;\n overflow-y: auto;\n min-height: 0;\n }\n\n .date-wrapper {\n position: relative;\n width: min-content;\n }\n\n /* hide native icon */\n input[type=\"date\"]::-webkit-calendar-picker-indicator {\n opacity: 0;\n position: absolute;\n right: 10px;\n width: 20px;\n height: 20px;\n cursor: pointer;\n }\n \n .calendar-icon-svg {\n position: absolute;\n right: 3px;\n top: 18px;\n transform: translateY(-50%);\n width: 20px;\n height: 20px;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n pointer-events: none;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group.date-row {\n display: flex;\n gap: 12px;\n }\n\n .form-group.date-row .date-field {\n flex: 1;\n }\n\n .form-label {\n display: block;\n font-weight: 500;\n margin-bottom: 6px;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n font-size: 14px;\n }\n\n .form-label.required::after {\n content: ' *';\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .form-input {\n width: 100%;\n box-sizing: border-box;\n padding: 10px 12px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 4px;\n font-size: 14px;\n font-family: inherit;\n transition: border-color 0.2s ease;\n background-color: transparent;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n }\n\n // .form-input:focus {\n // outline: none;\n // border-color: var(--jupiter-primary-color, #007bff);\n // box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\n // }\n\n select.form-input {\n cursor: pointer;\n background-color: white;\n }\n\n .dialog-actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n flex-shrink: 0;\n border-top: 1px solid var(--jupiter-border-color, #ddd);\n padding-top: 16px;\n margin-top: 16px;\n }\n\n .btn {\n padding: 10px 20px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s ease;\n }\n\n .btn-cancel {\n color: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));\n border: 1px solid var(--buttonBgColor, var(--jupiter-primary-color, #1976d2)) !important;\n background: transparent;\n }\n\n .btn-cancel:hover {\n opacity: 0.9;\n }\n\n .btn-primary {\n background: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));\n color: var(--buttonTextColor, white);\n }\n\n .btn-primary:hover {\n opacity: 0.9;\n }\n\n // .btn-primary:disabled {\n // background: var(--jupiter-disabled-background, #ccc);\n // cursor: not-allowed;\n // }\n\n /* Dimension Selection Styles */\n .dimensions-section {\n margin-top: 20px;\n padding-top: 20px;\n border-top: 1px solid var(--jupiter-border-color, #ddd);\n }\n\n .dimensions-section h3 {\n margin: 0 0 16px 0;\n font-size: 16px;\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n }\n\n .dimension-item {\n margin-bottom: 16px;\n padding: 16px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n background: var(--jupiter-card-background, #fafafa);\n }\n\n .dimension-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n }\n\n .dimension-checkbox {\n margin: 0;\n }\n\n .dimension-label {\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n flex: 1;\n }\n\n .dimension-details {\n margin-left: 24px;\n }\n\n .member-selection {\n margin-top: 12px;\n }\n\n .member-selection label {\n display: block;\n margin-bottom: 4px;\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n }\n\n .typed-input {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n font-size: 14px;\n }\n\n .member-list {\n max-height: 120px;\n overflow-y: auto;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n padding: 8px;\n }\n\n .member-option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n }\n\n .member-option input[type=\"radio\"] {\n margin: 0;\n }\n\n .member-option label {\n margin: 0;\n font-size: 13px;\n color: var(--jupiter-text-primary, #333);\n cursor: pointer;\n }\n\n .no-dimensions {\n text-align: center;\n color: var(--jupiter-text-secondary, #666);\n font-style: italic;\n padding: 20px;\n }\n\n .form-description {\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n margin: 0 0 12px 0;\n line-height: 1.4;\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this._resetForm();\n }\n\n willUpdate(changedProperties: Map<string, unknown>) {\n super.willUpdate(changedProperties);\n if (changedProperties.has('open') && this.open) {\n this._resetForm();\n }\n }\n\n private _handleCancel() {\n this.open = false;\n this.dispatchEvent(new CustomEvent('dialog-cancel', { bubbles: true }));\n }\n\n private _handleConfirm() {\n if (!this._isFormValid()) return;\n\n // For mixed sections, always use 'duration' since columns show both instant and duration concepts\n const request: AddColumnRequest = {\n periodType: this.periodType === 'mixed' ? 'duration' : this.periodType\n };\n\n if (this.periodType === 'instant') {\n request.instantDate = this._instantDate;\n } else {\n // Mixed and duration both use start/end dates\n request.startDate = this._startDate;\n request.endDate = this._endDate;\n }\n\n // Add selected dimensions\n if (this._selectedDimensions.size > 0) {\n request.selectedDimensions = Array.from(this._selectedDimensions.values());\n }\n\n this.dispatchEvent(new CustomEvent('column-add', {\n detail: request,\n bubbles: true\n }));\n }\n\n private _isFormValid(): boolean {\n // Mixed sections always use duration date fields (start/end)\n if (this.periodType === 'mixed' || this.periodType === 'duration') {\n return !!this._startDate && !!this._endDate && this._startDate <= this._endDate;\n } else if (this.periodType === 'instant') {\n return !!this._instantDate;\n }\n return false;\n }\n\n private _handleStartDateChange(e: Event) {\n this._startDate = (e.target as HTMLInputElement).value;\n }\n\n private _handleEndDateChange(e: Event) {\n this._endDate = (e.target as HTMLInputElement).value;\n }\n\n private _handleSelectedTypeChange(e: Event) {\n this._selectedType = (e.target as HTMLSelectElement).value as 'duration' | 'instant';\n }\n\n private _handleInstantDateChange(e: Event) {\n this._instantDate = (e.target as HTMLInputElement).value;\n }\n\n private _handleDimensionToggle(dimensionId: string, event: Event) {\n const checkbox = event.target as HTMLInputElement;\n \n if (checkbox.checked) {\n const dimension = this.availableDimensions.find(d => d.id === dimensionId);\n if (dimension) {\n const selection: DimensionSelection = {\n axisId: dimension.id,\n axisLabel: dimension.axisLabel,\n isTyped: !!(dimension.typedMember && (!dimension.members || dimension.members.length === 0))\n };\n \n this._selectedDimensions.set(dimensionId, selection);\n }\n } else {\n this._selectedDimensions.delete(dimensionId);\n }\n \n this.requestUpdate();\n }\n\n private _handleMemberSelection(dimensionId: string, memberId: string, memberLabel: string) {\n const existing = this._selectedDimensions.get(dimensionId);\n if (existing) {\n existing.memberId = memberId;\n existing.memberLabel = memberLabel;\n this._selectedDimensions.set(dimensionId, existing);\n this.requestUpdate();\n }\n }\n\n private _handleTypedValueChange(dimensionId: string, event: Event) {\n const input = event.target as HTMLInputElement;\n const existing = this._selectedDimensions.get(dimensionId);\n if (existing) {\n existing.typedValue = input.value;\n this._selectedDimensions.set(dimensionId, existing);\n }\n }\n\n private _resetForm() {\n this._startDate = this.periodStartDate || '';\n this._endDate = this.periodEndDate || '';\n this._instantDate = this.periodEndDate || this.periodStartDate || '';\n this._selectedType = this.periodType === 'instant' ? 'instant' : 'duration';\n this._selectedDimensions.clear();\n \n // Auto-select dimensions with only one member\n this._autoSelectSingleMemberDimensions();\n \n this.requestUpdate();\n }\n\n private _autoSelectSingleMemberDimensions() {\n this.availableDimensions.forEach(dimension => {\n // Auto-select dimensions with domain members (like filter-roles-dialog does)\n if (dimension.members && dimension.members.length > 0) {\n // Auto-select the first member by default (or all if required)\n // Following the pattern from filter-roles-dialog: auto-select ALL members by default\n const member = dimension.members[0]; // Select first member as default\n const selection: DimensionSelection = {\n axisId: dimension.id,\n axisLabel: dimension.axisLabel,\n memberId: member.id,\n memberLabel: member.label,\n isTyped: false\n };\n this._selectedDimensions.set(dimension.id, selection);\n console.log(`🎯 Auto-selected default member: ${dimension.axisLabel} -> ${member.label}`);\n }\n // Auto-select typed dimensions (no domain members, only typed input)\n else if (dimension.typedMember && (!dimension.members || dimension.members.length === 0)) {\n const selection: DimensionSelection = {\n axisId: dimension.id,\n axisLabel: dimension.axisLabel,\n isTyped: true\n // Note: typedValue will be entered in column header, not here\n };\n this._selectedDimensions.set(dimension.id, selection);\n console.log(`🎯 Auto-selected typed dimension: ${dimension.axisLabel} (value will be entered in column header)`);\n }\n });\n }\n\n render() {\n if (!this.open) return html``;\n\n const isValid = this._isFormValid();\n\n return html`\n <div class=\"dialog\" @click=\"${(e: Event) => e.stopPropagation()}\">\n <div class=\"dialog-header\">\n <h2 class=\"dialog-title\">${I18n.t('column.addColumn')}</h2>\n\n </div>\n\n <div class=\"dialog-content\">\n ${this.periodType === 'instant' ? html`\n <div class=\"form-group\">\n <label class=\"form-label required\">${I18n.t('column.instantDate')}</label>\n <div class=\"date-wrapper\">\n <input \n type=\"date\" \n class=\"form-input\"\n .value=\"${this._instantDate}\"\n @change=\"${this._handleInstantDateChange}\"\n required\n />\n <svg class=\"calendar-icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M19 4h-1V2h-2v2H8V2H6v2H5\n a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14\n a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V9h14z\"/>\n </div>\n </div>\n ` : html`\n <div class=\"form-group date-row\">\n <div class=\"date-field\">\n <label class=\"form-label required\">${I18n.t('column.startPeriodDate')}</label>\n <div class=\"date-wrapper\">\n <input \n type=\"date\" \n class=\"form-input\"\n .value=\"${this._startDate}\"\n @change=\"${this._handleStartDateChange}\"\n required\n />\n <svg class=\"calendar-icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M19 4h-1V2h-2v2H8V2H6v2H5\n a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14\n a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V9h14z\"/>\n </div>\n </div>\n <div class=\"date-field\">\n <label class=\"form-label required\">${I18n.t('column.endPeriodDate')}</label>\n <div class=\"date-wrapper\">\n <input \n type=\"date\" \n class=\"form-input\"\n .value=\"${this._endDate}\"\n @change=\"${this._handleEndDateChange}\"\n required\n />\n <svg class=\"calendar-icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M19 4h-1V2h-2v2H8V2H6v2H5\n a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14\n a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V9h14z\"/>\n </div>\n </div>\n </div>\n `}\n\n <!-- Dimensions Section -->\n ${this.availableDimensions.length > 0 ? html`\n <div class=\"dimensions-section\">\n <h3>${I18n.t('column.availableDimensions')}</h3>\n <p class=\"form-description\">${I18n.t('column.dimensionsDescription')}</p>\n \n ${this.availableDimensions.map(dimension => {\n const isSelected = this._selectedDimensions.has(dimension.id);\n const selection = this._selectedDimensions.get(dimension.id);\n const isTypedDimension = !!(dimension.typedMember && (!dimension.members || dimension.members.length === 0));\n \n return html`\n <div class=\"dimension-item\">\n <div class=\"dimension-header\">\n <input \n type=\"checkbox\" \n class=\"dimension-checkbox\"\n .checked=\"${isSelected}\"\n @change=\"${(e: Event) => this._handleDimensionToggle(dimension.id, e)}\"\n id=\"dim-${dimension.id}\"\n />\n <label for=\"dim-${dimension.id}\" class=\"dimension-label\">\n ${dimension.axisLabel || dimension.conceptName}\n </label>\n </div>\n \n ${isSelected ? html`\n <div class=\"dimension-details\">\n ${isTypedDimension ? html`\n <!-- Typed Dimension Input -->\n <div class=\"member-selection\">\n <label>${I18n.t('column.enterValue')} ${dimension.conceptName}:</label>\n <input\n type=\"text\"\n class=\"typed-input\"\n .value=\"${selection?.typedValue || ''}\"\n @input=\"${(e: Event) => this._handleTypedValueChange(dimension.id, e)}\"\n placeholder=\"${I18n.t('column.enterValuePlaceholder')}\"\n />\n </div>\n ` : html`\n <!-- Domain Members Selection -->\n ${dimension.members && dimension.members.length > 0 ? html`\n <div class=\"member-selection\">\n <label>${I18n.t('column.selectMember')}</label>\n <div class=\"member-list\">\n ${dimension.members.map(member => html`\n <div class=\"member-option\">\n <input\n type=\"radio\"\n name=\"member-${dimension.id}\"\n .checked=\"${selection?.memberId === member.id}\"\n @change=\"${() => this._handleMemberSelection(dimension.id, member.id, member.label)}\"\n id=\"member-${dimension.id}-${member.id}\"\n />\n <label for=\"member-${dimension.id}-${member.id}\">\n ${member.label}\n </label>\n </div>\n `)}\n </div>\n </div>\n ` : html`\n <p class=\"form-description\">${I18n.t('column.noMembersAvailable')}</p>\n `}\n `}\n </div>\n ` : ''}\n </div>\n `;\n })}\n </div>\n ` : ''}\n </div>\n\n <div class=\"dialog-actions\">\n <button class=\"btn btn-cancel\" @click=\"${this._handleCancel}\">\n ${I18n.t('column.cancel')}\n </button>\n <button \n class=\"btn btn-primary\" \n ?disabled=\"${!isValid}\"\n @click=\"${this._handleConfirm}\"\n >\n ${I18n.t('column.addColumn')}\n </button>\n </div>\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { FormSection, FormColumn, ConceptTree } from '../schema/types';\nimport { I18n } from '../utils/i18n';\nimport './concept-tree';\nimport './add-column-dialog';\nimport { AddColumnRequest, AvailableDimension } from './add-column-dialog';\n\n@customElement('jupiter-form-section')\nexport class JupiterFormSection extends LitElement {\n @property({ type: Object }) section!: FormSection;\n @property({ type: Array }) columns: FormColumn[] = [];\n @property({ type: Array }) datatypes?: any[]; // XBRL datatypes for baseType chain resolution\n @property({ type: Object }) formData: Record<string, any> = {};\n @property({ type: Object }) periodData: Record<string, Record<string, any>> = {};\n @property({ type: Object }) unitData: Record<string, Record<string, string>> = {};\n @property({ type: Object }) decimalsData: Record<string, Record<string, string>> = {};\n @property({ type: String }) globalDecimals = 'INF';\n @property({ type: Object }) typedMemberData: Record<string, Record<string, string>> = {};\n @property({ type: Object }) repeatCounts: { [conceptId: string]: number } = {};\n @property({ type: Array }) defaultUnits: Array<Record<string, string>> = [];\n @property({ type: Boolean }) disabled = false;\n @property({ type: Boolean }) collapsible = true;\n @property({ type: String }) locale = 'en-US';\n @property({ type: Boolean }) isFirstSection = false;\n @property({ type: Array }) availableDimensions: AvailableDimension[] = [];\n @property({ type: Boolean }) hideHeader = false;\n @property({ type: String }) mode: 'inputForm' | 'admin' | 'readonly' = 'inputForm';\n @property({ type: Boolean }) showFactsOnly = false;\n @property({ type: Object }) conceptMatchIds?: Set<string>;\n @property({ type: Object }) masterData?: Record<string, any>;\n @property({ type: String }) periodStartDate = '';\n @property({ type: String }) periodEndDate = '';\n @property({ type: String }) language = 'en';\n\n @state() private _expanded = true;\n @state() private _showAddColumnDialog = false;\n @state() private _sectionPeriodType: 'duration' | 'instant' | 'mixed' = 'duration';\n @state() private _openMenuColumnId: string | null = null;\n @state() private _insertAfterColumnId: string | null = null;\n\n static styles = css`\n :host {\n display: block;\n margin-bottom: 16px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .section-header {\n background: var(--jupiter-section-header-background, #f0f2f5);\n padding: 16px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n cursor: pointer;\n user-select: none;\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .section-header:hover {\n background: var(--jupiter-section-header-hover-background, #e4e7ea);\n }\n\n .section-header.not-collapsible {\n cursor: default;\n }\n\n .section-header.not-collapsible:hover {\n background: var(--jupiter-section-header-background, #f0f2f5);\n }\n\n .section-title {\n font-size: 18px;\n font-weight: 600;\n color: var(--jupiter-text-primary, #333);\n margin: 0;\n }\n\n .section-description {\n font-size: 14px;\n color: var(--jupiter-text-secondary, #666);\n margin: 4px 0 0 0;\n }\n\n .section-toggle {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n transition: transform 0.2s ease;\n color: var(--jupiter-text-secondary, #666);\n }\n\n .section-toggle.expanded {\n transform: rotate(90deg);\n }\n\n .section-toggle.hidden {\n visibility: hidden;\n }\n\n .section-header-controls {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .section-content {\n display: block;\n transition: max-height 0.3s ease;\n overflow: hidden;\n }\n\n .section-content.collapsed {\n display: none;\n }\n\n .table-container {\n overflow-x: auto;\n }\n\n .form-table {\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n border-spacing: 0;\n background: var(--jupiter-table-background, #fff);\n }\n\n .table-header {\n background: var(--jupiter-header-background, #f8f9fa);\n position: sticky;\n top: 0;\n z-index: 1;\n }\n\n .header-row {\n /* Table row - no special display needed */\n }\n\n .header-cell:first-child {\n border-radius: 6px 0 0 0;\n }\n .header-cell:last-child {\n border-radius: 0 6px 0 0;\n }\n\n .header-cell {\n padding: 8px 12px;\n text-align: left;\n font-weight: 600;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n background: var(--bg-color-1, var(--jupiter-header-background, #f8f9fa));\n min-width: 180px;\n width: 180px;\n font-size: 14px;\n vertical-align: middle;\n position: relative;\n overflow: visible;\n }\n\n .header-cell.concept-column {\n width: 300px;\n min-width: 300px;\n max-width: 300px;\n position: sticky;\n left: 0;\n z-index: 2;\n }\n\n .header-cell.removable {\n position: relative;\n }\n\n .column-menu-icon {\n position: absolute;\n top: 8px;\n right: 0px;\n width: 24px;\n height: 24px;\n background: transparent;\n color: var(--jupiter-text-secondary, #666);\n border: none;\n font-size: 20px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n transition: all 0.2s ease;\n line-height: 1;\n font-weight: bold;\n padding: 0;\n border-radius: 4px;\n }\n\n .column-menu-icon:hover {\n background: var(--jupiter-background-light, #f0f0f0);\n color: var(--jupiter-text-primary, #333);\n }\n\n .column-context-menu {\n position: absolute;\n top: 32px;\n right: 4px;\n background: var(--bg-color-2, var(--jupiter-card-background, #fff));\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 4px;\n // box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n min-width: 150px;\n padding: 4px 0;\n }\n\n .column-context-menu-item {\n padding: 8px 16px;\n cursor: pointer;\n font-size: 14px;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n transition: background 0.2s ease;\n border: none;\n background: transparent;\n width: 100%;\n text-align: left;\n display: block;\n }\n\n .column-context-menu-item:hover {\n opacity: 0.9;\n }\n\n .column-context-menu-item.remove {\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .column-context-menu-item.remove:hover {\n background: var(--jupiter-error-light, #ffebee);\n }\n\n /* Column header content styling */\n .column-header-content {\n display: flex;\n flex-direction: column;\n gap: 8px;\n align-items: center;\n }\n\n .column-title {\n text-align: center;\n }\n\n /* Typed member header input styles */\n .typed-members-header {\n display: flex;\n flex-direction: column;\n gap: 4px;\n width: 100%;\n padding: 8px;\n background: var(--jupiter-typed-member-header-background, #f8f9fa);\n border-radius: 4px;\n border: 1px solid var(--jupiter-border-color, #e0e0e0);\n }\n\n .typed-member-header-input {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .typed-member-header-label {\n font-size: 11px;\n font-weight: 500;\n color: var(--jupiter-text-secondary, #666);\n text-align: left;\n }\n\n .typed-member-header-field {\n width: 96%;\n padding: 4px 6px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 3px;\n font-size: 12px;\n background: var(--jupiter-input-background, #fff);\n color:#000;\n }\n\n .typed-member-header-field:focus {\n outline: none;\n border-color: var(--jupiter-primary-color, #1976d2);\n box-shadow: 0 0 0 1px var(--jupiter-primary-color, #1976d2);\n }\n\n .typed-member-header-field::placeholder {\n color: var(--jupiter-text-placeholder, #999);\n font-size: 11px;\n }\n\n .empty-section {\n padding: 24px;\n text-align: center;\n color: var(--jupiter-text-secondary, #666);\n font-style: italic;\n }\n `;\n\n private _boundFieldBlur = (e: Event) => {\n this._clearHighlights();\n };\n\n connectedCallback() {\n super.connectedCallback();\n this._expanded = this.section.expanded !== false;\n this._determinePeriodType();\n this._checkAndExpandFirstSection();\n // Close menu when clicking outside\n document.addEventListener('click', () => this._closeColumnMenu());\n // Clear highlights when a field loses focus\n this.addEventListener('field-blur', this._boundFieldBlur);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener('click', () => this._closeColumnMenu());\n this.removeEventListener('field-blur', this._boundFieldBlur);\n }\n \n updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n // Check if this became the first section or if section/isFirstSection properties changed\n if (changedProperties.has('isFirstSection') || changedProperties.has('section')) {\n this._checkAndExpandFirstSection();\n }\n\n if (changedProperties.has('section') && this.section?.concepts) {\n this._buildTotalMaps(this.section.concepts);\n }\n }\n \n private _checkAndExpandFirstSection() {\n // If this is the first section, expand it and its tree by default\n if (this.isFirstSection && this.section && this.section.concepts) {\n this._expanded = true;\n // Use setTimeout to ensure the DOM is ready for tree expansion\n setTimeout(() => {\n this._expandAllTrees();\n console.log('🎯 First section detected - expanded section and tree by default');\n }, 0);\n }\n }\n\n private _determinePeriodType() {\n // Get all non-abstract concepts\n const nonAbstractConcepts = this._getAllNonAbstractConcepts(this.section.concepts);\n \n if (nonAbstractConcepts.length === 0) {\n this._sectionPeriodType = 'duration';\n console.log(`📊 Section ${this.section.id}: No concepts, defaulting to duration`);\n return;\n }\n\n // Check period types\n const periodTypes = new Set(nonAbstractConcepts.map(c => c.periodType).filter(Boolean));\n \n //console.log(`🏷️ Section ${this.section.id}: Found period types:`, Array.from(periodTypes));\n // console.log(`📝 Section ${this.section.id}: Non-abstract concepts and their period types:`, \n // nonAbstractConcepts.map(c => ({ name: c.name, periodType: c.periodType, abstract: c.abstract }))\n // );\n \n if (periodTypes.size === 0) {\n this._sectionPeriodType = 'duration';\n // console.log(`📊 Section ${this.section.id}: No period types defined, defaulting to duration`);\n } else if (periodTypes.size === 1) {\n const singleType = Array.from(periodTypes)[0];\n this._sectionPeriodType = singleType === 'instant' ? 'instant' : 'duration';\n // console.log(`📊 Section ${this.section.id}: Single period type '${singleType}', setting to '${this._sectionPeriodType}'`);\n } else {\n this._sectionPeriodType = 'mixed';\n //console.log(`📊 Section ${this.section.id}: Mixed period types, setting to 'mixed'`);\n }\n \n //console.log(`✅ Section ${this.section.id}: Final period type: ${this._sectionPeriodType}`);\n }\n\n private _getAllNonAbstractConcepts(concepts: ConceptTree[]): ConceptTree[] {\n const result: ConceptTree[] = [];\n \n for (const concept of concepts) {\n if (!concept.abstract) {\n result.push(concept);\n }\n if (concept.children) {\n result.push(...this._getAllNonAbstractConcepts(concept.children));\n }\n }\n \n return result;\n }\n\n private _toggleExpanded() {\n if (!this.collapsible) return;\n \n this._expanded = !this._expanded;\n \n // When expanding the accordion, also expand all trees\n if (this._expanded) {\n this._expandAllTrees();\n }\n \n this.dispatchEvent(new CustomEvent('section-expand', {\n detail: {\n sectionId: this.section.id,\n expanded: this._expanded\n },\n bubbles: true\n }));\n }\n\n private _handleRemoveColumn(columnId: string) {\n this._openMenuColumnId = null; // Close menu\n this.dispatchEvent(new CustomEvent('column-remove', {\n detail: { \n columnId,\n sectionId: this.section.id \n },\n bubbles: true\n }));\n }\n\n private _toggleColumnMenu(columnId: string, event: Event) {\n event.stopPropagation();\n this._openMenuColumnId = this._openMenuColumnId === columnId ? null : columnId;\n }\n\n private _closeColumnMenu() {\n this._openMenuColumnId = null;\n }\n\n private _handleAddColumnFromMenu(columnId: string, event: Event) {\n event.stopPropagation();\n this._openMenuColumnId = null; // Close menu\n this._insertAfterColumnId = columnId; // Track after which column to insert\n this._handleAddColumn();\n }\n\n private _handleAddColumn() {\n // Determine period type specifically for this add column action\n const buttonPeriodType = this._determineButtonPeriodType();\n \n // Override the section period type for this dialog\n this._sectionPeriodType = buttonPeriodType;\n this._showAddColumnDialog = true;\n }\n\n private _determineButtonPeriodType(): 'duration' | 'instant' | 'mixed' {\n // Get all non-abstract concepts in the section (not just those with fields)\n // This ensures we correctly identify mixed period sections even when some concepts\n // don't have fields in the default column due to period type filtering\n const allNonAbstractConcepts = this._getAllNonAbstractConcepts(this.section.concepts);\n \n if (allNonAbstractConcepts.length === 0) {\n return 'duration';\n }\n\n // Check period types of all non-abstract concepts in the section\n const periodTypes = new Set(\n allNonAbstractConcepts\n .map(c => c.periodType)\n .filter(periodType => periodType !== undefined && periodType !== null)\n );\n \n if (periodTypes.size === 0) {\n return 'duration';\n } else if (periodTypes.size === 1) {\n const singleType = Array.from(periodTypes)[0];\n return singleType === 'instant' ? 'instant' : 'duration';\n } else {\n return 'mixed';\n }\n }\n\n private _getConceptsWithFields(concepts: ConceptTree[]): ConceptTree[] {\n const result: ConceptTree[] = [];\n \n for (const concept of concepts) {\n // Include concepts that have fields and are not abstract\n if (!concept.abstract && concept.fields && concept.fields.length > 0) {\n result.push(concept);\n }\n \n // Recursively check children\n if (concept.children) {\n result.push(...this._getConceptsWithFields(concept.children));\n }\n }\n \n return result;\n }\n\n private _handleDialogCancel() {\n this._showAddColumnDialog = false;\n }\n\n private _handleColumnAdd(event: CustomEvent<AddColumnRequest>) {\n event.stopPropagation();\n this._showAddColumnDialog = false;\n \n // Dispatch event to parent component with the column request and position info\n this.dispatchEvent(new CustomEvent('column-add-request', {\n detail: {\n sectionId: this.section.id,\n columnRequest: event.detail,\n insertAfterColumnId: this._insertAfterColumnId // Include position info\n },\n bubbles: true\n }));\n \n // Reset the insert position\n this._insertAfterColumnId = null;\n }\n\n private _handleFieldChange(event: CustomEvent) {\n event.stopPropagation();\n this.dispatchEvent(new CustomEvent('field-change', {\n detail: event.detail,\n bubbles: true,\n composed: true\n }));\n }\n\n private _handlePeriodChange(event: CustomEvent) {\n console.log(`📋 [FormSection] Received period-change event:`, event.detail);\n event.stopPropagation();\n // Forward period change event to parent (dynamic-form) with composed:true\n this.dispatchEvent(new CustomEvent('period-change', {\n detail: event.detail,\n bubbles: true,\n composed: true // CRITICAL: Allows event to cross shadow DOM boundaries\n }));\n console.log(`📋 [FormSection] Forwarded period-change event to dynamic-form`);\n }\n\n private _flattenConcepts(concepts: ConceptTree[], expanded: Set<string> = new Set()): ConceptTree[] {\n const result: ConceptTree[] = [];\n \n for (const concept of concepts) {\n result.push(concept);\n \n // If concept is expanded and has children, include them\n if (concept.children && concept.children.length > 0 && expanded.has(concept.id)) {\n const childrenFlattened = this._flattenConcepts(concept.children, expanded);\n result.push(...childrenFlattened);\n }\n }\n \n return result;\n }\n\n @state() private _expandedConcepts = new Set<string>();\n @state() private _allTreeExpanded = false;\n @state() private _highlightMap: Map<string, { type: 'total' | 'member'; columnId: string }> = new Map();\n @state() private _calculationErrorKeys: Set<string> = new Set(); // \"${conceptId}__${columnId}\"\n private _totalChildrenMap: Map<string, string[]> = new Map();\n private _memberParentMap: Map<string, string> = new Map();\n private _totalConceptMap: Map<string, ConceptTree> = new Map();\n private _totalChildConceptsMap: Map<string, ConceptTree[]> = new Map();\n\n /**\n * Returns true when every column cell for a concept has no value.\n * Used in readonly mode to hide fully-blank rows.\n */\n private _isConceptRowBlank(concept: ConceptTree): boolean {\n for (const column of this.columns) {\n const value = this.formData[concept.id]?.[column.id];\n if (value !== null && value !== undefined && value !== '') {\n return false;\n }\n }\n return true;\n }\n\n private _getAllConceptIds(concepts: ConceptTree[]): string[] {\n const result: string[] = [];\n \n for (const concept of concepts) {\n if (concept.children && concept.children.length > 0) {\n result.push(concept.id);\n result.push(...this._getAllConceptIds(concept.children));\n }\n }\n \n return result;\n }\n\n private _expandAllTrees() {\n const allConceptIds = this._getAllConceptIds(this.section.concepts || []);\n this._expandedConcepts = new Set([...this._expandedConcepts, ...allConceptIds]);\n this._allTreeExpanded = true;\n }\n\n private _collapseAllTrees() {\n this._expandedConcepts = new Set();\n this._allTreeExpanded = false;\n }\n\n private _handleConceptExpand(event: CustomEvent) {\n event.stopPropagation();\n const { conceptId, expanded } = event.detail;\n\n const next = new Set(this._expandedConcepts);\n if (expanded) {\n next.add(conceptId);\n } else {\n next.delete(conceptId);\n }\n this._expandedConcepts = next;\n\n const allConceptIds = this._getAllConceptIds(this.section.concepts || []);\n this._allTreeExpanded = allConceptIds.length > 0 && allConceptIds.every(id => next.has(id));\n\n this.dispatchEvent(new CustomEvent('concept-expand', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _buildTotalMaps(concepts: ConceptTree[]): void {\n this._totalChildrenMap.clear();\n this._memberParentMap.clear();\n this._totalConceptMap.clear();\n this._totalChildConceptsMap.clear();\n this._traverseTotalGroups(concepts);\n }\n\n private _traverseTotalGroups(concepts: ConceptTree[]): void {\n for (let i = 0; i < concepts.length; i++) {\n const concept = concepts[i];\n if (concept.preferredLabel?.includes('totalLabel')) {\n if (concept.children?.length) {\n // JDF-026: total has explicit children\n const childIds = concept.children.map(c => c.id);\n this._totalChildrenMap.set(concept.id, childIds);\n this._totalConceptMap.set(concept.id, concept);\n this._totalChildConceptsMap.set(concept.id, concept.children);\n for (const childId of childIds) {\n this._memberParentMap.set(childId, concept.id);\n }\n } else {\n // JDF-030: total has no children — siblings ABOVE/BEFORE it on the same level are its members.\n // Stop at the nearest preceding totalLabel sibling so each group is isolated.\n let lastTotalIdx = -1;\n for (let j = i - 1; j >= 0; j--) {\n if (concepts[j].preferredLabel?.includes('totalLabel')) {\n lastTotalIdx = j;\n break;\n }\n }\n const siblings = concepts.slice(lastTotalIdx + 1, i);\n if (siblings.length > 0) {\n const siblingIds = siblings.map(s => s.id);\n this._totalChildrenMap.set(concept.id, siblingIds);\n this._totalConceptMap.set(concept.id, concept);\n this._totalChildConceptsMap.set(concept.id, siblings);\n for (const siblingId of siblingIds) {\n this._memberParentMap.set(siblingId, concept.id);\n }\n }\n }\n }\n if (concept.children?.length) {\n this._traverseTotalGroups(concept.children);\n }\n }\n }\n\n private _runCalculationCheck(conceptId: string, columnId: string): void {\n const isSelfTotal = this._totalConceptMap.has(conceptId);\n const totalConceptId = isSelfTotal ? conceptId : this._memberParentMap.get(conceptId);\n if (!totalConceptId) return;\n\n const totalConcept = this._totalConceptMap.get(totalConceptId)!;\n const totalRaw = this.formData[totalConceptId]?.[columnId];\n const errorKey = `${totalConceptId}__${columnId}`;\n\n if (totalRaw === null || totalRaw === undefined || totalRaw === '') {\n if (this._calculationErrorKeys.has(errorKey)) {\n const next = new Set(this._calculationErrorKeys);\n next.delete(errorKey);\n this._calculationErrorKeys = next;\n }\n return;\n }\n\n const totalValue = parseFloat(totalRaw);\n if (isNaN(totalValue)) return;\n\n const children = this._totalChildConceptsMap.get(totalConceptId) || [];\n const childData = children.map(child => ({\n value: this.formData[child.id]?.[columnId],\n balance: child.balance\n }));\n\n const isValid = JupiterFormSection._checkTotal(totalValue, childData, totalConcept.balance);\n\n const next = new Set(this._calculationErrorKeys);\n if (!isValid) {\n next.add(errorKey);\n } else {\n next.delete(errorKey);\n }\n this._calculationErrorKeys = next;\n }\n\n private static _checkTotal(\n totalValue: number,\n children: Array<{ value: any; balance?: 'debit' | 'credit' }>,\n totalBalance?: 'debit' | 'credit'\n ): boolean {\n let calculatedSum = 0;\n let hasAnyValue = false;\n for (const child of children) {\n const val = parseFloat(child.value);\n if (isNaN(val)) continue;\n hasAnyValue = true;\n const weight = (!totalBalance || !child.balance || totalBalance === child.balance) ? 1 : -1;\n calculatedSum += weight * val;\n }\n if (!hasAnyValue) return true;\n return Math.abs(calculatedSum - totalValue) < 0.01;\n }\n\n\n private _handleFieldFocusForHighlight(event: CustomEvent): void {\n const conceptId: string = event.detail?.conceptId;\n const columnId: string = event.detail?.columnId;\n if (!conceptId || !columnId) return;\n\n const newMap = new Map<string, { type: 'total' | 'member'; columnId: string }>();\n const isSelfTotal = this._totalChildrenMap.has(conceptId);\n\n if (isSelfTotal) {\n // Focused concept is itself a total: highlight only its own group, ignore any parent total.\n newMap.set(conceptId, { type: 'total', columnId });\n for (const childId of this._totalChildrenMap.get(conceptId)!) {\n newMap.set(childId, { type: 'member', columnId });\n }\n } else {\n // Focused concept is a plain member: highlight the parent total and all its siblings.\n const parentId = this._memberParentMap.get(conceptId);\n if (parentId) {\n newMap.set(parentId, { type: 'total', columnId });\n for (const siblingId of this._totalChildrenMap.get(parentId)!) {\n newMap.set(siblingId, { type: 'member', columnId });\n }\n }\n }\n\n this._highlightMap = newMap;\n }\n\n private _clearHighlights(): void {\n if (this._highlightMap.size > 0) {\n this._highlightMap = new Map();\n }\n }\n\n private _getTypedMemberHeaderValue(columnId: string, axisId: string): string {\n // Get typed member value from the dedicated typed member data structure\n return this.typedMemberData[columnId]?.[axisId] || '';\n }\n\n private _handleTypedMemberHeaderChange(event: Event, columnId: string, axisId: string) {\n const target = event.target as HTMLInputElement;\n const value = target.value;\n \n console.log(`🔍 [FormSection] Typed member header change: columnId=${columnId}, axisId=${axisId}, value=${value}`);\n \n // Dispatch typed member change event (matches what dynamic form expects)\n this.dispatchEvent(new CustomEvent('typed-member-change', {\n detail: {\n columnId: columnId,\n axisId: axisId,\n value: value\n },\n bubbles: true\n }));\n }\n\n private _handleAddRepeat(event: CustomEvent) {\n event.stopPropagation();\n this.dispatchEvent(new CustomEvent('add-concept-repeat', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _handleRemoveRepeat(event: CustomEvent) {\n event.stopPropagation();\n this.dispatchEvent(new CustomEvent('remove-concept-repeat', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n /** Build the list of <tr> template results for a single flattened concept, including any repeat instances. */\n private _renderConceptRows(concept: ConceptTree) {\n const isRepeatable = this.mode !== 'readonly' &&\n !concept.abstract &&\n concept.fields?.some(f => (f as any).crossRoleTypedMembers?.length > 0);\n const repeatCount = isRepeatable ? (this.repeatCounts[concept.id] || 0) : 0;\n\n const sharedProps = (instanceConcept: ConceptTree, opts: { showAdd?: boolean; showRemove?: boolean }) => html`\n <jupiter-concept-tree\n .concept=\"${instanceConcept}\"\n .columns=\"${this.columns}\"\n .datatypes=\"${this.datatypes}\"\n .formData=\"${this.formData}\"\n .periodData=\"${this.periodData}\"\n .unitData=\"${this.unitData}\"\n .decimalsData=\"${this.decimalsData}\"\n .globalDecimals=\"${this.globalDecimals}\"\n .defaultUnits=\"${this.defaultUnits}\"\n .disabled=\"${this.disabled}\"\n .locale=\"${this.locale}\"\n .language=\"${this.language}\"\n .expandedConcepts=\"${this._expandedConcepts}\"\n .mode=\"${this.mode}\"\n .masterData=\"${this.masterData}\"\n .facts=\"${instanceConcept.facts}\"\n .typedMemberData=\"${this.typedMemberData}\"\n .showAddButton=\"${opts.showAdd || false}\"\n .showRemoveButton=\"${opts.showRemove || false}\"\n .highlightType=\"${this._highlightMap.get(instanceConcept.id)?.type}\"\n .highlightColumnId=\"${this._highlightMap.get(instanceConcept.id)?.columnId}\"\n .calculationErrorKeys=\"${this._calculationErrorKeys}\"\n @field-change=\"${this._handleFieldChange}\"\n @field-focus=\"${this._handleFieldFocusForHighlight}\"\n @period-change=\"${this._handlePeriodChange}\"\n @concept-expand=\"${this._handleConceptExpand}\"\n @add-concept-repeat=\"${this._handleAddRepeat}\"\n @remove-concept-repeat=\"${this._handleRemoveRepeat}\"\n ></jupiter-concept-tree>\n `;\n\n const rows = [html`\n <tr>${sharedProps(concept, { showAdd: isRepeatable })}</tr>\n `];\n\n for (let n = 1; n <= repeatCount; n++) {\n const instanceConcept: ConceptTree = {\n ...concept,\n id: `${concept.id}__repeat_${n}`,\n label: '',\n children: [],\n abstract: false\n };\n rows.push(html`\n <tr>${sharedProps(instanceConcept, { showRemove: true })}</tr>\n `);\n }\n\n return rows;\n }\n\n render() {\n if (!this.section.concepts || this.section.concepts.length === 0) {\n return html`\n <div class=\"section-header ${!this.collapsible ? 'not-collapsible' : ''}\" \n @click=\"${this._toggleExpanded}\">\n <div>\n <h3 class=\"section-title\">${this.section.title}</h3>\n ${this.section.description ? html`\n <p class=\"section-description\">${this.section.description}</p>\n ` : ''}\n </div>\n <div class=\"section-header-controls\">\n <div class=\"section-toggle ${this.collapsible ? (this._expanded ? 'expanded' : '') : 'hidden'}\">\n ${this.collapsible ? '▶' : ''}\n </div>\n </div>\n </div>\n \n <div class=\"section-content ${!this._expanded ? 'collapsed' : ''}\">\n <div class=\"empty-section\">\n No concepts defined for this section.\n </div>\n </div>\n `;\n }\n\n return html`\n ${!this.hideHeader ? html`\n <div class=\"section-header ${!this.collapsible ? 'not-collapsible' : ''}\" \n @click=\"${this._toggleExpanded}\">\n <div>\n <h3 class=\"section-title\">${this.section.title}</h3>\n ${this.section.description ? html`\n <p class=\"section-description\">${this.section.description}</p>\n ` : ''}\n </div>\n <div class=\"section-header-controls\">\n <div class=\"section-toggle ${this.collapsible ? (this._expanded ? 'expanded' : '') : 'hidden'}\">\n ${this.collapsible ? '▶' : ''}\n </div>\n </div>\n </div>\n ` : ''}\n\n <div class=\"section-content ${!this._expanded ? 'collapsed' : ''}\">\n <div class=\"table-container\">\n <table class=\"form-table\">\n <thead class=\"table-header\">\n <tr class=\"header-row\">\n <th class=\"header-cell concept-column\"></th>\n ${this.columns.map(column => html`\n <th class=\"header-cell ${column.removable ? 'removable' : ''}\">\n <div class=\"column-header-content\">\n <div class=\"column-title\">\n ${column.title}\n ${column.description ? html`<div style=\"font-weight: normal; font-size: 12px; color: var(--jupiter-text-secondary, #666);\">${column.description}</div>` : ''}\n </div>\n \n <!-- Typed member input fields in column header -->\n ${column.dimensionData?.hasTypedMembers ? html`\n <div class=\"typed-members-header\">\n ${column.dimensionData?.typedMembers?.map((typedMember: any) => html`\n <div class=\"typed-member-header-input\">\n ${this.mode === 'readonly' ? html`\n <span class=\"typed-member-header-field\" style=\"display:block;padding:4px 0;\">\n ${this._getTypedMemberHeaderValue(column.id, typedMember.axisId) || '—'}\n </span>\n ` : html`\n <input\n type=\"text\"\n class=\"typed-member-header-field\"\n placeholder=\"${I18n.t('section.enterPlaceholder')} ${typedMember.axisLabel}\"\n .value=\"${this._getTypedMemberHeaderValue(column.id, typedMember.axisId)}\"\n @input=\"${(e: Event) => this._handleTypedMemberHeaderChange(e, column.id, typedMember.axisId)}\"\n />\n `}\n </div>\n `)}\n </div>\n ` : ''}\n </div>\n \n <!-- Column menu icon (hidden in readonly mode) -->\n ${this.mode !== 'readonly' ? html`\n <div\n class=\"column-menu-icon\"\n @click=\"${(e: Event) => this._toggleColumnMenu(column.id, e)}\"\n title=\"${I18n.t('column.columnOptions')}\"\n >⋮</div>\n\n <!-- Context menu -->\n ${this._openMenuColumnId === column.id ? html`\n <div class=\"column-context-menu\">\n <button\n class=\"column-context-menu-item\"\n @click=\"${(e: Event) => this._handleAddColumnFromMenu(column.id, e)}\"\n >\n ${I18n.t('column.addColumn')}\n </button>\n ${column.removable ? html`\n <button\n class=\"column-context-menu-item remove\"\n @click=\"${(e: Event) => {\n e.stopPropagation();\n this._handleRemoveColumn(column.id);\n }}\"\n >\n ${I18n.t('column.removeColumn')}\n </button>\n ` : ''}\n </div>\n ` : ''}\n ` : ''}\n </th>\n `)}\n </tr>\n </thead>\n <tbody class=\"table-body\">\n ${this._flattenConcepts(this.section.concepts, this._expandedConcepts)\n .filter(concept => {\n if (this.conceptMatchIds?.size && !this.conceptMatchIds.has(concept.originalConceptId)) return false;\n if (this.mode === 'readonly' || this.showFactsOnly) return !this._isConceptRowBlank(concept);\n return true;\n })\n .flatMap(concept => this._renderConceptRows(concept))}\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- Add Column Dialog -->\n <jupiter-add-column-dialog\n .periodType=\"${this._sectionPeriodType}\"\n ?open=\"${this._showAddColumnDialog}\"\n .availableDimensions=\"${this.availableDimensions}\"\n .periodStartDate=\"${this.periodStartDate}\"\n .periodEndDate=\"${this.periodEndDate}\"\n @dialog-cancel=\"${this._handleDialogCancel}\"\n @column-add=\"${this._handleColumnAdd}\"\n ></jupiter-add-column-dialog>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { I18n } from '../utils/i18n';\n\n@customElement('jupiter-advanced-filter')\nexport class JupiterAdvancedFilter extends LitElement {\n @property({ type: Boolean }) showFactsOnly = false;\n @property({ type: String }) conceptSearchText = '';\n\n @state() private _localConceptSearchText = '';\n\n static styles = css`\n :host {\n display: block;\n font-family: var(--jupiter-font-family, system-ui, -apple-system, sans-serif);\n }\n\n .filter-options {\n padding: 24px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .filter-option {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 6px;\n transition: background-color 0.2s ease;\n }\n\n .filter-option.clickable {\n cursor: pointer;\n }\n\n .filter-option.clickable:hover {\n background: var(--menuBgColorLighter, var(--jupiter-hover-background, #f5f5f5));\n }\n\n .filter-option input[type=\"checkbox\"] {\n margin-top: 2px;\n width: 16px;\n height: 16px;\n cursor: pointer;\n flex-shrink: 0;\n }\n\n .filter-option-body {\n flex: 1;\n }\n\n .filter-option-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n cursor: pointer;\n user-select: none;\n }\n\n .filter-option-description {\n font-size: 13px;\n color: var(--primaryTextColor, var(--jupiter-text-secondary, #666));\n margin: 4px 0 0 0;\n line-height: 1.5;\n }\n\n .concept-search-input-wrapper {\n position: relative;\n margin-top: 10px;\n }\n\n .concept-search-input {\n width: 100%;\n box-sizing: border-box;\n padding: 8px 36px 8px 10px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 4px;\n font-size: 13px;\n font-family: inherit;\n background: transparent;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n transition: border-color 0.2s ease;\n }\n\n .concept-search-input::placeholder {\n color: var(--primaryTextColor, var(--jupiter-text-secondary, #999));\n }\n\n .concept-search-clear {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n cursor: pointer;\n padding: 2px 4px;\n border-radius: 2px;\n color: var(--jupiter-text-secondary, #666);\n font-size: 16px;\n line-height: 1;\n transition: color 0.2s ease;\n }\n\n .concept-search-clear:hover {\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n }\n `;\n\n updated(changedProperties: Map<string, any>) {\n if (changedProperties.has('conceptSearchText') && this.conceptSearchText !== this._localConceptSearchText) {\n this._localConceptSearchText = this.conceptSearchText;\n }\n }\n\n private _handleShowFactsOnlyChange(e: Event) {\n const checked = (e.target as HTMLInputElement).checked;\n this.dispatchEvent(new CustomEvent('filter-change', {\n detail: { showFactsOnly: checked, conceptSearchText: this._localConceptSearchText },\n bubbles: true,\n composed: true\n }));\n }\n\n private _handleConceptSearchInput(e: Event) {\n this._localConceptSearchText = (e.target as HTMLInputElement).value;\n this.dispatchEvent(new CustomEvent('filter-change', {\n detail: { showFactsOnly: this.showFactsOnly, conceptSearchText: this._localConceptSearchText },\n bubbles: true,\n composed: true\n }));\n }\n\n private _clearConceptSearch() {\n this._localConceptSearchText = '';\n const input = this.shadowRoot?.querySelector('.concept-search-input') as HTMLInputElement;\n if (input) {\n input.value = '';\n input.focus();\n }\n this.dispatchEvent(new CustomEvent('filter-change', {\n detail: { showFactsOnly: this.showFactsOnly, conceptSearchText: '' },\n bubbles: true,\n composed: true\n }));\n }\n\n render() {\n return html`\n <div class=\"filter-options\">\n <label class=\"filter-option clickable\">\n <input\n type=\"checkbox\"\n .checked=\"${this.showFactsOnly}\"\n @change=\"${this._handleShowFactsOnlyChange}\"\n />\n <div class=\"filter-option-body\">\n <div class=\"filter-option-label\">${I18n.t('filter.showFactsOnly')}</div>\n <p class=\"filter-option-description\">${I18n.t('filter.showFactsOnlyDescription')}</p>\n </div>\n </label>\n\n <div class=\"filter-option\">\n <div class=\"filter-option-body\">\n <div class=\"filter-option-label\">${I18n.t('filter.searchByConcept')}</div>\n <p class=\"filter-option-description\">${I18n.t('filter.searchByConceptDescription')}</p>\n <div class=\"concept-search-input-wrapper\">\n <input\n type=\"text\"\n class=\"concept-search-input\"\n placeholder=\"${I18n.t('filter.searchByConceptPlaceholder')}\"\n .value=\"${this._localConceptSearchText}\"\n @input=\"${this._handleConceptSearchInput}\"\n />\n ${this._localConceptSearchText ? html`\n <button\n class=\"concept-search-clear\"\n @click=\"${this._clearConceptSearch}\"\n title=\"${I18n.t('filter.clearSearch')}\"\n >×</button>\n ` : ''}\n </div>\n </div>\n </div>\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { FormSection, ConceptTree } from '../schema/types';\nimport { I18n } from '../utils/i18n';\nimport './advanced-filter';\n\nexport interface FilterRolesRequest {\n availableRoles: FormSection[];\n currentSelectedRoles: string[];\n}\n\nexport interface DimensionMemberSelection {\n dimensionId: string;\n dimensionLabel: string;\n selectedMemberIds: string[]; // Array of selected member IDs\n}\n\nexport interface RolePeriodPreferences {\n [roleId: string]: {\n showDuration: boolean;\n showInstant: boolean;\n showPreviousYear: boolean;\n dimensionSelections?: DimensionMemberSelection[]; // Optional dimension member selections\n };\n}\n\n@customElement('jupiter-filter-roles-dialog')\nexport class JupiterFilterRolesDialog extends LitElement {\n @property({ type: Boolean, reflect: true }) open = false;\n @property({ type: Array }) availableRoles: FormSection[] = [];\n @property({ type: Array }) selectedRoleIds: string[] = [];\n @property({ type: Object }) periodPreferences: RolePeriodPreferences = {};\n @property({ type: String }) mode: 'inputForm' | 'admin' | 'readonly' = 'inputForm';\n @property({ type: Object }) hypercubeData: any = null; // XBRL hypercube data for dimensions\n @property({ type: Boolean }) showFactsOnly = false;\n @property({ type: String }) conceptSearchText = '';\n\n @state() private _tempSelectedRoles = new Set<string>();\n @state() private _searchQuery = '';\n @state() private _filteredRoles: FormSection[] = [];\n @state() private _tempPeriodPreferences: RolePeriodPreferences = {};\n @state() private _selectedAvailableRole: string | null = null;\n @state() private _selectedChosenRole: string | null = null;\n @state() private _chosenSearchQuery = '';\n @state() private _draggedRoleId: string | null = null;\n @state() private _dragOverRoleId: string | null = null;\n @state() private _chosenRoleOrder: string[] = [];\n @state() private _showAdvancedFilter = false;\n @state() private _showFactsOnly = false;\n @state() private _conceptSearchText = '';\n\n static styles = css`\n :host {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 10000;\n display: none;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.5);\n font-family: var(--jupiter-font-family, system-ui, -apple-system, sans-serif);\n }\n\n :host([open]) {\n display: flex;\n }\n\n .dialog {\n background: var(--jupiter-background, #fff);\n border-radius: 8px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n \n width: 90vw;\n max-height: 80vh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .dialog-header {\n padding: 20px 24px 16px;\n border-bottom: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n display: flex;\n align-items: center;\n gap: 12px;\n background: var(--bg-color-1, var(--jupiter-header-background, #f8f9fa));\n }\n\n .dialog-title {\n font-size: 18px;\n font-weight: 600;\n margin: 0;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n flex: 1;\n }\n\n .filter-icon {\n width: 20px;\n height: 20px;\n fill: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));\n }\n\n .close-button {\n background: none;\n border: none;\n font-size: 24px;\n cursor: pointer;\n padding: 4px;\n color: var(--primaryTextColor, var(--jupiter-text-secondary, #666));\n border-radius: 4px;\n transition: background-color 0.2s ease;\n }\n\n .close-button:hover {\n opacity: 0.9;\n }\n\n .dialog-content {\n background: var(--bg-color-2, var(--jupiter-form-content-background, #fff));\n flex: 1;\n overflow-y: auto;\n padding: 20px 24px;\n }\n\n .description {\n color: var(--primaryTextColor, var(--secondaryTextColor, var(--jupiter-text-secondary, #666))) ;\n font-size: 14px;\n margin: 0 0 20px 0;\n line-height: 1.5;\n }\n\n .selection-controls {\n display: flex;\n gap: 12px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n }\n\n .search-container {\n margin-bottom: 16px;\n position: relative;\n }\n\n .search-input {\n width: stretch;\n padding: 10px 40px 10px 12px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 4px;\n font-size: 14px;\n font-family: inherit;\n background: transparent;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n transition: border-color 0.2s ease;\n }\n\n // .search-input:focus {\n // outline: none;\n // border-color: var(--jupiter-primary-color, #1976d2);\n // box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.1);\n // }\n\n .search-input::placeholder {\n color: var(--primaryTextColor, var(--jupiter-text-secondary, #666));\n }\n\n .search-icon {\n position: absolute;\n right: 12px;\n top: 50%;\n transform: translateY(-50%);\n width: 16px;\n height: 16px;\n fill: var(--jupiter-text-secondary, #666);\n pointer-events: none;\n }\n\n .clear-search {\n position: absolute;\n right: 12px;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n cursor: pointer;\n padding: 2px;\n border-radius: 2px;\n color: var(--jupiter-text-secondary, #666);\n font-size: 16px;\n line-height: 1;\n transition: color 0.2s ease;\n }\n\n .clear-search:hover {\n color: var(--jupiter-text-primary, #333);\n }\n\n .search-results-info {\n font-size: 12px;\n color: var(--jupiter-text-secondary, #666);\n margin-bottom: 8px;\n text-align: center;\n }\n\n .no-results {\n text-align: center;\n padding: 40px 20px;\n color: var(--jupiter-text-secondary, #666);\n font-style: italic;\n }\n\n mark {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: 500;\n }\n\n .selection-control {\n background: none;\n border: 1px solid var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));\n color: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));\n padding: 6px 12px;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .selection-control:hover {\n opacity: 0.9;\n }\n\n .roles-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n max-height: 300px;\n overflow-y: auto;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 4px;\n padding: 12px;\n }\n\n .role-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 8px;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n }\n\n .role-item:hover {\n background: var(--menuBgColorLighter, var(--jupiter-hover-background, #f5f5f5));\n }\n\n .role-checkbox {\n margin-top: 2px;\n cursor: pointer;\n }\n \n .role-info * {\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333)) !important;\n }\n\n .role-info {\n flex: 1;\n min-width: 0;\n }\n\n .role-title {\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n margin: 0 0 4px 0;\n word-wrap: break-word;\n line-height: 1.3;\n }\n\n .role-description {\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n margin: 0;\n line-height: 1.4;\n word-break: break-all; /* Allow URI breaking */\n }\n\n .role-description:last-child {\n margin-bottom: 4px;\n }\n\n .period-controls {\n margin-top: 8px;\n padding: 8px;\n background: var(--bg-color-1, var(--jupiter-background-light, #f8f9fa));\n border-radius: 4px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #e0e0e0));\n }\n\n .period-controls-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n margin: 0 0 6px 0;\n }\n\n .period-checkboxes {\n display: flex;\n gap: 16px;\n flex-wrap: wrap;\n }\n\n .period-checkbox-item {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .period-checkbox {\n cursor: pointer;\n }\n\n .period-checkbox-label {\n font-size: 13px;\n color: var(--jupiter-text-primary, #333);\n cursor: pointer;\n user-select: none;\n }\n\n .dimension-section {\n margin-top: 12px;\n padding: 8px;\n background: var(--jupiter-background, #fff);\n border-radius: 4px;\n border: 1px solid var(--jupiter-border-color, #e0e0e0);\n }\n\n .dimension-header {\n font-size: 12px;\n font-weight: 600;\n color: var(--jupiter-primary-color, #1976d2);\n margin: 0 0 8px 0;\n padding-bottom: 4px;\n border-bottom: 1px solid var(--jupiter-border-color, #e0e0e0);\n }\n\n .dimension-group {\n margin-bottom: 12px;\n }\n\n .dimension-group:last-child {\n margin-bottom: 0;\n }\n\n .dimension-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--jupiter-text-secondary, #666);\n margin: 0 0 6px 0;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .dimension-members {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding-left: 8px;\n }\n\n .member-checkbox-item {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 2px 0;\n }\n\n .member-checkbox {\n cursor: pointer;\n flex-shrink: 0;\n }\n\n .member-checkbox-label {\n font-size: 12px;\n color: var(--jupiter-text-primary, #333);\n cursor: pointer;\n user-select: none;\n line-height: 1.3;\n }\n\n .member-select-controls {\n display: flex;\n gap: 8px;\n margin-top: 6px;\n padding-left: 8px;\n }\n\n .member-select-btn {\n background: none;\n border: 1px solid var(--jupiter-border-color, #ddd);\n color: var(--jupiter-text-secondary, #666);\n padding: 2px 8px;\n border-radius: 3px;\n font-size: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .member-select-btn:hover {\n background: var(--jupiter-hover-background, #f5f5f5);\n border-color: var(--jupiter-primary-color, #1976d2);\n color: var(--jupiter-primary-color, #1976d2);\n }\n\n .no-dimensions-message {\n font-size: 11px;\n color: var(--jupiter-text-secondary, #999);\n font-style: italic;\n padding: 4px 8px;\n }\n\n .selected-count {\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n margin-top: 16px;\n text-align: center;\n }\n\n .dialog-actions {\n padding: 16px 24px;\n border-top: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n background: var(--bg-color-2, var(--jupiter-form-actions-background, #f8f9fa));\n }\n\n .dialog-actions button {\n padding: 10px 20px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s ease;\n }\n\n .btn-primary {\n background: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));\n color: var(--buttonTextColor, white);\n }\n\n .btn-primary:hover:not(:disabled) {\n opacity: 0.9;\n }\n\n .btn-secondary {\n color: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));\n border: 1px solid var(--buttonBgColor, var(--jupiter-primary-color, #1976d2)) !important;\n background: transparent;\n }\n\n .btn-secondary:hover:not(:disabled) {\n opacity: 0.9;\n }\n\n button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n /* Picklist Styles for Admin Mode */\n .picklist-container {\n display: flex;\n gap: 16px;\n height: 500px;\n }\n\n .picklist-panel {\n flex: 1;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n overflow: hidden;\n }\n\n .picklist-header {\n padding: 12px;\n background: var(--jupiter-background-light, #f8f9fa);\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n font-weight: 600;\n color: var(--jupiter-text-primary, #333);\n font-size: 14px;\n }\n\n .picklist-search {\n padding: 12px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n }\n\n .picklist-list {\n flex: 1;\n overflow-y: auto;\n padding: 8px;\n }\n\n .picklist-item {\n padding: 10px 12px;\n margin-bottom: 4px;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--jupiter-background, #fff);\n }\n\n .picklist-item:hover {\n background: var(--jupiter-hover-background, #f5f5f5);\n border-color: var(--jupiter-primary-color, #1976d2);\n }\n\n .picklist-item.selected {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n border-color: var(--jupiter-primary-color, #1976d2);\n }\n\n .picklist-item.dragging {\n opacity: 0.5;\n cursor: move;\n }\n\n .picklist-item.drag-over {\n border-top: 3px solid var(--jupiter-primary-color, #1976d2);\n margin-top: 3px;\n }\n\n .picklist-item[draggable=\"true\"] {\n cursor: move;\n }\n\n .picklist-item-label {\n font-weight: 500;\n font-size: 14px;\n margin-bottom: 4px;\n }\n\n .picklist-item-value {\n font-size: 11px;\n opacity: 0.8;\n word-break: break-all;\n }\n\n .picklist-controls {\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 8px;\n padding: 0 8px;\n }\n\n .picklist-button {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 14px;\n transition: background-color 0.2s ease;\n }\n\n .picklist-button:hover:not(:disabled) {\n background: var(--jupiter-primary-color-dark, #1565c0);\n }\n\n .picklist-button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n .picklist-count {\n padding: 8px 12px;\n font-size: 12px;\n color: var(--jupiter-text-secondary, #666);\n background: var(--jupiter-background-light, #f8f9fa);\n border-top: 1px solid var(--jupiter-border-color, #ddd);\n text-align: center;\n }\n\n .btn-text {\n background: none;\n border: none;\n color: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));\n padding: 10px 8px;\n font-size: 14px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n margin-right: auto;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n }\n\n .btn-text:hover {\n background: var(--menuBgColorLighter, var(--jupiter-hover-background, #f5f5f5));\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this._initializeTempSelection();\n this._initializePeriodPreferences();\n }\n\n updated(changedProperties: Map<string, any>) {\n if (changedProperties.has('selectedRoleIds') || changedProperties.has('open')) {\n this._initializeTempSelection();\n }\n if (changedProperties.has('availableRoles') || changedProperties.has('_searchQuery')) {\n this._updateFilteredRoles();\n }\n if (changedProperties.has('availableRoles') || changedProperties.has('periodPreferences') || changedProperties.has('open')) {\n this._initializePeriodPreferences();\n }\n if (changedProperties.has('open')) {\n if (!this.open) {\n this._showAdvancedFilter = false;\n } else {\n this._showFactsOnly = this.showFactsOnly;\n this._conceptSearchText = this.conceptSearchText;\n }\n }\n }\n\n private _updateFilteredRoles() {\n if (!this._searchQuery.trim()) {\n // Use natural order from XBRL data\n this._filteredRoles = [...this.availableRoles];\n return;\n }\n\n const query = this._searchQuery.toLowerCase().trim();\n const filtered = this.availableRoles.filter(role => {\n // Search in role title\n const titleMatch = role.title.toLowerCase().includes(query);\n \n // Search in role ID\n const idMatch = role.id.toLowerCase().includes(query);\n \n // Search in role description if available\n const descriptionMatch = role.description?.toLowerCase().includes(query) || false;\n \n // Search in roleURI if available (from metadata or if stored separately)\n // For now, we'll search in the title for URI-like patterns or check if role has URI-like structure\n const uriMatch = this._searchInRoleURI(role, query);\n \n return titleMatch || idMatch || descriptionMatch || uriMatch;\n });\n\n // Keep natural order for filtered results\n this._filteredRoles = filtered;\n }\n\n private _searchInRoleURI(role: FormSection, query: string): boolean {\n // If the role has metadata that contains roleURI\n if (role.metadata?.roleURI) {\n return role.metadata.roleURI.toLowerCase().includes(query);\n }\n \n // Look for URI patterns in title or ID\n const uriPattern = /https?:\\/\\/[^\\s]+/i;\n const titleHasURI = uriPattern.test(role.title);\n const idHasURI = uriPattern.test(role.id);\n \n if (titleHasURI || idHasURI) {\n return role.title.toLowerCase().includes(query) || role.id.toLowerCase().includes(query);\n }\n \n // If role ID follows URI-like pattern (contains dots, slashes, etc.)\n if (role.id.includes('.') || role.id.includes('/') || role.id.includes(':')) {\n return role.id.toLowerCase().includes(query);\n }\n \n return false;\n }\n\n private _handleSearchInput(event: Event) {\n const input = event.target as HTMLInputElement;\n this._searchQuery = input.value;\n }\n\n private _clearSearch() {\n this._searchQuery = '';\n const searchInput = this.shadowRoot?.querySelector('.search-input') as HTMLInputElement;\n if (searchInput) {\n searchInput.value = '';\n searchInput.focus();\n }\n }\n\n private _handleChosenSearchInput(event: Event) {\n const input = event.target as HTMLInputElement;\n this._chosenSearchQuery = input.value;\n }\n\n private _clearChosenSearch() {\n this._chosenSearchQuery = '';\n const searchInput = this.shadowRoot?.querySelector('.chosen-search-input') as HTMLInputElement;\n if (searchInput) {\n searchInput.value = '';\n searchInput.focus();\n }\n }\n\n private _highlightSearchTerm(text: string): string {\n if (!this._searchQuery.trim()) {\n return text;\n }\n\n const query = this._searchQuery.trim();\n const regex = new RegExp(`(${query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')})`, 'gi');\n return text.replace(regex, '<mark>$1</mark>');\n }\n\n private _renderHighlightedText(text: string) {\n // For compatibility, just return the text without highlighting for now\n return text;\n }\n\n private _getSelectedFilteredCount(): number {\n return this._filteredRoles.filter(role => this._tempSelectedRoles.has(role.id)).length;\n }\n\n private _initializeTempSelection() {\n this._tempSelectedRoles = new Set(this.selectedRoleIds);\n // Initialize chosen role order from selected role IDs\n this._chosenRoleOrder = [...this.selectedRoleIds];\n }\n\n private _initializePeriodPreferences() {\n // Initialize period preferences for all roles, preserving existing preferences\n const preferences: RolePeriodPreferences = {};\n this.availableRoles.forEach(role => {\n // Check if we have existing preferences for this role\n const existingPrefs = this.periodPreferences[role.id];\n \n if (existingPrefs) {\n // Preserve existing user preferences\n preferences[role.id] = { ...existingPrefs };\n } else {\n // Initialize defaults for new roles\n // For mixed-period roles, use preset values from presentation data or detect from concepts\n const hasMixedPeriods = role.showPeriodControl === true;\n \n // Read preset values from role data if available, otherwise detect from concepts\n let showDuration: boolean;\n let showInstant: boolean;\n \n if (role.duration !== undefined || role.instant !== undefined) {\n // Use preset values from presentation.json\n showDuration = role.duration === true;\n showInstant = role.instant === true;\n } else {\n // Fallback: detect from concepts\n showDuration = hasMixedPeriods || this._hasConceptsWithPeriodType(role, 'duration');\n showInstant = hasMixedPeriods || this._hasConceptsWithPeriodType(role, 'instant');\n }\n \n preferences[role.id] = {\n showDuration: showDuration,\n showInstant: showInstant,\n showPreviousYear: role.showPreviousYear === true // Read from role data in presentation.json\n };\n }\n \n // Auto-select ALL dimension members by default (for first time initialization)\n const dimensions = this._getDimensionsForRole(role.id);\n if (dimensions.length > 0 && !existingPrefs?.dimensionSelections) {\n // Only auto-select if there are no existing dimension selections (first time)\n if (!preferences[role.id].dimensionSelections) {\n preferences[role.id].dimensionSelections = [];\n }\n \n dimensions.forEach((dimension: any) => {\n const allMembers = this._getAllDimensionMembers(dimension.members);\n if (allMembers.length > 0) {\n // Auto-select ALL members by default\n const dimensionLabel = dimension.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n const allMemberIds = allMembers.map((m: any) => m.id);\n \n const dimensionSelection = {\n dimensionId: dimension.id,\n dimensionLabel: dimensionLabel,\n selectedMemberIds: allMemberIds\n };\n \n preferences[role.id].dimensionSelections!.push(dimensionSelection);\n console.log(`✅ Auto-selected all ${allMemberIds.length} members for dimension: ${dimensionLabel}`);\n }\n });\n }\n });\n this._tempPeriodPreferences = preferences;\n }\n\n private _hasConceptsWithPeriodType(role: FormSection, periodType: 'instant' | 'duration'): boolean {\n const checkConcepts = (concepts: ConceptTree[]): boolean => {\n return concepts.some(concept => {\n if (!concept.abstract && concept.periodType === periodType) {\n return true;\n }\n if (concept.children) {\n return checkConcepts(concept.children);\n }\n return false;\n });\n };\n return checkConcepts(role.concepts);\n }\n\n private _handlePeriodCheckboxChange(event: Event, roleId: string, periodType: 'duration' | 'instant' | 'previousYear') {\n event.stopPropagation();\n const checkbox = event.target as HTMLInputElement;\n \n const newPreferences = { ...this._tempPeriodPreferences };\n if (!newPreferences[roleId]) {\n newPreferences[roleId] = { showDuration: true, showInstant: true, showPreviousYear: false };\n }\n \n if (periodType === 'duration') {\n newPreferences[roleId].showDuration = checkbox.checked;\n } else if (periodType === 'instant') {\n newPreferences[roleId].showInstant = checkbox.checked;\n } else if (periodType === 'previousYear') {\n newPreferences[roleId].showPreviousYear = checkbox.checked;\n }\n \n this._tempPeriodPreferences = newPreferences;\n this.requestUpdate();\n }\n\n private _enforceSingleMemberSelectionsForRole(\n roleId: string,\n preferences: RolePeriodPreferences\n ): RolePeriodPreferences {\n const dimensions = this._getDimensionsForRole(roleId);\n if (dimensions.length === 0) {\n return preferences;\n }\n\n const nextPreferences = { ...preferences };\n const rolePreferences = nextPreferences[roleId]\n ? { ...nextPreferences[roleId] }\n : {\n showDuration: true,\n showInstant: true,\n showPreviousYear: false,\n dimensionSelections: []\n };\n\n const selections = rolePreferences.dimensionSelections\n ? [...rolePreferences.dimensionSelections]\n : [];\n\n dimensions.forEach((dimension: any) => {\n if (!this._isSingleMemberDimension(dimension)) {\n return;\n }\n\n const allMembers = this._getAllDimensionMembers(dimension.members);\n if (allMembers.length !== 1) {\n return;\n }\n\n const onlyMemberId = allMembers[0].id;\n const dimensionLabel =\n dimension.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label ||\n dimension.conceptName ||\n dimension.id;\n\n const selectionIndex = selections.findIndex(ds => ds.dimensionId === dimension.id);\n if (selectionIndex === -1) {\n selections.push({\n dimensionId: dimension.id,\n dimensionLabel,\n selectedMemberIds: [onlyMemberId]\n });\n return;\n }\n\n selections[selectionIndex] = {\n ...selections[selectionIndex],\n dimensionLabel,\n selectedMemberIds: [onlyMemberId]\n };\n });\n\n rolePreferences.dimensionSelections = selections;\n nextPreferences[roleId] = rolePreferences;\n return nextPreferences;\n }\n\n private _enforceSingleMemberSelectionsForSelectedRoles(\n preferences: RolePeriodPreferences,\n selectedRoles: Iterable<string> = this._tempSelectedRoles\n ): RolePeriodPreferences {\n let nextPreferences = { ...preferences };\n for (const roleId of selectedRoles) {\n nextPreferences = this._enforceSingleMemberSelectionsForRole(roleId, nextPreferences);\n }\n return nextPreferences;\n }\n\n private _handleCheckboxChange(event: Event, roleId: string) {\n const checkbox = event.target as HTMLInputElement;\n const newSelection = new Set(this._tempSelectedRoles);\n let newPreferences = { ...this._tempPeriodPreferences };\n \n if (checkbox.checked) {\n newSelection.add(roleId);\n newPreferences = this._enforceSingleMemberSelectionsForRole(roleId, newPreferences);\n } else {\n newSelection.delete(roleId);\n }\n \n this._tempSelectedRoles = newSelection;\n this._tempPeriodPreferences = newPreferences;\n this.requestUpdate();\n }\n\n private _selectAll() {\n // Select all currently filtered roles\n const newSelection = new Set(this._tempSelectedRoles);\n this._filteredRoles.forEach(role => newSelection.add(role.id));\n this._tempSelectedRoles = newSelection;\n this._tempPeriodPreferences = this._enforceSingleMemberSelectionsForSelectedRoles(\n this._tempPeriodPreferences,\n newSelection\n );\n this.requestUpdate();\n }\n\n private _selectNone() {\n // Deselect all currently filtered roles\n const newSelection = new Set(this._tempSelectedRoles);\n this._filteredRoles.forEach(role => newSelection.delete(role.id));\n this._tempSelectedRoles = newSelection;\n this.requestUpdate();\n }\n\n private _selectAllGlobal() {\n // Select all available roles (ignore filter)\n const newSelection = new Set(this.availableRoles.map(role => role.id));\n this._tempSelectedRoles = newSelection;\n this._tempPeriodPreferences = this._enforceSingleMemberSelectionsForSelectedRoles(\n this._tempPeriodPreferences,\n newSelection\n );\n this.requestUpdate();\n }\n\n private _selectNoneGlobal() {\n // Deselect all roles (ignore filter)\n this._tempSelectedRoles = new Set();\n this.requestUpdate();\n }\n\n private _resetToOriginal() {\n this._tempSelectedRoles = new Set(this.selectedRoleIds);\n this._tempPeriodPreferences = this._enforceSingleMemberSelectionsForSelectedRoles(\n this._tempPeriodPreferences,\n this._tempSelectedRoles\n );\n this.requestUpdate();\n }\n\n private _handleCancel() {\n this._initializeTempSelection();\n this.dispatchEvent(new CustomEvent('dialog-cancel', {\n bubbles: true\n }));\n }\n\n private _handleApply() {\n const normalizedPreferences = this._enforceSingleMemberSelectionsForSelectedRoles(\n this._tempPeriodPreferences,\n this._tempSelectedRoles\n );\n this._tempPeriodPreferences = normalizedPreferences;\n\n // Preserve the user's drag-and-drop order from _chosenRoleOrder.\n // Filter out any roles that were deselected, then append any newly selected\n // roles that somehow aren't in the order list yet (edge-case safety).\n const orderedSelected = this._chosenRoleOrder.filter(id => this._tempSelectedRoles.has(id));\n const notInOrder = Array.from(this._tempSelectedRoles).filter(id => !this._chosenRoleOrder.includes(id));\n this._chosenRoleOrder = [...orderedSelected, ...notInOrder];\n \n // Create ordered roles with roleURI metadata for localStorage persistence\n const orderedRolesWithMetadata = this._chosenRoleOrder.map((roleId, index) => {\n const role = this.availableRoles.find(r => r.id === roleId);\n return {\n roleId: roleId,\n roleURI: role?.metadata?.roleURI || '',\n order: index\n };\n });\n \n console.log('✅ Apply Filter - Enhanced structure being emitted:', orderedRolesWithMetadata);\n console.log('📋 Order array:', this._chosenRoleOrder);\n console.log('📊 Dimension preferences being emitted:', normalizedPreferences);\n \n this.dispatchEvent(new CustomEvent('roles-filter-apply', {\n detail: { \n selectedRoleIds: orderedRolesWithMetadata,\n periodPreferences: normalizedPreferences\n },\n bubbles: true\n }));\n }\n\n /**\n * Get dimensions for a specific role from hypercube data\n */\n private _getDimensionsForRole(roleId: string): any[] {\n console.log('🔍 [getDimensionsForRole] Called with roleId:', roleId);\n console.log('🔍 [getDimensionsForRole] hypercubeData exists:', !!this.hypercubeData);\n console.log('🔍 [getDimensionsForRole] hypercubeData type:', typeof this.hypercubeData);\n console.log('🔍 [getDimensionsForRole] hypercubeData value:', this.hypercubeData);\n \n if (!this.hypercubeData) {\n console.error('❌ [getDimensionsForRole] CRITICAL: hypercubeData is null/undefined/false');\n console.error('❌ Parent component must pass hypercubeData property to filter dialog!');\n console.error('❌ Example: <jupiter-filter-roles-dialog .hypercubeData=\"${hypercubeData}\">');\n return [];\n }\n \n // Handle array-wrapped format: [{ roles: [...] }] -> { roles: [...] }\n let hypercubeDataObj = this.hypercubeData;\n if (Array.isArray(this.hypercubeData) && this.hypercubeData.length > 0) {\n console.log('📦 [getDimensionsForRole] Detected array-wrapped format, unwrapping...');\n hypercubeDataObj = this.hypercubeData[0];\n }\n \n console.log('🔍 [getDimensionsForRole] hypercubeDataObj.roles exists:', !!hypercubeDataObj?.roles);\n \n if (!hypercubeDataObj?.roles) {\n console.warn('⚠️ [getDimensionsForRole] No roles found in hypercube data structure');\n console.warn('⚠️ Expected structure: { roles: [...] } or [{ roles: [...] }]');\n return [];\n }\n \n console.log('🔍 [getDimensionsForRole] Available hypercube roles:', \n hypercubeDataObj.roles.map((r: any) => r.roleId)\n );\n \n const hypercubeRole = hypercubeDataObj.roles.find((r: any) => r.roleId === roleId);\n console.log('🔍 [getDimensionsForRole] Found hypercube role:', !!hypercubeRole);\n \n if (!hypercubeRole?.items?.length) {\n console.warn('⚠️ [getDimensionsForRole] No items found in hypercube role for:', roleId);\n return [];\n }\n \n console.log('🔍 [getDimensionsForRole] Items count:', hypercubeRole.items.length);\n \n // Get dimensions from the first item (typically there's only one)\n const dimensions = hypercubeRole.items[0]?.dimensions || [];\n console.log('🔍 [getDimensionsForRole] Total dimensions found:', dimensions.length);\n console.log('🔍 [getDimensionsForRole] Dimension details:', dimensions.map((d: any) => ({\n id: d.id,\n type: d.dimensionType,\n hasMembers: !!(d.members && d.members.length > 0),\n membersCount: d.members?.length || 0\n })));\n \n // Filter to only include explicit dimensions with members (not typed-only dimensions)\n const filtered = dimensions.filter((dim: any) => \n dim.dimensionType === 'explicit' && \n dim.members && \n Array.isArray(dim.members) && \n dim.members.length > 0\n );\n \n console.log('✅ [getDimensionsForRole] Filtered dimensions count:', filtered.length);\n console.log('✅ [getDimensionsForRole] Filtered dimension IDs:', filtered.map((d: any) => d.id));\n \n return filtered;\n }\n\n /**\n * Get all members for a dimension (including nested children)\n */\n private _getAllDimensionMembers(members: any[]): any[] {\n if (!members || !Array.isArray(members)) {\n return [];\n }\n\n const allMembers: any[] = [];\n \n members.forEach(member => {\n allMembers.push(member);\n \n if (member.children && member.children.length > 0) {\n allMembers.push(...this._getAllDimensionMembers(member.children));\n }\n });\n \n return allMembers;\n }\n\n /**\n * Check if dimension has only one member (should be auto-selected and disabled)\n */\n private _isSingleMemberDimension(dimension: any): boolean {\n const allMembers = this._getAllDimensionMembers(dimension.members);\n return allMembers.length === 1;\n }\n\n /**\n * Handle dimension member selection change\n */\n private _handleDimensionMemberChange(event: Event, roleId: string, dimensionId: string, memberId: string) {\n event.stopPropagation();\n const checkbox = event.target as HTMLInputElement;\n \n const newPreferences = { ...this._tempPeriodPreferences };\n if (!newPreferences[roleId]) {\n newPreferences[roleId] = { \n showDuration: true, \n showInstant: true, \n showPreviousYear: false,\n dimensionSelections: []\n };\n }\n \n // Initialize dimensionSelections if not present\n if (!newPreferences[roleId].dimensionSelections) {\n newPreferences[roleId].dimensionSelections = [];\n }\n \n // Find or create dimension selection entry\n let dimensionSelection = newPreferences[roleId].dimensionSelections!.find(\n ds => ds.dimensionId === dimensionId\n );\n \n if (!dimensionSelection) {\n // Get dimension label\n const dimensions = this._getDimensionsForRole(roleId);\n const dimension = dimensions.find((d: any) => d.id === dimensionId);\n const dimensionLabel = dimension?.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimensionId;\n \n dimensionSelection = {\n dimensionId: dimensionId,\n dimensionLabel: dimensionLabel,\n selectedMemberIds: []\n };\n newPreferences[roleId].dimensionSelections!.push(dimensionSelection);\n }\n \n // Update selected members\n if (checkbox.checked) {\n if (!dimensionSelection.selectedMemberIds.includes(memberId)) {\n dimensionSelection.selectedMemberIds.push(memberId);\n }\n } else {\n dimensionSelection.selectedMemberIds = dimensionSelection.selectedMemberIds.filter(\n id => id !== memberId\n );\n }\n\n const dimensions = this._getDimensionsForRole(roleId);\n const dimension = dimensions.find((d: any) => d.id === dimensionId);\n if (dimension && this._tempSelectedRoles.has(roleId) && this._isSingleMemberDimension(dimension)) {\n const allMembers = this._getAllDimensionMembers(dimension.members);\n if (allMembers.length === 1) {\n dimensionSelection.selectedMemberIds = [allMembers[0].id];\n checkbox.checked = true;\n }\n }\n \n this._tempPeriodPreferences = newPreferences;\n console.log('📊 Updated dimension selections:', newPreferences[roleId].dimensionSelections);\n this.requestUpdate();\n }\n\n /**\n * Check if a dimension member is selected\n */\n private _isDimensionMemberSelected(roleId: string, dimensionId: string, memberId: string): boolean {\n const preferences = this._tempPeriodPreferences[roleId];\n if (!preferences?.dimensionSelections) {\n return false;\n }\n \n const dimensionSelection = preferences.dimensionSelections.find(\n ds => ds.dimensionId === dimensionId\n );\n \n return dimensionSelection?.selectedMemberIds.includes(memberId) || false;\n }\n\n /**\n * Select all members for a dimension\n */\n private _selectAllDimensionMembers(roleId: string, dimensionId: string) {\n const dimensions = this._getDimensionsForRole(roleId);\n const dimension = dimensions.find((d: any) => d.id === dimensionId);\n if (!dimension) return;\n \n const allMembers = this._getAllDimensionMembers(dimension.members);\n const allMemberIds = allMembers.map((m: any) => m.id);\n \n const newPreferences = { ...this._tempPeriodPreferences };\n if (!newPreferences[roleId]) {\n newPreferences[roleId] = { \n showDuration: true, \n showInstant: true, \n showPreviousYear: false,\n dimensionSelections: []\n };\n }\n \n if (!newPreferences[roleId].dimensionSelections) {\n newPreferences[roleId].dimensionSelections = [];\n }\n \n // Find or create dimension selection entry\n let dimensionSelection = newPreferences[roleId].dimensionSelections!.find(\n ds => ds.dimensionId === dimensionId\n );\n \n if (!dimensionSelection) {\n const dimensionLabel = dimension.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimensionId;\n dimensionSelection = {\n dimensionId: dimensionId,\n dimensionLabel: dimensionLabel,\n selectedMemberIds: []\n };\n newPreferences[roleId].dimensionSelections!.push(dimensionSelection);\n }\n \n dimensionSelection.selectedMemberIds = allMemberIds;\n this._tempPeriodPreferences = newPreferences;\n this.requestUpdate();\n }\n\n /**\n * Deselect all members for a dimension\n */\n private _deselectAllDimensionMembers(roleId: string, dimensionId: string) {\n const newPreferences = { ...this._tempPeriodPreferences };\n if (!newPreferences[roleId]?.dimensionSelections) {\n return;\n }\n \n const dimensionSelection = newPreferences[roleId].dimensionSelections!.find(\n ds => ds.dimensionId === dimensionId\n );\n \n if (dimensionSelection) {\n dimensionSelection.selectedMemberIds = [];\n }\n \n this._tempPeriodPreferences = newPreferences;\n this.requestUpdate();\n }\n\n private _switchToAdvancedFilter() {\n this._showAdvancedFilter = true;\n this._searchQuery = '';\n }\n\n private _switchToFilterRoles() {\n this._showAdvancedFilter = false;\n }\n\n private _handleFilterChange(e: CustomEvent) {\n this._showFactsOnly = e.detail.showFactsOnly;\n this._conceptSearchText = e.detail.conceptSearchText ?? '';\n }\n\n private _handleAdvancedFilterApply() {\n this.dispatchEvent(new CustomEvent('advanced-filter-apply', {\n detail: { showFactsOnly: this._showFactsOnly, conceptSearchText: this._conceptSearchText },\n bubbles: true\n }));\n }\n\n private _handleBackdropClick(event: Event) {\n if (event.target === this) {\n this._handleCancel();\n }\n }\n\n // Picklist methods for admin mode\n private _handleAvailableRoleClick(roleId: string) {\n this._selectedAvailableRole = roleId;\n this._selectedChosenRole = null;\n this.requestUpdate();\n }\n\n private _handleChosenRoleClick(roleId: string) {\n this._selectedChosenRole = roleId;\n this._selectedAvailableRole = null;\n this.requestUpdate();\n }\n\n private _moveToChosen() {\n if (!this._selectedAvailableRole) return;\n \n const newSelection = new Set(this._tempSelectedRoles);\n newSelection.add(this._selectedAvailableRole);\n this._tempSelectedRoles = newSelection;\n this._tempPeriodPreferences = this._enforceSingleMemberSelectionsForRole(\n this._selectedAvailableRole,\n this._tempPeriodPreferences\n );\n \n // Add to order list\n if (!this._chosenRoleOrder.includes(this._selectedAvailableRole)) {\n this._chosenRoleOrder = [...this._chosenRoleOrder, this._selectedAvailableRole];\n }\n \n this._selectedAvailableRole = null;\n this.requestUpdate();\n }\n\n private _moveToAvailable() {\n if (!this._selectedChosenRole) return;\n \n const newSelection = new Set(this._tempSelectedRoles);\n newSelection.delete(this._selectedChosenRole);\n this._tempSelectedRoles = newSelection;\n \n // Remove from order list\n this._chosenRoleOrder = this._chosenRoleOrder.filter(id => id !== this._selectedChosenRole);\n \n this._selectedChosenRole = null;\n this.requestUpdate();\n }\n\n private _moveAllToChosen() {\n const newSelection = new Set(this._tempSelectedRoles);\n this._filteredRoles.forEach(role => {\n newSelection.add(role.id);\n if (!this._chosenRoleOrder.includes(role.id)) {\n this._chosenRoleOrder.push(role.id);\n }\n });\n this._tempSelectedRoles = newSelection;\n this._tempPeriodPreferences = this._enforceSingleMemberSelectionsForSelectedRoles(\n this._tempPeriodPreferences,\n newSelection\n );\n this._selectedAvailableRole = null;\n this.requestUpdate();\n }\n\n private _moveAllToAvailable() {\n this._tempSelectedRoles = new Set();\n this._chosenRoleOrder = [];\n this._selectedChosenRole = null;\n this.requestUpdate();\n }\n\n private _getAvailableRoles(): FormSection[] {\n return this._filteredRoles.filter(role => !this._tempSelectedRoles.has(role.id));\n }\n\n private _getChosenRoles(): FormSection[] {\n const chosenRoles = this.availableRoles.filter(role => this._tempSelectedRoles.has(role.id));\n \n // Sort by order in _chosenRoleOrder\n const orderedRoles = this._chosenRoleOrder\n .map(roleId => chosenRoles.find(role => role.id === roleId))\n .filter(role => role !== undefined) as FormSection[];\n \n // Add any roles not in order list (shouldn't happen, but just in case)\n const unorderedRoles = chosenRoles.filter(role => !this._chosenRoleOrder.includes(role.id));\n const allOrderedRoles = [...orderedRoles, ...unorderedRoles];\n \n if (!this._chosenSearchQuery.trim()) {\n return allOrderedRoles;\n }\n \n const query = this._chosenSearchQuery.toLowerCase().trim();\n return allOrderedRoles.filter(role => {\n const titleMatch = role.title.toLowerCase().includes(query);\n const idMatch = role.id.toLowerCase().includes(query);\n const descriptionMatch = role.description?.toLowerCase().includes(query) || false;\n const uriMatch = this._searchInRoleURI(role, query);\n \n return titleMatch || idMatch || descriptionMatch || uriMatch;\n });\n }\n\n // Drag and drop handlers\n private _handleDragStart(event: DragEvent, roleId: string) {\n this._draggedRoleId = roleId;\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', roleId);\n }\n this.requestUpdate();\n }\n\n private _handleDragOver(event: DragEvent, roleId: string) {\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move';\n }\n if (this._draggedRoleId && this._draggedRoleId !== roleId) {\n this._dragOverRoleId = roleId;\n this.requestUpdate();\n }\n }\n\n private _handleDragLeave(event: DragEvent) {\n this._dragOverRoleId = null;\n this.requestUpdate();\n }\n\n private _handleDrop(event: DragEvent, targetRoleId: string) {\n event.preventDefault();\n \n if (!this._draggedRoleId || this._draggedRoleId === targetRoleId) {\n this._draggedRoleId = null;\n this._dragOverRoleId = null;\n this.requestUpdate();\n return;\n }\n \n // Reorder the chosen roles\n const newOrder = [...this._chosenRoleOrder];\n const draggedIndex = newOrder.indexOf(this._draggedRoleId);\n const targetIndex = newOrder.indexOf(targetRoleId);\n \n if (draggedIndex !== -1 && targetIndex !== -1) {\n // Remove dragged item\n newOrder.splice(draggedIndex, 1);\n // Insert at new position (account for removal: if dragging down, target moved up by 1)\n const newTargetIndex = draggedIndex < targetIndex ? targetIndex - 1 : targetIndex;\n newOrder.splice(newTargetIndex, 0, this._draggedRoleId);\n this._chosenRoleOrder = newOrder;\n \n console.log('🔄 Reordered roles:', this._chosenRoleOrder);\n }\n \n this._draggedRoleId = null;\n this._dragOverRoleId = null;\n this.requestUpdate();\n }\n\n private _handleDragEnd(event: DragEvent) {\n this._draggedRoleId = null;\n this._dragOverRoleId = null;\n this.requestUpdate();\n }\n\n render() {\n const selectedCount = this._tempSelectedRoles.size;\n const totalCount = this.availableRoles.length;\n const filteredCount = this._filteredRoles.length;\n const hasSearchQuery = this._searchQuery.trim().length > 0;\n\n return html`\n <div class=\"dialog\" @click=\"${(e: Event) => e.stopPropagation()}\">\n <!-- Dialog Header -->\n <div class=\"dialog-header\">\n <svg class=\"filter-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\"/>\n </svg>\n <h2 class=\"dialog-title\">${I18n.t('filter.title')}</h2>\n <button class=\"close-button\" @click=\"${this._handleCancel}\">×</button>\n </div>\n\n <!-- Dialog Content -->\n <div class=\"dialog-content\">\n ${this.mode === 'admin' ? html`\n <!-- Admin Mode: Picklist Layout -->\n <div class=\"picklist-container\">\n <!-- Available Roles Panel -->\n <div class=\"picklist-panel\">\n <div class=\"picklist-header\">\n ${I18n.t('filter.availableRoles')} (${this._getAvailableRoles().length})\n </div>\n <div class=\"picklist-search\">\n <div class=\"search-container\">\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"${I18n.t('filter.searchPlaceholder')}\"\n .value=\"${this._searchQuery}\"\n @input=\"${this._handleSearchInput}\"\n />\n ${this._searchQuery ? html`\n <button class=\"clear-search\" @click=\"${this._clearSearch}\" title=\"${I18n.t('filter.clearSearch')}\">\n ×\n </button>\n ` : html`\n <svg class=\"search-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"/>\n </svg>\n `}\n </div>\n </div>\n <div class=\"picklist-list\">\n ${this._getAvailableRoles().map(role => html`\n <div \n class=\"picklist-item ${this._selectedAvailableRole === role.id ? 'selected' : ''}\"\n @click=\"${() => this._handleAvailableRoleClick(role.id)}\"\n @dblclick=\"${() => { this._handleAvailableRoleClick(role.id); this._moveToChosen(); }}\"\n >\n <div class=\"picklist-item-label\">${role.title}</div>\n ${role.metadata?.roleURI ? html`\n <div class=\"picklist-item-value\">${role.metadata.roleURI}</div>\n ` : ''}\n </div>\n `)}\n </div>\n <div class=\"picklist-count\">\n ${this._getAvailableRoles().length} ${I18n.t('filter.roleCount')}\n </div>\n </div>\n\n <!-- Control Buttons -->\n <div class=\"picklist-controls\">\n <button \n class=\"picklist-button\"\n @click=\"${this._moveToChosen}\"\n ?disabled=\"${!this._selectedAvailableRole}\"\n title=\"${I18n.t('filter.addSelectedRole')}\"\n >\n ›\n </button>\n <button \n class=\"picklist-button\"\n @click=\"${this._moveAllToChosen}\"\n ?disabled=\"${this._getAvailableRoles().length === 0}\"\n title=\"${I18n.t('filter.addAllRoles')}\"\n >\n »\n </button>\n <button \n class=\"picklist-button\"\n @click=\"${this._moveToAvailable}\"\n ?disabled=\"${!this._selectedChosenRole}\"\n title=\"${I18n.t('filter.removeSelectedRole')}\"\n >\n ‹\n </button>\n <button \n class=\"picklist-button\"\n @click=\"${this._moveAllToAvailable}\"\n ?disabled=\"${this._tempSelectedRoles.size === 0}\"\n title=\"${I18n.t('filter.removeAllRoles')}\"\n >\n «\n </button>\n </div>\n\n <!-- Chosen Roles Panel -->\n <div class=\"picklist-panel\">\n <div class=\"picklist-header\">\n ${I18n.t('filter.chosenRoles')} (${this._tempSelectedRoles.size})\n </div>\n <div class=\"picklist-search\">\n <div class=\"search-container\">\n <input\n type=\"text\"\n class=\"search-input chosen-search-input\"\n placeholder=\"${I18n.t('filter.searchPlaceholder')}\"\n .value=\"${this._chosenSearchQuery}\"\n @input=\"${this._handleChosenSearchInput}\"\n />\n ${this._chosenSearchQuery ? html`\n <button class=\"clear-search\" @click=\"${this._clearChosenSearch}\" title=\"${I18n.t('filter.clearSearch')}\">\n ×\n </button>\n ` : html`\n <svg class=\"search-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"/>\n </svg>\n `}\n </div>\n </div>\n <div class=\"picklist-list\">\n ${this._getChosenRoles().map(role => html`\n <div \n class=\"picklist-item ${this._selectedChosenRole === role.id ? 'selected' : ''} ${this._draggedRoleId === role.id ? 'dragging' : ''} ${this._dragOverRoleId === role.id ? 'drag-over' : ''}\"\n draggable=\"true\"\n @click=\"${() => this._handleChosenRoleClick(role.id)}\"\n @dblclick=\"${() => { this._handleChosenRoleClick(role.id); this._moveToAvailable(); }}\"\n @dragstart=\"${(e: DragEvent) => this._handleDragStart(e, role.id)}\"\n @dragover=\"${(e: DragEvent) => this._handleDragOver(e, role.id)}\"\n @dragleave=\"${(e: DragEvent) => this._handleDragLeave(e)}\"\n @drop=\"${(e: DragEvent) => this._handleDrop(e, role.id)}\"\n @dragend=\"${(e: DragEvent) => this._handleDragEnd(e)}\"\n >\n <div class=\"picklist-item-label\">${role.title}</div>\n ${role.metadata?.roleURI ? html`\n <div class=\"picklist-item-value\">${role.metadata.roleURI}</div>\n ` : ''}\n </div>\n `)}\n </div>\n <div class=\"picklist-count\">\n ${this._tempSelectedRoles.size} ${I18n.t('filter.rolesSelected')}\n </div>\n </div>\n </div>\n ` : this._showAdvancedFilter ? html`\n <jupiter-advanced-filter\n .showFactsOnly=\"${this._showFactsOnly}\"\n .conceptSearchText=\"${this._conceptSearchText}\"\n @filter-change=\"${this._handleFilterChange}\"\n ></jupiter-advanced-filter>\n ` : html`\n <p class=\"description\">\n ${I18n.t('filter.description')}\n </p>\n\n <!-- Search Input -->\n <div class=\"search-container\">\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"${I18n.t('filter.searchPlaceholder')}\"\n .value=\"${this._searchQuery}\"\n @input=\"${this._handleSearchInput}\"\n />\n ${this._searchQuery ? html`\n <button class=\"clear-search\" @click=\"${this._clearSearch}\" title=\"${I18n.t('filter.clearSearch')}\">\n ×\n </button>\n ` : html`\n <svg class=\"search-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"/>\n </svg>\n `}\n </div>\n\n <!-- Search Results Info -->\n ${hasSearchQuery ? html`\n <div class=\"search-results-info\">\n ${I18n.t('filter.showingResults')} ${filteredCount} ${I18n.t('filter.of')} ${totalCount} ${I18n.t('filter.roles')}\n ${filteredCount !== totalCount ? html`${I18n.t('filter.matching')} \"${this._searchQuery}\"` : ''}\n </div>\n ` : ''}\n\n <!-- Selection Controls -->\n <div class=\"selection-controls\">\n ${hasSearchQuery ? html`\n <button class=\"selection-control\" @click=\"${this._selectAll}\">\n ${I18n.t('filter.selectFiltered')} (${filteredCount})\n </button>\n <button class=\"selection-control\" @click=\"${this._selectNone}\">\n ${I18n.t('filter.deselectFiltered')}\n </button>\n <button class=\"selection-control\" @click=\"${this._selectAllGlobal}\">\n ${I18n.t('filter.selectAll')} (${totalCount})\n </button>\n <button class=\"selection-control\" @click=\"${this._selectNoneGlobal}\">\n ${I18n.t('filter.deselectAll')}\n </button>\n ` : html`\n <button class=\"selection-control\" @click=\"${this._selectAll}\">\n ${I18n.t('filter.selectAll')}\n </button>\n <button class=\"selection-control\" @click=\"${this._selectNone}\">\n ${I18n.t('filter.selectNone')}\n </button>\n `}\n <button class=\"selection-control\" @click=\"${this._resetToOriginal}\">\n ${I18n.t('filter.reset')}\n </button>\n </div>\n\n <!-- Roles List -->\n <div class=\"roles-list\">\n ${this._filteredRoles.length === 0 ? html`\n <div class=\"no-results\">\n ${hasSearchQuery ? html`\n ${I18n.t('filter.noRolesFound')} \"${this._searchQuery}\".<br>\n ${I18n.t('filter.tryDifferentSearch')}\n ` : html`\n ${I18n.t('filter.noRolesAvailable')}\n `}\n </div>\n ` : html`\n ${this._filteredRoles.map(role => {\n const isSelected = this._tempSelectedRoles.has(role.id);\n const showPeriodControls = role.showPeriodControl === true;\n const preferences = this._tempPeriodPreferences[role.id] || { showDuration: true, showInstant: true };\n \n // Debug: Log role processing\n console.log('🎨 [Render] Processing role:', role.title, 'ID:', role.id);\n \n const dimensions = this._getDimensionsForRole(role.id);\n const hasDimensions = dimensions.length > 0;\n \n console.log('🎨 [Render] Role:', role.title, '- Has dimensions:', hasDimensions, '- Count:', dimensions.length);\n \n return html`\n <div class=\"role-item\">\n <input\n type=\"checkbox\"\n class=\"role-checkbox\"\n .checked=\"${isSelected}\"\n @change=\"${(e: Event) => this._handleCheckboxChange(e, role.id)}\"\n />\n <div class=\"role-info\">\n <h4 class=\"role-title\">${role.title}</h4>\n ${role.metadata?.roleURI ? html`\n <p class=\"role-description\">${I18n.t('filter.uri')}: ${role.metadata.roleURI}</p>\n ` : ''}\n \n <div class=\"period-controls\">\n <p class=\"period-controls-label\">${I18n.t('filter.additionalOptions')}</p>\n <div class=\"period-checkboxes\">\n <label class=\"period-checkbox-item\">\n <input\n type=\"checkbox\"\n class=\"period-checkbox\"\n .checked=\"${preferences.showPreviousYear}\"\n @change=\"${(e: Event) => this._handlePeriodCheckboxChange(e, role.id, 'previousYear')}\"\n />\n <span class=\"period-checkbox-label\">${I18n.t('filter.showPreviousYear')}</span>\n </label>\n </div>\n </div>\n\n ${hasDimensions ? html`\n <div class=\"dimension-section\">\n <div class=\"dimension-header\">📊 ${I18n.t('filter.dimensionMemberSelection')}</div>\n ${dimensions.map((dimension: any) => {\n const allMembers = this._getAllDimensionMembers(dimension.members);\n\n // Skip dimensions that have no members — nothing to select\n if (allMembers.length === 0) {\n return html``;\n }\n\n const dimensionLabel = dimension.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n return html`\n <div class=\"dimension-group\">\n <div class=\"dimension-label\">${dimensionLabel}</div>\n <div class=\"dimension-members\">\n ${allMembers.map((member: any) => {\n const memberLabel = member.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || member.conceptName;\n const isChecked = this._isDimensionMemberSelected(role.id, dimension.id, member.id);\n \n return html`\n <label class=\"member-checkbox-item\">\n <input\n type=\"checkbox\"\n class=\"member-checkbox\"\n .checked=\"${isChecked}\"\n @change=\"${(e: Event) => this._handleDimensionMemberChange(e, role.id, dimension.id, member.id)}\"\n />\n <span class=\"member-checkbox-label\">${memberLabel}</span>\n </label>\n `;\n })}\n </div>\n <div class=\"member-select-controls\">\n <button \n class=\"member-select-btn\"\n @click=\"${() => this._selectAllDimensionMembers(role.id, dimension.id)}\"\n >\n ${I18n.t('filter.selectAllMembers')}\n </button>\n <button \n class=\"member-select-btn\"\n @click=\"${() => this._deselectAllDimensionMembers(role.id, dimension.id)}\"\n >\n ${I18n.t('filter.clearMembers')}\n </button>\n </div>\n </div>\n `;\n })}\n </div>\n ` : ''}\n </div>\n </div>\n `;\n })}\n `}\n </div>\n `}\n </div>\n\n <!-- Dialog Actions -->\n <div class=\"dialog-actions\">\n ${this.mode !== 'admin' && this.mode !== 'readonly' ? html`\n ${this._showAdvancedFilter ? html`\n <button class=\"btn-text\" @click=\"${this._switchToFilterRoles}\">\n ${I18n.t('filter.backToFilterRoles')}\n </button>\n ` : html`\n <button class=\"btn-text\" @click=\"${this._switchToAdvancedFilter}\">\n ${I18n.t('filter.advancedFilter')}\n </button>\n `}\n ` : ''}\n <button class=\"btn-secondary\" @click=\"${this._handleCancel}\">\n ${I18n.t('filter.cancel')}\n </button>\n ${this._showAdvancedFilter ? html`\n <button class=\"btn-primary\" @click=\"${this._handleAdvancedFilterApply}\">\n ${I18n.t('filter.applyFilter')}\n </button>\n ` : html`\n <button\n class=\"btn-primary\"\n @click=\"${this._handleApply}\"\n ?disabled=\"${selectedCount === 0}\"\n >\n ${I18n.t('filter.applyFilter')} (${selectedCount})\n </button>\n `}\n </div>\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport {\n XBRLFormSchema,\n FormData,\n FormColumn,\n ValidationError,\n FormState,\n ComponentConfig,\n ConceptTree,\n FormField,\n FieldType,\n SubmissionData,\n SubmissionEntry,\n FormSection,\n AxisFilterConfig\n} from '../schema/types';\nimport { XBRLFormInput } from '../schema/xbrl-types';\nimport { FormValidator } from '../utils/validation';\nimport { XBRLFormBuilder } from '../utils/xbrl-form-builder';\nimport { I18n } from '../utils/i18n';\nimport { AddColumnRequest, AvailableDimension } from './add-column-dialog';\nimport { DraftStorageService } from '../services';\nimport { FactMatcher } from '../utils/fact-matcher';\nimport './form-section';\nimport './filter-roles-dialog';\n\n@customElement('jupiter-dynamic-form')\nexport class JupiterDynamicForm extends LitElement {\n @property({ type: Object }) schema?: XBRLFormSchema;\n @property({ type: Object }) xbrlInput?: XBRLFormInput;\n @property({ type: Object }) config: ComponentConfig = {};\n @property({ type: Object }) initialData: FormData = {};\n @property({ type: Boolean }) disabled = false;\n @property({ type: Boolean }) readonly = false;\n @property({ type: String }) periodStartDate = '2025-01-01';\n @property({ type: String }) periodEndDate = '2025-12-31';\n @property({ type: String }) language = 'en';\n @property({ type: String }) reportingLanguage = 'en';\n @property({ type: String }) display: 'accordion' | 'sidePanel' = 'accordion';\n @property({ type: String }) mode: 'inputForm' | 'admin' | 'readonly' = 'inputForm';\n @property({ type: String, attribute: 'submit-button-label' })\n submitButtonLabel?: string;\n // Role filter axes - array following checkboxes.json format.\n // Each entry specifies an axis and its members with available=true/false.\n // Roles are excluded only when the axis is applicable to that role AND none of its\n // members match an available=true entry. Roles without the axis are always included.\n @property({ type: Array })\n roleFilterAxes: AxisFilterConfig[] = [];\n\n // Controls visibility of the 'Last Validation Results' button (shown after validation completes)\n @property({ type: Boolean, attribute: 'show-last-validation-result-btn' })\n showLastValidationResultBtn = false;\n\n // isDraftSaving - when true, shows 'Saving draft' text on the Save Draft button\n @property({ type: Boolean, attribute: 'is-draft-saving' })\n isDraftSaving = false;\n\n // Default unit overrides for specific datatypes\n // Example: [{\"xbrli:monetaryItemType\": \"EUR\"}]\n @property({ type: Array })\n defaultUnits: Array<Record<string, string>> = [];\n\n // Global XBRL decimals attribute applied to all monetary facts ('INF' = no default)\n @property({ type: String })\n decimals = 'INF';\n\n // Master data - allows parent app to provide initial values for specific concepts\n // Example: {\"kvk-nummer\": \"12345678\", \"city\": \"Pune\"}\n // Keys are concept IDs, values are the predefined data\n @property({ type: Object, attribute: 'master-data' })\n masterData?: Record<string, any>;\n\n\n // External draft management - allows parent app to provide and receive draft data\n // These properties work bidirectionally:\n // - INPUT: Parent can set these to restore a saved draft\n // - OUTPUT: On save draft event, parent receives updated JSON data to persist\n @property({ type: Object, attribute: 'dynaforms-metadata' })\n dynaformsMetadata?: any;\n @property({ type: Object, attribute: 'dynaforms-facts' })\n dynaformsFacts?: any;\n\n @state() private _formData: FormData = {};\n @state() private _draftLoaded = false;\n @state() private _draftLoadedAt?: string;\n @state() private _preservedFormData: FormData = {}; // Preserve data for hidden sections\n @state() private _periodData: { [conceptId: string]: { [columnId: string]: { startDate?: string; endDate?: string; instantDate?: string } } } = {}; // Store field-specific periods\n @state() private _preservedPeriodData: { [conceptId: string]: { [columnId: string]: { startDate?: string; endDate?: string; instantDate?: string } } } = {}; // Preserve period data for hidden sections\n @state() private _unitData: { [conceptId: string]: { [columnId: string]: string } } = {}; // Store field-specific units\n @state() private _preservedUnitData: { [conceptId: string]: { [columnId: string]: string } } = {}; // Preserve unit data for hidden sections\n @state() private _decimalsData: { [conceptId: string]: { [columnId: string]: string } } = {}; // Store per-fact decimals values\n @state() private _effectiveMasterData: Record<string, any> | undefined = undefined; // masterData + auto-injected rounding level\n @state() private _typedMemberData: { [columnId: string]: { [axisId: string]: string } } = {};\n @state() private _preservedTypedMemberData: { [columnId: string]: { [axisId: string]: string } } = {}; // Preserve typed data for hidden sections\n @state() private _repeatCounts: { [conceptId: string]: number } = {}; // Extra repeat row counts per concept (JDF-022)\n @state() private _columns: FormColumn[] = [];\n @state() private _errors: ValidationError[] = [];\n @state() private _touched = new Set<string>();\n @state() private _dirty = false;\n @state() private _valid = true;\n @state() private _submitted = false;\n @state() private _xbrlFormErrors: Array<{ sectionId: string; fieldId: string; conceptId: string; columnId: string; value: any; errors: any[] }> = []; // Track validation errors\n @state() private _showErrorPopup = false; // Show error popup when save draft is clicked with errors\n @state() private _submitDisabled = false; // Temporarily disabled while processing a submit\n @state() private _currentSchema?: XBRLFormSchema;\n @state() private _allSections: FormSection[] = [];\n @state() private _selectedRoleIds: Array<{ roleId: string; roleURI: string; order: number }> | string[] = []; // Enhanced structure with roleURI and order, or legacy string array\n @state() private _showFilterDialog = false;\n @state() private _showFactsOnly = false;\n @state() private _conceptSearchText = '';\n @state() private _periodPreferences: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean; dimensionSelections?: Array<{ dimensionId: string; dimensionLabel: string; selectedMemberIds: string[] }> }> = {};\n @state() private _activeSidePanelRoleId: string | null = null;\n @state() private _sidePanelSearchQuery = '';\n @state() private _sidePanelCollapsed = false;\n @state() private _adminRoleConfigs: Record<string, { showPreviousYear: boolean; instant?: boolean; duration?: boolean }> = {};\n @state() private _roleBorderStatuses: Map<string, 'complete' | 'incomplete' | 'untouched' | 'none'> = new Map();\n @state() private _roleCompletedStates: Map<string, boolean> = new Map();\n @state() private _showRoleContextMenu = false;\n @state() private _contextMenuX = 0;\n @state() private _contextMenuY = 0;\n @state() private _contextMenuRoleId: string | null = null;\n @state() private _validationStatus: 'idle' | 'inProgress' | 'complete' = 'idle';\n\n // Draft storage service\n private _draftStorageService!: DraftStorageService;\n private _skipDraftLoading = false; // Flag to skip draft loading during reinitialization\n private _skipPeriodPreferencesRestore = false; // Flag to skip period preferences restoration when intentionally changing filters\n\n // Auto-save draft timer\n private _autoSaveTimer: ReturnType<typeof setInterval> | null = null;\n private _lastAutoSaveSnapshot = ''; // Snapshot of formData used to detect changes\n private _lastSavedDraftSnapshot = ''; // Snapshot of draft payload used to avoid duplicate emits\n\n static styles = css`\n :host {\n display: block;\n font-family: var(--jupiter-font-family, system-ui, -apple-system, sans-serif);\n color: var(--jupiter-text-primary, #333);\n background: var(--jupiter-background, #fff);\n }\n\n .form-container {\n width: 100%;\n max-width: var(--jupiter-max-width, none);\n margin: 0 auto;\n }\n\n .form-header {\n padding: 24px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n background: var(--jupiter-form-header-background, #fff);\n }\n\n .form-title {\n font-size: 24px;\n font-weight: 600;\n margin: 0 0 8px 0;\n color: var(--jupiter-text-primary, #333);\n }\n\n .form-description {\n font-size: 16px;\n color: var(--jupiter-text-secondary, #666);\n margin: 0;\n line-height: 1.5;\n }\n\n .form-actions {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n padding: 16px 24px;\n border-top: 1px solid var(--jupiter-border-color, #ddd);\n background: var(--bg-color-2, var(--jupiter-form-actions-background, #f8f9fa));\n display: flex;\n gap: 12px;\n align-items: center;\n z-index: 1000;\n box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .form-sections {\n padding: 24px;\n padding-bottom: 100px; /* Add space for fixed footer */\n background: var(--bg-color-2);\n }\n\n .validation-summary {\n margin-bottom: 16px;\n padding: 16px;\n border-radius: 4px;\n background: var(--jupiter-error-background, #ffebee);\n border: 1px solid var(--jupiter-error-color, #d32f2f);\n }\n\n .validation-summary-title {\n font-weight: 600;\n color: var(--jupiter-error-color, #d32f2f);\n margin: 0 0 8px 0;\n }\n\n .validation-summary-list {\n margin: 0;\n padding-left: 20px;\n }\n\n .validation-summary-item {\n color: var(--jupiter-error-color, #d32f2f);\n margin-bottom: 4px;\n }\n\n .form-actions button {\n padding: 10px 20px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s ease;\n }\n\n .btn-primary {\n background: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));\n color: var(--buttonTextColor, white);\n }\n\n // .btn-primary:hover:not(:disabled) {\n // background: var(--jupiter-primary-color-dark, #1565c0);\n // }\n\n .btn-secondary {\n color: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));\n border: 1px solid var(--buttonBgColor, var(--jupiter-primary-color, #1976d2)) !important;\n background: transparent;\n }\n\n .btn-secondary:hover:not(:disabled) {\n opacity: 0.9;\n }\n\n .btn-outline {\n background: transparent;\n color: var(--jupiter-primary-color, #1976d2);\n border: 1px solid var(--jupiter-primary-color, #1976d2);\n }\n\n .btn-outline:hover:not(:disabled) {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n }\n\n button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-validate {\n background: var(--jupiter-validate-color, #388e3c);\n color: white;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n }\n\n .btn-validate:hover:not(:disabled) {\n background: var(--jupiter-validate-color-dark, #2e7d32);\n }\n\n .btn-preview {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n }\n .btn-preview:hover:not(:disabled) {\n background: var(--jupiter-primary-color-dark, #1565c0);\n }\n\n\n .validation-spinner {\n display: inline-block;\n width: 14px;\n height: 14px;\n border: 2px solid rgba(255, 255, 255, 0.4);\n border-top-color: white;\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n flex-shrink: 0;\n }\n\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n\n .form-meta {\n display: flex;\n gap: 16px;\n align-items: center;\n font-size: 12px;\n color: var(--jupiter-text-secondary, #666);\n margin-left: auto;\n }\n\n .filter-roles-button {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: transparent;\n border: 1px solid var(--jupiter-primary-color, #1976d2);\n color: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));\n border-radius: 4px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n margin-right: auto;\n }\n\n .filter-roles-button:hover:not(:disabled) {\n opacity: 0.9;\n }\n\n .filter-roles-button .filter-icon {\n width: 16px;\n height: 16px;\n fill: currentColor;\n }\n\n .roles-count {\n display: inline-flex;\n align-items: center;\n background: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));\n color: var(--headerBgColor, white) !important;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n padding: 2px 6px;\n margin-left: 4px;\n min-width: 18px;\n justify-content: center;\n }\n\n .no-roles-message {\n padding: 40px;\n text-align: center;\n color: var(--primaryTextColor, var(--jupiter-text-secondary, #666));\n background: var(--bg-color-2, var(--jupiter-background-light, #f8f9fa));\n border-radius: 8px;\n margin: 20px 0;\n }\n\n .no-roles-message h3 {\n margin: 0 0 16px 0;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n }\n\n .no-roles-message p {\n margin: 8px 0;\n line-height: 1.5;\n }\n\n /* Side Panel Layout Styles */\n .side-panel-layout {\n display: flex;\n height: calc(100vh - 80px); /* Account for footer only */\n gap: 0;\n }\n\n .side-panel-roles-list {\n width: 280px;\n min-width: 280px;\n border-right: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n overflow-y: auto;\n background: var(--bg-color-2, var(--jupiter-background-light, #f8f9fa));\n display: flex;\n flex-direction: column;\n transition: width 0.3s ease, min-width 0.3s ease;\n position: relative;\n }\n\n .side-panel-roles-list.collapsed {\n width: 48px;\n min-width: 48px;\n overflow: visible;\n border-right: 1px solid var(--jupiter-border-color, #ddd);\n }\n\n .side-panel-toggle-btn {\n position: absolute;\n top: 0px;\n right: 0px;\n width: 32px;\n height: 32px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n background: var(--bg-color-2, var(--jupiter-background, #fff));\n color: var(--primaryTextColor);\n\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 100;\n transition: all 0.2s ease;\n }\n\n .side-panel-toggle-btn:hover {\n background: var(--jupiter-primary-color, #1976d2);\n color: white;\n border-color: var(--jupiter-primary-color, #1976d2);\n }\n\n .side-panel-toggle-btn svg {\n width: 20px;\n height: 20px;\n fill: currentColor;\n transition: transform 0.3s ease;\n }\n\n .side-panel-toggle-btn.collapsed svg {\n transform: rotate(180deg);\n }\n\n .side-panel-search-container {\n position: sticky;\n top: 0;\n z-index: 10;\n background: var(--bg-color-2, var(--jupiter-background, #fff));\n padding: 16px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n }\n\n .side-panel-search-input {\n width: 100%;\n padding: 10px 40px 10px 12px;\n border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));\n border-radius: 4px;\n font-size: 14px;\n font-family: inherit;\n background: transparent;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n transition: border-color 0.2s ease;\n box-sizing: border-box;\n }\n\n // .side-panel-search-input:focus {\n // outline: none;\n // border-color: var(--jupiter-primary-color, #1976d2);\n // box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.1);\n // }\n\n .side-panel-search-input::placeholder {\n color: var(--jupiter-text-secondary, #666);\n }\n\n .side-panel-search-icon {\n position: absolute;\n right: 28px;\n top: 50%;\n transform: translateY(-50%);\n width: 16px;\n height: 16px;\n fill: var(--jupiter-text-secondary, #666);\n pointer-events: none;\n }\n\n .side-panel-clear-search {\n position: absolute;\n right: 28px;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n cursor: pointer;\n padding: 2px;\n border-radius: 2px;\n color: var(--jupiter-text-secondary, #666);\n font-size: 20px;\n line-height: 1;\n transition: color 0.2s ease;\n }\n\n .side-panel-clear-search:hover {\n color: var(--jupiter-text-primary, #333);\n }\n\n .side-panel-search-results-info {\n font-size: 12px;\n padding: 8px 16px;\n text-align: center;\n border-bottom: 1px solid var(--jupiter-border-color, #e0e0e0);\n \n color: var(--primaryTextColor, var(--jupiter-text-secondary, #666));\n background: var(--bg-color-2, var(--jupiter-background-light, #f8f9fa));\n }\n\n .side-panel-no-results {\n padding: 40px 20px;\n text-align: center;\n color: var(--jupiter-text-secondary, #666);\n font-size: 14px;\n line-height: 1.6;\n }\n\n .side-panel-role-item {\n padding: 12px 16px;\n cursor: pointer;\n border-bottom: 1px solid var(--jupiter-border-color, #e0e0e0);\n transition: background-color 0.2s ease;\n font-size: 14px;\n color: var(--primaryTextColor, var(--jupiter-text-primary, #333));\n line-height: 1.4;\n }\n\n .side-panel-role-item:hover {\n opacity: 0.9;\n }\n\n .side-panel-role-item.active {\n background: var(--light-color-1, var(--jupiter-primary-color, #1976d2));\n color: white;\n font-weight: 500;\n }\n\n .side-panel-role-item.has-errors {\n border-left: 4px solid var(--jupiter-error-color, #d32f2f);\n }\n\n .side-panel-role-item.has-errors.active {\n border-left: 4px solid var(--jupiter-error-color, #d32f2f);\n }\n\n .side-panel-role-item.has-no-data {\n border-left: 4px solid var(--jupiter-untouched-color, #757575);\n }\n\n .side-panel-role-item.has-no-data.active {\n border-left: 4px solid var(--jupiter-untouched-color, #757575);\n }\n\n .side-panel-role-item.has-empty-fields {\n border-left: 4px solid var(--jupiter-warning-color, #ff9800);\n }\n\n .side-panel-role-item.has-empty-fields.active {\n border-left: 4px solid var(--jupiter-warning-color, #ff9800);\n }\n\n .side-panel-role-item.has-complete-data {\n border-left: 4px solid var(--jupiter-success-color, #4caf50);\n }\n\n .side-panel-role-item.has-complete-data.active {\n border-left: 4px solid var(--jupiter-success-color, #4caf50);\n }\n\n .role-completion-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-top: 1px solid var(--jupiter-border-color, #e0e0e0);\n margin-top: 4px;\n background: var(--jupiter-background, #fff);\n }\n\n .role-completion-row input[type=\"checkbox\"] {\n width: 16px;\n height: 16px;\n cursor: pointer;\n accent-color: var(--jupiter-success-color, #4caf50);\n flex-shrink: 0;\n }\n\n .role-completion-row label {\n font-size: 14px;\n color: var(--jupiter-text-secondary, #555);\n cursor: pointer;\n user-select: none;\n }\n\n .side-panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n background: var(--bg-color-2, var(--jupiter-background, #fff));\n }\n\n .side-panel-content .form-sections {\n padding: 0 24px 24px 24px;\n padding-top: 0;\n }\n\n /* Admin Mode Styles */\n .admin-mode-placeholder {\n padding: 0;\n background: white;\n min-height: 300px;\n }\n\n .admin-mode-container {\n max-width: 1200px;\n margin: 0 auto;\n padding: 24px;\n }\n\n .admin-mode-title {\n font-size: 20px;\n font-weight: 600;\n margin: 0 0 24px 0;\n color: var(--jupiter-text-primary, #333);\n }\n\n .admin-roles-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .admin-role-item {\n display: flex;\n align-items: center;\n padding: 16px;\n background: var(--jupiter-background-light, #f8f9fa);\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 6px;\n transition: background-color 0.2s ease;\n }\n\n .admin-role-item:hover {\n background: var(--jupiter-hover-background, #e8e8e8);\n }\n\n .admin-role-title {\n flex: 1;\n font-size: 14px;\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n }\n\n .admin-role-checkbox {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: 16px;\n }\n\n .admin-role-checkbox input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n }\n\n .admin-role-checkbox label {\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n cursor: pointer;\n user-select: none;\n }\n\n .admin-dimension-section {\n margin-top: 16px;\n padding: 16px;\n background: var(--jupiter-background, #fff);\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 6px;\n }\n\n .admin-dimension-header {\n font-size: 14px;\n font-weight: 600;\n color: var(--jupiter-text-primary, #333);\n margin-bottom: 16px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n }\n\n .admin-dimension-group {\n margin-bottom: 16px;\n }\n\n .admin-dimension-group:last-child {\n margin-bottom: 0;\n }\n\n .admin-dimension-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--jupiter-text-primary, #333);\n margin-bottom: 8px;\n }\n\n .admin-dimension-members {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 8px;\n }\n\n .admin-member-checkbox-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n border-radius: 4px;\n cursor: pointer;\n transition: background-color 0.2s ease;\n }\n\n .admin-member-checkbox-item:hover {\n background: var(--jupiter-hover-background, #f5f5f5);\n }\n\n .admin-member-checkbox {\n width: 16px;\n height: 16px;\n cursor: pointer;\n flex-shrink: 0;\n }\n\n .admin-member-checkbox-label {\n font-size: 13px;\n color: var(--jupiter-text-secondary, #666);\n user-select: none;\n flex: 1;\n }\n\n .admin-member-select-controls {\n display: flex;\n gap: 8px;\n margin-top: 8px;\n }\n\n .admin-member-select-btn {\n padding: 6px 12px;\n font-size: 12px;\n background: var(--jupiter-background-light, #f8f9fa);\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.2s ease;\n color: var(--jupiter-text-secondary, #666);\n }\n\n .admin-member-select-btn:hover {\n background: var(--jupiter-hover-background, #e8e8e8);\n border-color: var(--jupiter-primary-color, #1976d2);\n color: var(--jupiter-primary-color, #1976d2);\n }\n\n .admin-member-select-btn:active {\n transform: translateY(1px);\n }\n\n /* Error Popup Styles */\n .error-popup-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n }\n\n .error-popup {\n background: white;\n border-radius: 8px;\n max-width: 600px;\n width: 90%;\n max-height: 80vh;\n overflow: hidden;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);\n display: flex;\n flex-direction: column;\n }\n\n .error-popup-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 24px;\n border-bottom: 1px solid var(--jupiter-border-color, #ddd);\n background: var(--jupiter-section-header-background, #f0f2f5);\n }\n\n .error-popup-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .error-popup-close {\n background: transparent;\n border: none;\n font-size: 28px;\n cursor: pointer;\n padding: 0;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n color: var(--jupiter-text-color, #333);\n transition: background-color 0.2s;\n }\n\n .error-popup-close:hover {\n background-color: rgba(0, 0, 0, 0.05);\n }\n\n .error-popup-content {\n padding: 24px;\n overflow-y: auto;\n flex: 1;\n }\n\n .error-popup-content p {\n margin: 0 0 16px 0;\n color: var(--jupiter-text-primary, #333);\n }\n\n .error-list {\n list-style: none;\n padding: 0;\n margin: 0;\n }\n\n .error-list > li {\n padding: 12px;\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n margin-bottom: 12px;\n }\n\n .error-list > li strong {\n color: var(--jupiter-text-primary, #333);\n font-weight: 600;\n }\n\n .error-list ul {\n margin: 8px 0 0 0;\n padding-left: 20px;\n }\n\n .error-list ul li {\n color: var(--jupiter-error-color, #d32f2f);\n margin: 4px 0;\n }\n\n .error-popup-footer {\n padding: 16px 24px;\n border-top: 1px solid var(--jupiter-border-color, #ddd);\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n }\n\n .error-field-link {\n color: #0066cc;\n text-decoration: underline;\n cursor: pointer;\n font-family: monospace;\n }\n\n .error-field-link:hover {\n color: #0052a3;\n text-decoration: none;\n }\n\n /* Context Menu Styles */\n .role-context-menu {\n position: fixed;\n background: white;\n border: 1px solid var(--jupiter-border-color, #ddd);\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n z-index: 10001;\n min-width: 150px;\n padding: 4px 0;\n }\n\n .context-menu-item {\n padding: 8px 16px;\n cursor: pointer;\n font-size: 14px;\n color: var(--jupiter-text-primary, #333);\n transition: background-color 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .context-menu-item:hover {\n background: var(--jupiter-hover-background, #f5f5f5);\n }\n\n .context-menu-item.danger {\n color: var(--jupiter-error-color, #d32f2f);\n }\n\n .context-menu-item.danger:hover {\n background: #ffebee;\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n\n // Listen for period-change events from child components\n this.addEventListener('period-change', (e: Event) => {\n console.log(`🌍 [GLOBAL DynamicForm] Caught period-change event on element:`, e);\n const customEvent = e as CustomEvent;\n console.log(`🌍 [GLOBAL DynamicForm] Event detail:`, customEvent.detail);\n // Call the handler directly since @period-change binding doesn't catch it\n this._handlePeriodChange(customEvent);\n });\n\n // Listen for unit-change events from child components\n this.addEventListener('unit-change', (e: Event) => {\n console.log(`🏷️ [GLOBAL DynamicForm] Caught unit-change event on element:`, e);\n const customEvent = e as CustomEvent;\n console.log(`🏷️ [GLOBAL DynamicForm] Event detail:`, customEvent.detail);\n this._handleUnitChange(customEvent);\n });\n\n // Listen for decimals-change events from child components\n this.addEventListener('decimals-change', (e: Event) => {\n this._handleDecimalsChange(e as CustomEvent);\n });\n\n // Listen for field-blur events to track validation errors\n this.addEventListener('field-blur', (e: Event) => {\n console.log('🚨 [DynamicForm] field-blur event listener triggered!', e);\n const customEvent = e as CustomEvent;\n this._handleFieldBlur(customEvent);\n });\n\n\n // Close context menu when clicking anywhere\n document.addEventListener('click', () => {\n if (this._showRoleContextMenu) {\n this._showRoleContextMenu = false;\n this.requestUpdate();\n }\n });\n\n // Start 30-second auto-save draft timer\n this._autoSaveTimer = setInterval(() => {\n const currentSnapshot = JSON.stringify(this._formData);\n if (this._lastAutoSaveSnapshot === '') {\n this._lastAutoSaveSnapshot = currentSnapshot;\n console.log('ℹ️ [Auto Save] Baseline initialized; no draft save emitted.');\n return;\n }\n\n if (currentSnapshot !== this._lastAutoSaveSnapshot) {\n this._lastAutoSaveSnapshot = currentSnapshot;\n this._handleSaveDraft('auto');\n } else {\n console.log('ℹ️ [Auto Save] No form state change detected; skipping draft save emit.');\n }\n }, 30000);\n\n this._initializeForm();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n if (this._autoSaveTimer !== null) {\n clearInterval(this._autoSaveTimer);\n this._autoSaveTimer = null;\n }\n }\n\n updated(changedProperties: Map<string, any>) {\n // Recompute effective masterData when decimals or masterData changes\n if (changedProperties.has('decimals') || changedProperties.has('masterData')) {\n this._computeEffectiveMasterData();\n }\n\n // Initialize I18n language\n if (changedProperties.has('language')) {\n I18n.setLanguage(this.language);\n }\n\n // Apply default units to datatypes when xbrlInput or defaultUnits changes\n if ((changedProperties.has('xbrlInput') || changedProperties.has('defaultUnits')) && this.xbrlInput && this.defaultUnits && this.defaultUnits.length > 0) {\n this._applyDefaultUnitsToDatatypes();\n }\n\n // Reinitialize form when any of these critical properties change\n if (\n changedProperties.has('xbrlInput') ||\n changedProperties.has('schema') ||\n changedProperties.has('language') ||\n changedProperties.has('periodStartDate') ||\n changedProperties.has('periodEndDate') ||\n changedProperties.has('roleFilterAxes')\n ) {\n this._initializeForm();\n }\n }\n\n /**\n * Apply developer-provided default units to datatypes by setting isDefault=true\n * This allows units to be auto-selected for derived types (e.g., nl-types:monetaryNoDecimals20ItemType)\n */\n private _applyDefaultUnitsToDatatypes() {\n if (!this.xbrlInput?.datatypes || !this.defaultUnits || this.defaultUnits.length === 0) {\n return;\n }\n\n console.log('🔧 [DynamicForm] Applying defaultUnits to datatypes:', this.defaultUnits);\n\n // Iterate through defaultUnits array\n // Handle both wrapped and array formats for datatypes\n const datatypesArray = Array.isArray(this.xbrlInput.datatypes)\n ? this.xbrlInput.datatypes\n : this.xbrlInput.datatypes.concepts;\n\n if (!datatypesArray || datatypesArray.length === 0) {\n console.warn(\"⚠️ [DynamicForm] No datatypes found to apply defaults to\");\n return;\n }\n this.defaultUnits.forEach(defaultUnitMap => {\n // Each entry is like { \"xbrli:monetaryItemType\": \"EUR\" }\n Object.entries(defaultUnitMap).forEach(([datatypeId, unitId]) => {\n // Find the datatype in xbrlInput\n const datatype = datatypesArray.find((dt: any) => dt.type === datatypeId || dt.id === datatypeId) as any;\n if (datatype && datatype.units && datatype.units.length > 0) {\n // Find the unit to set as default\n const targetUnit = datatype.units.find((u: any) => u.id === unitId);\n\n if (targetUnit) {\n // Clear any existing defaults in this datatype\n datatype.units.forEach((u: any) => u.isDefault = false);\n\n // Set the developer-provided default\n targetUnit.isDefault = true;\n console.log(`✅ [DynamicForm] Set isDefault=true for unit \"${unitId}\" in datatype \"${datatypeId}\"`);\n } else {\n console.warn(`⚠️ [DynamicForm] Unit \"${unitId}\" not found in datatype \"${datatypeId}\"`);\n }\n } else {\n console.warn(`⚠️ [DynamicForm] Datatype \"${datatypeId}\" not found or has no units`);\n }\n });\n });\n }\n\n private _initializeForm() {\n // Initialize draft storage service\n if (!this._draftStorageService) {\n this._draftStorageService = new DraftStorageService(false); // Use localStorage\n }\n\n // Generate schema from XBRL input if provided, otherwise use provided schema\n if (this.xbrlInput) {\n try {\n console.log('🔄 Initializing form from XBRL input:', this.xbrlInput);\n console.log('📅 Using period dates:', this.periodStartDate, 'to', this.periodEndDate);\n console.log('🌐 Using language:', this.language);\n\n // Initialize period preferences from presentation data BEFORE building schema\n this._initializePeriodPreferencesFromData();\n\n // Apply axis filter defaults to period preferences (only for roles without saved preferences)\n this._applyAxisFilterToPeriodPreferences();\n\n // In admin mode: auto-enable showPreviousYear for roles that have dimension members (JDF-010)\n this._applyDimensionShowPreviousYear();\n\n console.log('⚙️ Using period preferences:', this._periodPreferences);\n this._currentSchema = XBRLFormBuilder.buildFormSchema(\n this.xbrlInput,\n this.periodStartDate,\n this.periodEndDate,\n this.language,\n this._periodPreferences\n );\n console.log('✅ Generated schema with sections:', this._currentSchema.sections.length);\n\n // Store all sections for filtering\n this._allSections = [...this._currentSchema.sections];\n\n // CRITICAL: Apply custom ordering from _selectedRoleIds to _allSections BEFORE filtering\n // This ensures sections maintain user's preferred order throughout the workflow\n if (Array.isArray(this._selectedRoleIds) &&\n this._selectedRoleIds.length > 0 &&\n typeof this._selectedRoleIds[0] === 'object') {\n\n console.log('🔄 Applying custom role order to _allSections from _selectedRoleIds');\n const enhancedRoles = this._selectedRoleIds as Array<{ roleId: string; roleURI: string; order: number }>;\n\n // Create a map of roleId to order\n const orderMap = new Map<string, number>();\n enhancedRoles.forEach(role => {\n orderMap.set(role.roleId, role.order);\n });\n\n // Sort _allSections by custom order\n this._allSections = [...this._allSections].sort((a, b) => {\n const orderA = orderMap.get(a.id) ?? 999;\n const orderB = orderMap.get(b.id) ?? 999;\n return orderA - orderB;\n });\n\n console.log('✅ Custom order applied to _allSections:', this._allSections.map(s => s.title));\n }\n\n // Initialize selected roles - select all sections by default, narrowed by roleFilterAxes\n if (this._selectedRoleIds.length === 0) {\n // roleFilterAxes controls initial SELECTION only — _allSections stays as the full pool\n // so the filter dialog always shows every role as available.\n const initialSections = (this.roleFilterAxes && this.roleFilterAxes.length > 0)\n ? this._filterRolesByAxisConfig(this._allSections)\n : this._allSections;\n this._selectedRoleIds = initialSections.map(section => section.id);\n console.log(`✅ Auto-selected ${this._selectedRoleIds.length} roles (of ${this._allSections.length} total)`);\n }\n\n // Apply current role filter - this will show empty form if no roles selected\n this._applyRoleFilter();\n\n // Use simple column structure for now\n this._columns = [\n {\n id: 'base',\n title: 'Value',\n description: 'Base values for concepts',\n type: 'base',\n order: 0,\n removable: false\n }\n ];\n } catch (error) {\n console.error('❌ Error building form from XBRL input:', error);\n this._currentSchema = this._getDefaultSchema();\n this._allSections = [];\n this._selectedRoleIds = [];\n this._columns = this._getDefaultColumns();\n }\n } else if (this.schema) {\n this._currentSchema = this.schema;\n this._allSections = [...this.schema.sections];\n this._selectedRoleIds = this._allSections.map(section => section.id);\n this._columns = this._getDefaultColumns();\n } else {\n this._currentSchema = this._getDefaultSchema();\n this._allSections = [];\n this._selectedRoleIds = [];\n this._columns = this._getDefaultColumns();\n }\n\n // Initialize form data\n this._formData = { ...this.initialData };\n if (this.xbrlInput?.initialData) {\n this._formData = { ...this._formData, ...this.xbrlInput.initialData };\n }\n\n // If global decimals is not provided, derive a default from existing\n // rounding-level value present either in facts or preloaded form data.\n this._initializeGlobalDecimalsFromRoundingData();\n\n // Extract typed member values from facts and pre-populate them\n this._extractTypedMembersFromFacts();\n\n // Check for and load saved draft (skip if reinitialization during preference update)\n if (!this._skipDraftLoading) {\n this._loadDraftIfExists().then(() => {\n // After draft is loaded, analyze all roles for initial border status\n this._analyzeAllVisibleRoles();\n }).catch(() => {\n // Even if draft loading fails, analyze roles\n this._analyzeAllVisibleRoles();\n });\n } else {\n console.log('⏭️ Skipping draft loading during preference update');\n // Still analyze roles even when skipping draft loading\n this._analyzeAllVisibleRoles();\n }\n\n // Validate initial data\n this._validateForm();\n }\n\n /**\n * Extract typed dimension values from facts and pre-populate typedMemberData\n * This scans all facts for typed dimensions and sets their values in column headers\n */\n private _extractTypedMembersFromFacts() {\n if (!this._currentSchema?.sections) {\n return;\n }\n\n// console.log('🔍 [DynamicForm] Extracting typed member values from facts');\n\n // Iterate through all sections, concepts, and facts\n this._currentSchema.sections.forEach(section => {\n this._extractTypedMembersFromConcepts(section.concepts || [], section);\n });\n\n console.log('✅ [DynamicForm] Typed member data populated:', this._typedMemberData);\n }\n\n /**\n * Recursively extract typed member values from concept tree\n */\n private _extractTypedMembersFromConcepts(concepts: ConceptTree[], section: FormSection) {\n concepts.forEach(concept => {\n // Check if concept has facts\n if (concept.facts && concept.facts.length > 0) {\n console.log(`🔍 [DynamicForm] Checking concept ${concept.id} with ${concept.facts.length} facts`);\n\n concept.facts.forEach((fact: any) => {\n // Check if fact has typed dimensions\n if (fact.dimensions && Array.isArray(fact.dimensions)) {\n const typedDimensions = fact.dimensions.filter((d: any) => d.dimensionType === 'typed' && d.typedMemberValue);\n\n if (typedDimensions.length > 0) {\n console.log(`📝 [DynamicForm] Found ${typedDimensions.length} typed dimensions in fact:`, {\n factName: fact.name,\n typedDimensions: typedDimensions.map((d: any) => ({\n dimension: d.dimension,\n typedMemberValue: d.typedMemberValue\n }))\n });\n\n // Find the column that has typed members and matches this fact\n const matchingColumn = this._findColumnWithTypedMembers(fact, concept, section);\n\n if (matchingColumn) {\n console.log(`✅ [DynamicForm] Found matching column: ${matchingColumn.id}`);\n\n // Extract typed values for each typed dimension\n typedDimensions.forEach((dim: any) => {\n const normalizedAxisId = this._normalizeAxisId(dim.dimension);\n\n // Check if this axis exists in the column's typed members\n const typedMember = matchingColumn.dimensionData?.typedMembers?.find(\n (tm: any) => tm.axisId === normalizedAxisId ||\n this._normalizeAxisId(tm.axisId) === normalizedAxisId\n );\n\n if (typedMember) {\n // Initialize column in typedMemberData if needed\n if (!this._typedMemberData[matchingColumn.id]) {\n this._typedMemberData[matchingColumn.id] = {};\n }\n\n // Set the typed value using the typedMember's axisId (which may be already normalized)\n const axisKey = typedMember.axisId;\n this._typedMemberData[matchingColumn.id][axisKey] = dim.typedMemberValue;\n\n console.log(`✅ [DynamicForm] Set typed member value:`, {\n sectionId: section.id,\n conceptId: concept.id,\n columnId: matchingColumn.id,\n axisKey: axisKey,\n typedMemberValue: dim.typedMemberValue\n });\n } else {\n console.warn(`⚠️ [DynamicForm] Typed member not found for axis: ${normalizedAxisId}`);\n }\n });\n } else {\n console.warn(`⚠️ [DynamicForm] No matching column found for fact with typed dimensions`);\n }\n }\n }\n });\n }\n\n // Recursively process children\n if (concept.children && concept.children.length > 0) {\n this._extractTypedMembersFromConcepts(concept.children, section);\n }\n });\n }\n\n /**\n * Find a column that has typed members and matches the fact's explicit dimensions\n */\n private _findColumnWithTypedMembers(fact: any, concept: ConceptTree, section: FormSection): FormColumn | null {\n if (!concept.fields || concept.fields.length === 0) {\n return null;\n }\n\n // Get columns from section\n const sectionColumns = section.columns || [];\n if (sectionColumns.length === 0) {\n return null;\n }\n\n // Try to find a field/column that has typed members and matches explicit dimensions\n for (const field of concept.fields) {\n const column = sectionColumns.find(col => col.id === field.columnId);\n\n if (column && column.dimensionData?.hasTypedMembers) {\n // This column has typed members, check if explicit dimensions match\n const factExplicitDims = (fact.dimensions || []).filter((d: any) => d.dimensionType === 'explicit');\n const columnExplicitDims = column.dimensionData.combinations || [];\n\n // If there are no explicit dimensions, or if they match, this is the column\n if (factExplicitDims.length === 0 ||\n factExplicitDims.length === columnExplicitDims.length &&\n factExplicitDims.every((factDim: any) =>\n columnExplicitDims.some((colDim: any) =>\n this._normalizeAxisId(factDim.dimension) === this._normalizeAxisId(colDim.axisId) &&\n this._normalizeMemberId(factDim.member) === this._normalizeMemberId(colDim.memberId)\n )\n )) {\n return column;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Find the column that matches the fact's dimensions\n */\n private _findColumnForFactDimensions(fact: any, concept: ConceptTree, section: FormSection): FormColumn | null {\n if (!concept.fields || concept.fields.length === 0) {\n console.log(`⚠️ [DynamicForm] No fields for concept: ${concept.id}`);\n return null;\n }\n\n // Get columns from section, not from this._columns\n const sectionColumns = section.columns || [];\n if (sectionColumns.length === 0) {\n console.log(`⚠️ [DynamicForm] No columns in section: ${section.id}`);\n return null;\n }\n\n // Try to find a field that matches the fact's dimensions\n for (const field of concept.fields) {\n const column = sectionColumns.find(col => col.id === field.columnId);\n if (column && column.dimensionData) {\n // Check if dimensions match\n const factDimensions = fact.dimensions || [];\n const columnDimensions = column.dimensionData.combinations || [];\n\n console.log(`🔍 [DynamicForm] Checking column ${column.id}:`, {\n factDimensions: factDimensions.map((d: any) => ({ axis: d.dimension, member: d.member, type: d.dimensionType })),\n columnDimensions: columnDimensions.map((d: any) => ({ axis: d.axisId, member: d.memberId }))\n });\n\n // Simple matching - check if all column dimensions are present in fact\n const allMatch = columnDimensions.every((colDim: any) => {\n return factDimensions.some((factDim: any) => {\n const axisMatch = this._normalizeAxisId(factDim.dimension) === this._normalizeAxisId(colDim.axisId);\n if (factDim.dimensionType === 'explicit') {\n const memberMatch = this._normalizeMemberId(factDim.member) === this._normalizeMemberId(colDim.memberId);\n return axisMatch && memberMatch;\n } else if (factDim.dimensionType === 'typed') {\n return axisMatch; // Typed dimensions match by axis only\n }\n return false;\n });\n });\n\n if (allMatch) {\n return column;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Normalize axis ID by extracting the local name\n */\n private _normalizeAxisId(axisId: string): string {\n if (!axisId) return '';\n // Handle both \"prefix:Name\" and \"prefix_Name\" formats\n if (axisId.includes(':')) {\n return axisId.split(':').pop() || axisId;\n } else if (axisId.includes('_')) {\n return axisId.split('_').pop() || axisId;\n }\n return axisId;\n }\n\n /**\n * Normalize member ID by extracting the local name\n */\n private _normalizeMemberId(memberId: string): string {\n if (!memberId) return '';\n // Handle both \"prefix:Name\" and \"prefix_Name\" formats\n if (memberId.includes(':')) {\n return memberId.split(':').pop() || memberId;\n } else if (memberId.includes('_')) {\n return memberId.split('_').pop() || memberId;\n }\n return memberId;\n }\n\n private _getDefaultSchema(): XBRLFormSchema {\n return {\n version: '1.0',\n formId: 'default-form',\n title: 'Dynamic Form',\n description: 'Please provide form schema or XBRL input data',\n sections: []\n };\n }\n\n private _getDefaultColumns(): FormColumn[] {\n return [\n {\n id: 'base',\n title: 'Value',\n description: 'Base values for concepts',\n type: 'base',\n order: 0,\n removable: false\n }\n ];\n }\n\n /**\n * Initialize period preferences from presentation data\n * Reads showPreviousYear, instant, and duration attributes from each role to set initial preferences\n * Only sets defaults for roles that don't have existing user preferences\n */\n private _initializePeriodPreferencesFromData() {\n if (!this.xbrlInput?.presentation?.[0]?.roles) {\n return;\n }\n\n const preferences: Record<string, { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }> = { ...this._periodPreferences };\n\n this.xbrlInput.presentation[0].roles.forEach(role => {\n // Only set defaults if this role doesn't already have preferences (preserve user selections)\n if (!preferences[role.id]) {\n // Read preset values from role data, with defaults\n const showPreviousYear = (role as any).showPreviousYear === true;\n const instant = (role as any).instant !== undefined ? (role as any).instant === true : true;\n const duration = (role as any).duration !== undefined ? (role as any).duration === true : true;\n\n preferences[role.id] = {\n showDuration: duration,\n showInstant: instant,\n showPreviousYear: showPreviousYear\n };\n\n const presets: string[] = [];\n if (showPreviousYear) presets.push('previous year');\n if (instant) presets.push('instant');\n if (duration) presets.push('duration');\n\n if (presets.length > 0) {\n //console.log(`✅ Auto-configured role \"${role.role}\" with presets: ${presets.join(', ')}`);\n }\n }\n });\n\n this._periodPreferences = preferences;\n }\n\n /**\n * Translate roleFilterAxes into dimensionSelections within _periodPreferences so that\n * buildFormSchema / filterHypercubeDimensionsBySelection picks up the right columns.\n *\n * Rules:\n * - Only runs when roleFilterAxes is non-empty and hypercube data is present.\n * - For each hypercube role, if no dimensionSelections have been saved yet (fresh start / no\n * user metadata), derive them from roleFilterAxes: available=true members → selectedMemberIds.\n * - Skips roles that already have dimensionSelections (user's saved preference takes priority).\n */\n private _applyAxisFilterToPeriodPreferences(): void {\n if (!this.roleFilterAxes || this.roleFilterAxes.length === 0) return;\n if (!this.xbrlInput?.hypercubes?.[0]?.roles) return;\n\n const hypercubeRoles = this.xbrlInput.hypercubes[0].roles;\n const preferences = { ...this._periodPreferences };\n\n for (const hypercubeRole of hypercubeRoles) {\n const roleId = hypercubeRole.roleId;\n const existing = preferences[roleId];\n\n // Preserve user's saved dimension selections — only apply defaults on first load\n if (existing?.dimensionSelections && existing.dimensionSelections.length > 0) {\n continue;\n }\n\n const dimensionSelections: Array<{ dimensionId: string; dimensionLabel: string; selectedMemberIds: string[] }> = [];\n\n for (const filterAxis of this.roleFilterAxes) {\n // Check if this role has the axis dimension in any of its hypercube items\n for (const item of hypercubeRole.items || []) {\n const matchingDim = item.dimensions?.find(\n (dim: any) => dim.id === filterAxis.id ||\n (filterAxis.conceptName && dim.conceptName === filterAxis.conceptName)\n );\n\n if (matchingDim) {\n dimensionSelections.push({\n dimensionId: filterAxis.id,\n dimensionLabel: filterAxis.conceptName || filterAxis.id,\n selectedMemberIds: filterAxis.members\n .filter(m => m.available === true)\n .map(m => m.id)\n });\n break; // Found in this item — no need to check remaining items for this axis\n }\n }\n }\n\n if (dimensionSelections.length > 0) {\n preferences[roleId] = {\n showDuration: existing?.showDuration ?? true,\n showInstant: existing?.showInstant ?? true,\n showPreviousYear: existing?.showPreviousYear ?? false,\n dimensionSelections\n };\n }\n }\n\n this._periodPreferences = preferences;\n }\n\n /**\n * In admin mode, auto-enables showPreviousYear for roles that have at least one dimension\n * member selected (from roleFilterAxes defaults). This ensures such roles render with a\n * minimum of two columns (current + previous year) on fresh initialization.\n *\n * Skipped when form state is being restored from external props or localStorage so that\n * the user's previously saved preferences are not overridden.\n */\n private _applyDimensionShowPreviousYear(): void {\n if (this.mode !== 'admin') return;\n\n // Only apply on fresh initialization — skip if any saved state exists\n const hasExternalState = !!(this.dynaformsFacts && this.dynaformsMetadata);\n const hasLocalDraft = this._draftStorageService?.hasDraft() ?? false;\n if (hasExternalState || hasLocalDraft) return;\n\n const updated = { ...this._periodPreferences };\n let changed = false;\n\n for (const roleId of Object.keys(updated)) {\n const prefs = updated[roleId];\n if (prefs.showPreviousYear) continue; // already enabled\n\n const hasDimensionMembers = prefs.dimensionSelections?.some(\n ds => ds.selectedMemberIds && ds.selectedMemberIds.length > 0\n ) ?? false;\n\n if (hasDimensionMembers) {\n updated[roleId] = { ...prefs, showPreviousYear: true };\n changed = true;\n console.log(`📅 [JDF-010] Auto-enabled showPreviousYear for role \"${roleId}\" (has dimension members)`);\n }\n }\n\n if (changed) {\n this._periodPreferences = updated;\n }\n }\n\n /**\n * Helper method to extract roleIds from _selectedRoleIds\n * Handles both legacy string[] and enhanced object[] structure\n */\n private _getRoleIdsArray(): string[] {\n if (!Array.isArray(this._selectedRoleIds) || this._selectedRoleIds.length === 0) {\n return [];\n }\n\n // Check if first element is a string (legacy format) or object (enhanced format)\n if (typeof this._selectedRoleIds[0] === 'string') {\n return this._selectedRoleIds as string[];\n } else {\n return (this._selectedRoleIds as Array<{ roleId: string; roleURI: string; order: number }>).map(item => item.roleId);\n }\n }\n\n private _applyRoleFilter() {\n if (!this._currentSchema || !this._allSections.length) return;\n\n // Extract roleIds from enhanced structure for filtering\n const roleIds = this._getRoleIdsArray();\n\n console.log(`🔍 Applying role filter: ${roleIds.length} selected out of ${this._allSections.length} total`);\n\n // If no roles are selected, show empty form (user needs to select roles)\n if (roleIds.length === 0) {\n console.log(`📝 No roles selected - showing empty form`);\n this._currentSchema = {\n ...this._currentSchema,\n sections: []\n };\n this.requestUpdate();\n return;\n }\n\n // Before filtering, preserve data from sections that will be hidden\n this._preserveDataForHiddenSections();\n\n // Filter sections based on selected role IDs\n const filteredSections = this._allSections.filter(section =>\n roleIds.includes(section.id)\n );\n\n // CRITICAL: Sort filtered sections according to custom order from picklist\n const orderedSections = this._sortSectionsByCustomOrder(filteredSections);\n\n console.log(`📊 Filtered sections: ${orderedSections.length}`);\n console.log(`📋 Custom order applied:`, orderedSections.map(s => s.title));\n\n // Restore data for sections that are now being shown\n this._restoreDataForVisibleSections(orderedSections);\n\n // Update current schema with filtered and ordered sections\n this._currentSchema = {\n ...this._currentSchema,\n sections: orderedSections\n };\n\n console.log(`✅ Schema updated with custom order. Current sections count: ${this._currentSchema.sections.length}`);\n\n // Force re-render to update the UI with new order\n this.requestUpdate();\n }\n\n /**\n * Sort sections according to custom order from _selectedRoleIds\n * Handles both enhanced structure and legacy string array\n */\n private _sortSectionsByCustomOrder(sections: FormSection[]): FormSection[] {\n // If _selectedRoleIds is enhanced structure with order\n if (Array.isArray(this._selectedRoleIds) &&\n this._selectedRoleIds.length > 0 &&\n typeof this._selectedRoleIds[0] === 'object') {\n\n const enhancedRoles = this._selectedRoleIds as Array<{ roleId: string; roleURI: string; order: number }>;\n\n // Create a map of roleId to order\n const orderMap = new Map<string, number>();\n enhancedRoles.forEach(role => {\n orderMap.set(role.roleId, role.order);\n });\n\n // Sort sections by order\n return [...sections].sort((a, b) => {\n const orderA = orderMap.get(a.id) ?? 999;\n const orderB = orderMap.get(b.id) ?? 999;\n return orderA - orderB;\n });\n }\n\n // Legacy string array or no order - return as is\n return sections;\n }\n\n /**\n * Filter roles based on roleFilterAxes input property (checkboxes.json format).\n *\n * Rules per axis:\n * 1. If the role has no hypercube entry → always included.\n * 2. If the axis from the filter config is NOT present in the role's hypercube dimensions → axis is\n * not applicable to this role → role is not affected by this axis (still included).\n * 3. If the axis IS present: include the role only if at least one of the role's members for that\n * axis matches an available=true member in the filter config.\n * 4. All axes in the config must pass (logical AND). A single failing axis excludes the role.\n */\n private _filterRolesByAxisConfig(sections: FormSection[]): FormSection[] {\n if (!this.roleFilterAxes || this.roleFilterAxes.length === 0) {\n return sections;\n }\n if (!this.xbrlInput?.hypercubes || this.xbrlInput.hypercubes.length === 0) {\n return sections;\n }\n\n const hypercubeData = this.xbrlInput.hypercubes[0];\n\n return sections.filter(section => {\n const hypercubeRole = hypercubeData.roles?.find((r: any) => r.roleId === section.id);\n\n // Rule 1: No hypercube entry for this role → always include\n if (!hypercubeRole || !hypercubeRole.items || hypercubeRole.items.length === 0) {\n return true;\n }\n\n // Evaluate each filter axis independently; all must pass\n for (const filterAxis of this.roleFilterAxes) {\n const availableMemberIds = new Set(\n filterAxis.members\n .filter(m => m.available === true)\n .map(m => m.id)\n );\n\n let axisApplicable = false;\n let rolePassesAxis = false;\n\n for (const item of hypercubeRole.items) {\n if (!item.dimensions || item.dimensions.length === 0) continue;\n\n const matchingDim = item.dimensions.find(\n (dim: any) => dim.id === filterAxis.id ||\n (filterAxis.conceptName && dim.conceptName === filterAxis.conceptName)\n );\n\n if (matchingDim) {\n axisApplicable = true;\n\n if (matchingDim.members) {\n for (const roleMember of matchingDim.members) {\n if (availableMemberIds.has(roleMember.id)) {\n rolePassesAxis = true;\n break;\n }\n }\n }\n\n if (rolePassesAxis) break;\n }\n }\n\n // Rule 2: Axis not applicable to this role → passes this axis check\n // Rule 3/4: Axis applicable but no available=true member matches → exclude\n if (axisApplicable && !rolePassesAxis) {\n return false;\n }\n }\n\n return true;\n });\n }\n\n private _preserveDataForHiddenSections() {\n // Get currently visible section IDs\n const currentlyVisibleSectionIds = this._currentSchema?.sections.map(s => s.id) || [];\n\n // Extract roleIds from enhanced structure\n const selectedRoleIds = this._getRoleIdsArray();\n\n // Find sections that will be hidden after filter is applied\n const sectionsThatWillBeHidden = currentlyVisibleSectionIds.filter(\n sectionId => !selectedRoleIds.includes(sectionId)\n );\n\n // Preserve form data for concepts in hidden sections\n sectionsThatWillBeHidden.forEach(sectionId => {\n const section = this._allSections.find(s => s.id === sectionId);\n if (section) {\n this._preserveSectionData(section);\n }\n });\n\n // console.log(`📦 Preserved data for ${sectionsThatWillBeHidden.length} hidden sections:`, sectionsThatWillBeHidden);\n }\n\n private _restoreDataForVisibleSections(visibleSections: FormSection[]) {\n // Restore data for sections that are now being shown\n visibleSections.forEach(section => {\n this._restoreSectionData(section);\n });\n\n console.log(`🔄 Restored data for ${visibleSections.length} visible sections`);\n }\n\n private _preserveSectionData(section: FormSection) {\n // Preserve form data for all concepts in this section\n section.concepts.forEach(concept => {\n this._preserveConceptData(concept);\n });\n }\n\n private _preserveConceptData(concept: ConceptTree) {\n // Preserve data for this concept\n if (this._formData[concept.id]) {\n this._preservedFormData[concept.id] = { ...this._formData[concept.id] };\n }\n\n // Preserve typed member data for columns related to this concept\n concept.fields.forEach(field => {\n if (this._typedMemberData[field.columnId]) {\n this._preservedTypedMemberData[field.columnId] = { ...this._typedMemberData[field.columnId] };\n }\n // Preserve cross-role typed member data (stored under compound key)\n const crossRoleKey = `${concept.id}__${field.columnId}`;\n if (this._typedMemberData[crossRoleKey]) {\n this._preservedTypedMemberData[crossRoleKey] = { ...this._typedMemberData[crossRoleKey] };\n }\n });\n\n // Recursively preserve data for child concepts\n if (concept.children) {\n concept.children.forEach(child => {\n this._preserveConceptData(child);\n });\n }\n }\n\n private _restoreSectionData(section: FormSection) {\n // Restore form data for all concepts in this section\n section.concepts.forEach(concept => {\n this._restoreConceptData(concept);\n });\n }\n\n private _restoreConceptData(concept: ConceptTree) {\n // Restore data for this concept if it was preserved\n if (this._preservedFormData[concept.id]) {\n this._formData[concept.id] = { ...this._preservedFormData[concept.id] };\n }\n\n // Restore typed member data for columns related to this concept\n concept.fields.forEach(field => {\n if (this._preservedTypedMemberData[field.columnId]) {\n this._typedMemberData[field.columnId] = { ...this._preservedTypedMemberData[field.columnId] };\n }\n // Restore cross-role typed member data (stored under compound key)\n const crossRoleKey = `${concept.id}__${field.columnId}`;\n if (this._preservedTypedMemberData[crossRoleKey]) {\n this._typedMemberData[crossRoleKey] = { ...this._preservedTypedMemberData[crossRoleKey] };\n }\n });\n\n // Recursively restore data for child concepts\n if (concept.children) {\n concept.children.forEach(child => {\n this._restoreConceptData(child);\n });\n }\n }\n\n private _shouldShowFilterButton(): boolean {\n return true; // Always show filter button to allow role selection\n }\n\n private _handleFilterRolesClick() {\n this._showFilterDialog = true;\n }\n\n private _handleAdvancedFilterApply(event: CustomEvent) {\n this._showFactsOnly = event.detail.showFactsOnly;\n this._conceptSearchText = event.detail.conceptSearchText ?? '';\n this._showFilterDialog = false;\n }\n\n private _handleFilterDialogCancel() {\n this._showFilterDialog = false;\n\n // If no roles were previously selected (first time opening), \n // and user cancels, keep empty selection for consistency\n const roleCount = this._getRoleIdsArray().length;\n console.log(`🚫 Filter dialog cancelled. Current selection: ${roleCount}/${this._allSections.length}`);\n }\n\n private _handleRoleFilterApply(event: CustomEvent) {\n const { selectedRoleIds, periodPreferences } = event.detail;\n console.log('🎯 Filter apply triggered');\n console.log('📊 Old _selectedRoleIds:', this._selectedRoleIds);\n console.log('📊 New selectedRoleIds from dialog:', selectedRoleIds);\n\n this._selectedRoleIds = selectedRoleIds;\n this._periodPreferences = periodPreferences;\n\n console.log('📊 Updated _selectedRoleIds:', this._selectedRoleIds);\n console.log('📊 New period preferences (including dimension selections):', this._periodPreferences);\n\n // CRITICAL: Capture current form data BEFORE reinitialization to preserve user input\n console.log('💾 Capturing current form data before reinitialization...');\n const currentFormData = this._generateSubmissionData();\n const currentMetadata = this._draftStorageService.createMetadataSnapshot(\n this.periodStartDate,\n this.periodEndDate,\n this.language,\n this._selectedRoleIds, // Enhanced structure with roleURI and order\n this._allSections,\n this._typedMemberData,\n this._periodPreferences,\n this._periodData,\n this._unitData,\n this.reportingLanguage,\n this._repeatCounts,\n this._decimalsData\n );\n\n // Save current state to draft storage\n this._draftStorageService.saveDraft(currentFormData, currentMetadata);\n console.log('✅ Current form data saved to draft storage with NEW preferences');\n\n // CRITICAL: Keep external draft properties in sync with the just-saved state.\n // _loadDraftIfExists() gives Priority 1 to dynaformsFacts/dynaformsMetadata; if these\n // are still pointing at a stale \"save-draft\" snapshot (e.g. the one where the role was\n // removed), that old snapshot will override the fresh localStorage draft we just wrote,\n // preventing the re-added role from ever appearing.\n this.dynaformsFacts = currentFormData;\n this.dynaformsMetadata = currentMetadata;\n\n // CRITICAL: Skip period preferences restoration to prevent override of new selections\n this._skipPeriodPreferencesRestore = true;\n\n // CRITICAL: Skip draft loading during reinitialization to prevent old draft from overriding changes\n this._skipDraftLoading = true;\n console.log('🔄 Reinitializing form with new filter settings...');\n this._initializeForm();\n this._skipDraftLoading = false;\n this._skipPeriodPreferencesRestore = false;\n\n console.log('📊 After _initializeForm, _currentSchema.sections.length:', this._currentSchema?.sections.length);\n console.log('📊 Section IDs:', this._currentSchema?.sections.map(s => s.id));\n\n // CRITICAL: Restore form data from draft after reinitialization\n console.log('📥 Restoring form data from draft after reinitialization...');\n this._loadDraftIfExists().then(() => {\n console.log('✅ Form data restored successfully after reinitialization');\n }).catch((error) => {\n console.error('❌ Error restoring form data after reinitialization:', error);\n });\n\n this._showFilterDialog = false;\n\n // Extract roleIds for counting (handle both legacy string[] and enhanced object[])\n const roleCount = Array.isArray(this._selectedRoleIds) && this._selectedRoleIds.length > 0\n ? (typeof this._selectedRoleIds[0] === 'string' ? this._selectedRoleIds.length : (this._selectedRoleIds as Array<{ roleId: string; roleURI: string; order: number }>).length)\n : 0;\n\n console.log(`🎯 Applied role filter: ${roleCount}/${this._allSections.length} roles selected`);\n console.log('📋 Enhanced selectedRoleIds structure:', this._selectedRoleIds);\n\n // Dispatch event for external listeners\n this.dispatchEvent(new CustomEvent('roles-filter-changed', {\n detail: {\n selectedRoleIds, // Enhanced structure with roleURI and order\n totalRoles: this._allSections.length,\n visibleRoles: roleCount,\n periodPreferences\n },\n bubbles: true\n }));\n }\n\n /**\n * Check if dimension selections have changed for any role\n */\n private _haveDimensionSelectionsChanged(newPeriodPreferences: any): boolean {\n // Get all role IDs from both old and new preferences\n const allRoleIds = new Set([\n ...Object.keys(this._periodPreferences || {}),\n ...Object.keys(newPeriodPreferences || {})\n ]);\n\n for (const roleId of allRoleIds) {\n const oldPrefs = this._periodPreferences?.[roleId];\n const newPrefs = newPeriodPreferences?.[roleId];\n\n const oldDimensions = oldPrefs?.dimensionSelections || [];\n const newDimensions = newPrefs?.dimensionSelections || [];\n\n // Compare dimension selections using sorted JSON strings\n const oldDimensionsStr = JSON.stringify(\n oldDimensions.sort((a: any, b: any) => a.dimensionId.localeCompare(b.dimensionId))\n );\n const newDimensionsStr = JSON.stringify(\n newDimensions.sort((a: any, b: any) => a.dimensionId.localeCompare(b.dimensionId))\n );\n\n if (oldDimensionsStr !== newDimensionsStr) {\n console.log(`🔍 Dimension selection changed for role: ${roleId}`);\n console.log(' Old:', oldDimensions);\n console.log(' New:', newDimensions);\n return true;\n }\n }\n\n return false;\n }\n\n private _validateForm() {\n const errors: ValidationError[] = [];\n\n // Use current schema for validation\n const schema = this._currentSchema;\n if (!schema) return;\n\n // Validate each section and its concepts\n for (const section of schema.sections) {\n for (const concept of section.concepts) {\n for (const field of concept.fields) {\n const value = this._formData[concept.id]?.[field.columnId];\n const fieldErrors = FormValidator.validateField(\n field.id,\n concept.id,\n field.columnId,\n value,\n field.type,\n field.validation || []\n );\n errors.push(...fieldErrors);\n }\n }\n }\n\n this._errors = errors;\n this._valid = errors.filter(e => e.severity === 'error').length === 0;\n }\n\n private _handleFieldChange(event: CustomEvent) {\n const { fieldId, conceptId, columnId, value } = event.detail;\n\n console.log(`📝 Field change: conceptId=${conceptId}, columnId=${columnId}, value=${value}, fieldId=${fieldId}`);\n\n // Update form data with proper immutable update to trigger Lit reactivity\n const updatedFormData = { ...this._formData };\n if (!updatedFormData[conceptId]) {\n updatedFormData[conceptId] = {};\n }\n const oldValue = updatedFormData[conceptId][columnId];\n updatedFormData[conceptId] = { ...updatedFormData[conceptId], [columnId]: value };\n this._formData = updatedFormData;\n\n console.log(`💾 Updated formData[${conceptId}]:`, this._formData[conceptId]);\n\n // Mark as touched and dirty\n this._touched.add(`${conceptId}-${columnId}`);\n this._dirty = true;\n\n // Re-validate\n this._validateForm();\n\n // Trigger update (should be automatic with the new object reference)\n this.requestUpdate();\n\n // Dispatch change event\n this.dispatchEvent(new CustomEvent('field-change', {\n detail: { fieldId, conceptId, columnId, value, oldValue },\n bubbles: true\n }));\n }\n\n private _handlePeriodChange(event: CustomEvent) {\n console.log(`🎯 [DynamicForm] _handlePeriodChange called with event:`, event);\n console.log(`🎯 [DynamicForm] Event detail:`, event.detail);\n const { conceptId, columnId, periodType, periodStartDate, periodEndDate, periodInstantDate, unit } = event.detail;\n\n console.log(`📅 Period change received: conceptId=${conceptId}, columnId=${columnId}, periodType=${periodType}, startDate=${periodStartDate}, endDate=${periodEndDate}, instantDate=${periodInstantDate}, unit=${unit}`);\n\n // Update period data with proper immutable update\n const updatedPeriodData = { ...this._periodData };\n if (!updatedPeriodData[conceptId]) {\n updatedPeriodData[conceptId] = {};\n }\n\n updatedPeriodData[conceptId] = {\n ...updatedPeriodData[conceptId],\n [columnId]: {\n startDate: periodStartDate,\n endDate: periodEndDate,\n instantDate: periodInstantDate\n }\n };\n this._periodData = updatedPeriodData;\n\n console.log(`💾 Period data stored for [${conceptId}][${columnId}]:`, this._periodData[conceptId][columnId]);\n console.log(`📦 Full period data state:`, JSON.stringify(this._periodData, null, 2));\n\n // Also store unit if provided\n if (unit) {\n this._storeUnit(conceptId, columnId, unit);\n }\n\n // Mark as dirty\n this._dirty = true;\n\n // Trigger update\n this.requestUpdate();\n }\n\n private _handleUnitChange(event: CustomEvent) {\n console.log(`🏷️ [DynamicForm] _handleUnitChange called with event:`, event);\n console.log(`🏷️ [DynamicForm] Event detail:`, event.detail);\n const { conceptId, columnId, unit } = event.detail;\n\n console.log(`🏷️ Unit change received: conceptId=${conceptId}, columnId=${columnId}, unit=${unit}`);\n\n this._storeUnit(conceptId, columnId, unit);\n\n // Mark as dirty\n this._dirty = true;\n\n // Trigger update\n this.requestUpdate();\n }\n\n private _storeUnit(conceptId: string, columnId: string, unit: string) {\n console.log(`🔧 [_storeUnit] Called with conceptId=${conceptId}, columnId=${columnId}, unit=${unit}`);\n console.log(`🔧 [_storeUnit] Current _unitData before update:`, JSON.stringify(this._unitData, null, 2));\n\n // Update unit data with proper immutable update\n const updatedUnitData = { ...this._unitData };\n if (!updatedUnitData[conceptId]) {\n console.log(`🔧 [_storeUnit] Creating new entry for conceptId: ${conceptId}`);\n updatedUnitData[conceptId] = {};\n }\n\n updatedUnitData[conceptId] = {\n ...updatedUnitData[conceptId],\n [columnId]: unit\n };\n this._unitData = updatedUnitData;\n\n console.log(`💾 [_storeUnit] Unit data stored for [${conceptId}][${columnId}]:`, this._unitData[conceptId][columnId]);\n console.log(`📦 [_storeUnit] Full unit data state after update:`, JSON.stringify(this._unitData, null, 2));\n }\n\n private _handleDecimalsChange(event: CustomEvent) {\n const { conceptId, columnId, decimals } = event.detail;\n if (!conceptId || !columnId) return;\n this._storeDecimals(conceptId, columnId, decimals);\n this._dirty = true;\n this.requestUpdate();\n }\n\n private _computeEffectiveMasterData() {\n const ROUNDING_CONCEPT = 'rj-i_DocumentIntendedRoundingLevel';\n if (this.decimals !== 'INF') {\n const parsed = parseFloat(this.decimals);\n if (!isNaN(parsed)) {\n this._effectiveMasterData = {\n ...(this.masterData || {}),\n [ROUNDING_CONCEPT]: String(-parsed)\n };\n return;\n }\n }\n // No valid global decimals — use masterData as-is (may be undefined)\n this._effectiveMasterData = this.masterData ? { ...this.masterData } : undefined;\n }\n\n private _initializeGlobalDecimalsFromRoundingData(): void {\n // Respect explicit global decimals provided by host app/user.\n if (this._hasValidGlobalDecimals()) {\n return;\n }\n\n const roundingLevel =\n this._findRoundingLevelFactValue(this._allSections) ??\n this._findRoundingLevelValueInFormData(this._formData);\n\n if (roundingLevel === undefined || roundingLevel === null || roundingLevel === '') {\n return;\n }\n\n const parsed = parseFloat(String(roundingLevel));\n if (isNaN(parsed)) {\n return;\n }\n\n // Rounding-level facts are typically negative (e.g., -2). Global decimals\n // should be a positive value for UI/edit-period defaults.\n this.decimals = String(Math.abs(parsed));\n }\n\n private _findRoundingLevelValueInFormData(formData?: FormData): any {\n if (!formData) {\n return undefined;\n }\n\n for (const conceptKey of Object.keys(formData)) {\n if (!this._isRoundingLevelConcept(conceptKey)) {\n continue;\n }\n\n const columnValues = formData[conceptKey] || {};\n for (const columnId of Object.keys(columnValues)) {\n const value = columnValues[columnId];\n if (value !== undefined && value !== null && value !== '') {\n return value;\n }\n }\n }\n\n return undefined;\n }\n\n private _findRoundingLevelFactValue(sections: FormSection[]): any {\n for (const section of sections) {\n const value = this._findRoundingLevelFactValueInConcepts(section.concepts || []);\n if (value !== undefined && value !== null && value !== '') {\n return value;\n }\n }\n return undefined;\n }\n\n private _findRoundingLevelFactValueInConcepts(concepts: ConceptTree[]): any {\n for (const concept of concepts) {\n const conceptIdToCheck = concept.originalConceptId || concept.id;\n if (this._isRoundingLevelConcept(conceptIdToCheck)) {\n const facts = concept.facts || [];\n for (const fact of facts as any[]) {\n if (fact?.value !== undefined && fact?.value !== null && fact?.value !== '') {\n return fact.value;\n }\n }\n }\n\n if (concept.children && concept.children.length > 0) {\n const childValue = this._findRoundingLevelFactValueInConcepts(concept.children);\n if (childValue !== undefined && childValue !== null && childValue !== '') {\n return childValue;\n }\n }\n }\n\n return undefined;\n }\n\n private _hasValidGlobalDecimals(): boolean {\n if (this.decimals === undefined || this.decimals === null) {\n return false;\n }\n if (this.decimals === 'INF') {\n return false;\n }\n const parsed = parseFloat(this.decimals);\n return !isNaN(parsed);\n }\n\n private _isRoundingLevelConcept(conceptId?: string): boolean {\n if (!conceptId) {\n return false;\n }\n\n // Accept exact and suffixed keys (e.g. __hash / __repeat_N)\n // and namespace/prefix variants that end with local name.\n return conceptId === 'rj-i_DocumentIntendedRoundingLevel' || conceptId.includes('DocumentIntendedRoundingLevel');\n }\n\n private _findFactValueForField(concept: ConceptTree, field: FormField, section?: FormSection): any {\n if (!concept.facts || concept.facts.length === 0) {\n return undefined;\n }\n\n const column = this._findColumnByIdInSection(field.columnId, section);\n const fieldPeriodData = this._periodData[concept.id]?.[field.columnId];\n const periodStartDate = fieldPeriodData?.startDate || column?.periodStartDate || field.periodStartDate || this.periodStartDate;\n const periodEndDate = fieldPeriodData?.endDate || column?.periodEndDate || field.periodEndDate || this.periodEndDate;\n const periodInstantDate = fieldPeriodData?.instantDate || field.periodInstantDate || periodEndDate || periodStartDate;\n const unit = this._unitData[concept.id]?.[field.columnId];\n\n const cellContext = {\n conceptId: concept.originalConceptId || field.conceptId || concept.id,\n columnId: field.columnId,\n periodStartDate,\n periodEndDate,\n periodInstantDate,\n periodType: field.periodType,\n unit,\n dimensionData: column?.dimensionData\n };\n\n const matchedFact = FactMatcher.findMatchingFact(concept.facts as any[], cellContext as any);\n return matchedFact?.value;\n }\n\n private _storeDecimals(conceptId: string, columnId: string, decimals: string | undefined) {\n const updated = { ...this._decimalsData };\n if (!updated[conceptId]) updated[conceptId] = {};\n updated[conceptId] = { ...updated[conceptId], [columnId]: decimals ?? '' };\n this._decimalsData = updated;\n }\n\n /**\n * Generate a unique concept key that includes section context\n */\n private _generateUniqueConceptKey(sectionId: string, conceptId: string): string {\n return `${sectionId}::${conceptId}`;\n }\n\n /**\n * Extract the original concept ID from a unique concept key\n */\n private _extractOriginalConceptId(uniqueConceptKey: string): string {\n const parts = uniqueConceptKey.split('::');\n return parts.length > 1 ? parts[1] : uniqueConceptKey;\n }\n\n private _handleAddConceptRepeat(event: CustomEvent) {\n const { conceptId } = event.detail;\n this._repeatCounts = { ...this._repeatCounts, [conceptId]: (this._repeatCounts[conceptId] || 0) + 1 };\n this._dirty = true;\n }\n\n private _handleRemoveConceptRepeat(event: CustomEvent) {\n const { conceptId: rawConceptId } = event.detail;\n\n // The event detail carries the synthetic instance ID (e.g. \"baseId__repeat_2\").\n // Parse out the base concept ID and which repeat index to remove.\n const repeatMatch = rawConceptId.match(/^(.+)__repeat_(\\d+)$/);\n const baseConceptId = repeatMatch ? repeatMatch[1] : rawConceptId;\n const removeIndex = repeatMatch ? parseInt(repeatMatch[2]) : (this._repeatCounts[rawConceptId] || 0);\n\n const current = this._repeatCounts[baseConceptId] || 0;\n if (current <= 0 || removeIndex < 1 || removeIndex > current) return;\n\n const newFormData = { ...this._formData };\n const newTypedData = { ...this._typedMemberData };\n const newUnitData = { ...this._unitData };\n const newPeriodData = { ...this._periodData };\n\n // Shift instances after the removed one down by one\n for (let n = removeIndex; n < current; n++) {\n const fromId = `${baseConceptId}__repeat_${n + 1}`;\n const toId = `${baseConceptId}__repeat_${n}`;\n\n // Move form data\n if (newFormData[fromId] !== undefined) {\n newFormData[toId] = newFormData[fromId];\n } else {\n delete newFormData[toId];\n }\n\n // Move typed member data (keys like \"fromId__columnId\")\n const toPrefix = `${toId}__`;\n const fromPrefix = `${fromId}__`;\n const fromEntries = Object.keys(newTypedData).filter(k => k.startsWith(fromPrefix));\n // Clear destination first, then copy source, then delete source originals\n Object.keys(newTypedData).filter(k => k.startsWith(toPrefix)).forEach(k => delete newTypedData[k]);\n fromEntries.forEach(k => {\n newTypedData[`${toId}__${k.slice(fromPrefix.length)}`] = newTypedData[k];\n });\n fromEntries.forEach(k => delete newTypedData[k]);\n\n // Move unit data\n if (newUnitData[fromId] !== undefined) {\n newUnitData[toId] = newUnitData[fromId];\n } else {\n delete newUnitData[toId];\n }\n\n // Move period data\n if (newPeriodData[fromId] !== undefined) {\n newPeriodData[toId] = newPeriodData[fromId];\n } else {\n delete newPeriodData[toId];\n }\n }\n\n // Delete the last (now duplicated) slot after shifting\n const lastId = `${baseConceptId}__repeat_${current}`;\n delete newFormData[lastId];\n delete newUnitData[lastId];\n delete newPeriodData[lastId];\n const lastPrefix = `${lastId}__`;\n Object.keys(newTypedData).filter(k => k.startsWith(lastPrefix)).forEach(k => delete newTypedData[k]);\n\n this._formData = newFormData;\n this._typedMemberData = newTypedData;\n this._unitData = newUnitData;\n this._periodData = newPeriodData;\n this._repeatCounts = { ...this._repeatCounts, [baseConceptId]: current - 1 };\n this._dirty = true;\n }\n\n private _handleTypedMemberChange(event: CustomEvent) {\n const { columnId, axisId, value, conceptId } = event.detail;\n\n // Cross-role typed members (from Edit Period dialog) carry conceptId so that\n // each concept row stores its own values independently.\n // Column-header typed members have no conceptId and keep using columnId alone.\n const storageKey = conceptId ? `${conceptId}__${columnId}` : columnId;\n\n console.log(`🔍 [DynamicForm] Typed member change: storageKey=${storageKey}, axisId=${axisId}, value=${value}`);\n\n // Update typed member data with immutable update\n const updatedTypedMemberData = { ...this._typedMemberData };\n if (!updatedTypedMemberData[storageKey]) {\n updatedTypedMemberData[storageKey] = {};\n }\n updatedTypedMemberData[storageKey] = { ...updatedTypedMemberData[storageKey], [axisId]: value };\n this._typedMemberData = updatedTypedMemberData;\n\n // Mark as dirty\n this._dirty = true;\n\n // Trigger update\n this.requestUpdate();\n\n // Dispatch change event\n this.dispatchEvent(new CustomEvent('typed-member-change', {\n detail: { columnId, axisId, value },\n bubbles: true\n }));\n }\n\n private _handleFieldBlur(event: CustomEvent) {\n console.log(`🟧 [DynamicForm] _handleFieldBlur received event:`, event);\n console.log(`🟧 [DynamicForm] Event detail:`, event.detail);\n\n const { fieldId, conceptId, columnId, xbrlValidationErrors } = event.detail;\n\n console.log(`🟧 [DynamicForm] Extracted - fieldId: ${fieldId}, conceptId: ${conceptId}, columnId: ${columnId}`);\n console.log(`🟧 [DynamicForm] xbrlValidationErrors:`, xbrlValidationErrors);\n\n // Find which section this field belongs to using composedPath for Shadow DOM\n let sectionId = '';\n const path = event.composedPath();\n\n console.log(`🟧 [DynamicForm] Event path length: ${path.length}`);\n\n // Traverse the composed path to find the section\n for (const element of path) {\n const el = element as HTMLElement;\n if (el.tagName === 'JUPITER-FORM-SECTION') {\n sectionId = el.getAttribute('section-id') || '';\n console.log(`🟧 [DynamicForm] Found section element with id: ${sectionId}`);\n break;\n }\n }\n\n console.log(`🟧 [DynamicForm] Found sectionId: ${sectionId}`);\n\n // Update error tracking (create new array for Lit reactivity)\n console.log(`🟧 [DynamicForm] Processing errors - has errors: ${xbrlValidationErrors && xbrlValidationErrors.length > 0}`);\n\n if (xbrlValidationErrors && xbrlValidationErrors.length > 0) {\n console.log(`🟧 [DynamicForm] Adding/updating error for fieldId: ${fieldId}, sectionId: ${sectionId}`);\n\n // Get the current value from formData\n const value = this._formData[conceptId]?.[columnId] || '';\n\n // Add or update error entry\n const existingIndex = this._xbrlFormErrors.findIndex(\n e => e.fieldId === fieldId && e.sectionId === sectionId\n );\n\n const newError = {\n sectionId,\n fieldId,\n conceptId,\n columnId,\n value,\n errors: xbrlValidationErrors\n };\n\n console.log(`🟧 [DynamicForm] New error object:`, newError);\n console.log(`🟧 [DynamicForm] Existing index: ${existingIndex}`);\n\n if (existingIndex >= 0) {\n // Update existing error - create new array with updated entry\n this._xbrlFormErrors = [\n ...this._xbrlFormErrors.slice(0, existingIndex),\n newError,\n ...this._xbrlFormErrors.slice(existingIndex + 1)\n ];\n console.log(`🟧 [DynamicForm] Updated existing error at index ${existingIndex}`);\n } else {\n // Add new error - create new array with new entry\n this._xbrlFormErrors = [...this._xbrlFormErrors, newError];\n console.log(`🟧 [DynamicForm] Added new error`);\n }\n } else {\n console.log(`🟧 [DynamicForm] Removing error (if exists) for fieldId: ${fieldId}, sectionId: ${sectionId}`);\n // Remove error entry if validation passed - create new filtered array\n const beforeLength = this._xbrlFormErrors.length;\n this._xbrlFormErrors = this._xbrlFormErrors.filter(\n e => !(e.fieldId === fieldId && e.sectionId === sectionId)\n );\n console.log(`🟧 [DynamicForm] Removed ${beforeLength - this._xbrlFormErrors.length} errors`);\n }\n\n console.log(`🔍 [Validation] Total errors: ${this._xbrlFormErrors.length}`, this._xbrlFormErrors);\n }\n\n private _getSectionTitle(sectionId: string): string {\n console.log(`🔍 [_getSectionTitle] Looking for sectionId: \"${sectionId}\"`);\n console.log(`🔍 [_getSectionTitle] Available sections:`, this._allSections.map(s => ({ id: s.id, title: s.title })));\n const section = this._allSections.find(s => s.id === sectionId);\n const result = section?.title || sectionId || '(Unknown Section)';\n console.log(`🔍 [_getSectionTitle] Result: \"${result}\"`);\n return result;\n }\n\n private _roleHasErrors(roleId: string): boolean {\n return this._xbrlFormErrors.some(error => error.sectionId === roleId);\n }\n\n private async _handleErrorFieldClick(conceptId: string, columnId: string, sectionId: string) {\n console.log(`🎯 [Error Click] Attempting to focus field: ${conceptId}__${columnId} in section: ${sectionId}`);\n\n // Close the error popup\n this._showErrorPopup = false;\n this.requestUpdate();\n\n // Wait for popup to close\n await this.updateComplete;\n\n // CRITICAL: If using side panel layout, switch to the correct section first\n if (this.display === 'sidePanel' && this._activeSidePanelRoleId !== sectionId) {\n console.log(`🔀 Switching to section: ${sectionId} (currently on: ${this._activeSidePanelRoleId})`);\n this._activeSidePanelRoleId = sectionId;\n this.requestUpdate();\n await this.updateComplete;\n // Wait for the section to fully render\n await new Promise(resolve => setTimeout(resolve, 500));\n }\n\n // Find the section element\n const sectionElements = this.shadowRoot?.querySelectorAll('jupiter-form-section');\n let targetSection: any = null;\n\n sectionElements?.forEach((sectionEl: any) => {\n if (sectionEl.section?.id === sectionId) {\n targetSection = sectionEl;\n }\n });\n\n if (!targetSection) {\n console.warn(`⚠️ Section not found: ${sectionId}`);\n return;\n }\n\n console.log(`✅ Found section element:`, targetSection);\n\n // Expand the section if it's collapsed\n if (targetSection.section?.collapsed) {\n console.log(`📂 Expanding collapsed section`);\n targetSection.section.collapsed = false;\n targetSection.requestUpdate();\n await targetSection.updateComplete;\n // Wait a bit more for animation and nested components to render\n await new Promise(resolve => setTimeout(resolve, 500));\n } else {\n // Even if not collapsed, wait for rendering\n await targetSection.updateComplete;\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n\n // Debug: Check shadow DOM availability\n console.log(`🔍 Section shadow DOM exists: ${!!targetSection.shadowRoot}`);\n if (targetSection.shadowRoot) {\n console.log(`🔍 Shadow DOM innerHTML length: ${targetSection.shadowRoot.innerHTML?.length || 0}`);\n\n // Debug: Check what elements exist in shadow DOM\n const allElements = targetSection.shadowRoot.querySelectorAll('*');\n console.log(`🔍 Total elements in shadow DOM: ${allElements.length}`);\n\n // List all custom elements (with proper type casting)\n const customElements = Array.from(allElements).filter((el): el is Element => {\n const element = el as Element;\n return !!(element.tagName && element.tagName.includes('-'));\n });\n console.log(`🔍 Custom elements found:`, customElements.map(el => el.tagName).join(', '));\n }\n\n // Construct the field ID that form-field component uses\n const fieldId = `${conceptId}_${columnId}_field`;\n console.log(`🔍 Looking for input with fieldId: ${fieldId}`);\n console.log(`🔍 Looking for field with conceptId: ${conceptId} AND columnId: ${columnId}`);\n\n // CRITICAL: Form fields are nested inside jupiter-concept-tree elements' shadow DOMs\n // We need to search through concept trees first\n const conceptTrees = targetSection.shadowRoot?.querySelectorAll('jupiter-concept-tree');\n let targetInput: HTMLInputElement | HTMLTextAreaElement | null = null;\n\n console.log(`🔍 Found ${conceptTrees?.length || 0} concept-tree elements`);\n\n // Search through each concept tree's shadow DOM for form-field elements\n if (conceptTrees) {\n conceptTrees.forEach((conceptTree: any, treeIndex: number) => {\n if (targetInput) return; // Already found, skip\n\n const formFieldsInTree = conceptTree.shadowRoot?.querySelectorAll('jupiter-form-field');\n console.log(`🔍 Concept tree ${treeIndex}: Found ${formFieldsInTree?.length || 0} form-field elements`);\n\n formFieldsInTree?.forEach((fieldEl: any, fieldIndex: number) => {\n if (targetInput) return; // Already found, skip\n\n console.log(` Field ${fieldIndex}: conceptId=${fieldEl.conceptId}, columnId=${fieldEl.columnId}`);\n\n // Match by both conceptId AND columnId for precise targeting\n if (fieldEl.conceptId === conceptId && fieldEl.columnId === columnId) {\n // Try to find the input element inside the form-field's shadow DOM\n const inputEl = fieldEl.shadowRoot?.querySelector('input, textarea');\n console.log(` -> Matched! Input element found: ${!!inputEl}`);\n if (inputEl) {\n targetInput = inputEl as HTMLInputElement | HTMLTextAreaElement;\n console.log(`✅ Found input element in form-field`);\n }\n }\n });\n });\n }\n\n if (!targetInput) {\n console.warn(`⚠️ Input field not found for: ${fieldId}`);\n return;\n }\n\n // TypeScript type guard - we know targetInput is not null here\n const input = targetInput as HTMLInputElement | HTMLTextAreaElement;\n\n // Scroll the section into view\n targetSection.scrollIntoView({ behavior: 'smooth', block: 'start' });\n\n // Wait for scroll\n await new Promise(resolve => setTimeout(resolve, 300));\n\n // Focus the input field\n input.focus();\n\n // Select the text if it's an input field\n if (input.tagName === 'INPUT' || input.tagName === 'TEXTAREA') {\n input.select();\n }\n\n // Add a red highlight effect\n input.style.boxShadow = '0 0 0 3px rgba(220, 38, 38, 0.5)';\n setTimeout(() => {\n input.style.boxShadow = '';\n }, 2000);\n\n console.log(`✅ Successfully focused field: ${conceptId}__${columnId}`);\n }\n\n private _handleSectionExpand(event: CustomEvent) {\n this.dispatchEvent(new CustomEvent('section-expand', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _handleConceptExpand(event: CustomEvent) {\n this.dispatchEvent(new CustomEvent('concept-expand', {\n detail: event.detail,\n bubbles: true\n }));\n }\n\n private _handleColumnRemove(event: CustomEvent) {\n const { columnId, sectionId } = event.detail;\n\n // Remove column from ONLY the specific section\n if (this._currentSchema && sectionId) {\n const targetSection = this._currentSchema.sections.find(section => section.id === sectionId);\n if (targetSection && targetSection.columns) {\n targetSection.columns = targetSection.columns.filter(col => col.id !== columnId);\n }\n } else {\n // Fallback: remove from all sections (for backward compatibility)\n this._columns = this._columns.filter(col => col.id !== columnId);\n\n if (this._currentSchema) {\n this._currentSchema.sections.forEach(section => {\n if (section.columns) {\n section.columns = section.columns.filter(col => col.id !== columnId);\n }\n });\n }\n }\n\n // Remove data for this column from the specific section's concepts\n this._removeColumnData(columnId, sectionId);\n\n this._dirty = true;\n this._validateForm();\n this.requestUpdate();\n\n this.dispatchEvent(new CustomEvent('column-remove', {\n detail: { columnId, sectionId },\n bubbles: true\n }));\n }\n\n private _handleColumnAddRequest(event: CustomEvent) {\n const { sectionId, columnRequest, insertAfterColumnId } = event.detail;\n this._addColumnFromRequest(columnRequest, sectionId, insertAfterColumnId);\n }\n\n private _getAvailableDimensionsForSection(sectionId: string): AvailableDimension[] {\n // console.log(`🔍 Getting dimensions for section: ${sectionId}`);\n\n if (!this.xbrlInput?.hypercubes?.[0]) {\n //console.log('❌ No hypercubes data available');\n return [];\n }\n\n //console.log(`📊 Available hypercube roles:`, this.xbrlInput.hypercubes[0].roles.map(r => r.roleId));\n\n const hypercubeRole = this.xbrlInput.hypercubes[0].roles.find(hr => hr.roleId === sectionId);\n\n if (!hypercubeRole?.items?.length) {\n console.log(`❌ No hypercube items found for role: ${sectionId}`);\n return [];\n }\n\n // console.log(`✅ Found hypercube role with ${hypercubeRole.items.length} items`);\n\n const availableDimensions: AvailableDimension[] = [];\n\n const lang = this.language || 'en';\n const pickLabel = (labels: any[], fallback: string) =>\n (labels?.find((l: any) => l.lang === lang && l.role === 'http://www.xbrl.org/2003/role/label') ||\n labels?.find((l: any) => l.lang === 'en' && l.role === 'http://www.xbrl.org/2003/role/label') ||\n labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label'))?.label || fallback;\n\n // Process all hypercube items to find unique dimensions\n hypercubeRole.items.forEach(item => {\n if (item.dimensions && item.dimensions.length > 0) {\n item.dimensions.forEach(dimension => {\n // Check if we already have this dimension\n if (!availableDimensions.find(d => d.id === dimension.id)) {\n const axisLabel = pickLabel(dimension.labels, dimension.conceptName);\n\n const availableDimension: AvailableDimension = {\n id: dimension.id,\n conceptName: dimension.conceptName,\n axisLabel: axisLabel\n };\n\n // Add members if available\n if (dimension.members && dimension.members.length > 0) {\n availableDimension.members = dimension.members.map(member => ({\n id: member.id,\n label: pickLabel(member.labels, member.conceptName || member.id)\n }));\n }\n\n // Add typed member if available\n if (dimension.typedMember) {\n availableDimension.typedMember = {\n id: dimension.typedMember.id,\n dataType: 'string' // Default to string for now\n };\n }\n\n availableDimensions.push(availableDimension);\n }\n });\n }\n });\n\n // console.log(`📈 Found ${availableDimensions.length} dimensions for section ${sectionId}:`, availableDimensions.map(d => d.axisLabel));\n return availableDimensions;\n }\n\n /**\n * Format period range for display - shows only year when both dates are in same year\n * @param startDate - Period start date in YYYY-MM-DD format\n * @param endDate - Period end date in YYYY-MM-DD format\n * @returns Formatted period string (e.g., \"2025\" or \"2025-01-01 / 2026-12-31\")\n */\n private _formatPeriodDisplay(startDate?: string, endDate?: string): string {\n if (!startDate || !endDate) {\n return `${startDate || ''} / ${endDate || ''}`;\n }\n\n const startYear = startDate.substring(0, 4);\n const endYear = endDate.substring(0, 4);\n\n // If both dates are in the same year, show only the year\n if (startYear === endYear) {\n return startYear;\n }\n\n // Otherwise, show the full date range\n return `${startDate} / ${endDate}`;\n }\n\n private _resolveInstantDate(\n preferredLabel: string | undefined,\n instantDate: string | undefined,\n startDate: string | undefined,\n endDate: string | undefined\n ): string {\n if (preferredLabel?.includes('periodStartLabel')) {\n // One day before periodStartDate (e.g. 2024-01-01 → 2023-12-31)\n const base = startDate || '2025-01-01';\n try {\n const d = new Date(base);\n d.setDate(d.getDate() - 1);\n return d.toISOString().split('T')[0];\n } catch {\n return base;\n }\n }\n // Default: use explicit instantDate, then periodEndDate, then periodStartDate\n return instantDate || endDate || startDate || '2025-01-01';\n }\n\n private _addColumnFromRequest(request: AddColumnRequest, sectionId: string, insertAfterColumnId?: string | null) {\n const timestamp = Date.now();\n const newColumnId = `col-${timestamp}`;\n\n let title = '';\n let description = '';\n\n if (request.periodType === 'instant') {\n title = request.instantDate || '';\n description = '';\n } else if (request.periodType === 'duration' || request.periodType === 'mixed') {\n title = this._formatPeriodDisplay(request.startDate, request.endDate);\n description = '';\n }\n\n // Process selected dimensions from the dialog\n let dimensionData: any = {\n dimensionId: 'period',\n memberValue: request.periodType === 'instant' ?\n `instant-${request.instantDate}` :\n `duration-${request.startDate}-${request.endDate}`,\n memberLabel: title,\n };\n\n // If dimensions were selected in the dialog, use them\n if (request.selectedDimensions && request.selectedDimensions.length > 0) {\n const dimensionParts: string[] = [];\n const dimensionKeys: string[] = [];\n\n for (const dimSelection of request.selectedDimensions) {\n if (dimSelection.isTyped && dimSelection.typedValue) {\n // Typed dimension\n dimensionParts.push(`${dimSelection.axisLabel}: ${dimSelection.typedValue}`);\n dimensionKeys.push(`${dimSelection.axisId}|${dimSelection.typedValue}`);\n } else if (dimSelection.memberId && dimSelection.memberLabel) {\n // Domain dimension with selected member\n dimensionParts.push(dimSelection.memberLabel);\n dimensionKeys.push(`${dimSelection.axisId}|${dimSelection.memberId}`);\n }\n }\n\n // Build title and description to match default column format\n // Title: dimension labels only (e.g., \"Fiscal | Separate\")\n // Description: period display (e.g., \"2025\")\n if (dimensionParts.length > 0) {\n title = dimensionParts.join(' | ');\n description = request.periodType === 'instant' ?\n request.instantDate || '' :\n this._formatPeriodDisplay(request.startDate, request.endDate);\n\n dimensionData = {\n dimensionId: newColumnId,\n memberValue: dimensionParts.join(' | '),\n memberLabel: dimensionParts.join(' | '),\n memberKey: dimensionParts.join(' | '),\n dimensionIdKey: dimensionKeys.join('::'),\n selectedDimensions: request.selectedDimensions\n };\n\n console.log(`📊 Applied selected dimensions to new column: ${dimensionData.memberKey}`);\n }\n } else {\n // Fallback to existing hypercube logic for backwards compatibility\n if (this.xbrlInput?.hypercubes?.[0]) {\n const hypercubeRole = this.xbrlInput.hypercubes[0].roles.find(hr => hr.roleId === sectionId);\n\n if (hypercubeRole?.items?.length === 1) {\n const item = hypercubeRole.items[0];\n if (item.dimensions.length === 1) {\n const dimension = item.dimensions[0];\n if (dimension.members && dimension.members.length > 0) {\n // Find axis label\n const axisLabel = dimension.labels.find(l => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n\n // For manually added columns, we could offer choice or use first member\n // For now, using first member as specified in requirements\n const firstMember = dimension.members[0];\n const memberLabel = firstMember.labels.find(l => l.role === 'http://www.xbrl.org/2003/role/label')?.label || firstMember.conceptName;\n\n // Update title and description to match default column format\n // Title: dimension label only\n // Description: period display\n title = memberLabel;\n description = request.periodType === 'instant' ?\n request.instantDate || '' :\n this._formatPeriodDisplay(request.startDate, request.endDate);\n\n dimensionData = {\n dimensionId: newColumnId,\n axisId: dimension.id,\n memberId: firstMember.id,\n memberValue: memberLabel,\n memberLabel: memberLabel,\n axis: axisLabel,\n axisLabel: axisLabel,\n memberKey: `${axisLabel} | ${memberLabel}`,\n dimensionIdKey: `${dimension.id} | ${firstMember.id}`\n };\n\n console.log(`📊 Applied hypercube dimension to new column: ${dimensionData.memberKey}`);\n }\n }\n }\n }\n }\n\n const newColumn: FormColumn = {\n id: newColumnId,\n title,\n description,\n type: dimensionData.memberKey ? 'dimension' : 'dimension',\n order: this._columns.length,\n removable: true,\n dimensionData,\n // CRITICAL: Add period dates so they can be saved to draft and restored\n periodStartDate: request.periodType === 'instant' ? request.instantDate : request.startDate,\n periodEndDate: request.periodType === 'instant' ? request.instantDate : request.endDate\n };\n\n // Store typed member data for the new column if typed dimensions were selected\n if (request.selectedDimensions && request.selectedDimensions.length > 0) {\n const typedMembers: { [axisId: string]: string } = {};\n let hasTypedDimensions = false;\n\n for (const dimSelection of request.selectedDimensions) {\n if (dimSelection.isTyped) {\n // Initialize typed member data with provided value or empty string\n typedMembers[dimSelection.axisId] = dimSelection.typedValue || '';\n hasTypedDimensions = true;\n //console.log(`💾 Initializing typed member data: ${dimSelection.axisLabel} = \"${dimSelection.typedValue || '(empty - will be entered in column header)'}\"`);\n }\n }\n\n if (hasTypedDimensions) {\n this._typedMemberData[newColumnId] = typedMembers;\n // Update dimension data to indicate it has typed members and include the typed member info\n if (newColumn.dimensionData) {\n newColumn.dimensionData.hasTypedMembers = true;\n // Create typedMembers array for the form-section template\n newColumn.dimensionData.typedMembers = request.selectedDimensions\n .filter(dim => dim.isTyped)\n .map(dim => ({\n axisId: dim.axisId,\n axisLabel: dim.axisLabel,\n typedMemberId: dim.axisId, // Use axisId as typedMemberId for typed dimensions\n memberLabel: dim.axisLabel // Use axisLabel as memberLabel\n }));\n //console.log(`� Added typed members to column dimension data:`, newColumn.dimensionData.typedMembers);\n }\n // console.log(`� Initialized typed member data for column ${newColumnId}:`, typedMembers);\n }\n }\n\n // Add column ONLY to the specific section that requested it\n if (this._currentSchema) {\n const targetSection = this._currentSchema.sections.find(section => section.id === sectionId);\n if (targetSection) {\n if (!targetSection.columns) {\n targetSection.columns = [...this._columns];\n }\n\n // Insert column at the specified position or at the end\n if (insertAfterColumnId) {\n const insertIndex = targetSection.columns.findIndex(col => col.id === insertAfterColumnId);\n if (insertIndex !== -1) {\n // Insert after the specified column\n targetSection.columns = [\n ...targetSection.columns.slice(0, insertIndex + 1),\n newColumn,\n ...targetSection.columns.slice(insertIndex + 1)\n ];\n } else {\n // Column not found, add at the end\n targetSection.columns = [...targetSection.columns, newColumn];\n }\n } else {\n // No position specified, add at the end\n targetSection.columns = [...targetSection.columns, newColumn];\n }\n }\n }\n\n // Replicate form fields for existing concepts in ONLY the target section\n this._replicateFieldsForNewColumn(newColumnId, request, sectionId);\n\n this._dirty = true;\n this.requestUpdate();\n\n this.dispatchEvent(new CustomEvent('column-add', {\n detail: { column: newColumn },\n bubbles: true\n }));\n }\n\n private _removeColumnData(columnId: string, sectionId?: string) {\n if (!this._currentSchema) return;\n\n if (sectionId) {\n // Remove data only for concepts in the specific section\n const targetSection = this._currentSchema.sections.find(section => section.id === sectionId);\n if (targetSection) {\n this._removeColumnDataFromConcepts(targetSection.concepts, columnId);\n }\n } else {\n // Remove data for all concepts in all sections\n for (const conceptId in this._formData) {\n if (this._formData[conceptId][columnId] !== undefined) {\n delete this._formData[conceptId][columnId];\n }\n }\n }\n }\n\n private _removeColumnDataFromConcepts(concepts: ConceptTree[], columnId: string) {\n concepts.forEach(concept => {\n // Remove form data for this concept and column\n if (this._formData[concept.id] && this._formData[concept.id][columnId] !== undefined) {\n delete this._formData[concept.id][columnId];\n }\n\n // Remove field from concept's fields array\n if (concept.fields) {\n concept.fields = concept.fields.filter(field => field.columnId !== columnId);\n }\n\n // Recursively process children\n if (concept.children) {\n this._removeColumnDataFromConcepts(concept.children, columnId);\n }\n });\n }\n\n private _shouldCreateFieldForConcept(concept: ConceptTree, request: AddColumnRequest): boolean {\n // Don't create fields for abstract concepts\n if (concept.abstract) {\n return false;\n }\n\n // CRITICAL FIX: For dimension columns (when selectedDimensions are provided),\n // we should NOT filter by period type. Each field will have its own period control (📅 button).\n // This allows mixed sections to show both instant and duration concepts in the same column.\n const isDimensionColumn = request.selectedDimensions && request.selectedDimensions.length > 0;\n\n // Check period type compatibility ONLY for non-dimension columns\n if (!isDimensionColumn && concept.periodType) {\n if (request.periodType === 'instant' && concept.periodType !== 'instant') {\n return false;\n }\n if (request.periodType === 'duration' && concept.periodType !== 'duration') {\n return false;\n }\n }\n\n return true;\n }\n\n private _replicateFieldsForNewColumn(columnId: string, request: AddColumnRequest, sectionId: string) {\n if (!this._currentSchema) return;\n\n // Build fields for the new column for ONLY the specific section\n const formBuilder = new XBRLFormBuilder();\n\n const targetSection = this._currentSchema.sections.find(section => section.id === sectionId);\n if (targetSection) {\n this._replicateFieldsForSection(targetSection.concepts, columnId, request, formBuilder);\n }\n }\n\n private _replicateFieldsForSection(concepts: ConceptTree[], columnId: string, request: AddColumnRequest, formBuilder: XBRLFormBuilder) {\n concepts.forEach(concept => {\n // Check if we should create a field for this concept in the new column\n if (this._shouldCreateFieldForConcept(concept, request)) {\n // Create a new field manually based on existing field structure or from scratch\n const existingField = concept.fields?.[0]; // Use first existing field as template\n\n let field: FormField;\n const colStartDate = request.periodType === 'instant' ? request.instantDate : request.startDate;\n const colEndDate = request.periodType === 'instant' ? request.instantDate : request.endDate;\n const instantDate = this._resolveInstantDate(concept.preferredLabel, request.instantDate, colStartDate, colEndDate);\n\n if (existingField) {\n // Template from existing field\n field = {\n id: `${concept.id}_${columnId}`,\n conceptId: concept.id,\n columnId: columnId,\n type: existingField.type,\n label: existingField.label,\n placeholder: existingField.placeholder,\n required: existingField.required,\n disabled: existingField.disabled,\n validation: existingField.validation,\n defaultValue: existingField.defaultValue,\n periodType: concept.periodType,\n conceptType: concept.type,\n periodStartDate: colStartDate,\n periodEndDate: colEndDate,\n periodInstantDate: concept.periodType === 'instant' ? instantDate : undefined\n };\n } else {\n // Create field from scratch for concepts without existing fields\n field = {\n id: `${concept.id}_${columnId}`,\n conceptId: concept.id,\n columnId: columnId,\n type: 'text' as FieldType,\n label: concept.label || concept.name,\n placeholder: `Enter ${concept.name}`,\n required: false,\n disabled: false,\n validation: [],\n defaultValue: '',\n periodType: concept.periodType,\n conceptType: concept.type,\n periodStartDate: colStartDate,\n periodEndDate: colEndDate,\n periodInstantDate: concept.periodType === 'instant' ? instantDate : undefined\n };\n }\n\n // Add field to concept's fields array\n if (!concept.fields) {\n concept.fields = [];\n }\n concept.fields.push(field);\n }\n\n // Recursively process children\n if (concept.children) {\n this._replicateFieldsForSection(concept.children, columnId, request, formBuilder);\n }\n });\n }\n\n private _addColumn() {\n // This would typically open a dialog to configure the new dimension column\n // For now, we'll add a generic dimension column\n const newColumnId = `dim-${Date.now()}`;\n const newColumn: FormColumn = {\n id: newColumnId,\n title: `Dimension ${this._columns.length}`,\n description: 'Additional dimension column',\n type: 'dimension',\n order: this._columns.length,\n removable: true,\n dimensionData: {\n dimensionId: 'custom',\n memberValue: 'default',\n memberLabel: 'Default Member',\n }\n };\n\n this._columns = [...this._columns, newColumn];\n this.requestUpdate();\n\n this.dispatchEvent(new CustomEvent('column-add', {\n detail: { column: newColumn },\n bubbles: true\n }));\n }\n\n private _handleSubmit() {\n console.log('📝 Form submission started...');\n this._submitted = true;\n\n // Disable submit button immediately to prevent double-clicks\n this._submitDisabled = true;\n\n // Admin mode: Save draft first, then update and print presentation data\n if (this.mode === 'admin') {\n this._handleSaveDraft();\n this._handleAdminModeSubmit();\n this._submitDisabled = false;\n return;\n }\n\n // Input form mode: Check for XBRL validation errors before submission\n console.log(`🔵 [Submit] Checking for errors...`);\n console.log(`🔵 [Submit] _xbrlFormErrors.length: ${this._xbrlFormErrors.length}`);\n console.log(`🔵 [Submit] _xbrlFormErrors:`, this._xbrlFormErrors);\n\n if (this._xbrlFormErrors.length > 0) {\n console.log('❌ [Submit] Cannot submit - validation errors present:', this._xbrlFormErrors);\n this._showErrorPopup = true;\n this._submitDisabled = false; // Re-enable — user must fix errors and retry\n this.requestUpdate();\n return;\n }\n\n console.log(`✅ [Submit] No validation errors, proceeding with submission...`);\n\n // Input form mode: Regular validation and submission\n this._validateForm();\n\n // Block submission when form-level validation found errors\n if (!this._valid) {\n console.log('❌ [Submit] Cannot submit - form validation errors present:', this._errors);\n this._showErrorPopup = true;\n this._submitDisabled = false; // Re-enable — user must fix errors and retry\n this.requestUpdate();\n return;\n }\n\n // Generate submission data in the required format\n const submissionData = this._generateSubmissionData();\n\n // Log final submission data for debugging\n console.log('📊 Form Submission Data:', JSON.stringify(submissionData, null, 2));\n console.log('📊 Submission Data Summary:');\n submissionData.forEach((entry, index) => {\n console.log(` [${index}] conceptId: ${entry.conceptId}, columnId: ${entry.columnId}, value: ${entry.value}, unit: ${entry.unit || 'none'}`);\n });\n\n this.dispatchEvent(new CustomEvent('form-submit', {\n detail: {\n data: this._formData,\n submissionData: submissionData,\n valid: this._valid,\n errors: this._errors,\n reportingLanguage: this.reportingLanguage\n },\n bubbles: true\n }));\n\n console.log('✅ Form submit event dispatched');\n\n // Re-enable submit button 1 second after the event fires\n setTimeout(() => {\n this._submitDisabled = false;\n }, 1000);\n }\n\n private _handleSaveDraft(source: 'manual' | 'auto' = 'manual') {\n\n console.log(`🔵 [Save Draft] Checking for errors...`);\n console.log(`🔵 [Save Draft] _xbrlFormErrors.length: ${this._xbrlFormErrors.length}`);\n console.log(`🔵 [Save Draft] _xbrlFormErrors:`, this._xbrlFormErrors);\n\n // Check for validation errors before saving\n if (this._xbrlFormErrors.length > 0) {\n console.log('❌ [Save Draft] Cannot save - validation errors present:', this._xbrlFormErrors);\n this._showErrorPopup = true;\n this.requestUpdate();\n return; // Stop execution\n }\n\n console.log(`✅ [Save Draft] No validation errors, proceeding with save...`);\n console.log('💾 Raw form data before submission generation:', this._formData);\n console.log('🏷️ Unit data before submission generation:', this._unitData);\n console.log('📋 Enhanced selectedRoleIds with roleURI and order:', this._selectedRoleIds);\n\n // Generate draft data in the same format as submission\n const draftData = this._generateSubmissionData();\n\n console.log('📤 Generated submission data:', draftData);\n console.log('📊 Submission data breakdown:');\n draftData.forEach((entry, index) => {\n console.log(` [${index}] conceptId: ${entry.conceptId}, columnId: ${entry.columnId}, value: ${entry.value}, unit: ${entry.unit || 'none'}`);\n });\n\n // Create metadata snapshot with enhanced selectedRoleIds structure (includes roleURI and order)\n const roleCompletedStates = this._roleCompletedStates.size > 0\n ? Object.fromEntries(this._roleCompletedStates)\n : undefined;\n\n const metadata = this._draftStorageService.createMetadataSnapshot(\n this.periodStartDate,\n this.periodEndDate,\n this.language,\n this._selectedRoleIds, // Enhanced structure: Array<{ roleId, roleURI, order }> or string[]\n this._allSections,\n this._typedMemberData,\n this._periodPreferences,\n this._periodData,\n this._unitData,\n this.reportingLanguage,\n this._repeatCounts,\n this._decimalsData,\n roleCompletedStates\n );\n\n // Emit/save only when actual draft payload changed.\n const draftPayloadSnapshot = JSON.stringify({\n draftData,\n metadata\n });\n\n if (draftPayloadSnapshot === this._lastSavedDraftSnapshot) {\n console.log(`ℹ️ [Save Draft] No draft content change detected (${source}); skipping event emit.`);\n return;\n }\n\n this._lastSavedDraftSnapshot = draftPayloadSnapshot;\n\n // Save to localStorage (optional - for browser persistence)\n const saved = this._draftStorageService.saveDraft(draftData, metadata);\n\n console.log('💾 [Save Draft] Metadata saved with enhanced selectedRoleIds:', metadata.selectedRoleIds);\n\n // Update the @Input properties with current draft data\n // Consumer application can bind to these properties to persist to database\n this.dynaformsFacts = draftData;\n this.dynaformsMetadata = metadata;\n\n // Emit event with JSON data for consumer application to catch and persist\n this.dispatchEvent(new CustomEvent('form-save-draft', {\n detail: {\n data: this._formData,\n draftData: draftData,\n metadata: metadata,\n saved: saved,\n valid: this._valid,\n errors: this._errors,\n // JSON data ready for external database storage\n dynaformsFacts: draftData,\n dynaformsMetadata: metadata,\n reportingLanguage: this.reportingLanguage,\n source: source == 'auto' ? 'auto' : 'manual'\n },\n bubbles: true,\n composed: true\n }));\n\n const roleCount = this._getRoleIdsArray().length;\n console.log('💾 Draft saved - localStorage + event emitted', {\n entries: draftData.length,\n saved: saved,\n roles: roleCount,\n customColumns: metadata.customColumns.length,\n eventEmitted: true,\n enhancedRoleStructure: Array.isArray(this._selectedRoleIds) && this._selectedRoleIds.length > 0 && typeof this._selectedRoleIds[0] === 'object'\n });\n }\n\n // ===========================================\n // Draft Loading & Restoration\n // ===========================================\n\n private async _loadDraftIfExists() {\n console.log('📋 Checking for saved draft...');\n\n // Priority 1: Check if external draft data was provided via properties\n if (this.dynaformsFacts && this.dynaformsMetadata) {\n console.log('📦 Using external draft data from properties');\n const draft = {\n formData: this.dynaformsFacts,\n metadata: this.dynaformsMetadata\n };\n\n await this._restoreFromDraft(draft);\n\n // Set draft loaded state\n this._draftLoaded = true;\n this._draftLoadedAt = this.dynaformsMetadata.savedAt || new Date().toISOString();\n\n // Dispatch event\n this.dispatchEvent(new CustomEvent('form-draft-loaded', {\n detail: {\n draft: draft,\n source: 'external',\n compatible: true,\n warnings: []\n },\n bubbles: true,\n composed: true\n }));\n\n console.log('📥 External draft loaded successfully');\n return;\n }\n\n // Priority 2: Check localStorage\n if (!this._draftStorageService.hasDraft()) {\n console.log('ℹ️ No saved draft found');\n return;\n }\n\n const draft = this._draftStorageService.loadDraft();\n if (!draft) {\n console.warn('⚠️ Failed to load draft');\n return;\n }\n\n // Validate draft compatibility\n const { compatible, warnings } = this._draftStorageService.validateDraftCompatibility(\n draft,\n this.periodStartDate,\n this.periodEndDate\n );\n\n if (warnings.length > 0) {\n console.warn('⚠️ Draft compatibility warnings:', warnings);\n }\n\n // Restore the form state\n await this._restoreFromDraft(draft);\n\n // Dispatch event to notify parent application\n this.dispatchEvent(new CustomEvent('form-draft-loaded', {\n detail: {\n draft: draft,\n compatible: compatible,\n warnings: warnings\n },\n bubbles: true,\n composed: true\n }));\n\n console.log('📥 Draft loaded successfully', {\n entries: draft.formData.length,\n savedAt: draft.metadata.savedAt,\n age: this._draftStorageService.getDraftAge()\n });\n }\n\n private async _restoreFromDraft(draft: any) {\n const { formData, metadata } = draft;\n\n // 1. Restore metadata state\n if (metadata.selectedRoleIds && metadata.selectedRoleIds.length > 0) {\n this._selectedRoleIds = metadata.selectedRoleIds;\n console.log(`🔄 Restored ${this._selectedRoleIds.length} selected roles`);\n }\n\n if (metadata.typedMemberData) {\n this._typedMemberData = metadata.typedMemberData;\n this._preservedTypedMemberData = {}; // Clear preserved typed data when restoring\n console.log('🔄 Restored typed member data');\n }\n\n if (metadata.repeatCounts) {\n this._repeatCounts = metadata.repeatCounts;\n console.log('🔄 Restored repeat counts:', this._repeatCounts);\n }\n\n if (metadata.periodData) {\n this._periodData = metadata.periodData;\n console.log('🔄 Restored custom field-level period data:', Object.keys(this._periodData).length, 'concepts');\n }\n\n if (metadata.unitData) {\n this._unitData = metadata.unitData;\n console.log('🔄 Restored custom field-level unit data:', Object.keys(this._unitData).length, 'concepts');\n }\n\n if (metadata.decimalsData) {\n this._decimalsData = metadata.decimalsData;\n console.log('🔄 Restored per-fact decimals data:', Object.keys(this._decimalsData).length, 'concepts');\n }\n\n if (metadata.roleCompletedStates) {\n this._roleCompletedStates = new Map(Object.entries(metadata.roleCompletedStates));\n console.log('🔄 Restored role completed states:', Object.keys(metadata.roleCompletedStates).length, 'roles');\n }\n\n if (metadata.periodPreferences) {\n // CRITICAL: Skip restoration if we're intentionally changing period preferences\n if (this._skipPeriodPreferencesRestore) {\n console.log('⏭️ Skipping period preferences restoration - using new filter selections');\n } else {\n this._periodPreferences = metadata.periodPreferences;\n console.log('🔄 Restored period preferences (including previous year settings):', this._periodPreferences);\n\n // CRITICAL: Rebuild schema with restored period preferences\n // This ensures default columns (like previous year) are generated correctly\n if (this.xbrlInput) {\n console.log('🔄 Rebuilding schema with restored period preferences...');\n this._currentSchema = XBRLFormBuilder.buildFormSchema(\n this.xbrlInput,\n this.periodStartDate,\n this.periodEndDate,\n this.language,\n this._periodPreferences\n );\n\n // Update all sections with the rebuilt schema — keep the full pool intact\n // (roleFilterAxes only narrows the initial selection, not the available pool)\n this._allSections = [...this._currentSchema.sections];\n\n console.log('✅ Schema rebuilt with restored period preferences');\n\n // CRITICAL: Apply custom period data to fields after schema rebuild\n // This must happen BEFORE custom columns are merged\n console.log('🔄 Applying custom period data to schema fields...');\n this._applyCustomPeriodDataToFields();\n\n // IMPORTANT: After rebuilding, merge any additional custom columns that were manually added\n // (but DON'T replace default columns like duration, instant, previous year)\n if (metadata.customColumns && metadata.customColumns.length > 0) {\n this._mergeAdditionalCustomColumns(metadata.customColumns);\n console.log(`🔄 Merged ${metadata.customColumns.length} additional custom columns`);\n }\n }\n }\n } else {\n // If no period preferences to restore, use the old logic of restoring columns directly\n // 2. Restore custom columns structure (only if schema wasn't rebuilt)\n if (metadata.customColumns && metadata.customColumns.length > 0) {\n this._restoreCustomColumns(metadata.customColumns);\n console.log(`🔄 Restored ${metadata.customColumns.length} custom columns`);\n }\n }\n\n // 2. Convert submission data back to FormData structure AND extract custom period data AND unit data\n const restoredFormData: any = {};\n const restoredPeriodData: { [conceptId: string]: { [columnId: string]: { startDate?: string; endDate?: string; instantDate?: string } } } = {};\n const restoredUnitData: { [conceptId: string]: { [columnId: string]: string } } = {};\n\n formData.forEach((entry: any) => {\n let { conceptId, draftInstanceId, value, columnId, period, unit } = entry;\n\n // Fallback: Infer columnId from period data if missing (for old draft format)\n if (!columnId && period) {\n columnId = this._inferColumnIdFromPeriod(period, conceptId);\n if (!columnId) {\n console.warn(`⚠️ Could not infer columnId for concept ${conceptId}, skipping...`);\n return;\n }\n }\n\n // For repeat instances, draftInstanceId is the synthetic key (e.g. \"conceptId__repeat_1\").\n // For base instances it equals conceptId. Fall back to conceptId for older draft formats.\n const instanceKey = draftInstanceId || conceptId;\n\n // Find the actual concept in sections to get the correct ID (might have suffix).\n // Only apply suffix-lookup for the base concept part (not the __repeat_ suffix).\n const baseConceptId = instanceKey.includes('__repeat_')\n ? instanceKey.split('__repeat_')[0]\n : instanceKey;\n const actualBaseId = this._findActualConceptId(baseConceptId);\n const conceptIdToUse = instanceKey.includes('__repeat_')\n ? `${actualBaseId || baseConceptId}__repeat_${instanceKey.split('__repeat_')[1]}`\n : (actualBaseId || instanceKey);\n\n if (!restoredFormData[conceptIdToUse]) {\n restoredFormData[conceptIdToUse] = {};\n }\n\n restoredFormData[conceptIdToUse][columnId] = value;\n console.log(`📦 Restored: ${conceptIdToUse}[${columnId}] = ${value}${instanceKey !== conceptId ? ` (repeat instance)` : ''}`);\n\n // CRITICAL: Extract custom period data from submission entries\n if (period) {\n if (!restoredPeriodData[conceptIdToUse]) {\n restoredPeriodData[conceptIdToUse] = {};\n }\n\n if (period.type === 'instant') {\n restoredPeriodData[conceptIdToUse][columnId] = {\n instantDate: period.date\n };\n console.log(`📅 [Restore Period] Extracted instant date for ${conceptIdToUse}/${columnId}: ${period.date}`);\n } else if (period.type === 'duration') {\n restoredPeriodData[conceptIdToUse][columnId] = {\n startDate: period.startDate,\n endDate: period.endDate\n };\n console.log(`📅 [Restore Period] Extracted duration dates for ${conceptIdToUse}/${columnId}: ${period.startDate} - ${period.endDate}`);\n }\n }\n\n // CRITICAL: Extract custom unit data from submission entries\n if (unit) {\n if (!restoredUnitData[conceptIdToUse]) {\n restoredUnitData[conceptIdToUse] = {};\n }\n restoredUnitData[conceptIdToUse][columnId] = unit;\n console.log(`🏷️ [Restore Unit] Extracted unit for ${conceptIdToUse}/${columnId}: ${unit}`);\n }\n });\n\n // 3. Apply restored data to form data\n this._formData = { ...this._formData, ...restoredFormData };\n console.log(`🔄 Restored ${Object.keys(restoredFormData).length} concepts with data`);\n\n // Recompute global decimals default from restored rounding-level value\n // when decimals was not explicitly provided.\n this._initializeGlobalDecimalsFromRoundingData();\n\n // 3a. CRITICAL: Merge restored period data from submission entries with metadata periodData\n // Priority: submission period data (most recent) > metadata periodData (backup)\n this._periodData = {\n ...this._periodData,\n ...(metadata.periodData || {}),\n ...restoredPeriodData\n };\n console.log(`📅 [Period Restore] Merged period data: ${Object.keys(this._periodData).length} concepts with custom periods`);\n console.log(`📅 [Period Restore] Full _periodData after merge:`, JSON.stringify(this._periodData, null, 2));\n\n // 3b. CRITICAL: Merge restored unit data from submission entries with metadata unitData\n // Priority: submission unit data (most recent) > metadata unitData (backup)\n this._unitData = {\n ...this._unitData,\n ...(metadata.unitData || {}),\n ...restoredUnitData\n };\n console.log(`🏷️ [Unit Restore] Merged unit data: ${Object.keys(this._unitData).length} concepts with custom units`);\n console.log(`🏷️ [Unit Restore] Full _unitData after merge:`, JSON.stringify(this._unitData, null, 2));\n\n // 4. Apply role filter to show selected sections\n if (this._selectedRoleIds.length > 0) {\n this._applyRoleFilter();\n }\n\n // 5. Mark form as dirty since it has restored data\n this._dirty = true;\n this._touched.clear(); // Clear touched state since this is a restoration\n\n // 6. Validate restored data\n this._validateForm();\n\n // 7. Force a complete re-render by reassigning the sections array\n this._allSections = [...this._allSections];\n this.requestUpdate();\n\n // 8. Wait for the update to complete and all child components to render\n await this.updateComplete;\n\n // 9. Wait a bit more for nested components\n await new Promise(resolve => setTimeout(resolve, 100));\n\n // 10. Now populate the field values\n const fieldCount = this.shadowRoot?.querySelectorAll('input, textarea, select').length || 0;\n console.log(`🔍 Found ${fieldCount} fields in DOM after update`);\n\n if (fieldCount > 0) {\n this._populateFieldValues(restoredFormData);\n } else {\n console.error('❌ No fields found in DOM even after updateComplete');\n }\n\n console.log('✅ Draft restoration completed');\n }\n\n private _findActualConceptId(conceptId: string): string | null {\n // Try to find the concept in all sections\n // The concept might be stored with original ID but field uses suffixed ID\n for (const section of this._allSections) {\n const found = this._findActualConceptIdInTree(section.concepts, conceptId);\n if (found) return found;\n }\n return null;\n }\n\n private _findActualConceptIdInTree(concepts: ConceptTree[], conceptId: string): string | null {\n for (const concept of concepts) {\n // Match by originalConceptId or id\n if (concept.originalConceptId === conceptId || concept.id === conceptId) {\n return concept.id; // Return the actual ID used in fields\n }\n if (concept.children) {\n const found = this._findActualConceptIdInTree(concept.children, conceptId);\n if (found) return found;\n }\n }\n return null;\n }\n\n private _inferColumnIdFromPeriod(period: any, conceptId: string): string | null {\n // Find the concept in all sections\n for (const section of this._allSections) {\n const concept = this._findConceptInSection(section.concepts, conceptId);\n if (concept && section.columns) {\n // Try to match period with available columns\n for (const column of section.columns) {\n const isInstant = period.type === 'instant';\n const isDuration = period.type === 'duration';\n\n if (isInstant && period.date) {\n // Match instant period with column date\n if (column.periodStartDate === period.date ||\n (column.periodStartDate === column.periodEndDate && column.periodStartDate === period.date)) {\n console.log(`✓ Inferred columnId: ${column.id} for concept ${conceptId}`);\n return column.id;\n }\n } else if (isDuration && period.startDate && period.endDate) {\n // Match duration period with column date range\n if (column.periodStartDate === period.startDate && column.periodEndDate === period.endDate) {\n console.log(`✓ Inferred columnId: ${column.id} for concept ${conceptId}`);\n return column.id;\n }\n }\n }\n\n // Fallback: Use default column based on period type\n if (period.type === 'instant') {\n const instantCol = section.columns.find(c => c.id === 'instant');\n if (instantCol) return instantCol.id;\n } else {\n const durationCol = section.columns.find(c => c.id === 'duration');\n if (durationCol) return durationCol.id;\n }\n }\n }\n return null;\n }\n\n private _findConceptInSection(concepts: ConceptTree[], conceptId: string): ConceptTree | null {\n for (const concept of concepts) {\n if (concept.id === conceptId || concept.originalConceptId === conceptId) {\n return concept;\n }\n if (concept.children) {\n const found = this._findConceptInSection(concept.children, conceptId);\n if (found) return found;\n }\n }\n return null;\n }\n\n private _populateFieldValues(formData: any) {\n let populatedCount = 0;\n let notFoundCount = 0;\n\n console.log('🔍 Starting field population...');\n console.log('📦 Form data to populate:', formData);\n\n // Iterate through all concepts and columns to populate field values\n Object.keys(formData).forEach(conceptId => {\n const conceptData = formData[conceptId];\n\n Object.keys(conceptData).forEach(columnId => {\n const value = conceptData[columnId];\n\n // The field ID format is: conceptId__columnId (double underscore)\n const fieldId = `${conceptId}__${columnId}`;\n\n console.log(`🔍 Looking for field: ${fieldId}`);\n\n // Find the input element by ID\n const fieldElement = this.shadowRoot?.querySelector(`#${CSS.escape(fieldId)}`);\n\n if (fieldElement) {\n if (fieldElement instanceof HTMLInputElement ||\n fieldElement instanceof HTMLTextAreaElement ||\n fieldElement instanceof HTMLSelectElement) {\n\n if (fieldElement.type === 'checkbox') {\n (fieldElement as HTMLInputElement).checked = Boolean(value);\n } else {\n fieldElement.value = value !== null && value !== undefined ? String(value) : '';\n }\n\n console.log(` ✅ Populated field ${fieldId} with value:`, value);\n populatedCount++;\n }\n } else {\n console.warn(` ❌ Field element NOT FOUND: ${fieldId}`);\n console.warn(` Available fields in DOM:`, Array.from(this.shadowRoot?.querySelectorAll('input, textarea, select') || []).map(el => el.id).filter(id => id.includes(conceptId.split('__')[0])));\n notFoundCount++;\n }\n });\n });\n\n console.log(`✅ Field population complete: ${populatedCount} populated, ${notFoundCount} not found`);\n }\n\n private _restoreCustomColumns(customColumns: any[]) {\n // Group columns by section ID\n const columnsBySection = new Map<string, any[]>();\n\n customColumns.forEach(col => {\n if (!columnsBySection.has(col.sectionId)) {\n columnsBySection.set(col.sectionId, []);\n }\n columnsBySection.get(col.sectionId)!.push(col);\n });\n\n // Apply columns to each section\n this._allSections.forEach(section => {\n const savedColumns = columnsBySection.get(section.id);\n if (savedColumns) {\n // Reconstruct FormColumn objects from saved metadata\n section.columns = savedColumns.map(col => {\n const column: FormColumn = {\n id: col.columnId,\n title: col.label,\n description: col.description, // Restore description (period display)\n type: col.dimensionData ? 'dimension' : 'base',\n periodStartDate: col.startDate || col.date,\n periodEndDate: col.endDate || col.date,\n dimensionData: col.dimensionData,\n order: 0,\n removable: col.columnId !== 'duration' && col.columnId !== 'instant',\n periodType: col.periodType // CRITICAL: Preserve explicit period type\n };\n console.log(`📅 [Draft Restore] Restoring column ${col.columnId}: title=${column.title}, description=${column.description}, startDate=${column.periodStartDate}, endDate=${column.periodEndDate}, periodType=${column.periodType}`);\n return column;\n });\n\n // CRITICAL: Ensure datatypes are available for field generation\n if (this.xbrlInput?.datatypes && !section.datatypes) {\n // Handle both array and wrapped formats\n const datatypesArray = Array.isArray(this.xbrlInput.datatypes)\n ? this.xbrlInput.datatypes\n : this.xbrlInput.datatypes.concepts || [];\n section.datatypes = datatypesArray;\n console.log(`✅ [Draft Restore] Attached ${datatypesArray.length} datatypes to section ${section.id}`);\n } else if (section.datatypes) {\n console.log(`ℹ️ [Draft Restore] Section ${section.id} already has ${section.datatypes.length} datatypes`);\n } else {\n console.warn(`⚠️ [Draft Restore] No datatypes available for section ${section.id}`);\n }\n\n // Regenerate fields for concepts to include the restored columns\n this._regenerateFieldsForSection(section);\n\n console.log(` └─ Restored ${savedColumns.length} columns for section ${section.id}`);\n }\n });\n\n // Update current schema with restored sections\n if (this._currentSchema) {\n this._currentSchema = {\n ...this._currentSchema,\n sections: this._allSections\n };\n }\n }\n\n /**\n * Merge additional custom columns that were manually added by user\n * This preserves default columns (duration, instant, previous year) generated by schema builder\n * and only adds custom columns that don't already exist\n */\n private _mergeAdditionalCustomColumns(customColumns: any[]) {\n // Group columns by section ID\n const columnsBySection = new Map<string, any[]>();\n\n customColumns.forEach(col => {\n // Only merge columns that were manually added (e.g., col-123456)\n // Skip default columns like 'duration', 'instant', 'duration_prev', 'instant_prev', 'duration_0', etc.\n const isManuallyAdded = col.columnId.startsWith('col-');\n if (isManuallyAdded) {\n if (!columnsBySection.has(col.sectionId)) {\n columnsBySection.set(col.sectionId, []);\n }\n columnsBySection.get(col.sectionId)!.push(col);\n }\n });\n\n // Add custom columns to each section without replacing existing columns\n this._allSections.forEach(section => {\n const customColumnsForSection = columnsBySection.get(section.id);\n if (customColumnsForSection && customColumnsForSection.length > 0) {\n if (!section.columns) {\n section.columns = [];\n }\n\n // CRITICAL: Ensure datatypes are available for field generation\n if (this.xbrlInput?.datatypes && !section.datatypes) {\n // Handle both array and wrapped formats\n const datatypesArray = Array.isArray(this.xbrlInput.datatypes)\n ? this.xbrlInput.datatypes\n : this.xbrlInput.datatypes.concepts || [];\n section.datatypes = datatypesArray;\n console.log(`✅ [Merge Custom] Attached ${datatypesArray.length} datatypes to section ${section.id}`);\n } else if (section.datatypes) {\n console.log(`ℹ️ [Merge Custom] Section ${section.id} already has ${section.datatypes.length} datatypes`);\n } else {\n console.warn(`⚠️ [Merge Custom] No datatypes available for section ${section.id}`);\n }\n\n // Add each custom column if it doesn't already exist\n customColumnsForSection.forEach(col => {\n console.log(`📅 [Merge Custom Column] Column ${col.columnId}: col.startDate=${col.startDate}, col.endDate=${col.endDate}, col.date=${col.date}, col.periodType=${col.periodType}`);\n const existingColumn = section.columns!.find(c => c.id === col.columnId);\n if (!existingColumn) {\n const newColumn: FormColumn = {\n id: col.columnId,\n title: col.label,\n description: col.description, // Restore description (period display)\n type: col.dimensionData ? 'dimension' : 'base',\n periodStartDate: col.startDate || col.date,\n periodEndDate: col.endDate || col.date,\n dimensionData: col.dimensionData,\n order: section.columns!.length,\n removable: true,\n periodType: col.periodType // CRITICAL: Preserve explicit period type\n };\n console.log(`📅 [New Column Created] Column ${newColumn.id}: title=${newColumn.title}, description=${newColumn.description}, periodStartDate=${newColumn.periodStartDate}, periodEndDate=${newColumn.periodEndDate}, periodType=${newColumn.periodType}`);\n section.columns!.push(newColumn);\n console.log(` └─ Added custom column ${col.columnId} to section ${section.id}`);\n }\n });\n\n // Regenerate fields for concepts to include the merged columns\n this._regenerateFieldsForSection(section);\n }\n });\n\n // Update current schema with merged sections\n if (this._currentSchema) {\n this._currentSchema = {\n ...this._currentSchema,\n sections: this._allSections\n };\n }\n }\n\n /**\n * Apply custom period data from _periodData to all existing fields\n * This is called after schema rebuild to preserve user-modified period dates\n */\n private _applyCustomPeriodDataToFields() {\n if (!this._periodData || Object.keys(this._periodData).length === 0) {\n console.log('ℹ️ No custom period data to apply');\n return;\n }\n\n let appliedCount = 0;\n\n // Recursive function to traverse concept trees\n const applyToConceptTree = (concepts: ConceptTree[]) => {\n concepts.forEach(concept => {\n // Check if this concept has custom period data\n if (this._periodData[concept.id]) {\n const conceptPeriodData = this._periodData[concept.id];\n\n // Apply to each field in this concept\n if (concept.fields) {\n concept.fields.forEach(field => {\n const customPeriod = conceptPeriodData[field.columnId];\n if (customPeriod) {\n // Apply custom period dates\n if (customPeriod.startDate) {\n field.periodStartDate = customPeriod.startDate;\n }\n if (customPeriod.endDate) {\n field.periodEndDate = customPeriod.endDate;\n }\n if (customPeriod.instantDate) {\n field.periodInstantDate = customPeriod.instantDate;\n }\n appliedCount++;\n console.log(`✅ [Apply Period] Updated field ${concept.id}/${field.columnId}: start=${field.periodStartDate}, end=${field.periodEndDate}, instant=${field.periodInstantDate}`);\n }\n });\n }\n }\n\n // Recursively apply to children\n if (concept.children && concept.children.length > 0) {\n applyToConceptTree(concept.children);\n }\n });\n };\n\n // Apply to all sections\n this._allSections.forEach(section => {\n if (section.concepts && section.concepts.length > 0) {\n applyToConceptTree(section.concepts);\n }\n });\n\n console.log(`📅 [Apply Period] Applied custom period data to ${appliedCount} fields`);\n }\n\n private _regenerateFieldsForSection(section: FormSection) {\n if (!section.columns) return;\n\n // Get period preferences for this section to respect concept filtering\n const sectionPreferences = this._periodPreferences[section.id] || {\n showDuration: true,\n showInstant: true,\n showPreviousYear: false\n };\n\n // Recursively regenerate fields for all concepts\n const regenerateConcepts = (concepts: ConceptTree[]) => {\n concepts.forEach(concept => {\n // Clear existing fields\n concept.fields = [];\n\n // Check if concept should be visible based on period preferences\n const shouldShowConcept = this._shouldShowConceptBasedOnPeriodPreferences(\n concept,\n sectionPreferences\n );\n\n // Only create fields if concept should be visible\n if (shouldShowConcept) {\n // Create fields for each column\n section.columns!.forEach(column => {\n // Only create field if period type matches or is compatible\n const conceptPeriodType = concept.periodType;\n const columnPeriodType = this._inferColumnPeriodType(column);\n\n // Skip abstract concepts without values\n if (concept.abstract) return;\n\n // CRITICAL FIX: For merged columns (where both duration and instant concepts appear),\n // we should NOT filter by period type since each field has its own period controls.\n // Only filter if we have explicit period-specific columns (like 'instant' or duration with typed dimensions)\n // Skip period checking for:\n // - Custom columns (col-*) in mixed sections\n // - Dimension columns (duration_*, instant_*) which are always merged\n // - Default columns ('duration', 'default')\n const isCustomColumn = column.id.startsWith('col-');\n const isDimensionColumn =\n column.id.startsWith('duration_') ||\n column.id.startsWith('instant_') ||\n column.id.startsWith('typed-');\n const isMixedSection = section.showPeriodControl === true;\n const shouldSkipPeriodCheck = !columnPeriodType ||\n column.id === 'duration' ||\n column.id === 'default' ||\n (isCustomColumn && isMixedSection) ||\n isDimensionColumn;\n\n // Check period type compatibility (skip for merged columns)\n if (!shouldSkipPeriodCheck && conceptPeriodType && columnPeriodType) {\n // For instant concepts, only show in instant columns\n // For duration concepts, only show in duration columns\n if (conceptPeriodType !== columnPeriodType) {\n console.log(`⏭️ [Field Regeneration] Skipping field for ${concept.id} in column ${column.id}: conceptPeriodType=${conceptPeriodType}, columnPeriodType=${columnPeriodType}`);\n return;\n }\n }\n\n // Create the field\n const newField = {\n id: `${concept.id}_${column.id}`,\n conceptId: concept.id,\n columnId: column.id,\n type: this._mapConceptTypeToFieldType(concept.type),\n label: concept.label,\n periodType: conceptPeriodType, // Add periodType from concept\n conceptType: concept.type, // CRITICAL: Include conceptType for XBRL validation\n periodStartDate: column.periodStartDate,\n periodEndDate: column.periodEndDate,\n periodInstantDate: conceptPeriodType === 'instant' ? (column.periodEndDate || column.periodStartDate) : undefined\n };\n\n // Apply custom period data if exists (user-modified period dates)\n if (this._periodData[concept.id]?.[column.id]) {\n const customPeriod = this._periodData[concept.id][column.id];\n if (customPeriod.startDate) newField.periodStartDate = customPeriod.startDate;\n if (customPeriod.endDate) newField.periodEndDate = customPeriod.endDate;\n if (customPeriod.instantDate) newField.periodInstantDate = customPeriod.instantDate;\n console.log(`✅ [Field Regeneration] Applied custom period data to ${concept.id}/${column.id}:`, customPeriod);\n console.log(`✅ [Field Regeneration] Field properties after apply: periodStartDate=${newField.periodStartDate}, periodEndDate=${newField.periodEndDate}, periodInstantDate=${newField.periodInstantDate}`);\n } else {\n console.log(`ℹ️ [Field Regeneration] No custom period data for ${concept.id}/${column.id}. Checking _periodData:`, this._periodData[concept.id]);\n }\n\n if (concept.id.includes('DescriptionLocationNL') || column.id.startsWith('col-')) {\n console.log(`📅 [Field Regeneration] Concept ${concept.id}, Column ${column.id}: field.periodStartDate=${newField.periodStartDate}, field.periodEndDate=${newField.periodEndDate}, column.periodStartDate=${column.periodStartDate}`);\n }\n concept.fields.push(newField);\n });\n }\n\n // Recursively process children\n if (concept.children) {\n regenerateConcepts(concept.children);\n }\n });\n };\n\n regenerateConcepts(section.concepts);\n }\n\n /**\n * Check if a concept should be shown based on period preferences\n */\n private _shouldShowConceptBasedOnPeriodPreferences(\n concept: ConceptTree,\n preferences: { showDuration: boolean; showInstant: boolean; showPreviousYear: boolean }\n ): boolean {\n // Always show abstract concepts (they're just headers)\n if (concept.abstract) {\n return true;\n }\n\n // If concept has no period type, show it\n if (!concept.periodType) {\n return true;\n }\n\n // Check if the concept's period type matches the preferences\n if (concept.periodType === 'duration' && !preferences.showDuration) {\n return false;\n }\n\n if (concept.periodType === 'instant' && !preferences.showInstant) {\n return false;\n }\n\n return true;\n }\n\n private _inferColumnPeriodType(column: FormColumn): 'instant' | 'duration' | undefined {\n // CRITICAL: Check explicit periodType first (from user selection or saved metadata)\n if (column.periodType) {\n return column.periodType;\n }\n\n // Fallback: infer from dates\n // If both dates are same, it's instant\n if (column.periodStartDate && column.periodEndDate) {\n return column.periodStartDate === column.periodEndDate ? 'instant' : 'duration';\n }\n // If only start date, assume instant\n if (column.periodStartDate && !column.periodEndDate) {\n return 'instant';\n }\n return undefined;\n }\n\n private _mapConceptTypeToFieldType(conceptType?: string): FieldType {\n if (!conceptType) return 'text';\n\n if (conceptType.includes('monetary') || conceptType.includes('Monetary')) {\n return 'number';\n }\n if (conceptType.includes('date') || conceptType.includes('Date')) {\n return 'date';\n }\n if (conceptType.includes('boolean') || conceptType.includes('Boolean')) {\n return 'boolean';\n }\n if (conceptType.includes('integer') || conceptType.includes('Integer')) {\n return 'number';\n }\n if (conceptType.includes('decimal') || conceptType.includes('Decimal')) {\n return 'number';\n }\n\n return 'text';\n }\n\n private _generateSubmissionData(): SubmissionData {\n const submissionData: SubmissionData = [];\n\n if (!this._currentSchema) {\n return submissionData;\n }\n\n // Include data from currently visible sections\n this._currentSchema.sections.forEach(section => {\n this._processConceptsForSubmission(section.concepts, submissionData, section);\n });\n\n // IMPORTANT: Also include data from preserved (hidden) sections\n this._includePreservedDataInSubmission(submissionData);\n\n // Remove duplicates from submission data\n const uniqueSubmissionData = this._removeDuplicateSubmissions(submissionData);\n\n return uniqueSubmissionData;\n }\n\n private _includePreservedDataInSubmission(submissionData: SubmissionData) {\n // Process preserved form data\n Object.keys(this._preservedFormData).forEach(conceptId => {\n const conceptData = this._preservedFormData[conceptId];\n if (conceptData) {\n Object.keys(conceptData).forEach(columnId => {\n const value = conceptData[columnId];\n if (value !== undefined && value !== null && value !== '') {\n // Find the original concept from all sections to get proper submission data\n const originalConcept = this._findConceptInAllSections(conceptId);\n if (originalConcept) {\n const originalSection = this._findSectionForConcept(conceptId);\n this._addConceptDataToSubmission(originalConcept, columnId, value, submissionData, originalSection || undefined);\n }\n }\n });\n }\n });\n\n console.log(`📤 Included preserved data in submission. Total entries: ${submissionData.length}`);\n }\n\n private _findConceptInAllSections(conceptId: string): ConceptTree | null {\n for (const section of this._allSections) {\n const concept = this._findConceptInSection(section.concepts, conceptId);\n if (concept) {\n return concept;\n }\n }\n return null;\n }\n\n private _findSectionForConcept(conceptId: string): FormSection | null {\n for (const section of this._allSections) {\n const concept = this._findConceptInSection(section.concepts, conceptId);\n if (concept) {\n return section;\n }\n }\n return null;\n }\n\n private _addConceptDataToSubmission(concept: ConceptTree, columnId: string, value: any, submissionData: SubmissionData, section?: FormSection) {\n // Find the matching field for this column\n const field = concept.fields.find(f => f.columnId === columnId);\n if (!field) return;\n\n // Determine period type for submission\n const isInstant = concept.periodType === 'instant';\n\n // Check if field has custom period data (user-modified)\n const fieldPeriodData = this._periodData[concept.id]?.[columnId];\n\n // Get stored unit for this field\n const fieldUnit = this._unitData[concept.id]?.[columnId];\n\n // Get column to check for period dates (for previous year columns as fallback)\n const column = this._findColumnByIdInAllSections(columnId);\n\n console.log(`🔍 [Submission] Concept: ${concept.id}, Column: ${columnId}, Field Period: ${fieldPeriodData ? JSON.stringify(fieldPeriodData) : 'none'}, Unit: ${fieldUnit || 'none'}, Column Period: ${column?.periodStartDate || 'none'} - ${column?.periodEndDate || 'none'}`);\n\n // Priority: field-specific period > column period > form defaults\n const periodStartDate = fieldPeriodData?.startDate || column?.periodStartDate || field.periodStartDate || this.periodStartDate;\n const periodEndDate = fieldPeriodData?.endDate || column?.periodEndDate || field.periodEndDate || this.periodEndDate;\n const periodInstantDate = fieldPeriodData?.instantDate || field.periodInstantDate || periodEndDate || periodStartDate;\n\n const entry: SubmissionEntry = {\n conceptId: concept.originalConceptId || concept.id,\n columnId: columnId,\n value: value,\n period: {\n type: concept.periodType || 'duration',\n ...(isInstant\n ? { date: periodInstantDate }\n : {\n startDate: periodStartDate,\n endDate: periodEndDate\n })\n }\n };\n\n // Add unit if available\n if (fieldUnit) {\n entry.unit = fieldUnit;\n console.log(`✅ [Submission] Adding unit to entry: ${fieldUnit} for ${concept.id}/${columnId}`);\n }\n\n // Add decimals for monetary concepts (per-fact value takes precedence over global)\n const isMonetary = concept.type?.toLowerCase().includes('monetary');\n const fieldDecimals = this._decimalsData[concept.id]?.[columnId];\n const decimalsValue = fieldDecimals || (this.decimals !== 'INF' ? this.decimals : undefined);\n if (isMonetary && decimalsValue) {\n const parsed = parseFloat(decimalsValue);\n entry.decimals = isNaN(parsed) ? decimalsValue : String(-Math.abs(parsed));\n }\n\n // Add dimension information if available\n if (column?.dimensionData?.memberLabel) {\n entry.dimension = column.dimensionData.memberLabel;\n }\n\n console.log(`📤 [Submission Entry] Created entry:`, JSON.stringify(entry, null, 2));\n submissionData.push(entry);\n }\n\n private _findColumnByIdInAllSections(columnId: string): FormColumn | undefined {\n for (const section of this._allSections) {\n if (section.columns) {\n const column = section.columns.find(col => col.id === columnId);\n if (column) {\n return column;\n }\n }\n }\n return undefined;\n }\n\n private _removeDuplicateSubmissions(submissionData: SubmissionData): SubmissionData {\n const uniqueEntries = new Map<string, any>();\n\n submissionData.forEach(entry => {\n // Create a unique key based on concept ID, value, dimension, AND period\n const periodKey = entry.period.type === 'instant'\n ? entry.period.date\n : `${entry.period.startDate}_${entry.period.endDate}`;\n const key = `${entry.conceptId}_${entry.value}_${entry.dimension || 'no-dimension'}_${periodKey}`;\n\n // Only keep the first occurrence of each unique entry\n if (!uniqueEntries.has(key)) {\n uniqueEntries.set(key, entry);\n }\n });\n\n return Array.from(uniqueEntries.values());\n }\n\n private _findColumnById(columnId: string): FormColumn | undefined {\n if (!this._currentSchema) {\n return undefined;\n }\n\n for (const section of this._currentSchema.sections) {\n if (section.columns) {\n const column = section.columns.find(col => col.id === columnId);\n if (column) {\n return column;\n }\n }\n }\n return undefined;\n }\n\n private _findColumnByIdInSection(columnId: string, section?: FormSection): FormColumn | undefined {\n if (!section?.columns) {\n return undefined;\n }\n\n return section.columns.find(col => col.id === columnId);\n }\n\n private _getTypedMemberNameForAxis(axisId: string, section?: FormSection): string | null {\n // Look for the typed member name in the hypercube data\n if (!this.xbrlInput?.hypercubes?.[0]) {\n return null;\n }\n\n const sectionRoleId = section?.id;\n if (!sectionRoleId) {\n return null;\n }\n\n // Find the role in hypercubes\n const hypercube = this.xbrlInput.hypercubes[0];\n const role = hypercube.roles?.find((r: any) => r.roleId === sectionRoleId);\n if (!role?.items) {\n return null;\n }\n\n // Search through all items for dimensions matching the axis\n for (const item of role.items) {\n if (item.dimensions) {\n const dimension = item.dimensions.find((d: any) => d.id === axisId);\n if (dimension?.typedMember?.id) {\n return dimension.typedMember.id;\n }\n }\n }\n\n return null;\n }\n\n private _doesConceptApplyToTypedDimension(concept: ConceptTree, section?: FormSection, columnId?: string): boolean {\n // Check if this concept is part of a hypercube that has typed dimensions\n if (!this.xbrlInput?.hypercubes?.[0]) {\n return false;\n }\n\n const sectionRoleId = section?.id;\n if (!sectionRoleId) {\n return false;\n }\n\n // Find the hypercube role that matches this section\n const hypercubeRole = this.xbrlInput.hypercubes[0].roles.find(hr => hr.roleId === sectionRoleId);\n if (!hypercubeRole?.items?.length) {\n return false;\n }\n\n // Check if any hypercube item contains this concept and has typed dimensions\n for (const item of hypercubeRole.items) {\n // Check if this concept is in the conceptIds list for this hypercube item\n const conceptIdToCheck = concept.originalConceptId || concept.id;\n if (item.conceptIds && item.conceptIds.includes(conceptIdToCheck)) {\n // Check if this hypercube item has typed dimensions\n const hasTypedDimensions = item.dimensions.some(dim => dim.typedMember);\n console.log(`🔍 [DynamicForm] Concept ${conceptIdToCheck} found in hypercube item. Has typed dimensions:`, hasTypedDimensions);\n return hasTypedDimensions;\n }\n }\n\n console.log(`🔍 [DynamicForm] Concept ${concept.originalConceptId || concept.id} not found in any hypercube items for role ${sectionRoleId}`);\n return false;\n }\n\n /**\n * Get the specific typed dimensions that apply to a concept in its role\n */\n private _getApplicableTypedDimensions(concept: ConceptTree, section?: FormSection): string[] {\n if (!this.xbrlInput?.hypercubes?.[0] || !section?.id) {\n return [];\n }\n\n const hypercubeRole = this.xbrlInput.hypercubes[0].roles.find(hr => hr.roleId === section.id);\n if (!hypercubeRole?.items?.length) {\n return [];\n }\n\n const conceptIdToCheck = concept.originalConceptId || concept.id;\n\n // Find the hypercube item that contains this concept\n for (const item of hypercubeRole.items) {\n if (item.conceptIds && item.conceptIds.includes(conceptIdToCheck)) {\n // Return the IDs of typed dimensions in this hypercube item\n const typedDimensions = item.dimensions\n .filter(dim => dim.typedMember)\n .map(dim => dim.id);\n\n console.log(`🔍 [DynamicForm] Found applicable typed dimensions for concept ${conceptIdToCheck}:`, typedDimensions);\n return typedDimensions;\n }\n }\n\n return [];\n }\n\n private _processConceptsForSubmission(concepts: ConceptTree[], submissionData: SubmissionData, section?: FormSection) {\n const targetRole = \"Toelichting op de geconsolideerde jaarrekening - Financiële vaste activa: Deelnemingen: Volledig geconsolideerd: Specificatie\";\n const sectionTitle = section?.title || 'Unknown';\n\n concepts.forEach(concept => {\n // Enhanced debug logging for target role\n if (sectionTitle === targetRole) {\n console.warn(`[DUPLICATE DEBUG] Processing concept ${concept.originalConceptId || concept.id} in target role`);\n if (concept.fields) {\n console.warn(`[DUPLICATE DEBUG] Concept has ${concept.fields.length} fields`);\n concept.fields.forEach((field, index) => {\n console.warn(`[DUPLICATE DEBUG] Field ${index}: columnId=${field.columnId}, current value=${this._formData[concept.id]?.[field.columnId]}`);\n });\n }\n }\n\n // Debug log for any concept with multiple fields\n if (concept.fields && concept.fields.length > 1) {\n //console.log(`🔍 [DEBUG] Processing concept ${concept.originalConceptId}, fields count: ${concept.fields.length}`);\n concept.fields.forEach((field, index) => {\n //console.log(` Field ${index}: columnId=${field.columnId}, value=${this._formData[concept.id]?.[field.columnId]}`);\n });\n }\n\n // Process fields for this concept\n if (concept.fields && concept.fields.length > 0) {\n concept.fields.forEach(field => {\n // Get the value from the nested form data structure\n const conceptData = this._formData[concept.id];\n let fieldValue = conceptData?.[field.columnId];\n const baseConceptId = field.conceptId || concept.id.split('__').slice(0, -1).join('__') || concept.id;\n\n // If decimals is not provided, preserve fact value for rounding level concept.\n // This prevents an injected/legacy masterData value (commonly 0) from overriding facts.\n if (\n (fieldValue === undefined || fieldValue === null || fieldValue === '') &&\n this._isRoundingLevelConcept(baseConceptId) &&\n !this._hasValidGlobalDecimals()\n ) {\n const factValue = this._findFactValueForField(concept, field, section);\n if (factValue !== undefined && factValue !== null && factValue !== '') {\n fieldValue = factValue;\n }\n }\n\n // masterData fields are rendered disabled so no field-change event fires for them.\n // Their values are never written into _formData. Fall back to masterData here so\n // they are included in draft saves and final submission.\n if ((fieldValue === undefined || fieldValue === null || fieldValue === '') && this._effectiveMasterData) {\n const masterValue = this._effectiveMasterData?.[baseConceptId];\n if (masterValue !== undefined && masterValue !== null && masterValue !== '') {\n fieldValue = masterValue;\n console.warn(` 📦 [Submission] Using masterData for: ${baseConceptId} [${field.columnId}] = ${JSON.stringify(fieldValue)}`);\n }\n }\n\n // Only include fields that have values\n if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {\n // Log submission entry creation for target role\n if (sectionTitle === targetRole) {\n // console.warn(`[DUPLICATE DEBUG] Creating submission entry for concept ${concept.originalConceptId || concept.id}, field columnId=${field.columnId}, value=${fieldValue}`);\n }\n\n // Find the column information from the SPECIFIC section to check for dimension data\n const column = this._findColumnByIdInSection(field.columnId, section);\n // console.log(`🔍 [DynamicForm] Processing field for concept ${concept.originalConceptId || concept.id}, field columnId: ${field.columnId}, found column in section ${section?.id}: ${!!column}, column title: ${column?.title}`);\n\n // Check if field has custom period data (user-modified)\n const fieldPeriodData = this._periodData[concept.id]?.[field.columnId];\n\n const submissionEntry: any = {\n conceptId: concept.id,\n draftInstanceId: concept.id, // used during draft restoration to route value to the correct _formData slot\n columnId: field.columnId, // CRITICAL: Include columnId for draft restoration\n value: fieldValue,\n period: {\n type: concept.periodType || 'duration'\n } as { type: 'instant' | 'duration'; date?: string; startDate?: string; endDate?: string; }\n };\n\n // Determine period structure based on concept's period type\n // Priority: field-specific period (user-modified) > column period dates > field defaults > form defaults\n if (concept.periodType === 'instant') {\n // For instant concepts, use a single date\n const instantDate = fieldPeriodData?.instantDate || fieldPeriodData?.endDate || column?.periodEndDate || field.periodInstantDate || field.periodEndDate || field.periodStartDate || this.periodStartDate;\n submissionEntry.period.date = instantDate;\n } else {\n // For duration concepts, use start and end dates\n const startDate = fieldPeriodData?.startDate || column?.periodStartDate || field.periodStartDate || this.periodStartDate;\n const endDate = fieldPeriodData?.endDate || column?.periodEndDate || field.periodEndDate || this.periodEndDate;\n submissionEntry.period.startDate = startDate;\n submissionEntry.period.endDate = endDate;\n }\n\n // Debug log period dates with field-specific info\n console.log(`🔍 [Submission] Concept: ${concept.id}, Column: ${field.columnId}, Field Period: ${fieldPeriodData ? JSON.stringify(fieldPeriodData) : 'none'}, Column Period: ${column?.periodStartDate || 'none'} - ${column?.periodEndDate || 'none'}, Used Period: ${submissionEntry.period.type === 'instant' ? submissionEntry.period.date : `${submissionEntry.period.startDate} - ${submissionEntry.period.endDate}`}`);\n\n // Add unit if available\n const fieldUnit = this._unitData[concept.id]?.[field.columnId];\n if (fieldUnit) {\n submissionEntry.unit = fieldUnit;\n console.log(`✅ [Submission] Adding unit to entry: ${fieldUnit} for ${concept.id}/${field.columnId}`);\n } else {\n console.log(`⚠️ [Submission] No unit found in _unitData for ${concept.id}/${field.columnId}. _unitData state:`, JSON.stringify(this._unitData, null, 2));\n }\n\n // Add decimals for monetary concepts\n const isMonetary = concept.type?.toLowerCase().includes('monetary');\n const fieldDecimals = this._decimalsData[concept.id]?.[field.columnId];\n const decimalsValue = fieldDecimals || (this.decimals !== 'INF' ? this.decimals : undefined);\n if (isMonetary && decimalsValue) {\n const parsed = parseFloat(decimalsValue);\n submissionEntry.decimals = isNaN(parsed) ? decimalsValue : String(-Math.abs(parsed));\n }\n\n // Add dimension information\n // Only use dimension data from the specific column that this field is linked to\n if (column?.type === 'dimension' && column.dimensionData?.dimensionIdKey) {\n submissionEntry.dimension = column.dimensionData.dimensionIdKey;\n console.log(`🔍 [DynamicForm] Using dimension key from field's column (${field.columnId}):`, column.dimensionData.dimensionIdKey);\n } else {\n console.log(`🔍 [DynamicForm] No dimension data found for field column ${field.columnId}. Column type: ${column?.type}, has dimensionData: ${!!column?.dimensionData}`);\n }\n\n // Add typed member values if they exist for this column AND the concept is part of the hypercube\n if (this._typedMemberData[field.columnId]) {\n const applicableTypedDimensions = this._getApplicableTypedDimensions(concept, section);\n console.log(`🔍 [DynamicForm] Concept ${concept.id} applicable typed dimensions:`, applicableTypedDimensions);\n\n if (applicableTypedDimensions.length > 0) {\n // Filter typed member data to only include dimensions applicable to this concept\n const filteredTypedMembers: { [axisId: string]: { value: string; memberName: string } } = {};\n const allTypedMemberData = this._typedMemberData[field.columnId];\n\n applicableTypedDimensions.forEach(dimensionId => {\n if (allTypedMemberData[dimensionId]) {\n const memberName = this._getTypedMemberNameForAxis(dimensionId, section);\n filteredTypedMembers[dimensionId] = {\n value: allTypedMemberData[dimensionId],\n memberName: memberName || 'Unknown'\n };\n }\n });\n\n if (Object.keys(filteredTypedMembers).length > 0) {\n submissionEntry.typedMembers = filteredTypedMembers;\n console.log(`🔍 [DynamicForm] Adding filtered typed members to submission:`, filteredTypedMembers);\n } else {\n console.log(`🔍 [DynamicForm] No typed member values found for applicable dimensions:`, applicableTypedDimensions);\n }\n } else {\n console.log(`🔍 [DynamicForm] Skipping typed members for concept ${concept.id} - not applicable to this hypercube`);\n }\n } else {\n console.log(`🔍 [DynamicForm] No typed member data found for column ${field.columnId}. Available columns:`, Object.keys(this._typedMemberData));\n if (column) {\n console.log(`🔍 [DynamicForm] Column details:`, {\n id: column.id,\n type: column.type,\n hasTypedMembers: column.dimensionData?.hasTypedMembers,\n dimensionData: column.dimensionData\n });\n }\n }\n\n // Add cross-role typed member values (from Edit Period dialog, JDF-021/JDF-022).\n // These are stored under the compound key \"${concept.id}__${field.columnId}\" so\n // that each concept row has its own independent dimension values.\n if (!submissionEntry.typedMembers && field.crossRoleTypedMembers?.length) {\n const crossRoleKey = `${concept.id}__${field.columnId}`;\n const crossRoleValues = this._typedMemberData[crossRoleKey];\n if (crossRoleValues) {\n const filteredTypedMembers: { [axisId: string]: { value: string; memberName: string } } = {};\n field.crossRoleTypedMembers.forEach(tm => {\n const val = crossRoleValues[tm.axisId];\n if (val !== undefined && val !== null && val !== '') {\n filteredTypedMembers[tm.axisId] = {\n value: val,\n memberName: tm.typedMemberId\n };\n }\n });\n if (Object.keys(filteredTypedMembers).length > 0) {\n submissionEntry.typedMembers = filteredTypedMembers;\n console.log(`🔍 [Submission] Adding cross-role typed members for ${concept.id}/${field.columnId}:`, filteredTypedMembers);\n }\n }\n }\n\n // Log final submission entry for target role\n if (sectionTitle === targetRole) {\n console.warn(`[DUPLICATE DEBUG] Final submission entry:`, submissionEntry);\n }\n\n submissionData.push(submissionEntry);\n }\n });\n\n // Process extra repeat instances for cross-role typed members (JDF-022)\n const repeatCount = this._repeatCounts[concept.id] || 0;\n if (repeatCount > 0 && concept.fields.some(f => f.crossRoleTypedMembers?.length)) {\n for (let n = 1; n <= repeatCount; n++) {\n const instanceId = `${concept.id}__repeat_${n}`;\n\n concept.fields.forEach(field => {\n const instanceValue = this._formData[instanceId]?.[field.columnId];\n if (instanceValue === undefined || instanceValue === null || instanceValue === '') return;\n\n const column = this._findColumnByIdInSection(field.columnId, section);\n const fieldPeriodData = this._periodData[instanceId]?.[field.columnId];\n\n const instanceEntry: any = {\n conceptId: concept.id, // original concept ID (not synthetic repeat ID)\n draftInstanceId: instanceId, // synthetic ID used during draft restoration to route to the correct _formData slot\n columnId: field.columnId,\n value: instanceValue,\n period: {\n type: concept.periodType || 'duration'\n } as { type: 'instant' | 'duration'; date?: string; startDate?: string; endDate?: string; }\n };\n\n if (concept.periodType === 'instant') {\n instanceEntry.period.date = fieldPeriodData?.instantDate || fieldPeriodData?.endDate || column?.periodEndDate || field.periodInstantDate || field.periodEndDate || field.periodStartDate || this.periodStartDate;\n } else {\n instanceEntry.period.startDate = fieldPeriodData?.startDate || column?.periodStartDate || field.periodStartDate || this.periodStartDate;\n instanceEntry.period.endDate = fieldPeriodData?.endDate || column?.periodEndDate || field.periodEndDate || this.periodEndDate;\n }\n\n const instanceUnit = this._unitData[instanceId]?.[field.columnId];\n if (instanceUnit) {\n instanceEntry.unit = instanceUnit;\n }\n\n if (column?.type === 'dimension' && column.dimensionData?.dimensionIdKey) {\n instanceEntry.dimension = column.dimensionData.dimensionIdKey;\n }\n\n // Add cross-role typed members for this repeat instance\n if (field.crossRoleTypedMembers?.length) {\n const crossRoleKey = `${instanceId}__${field.columnId}`;\n const crossRoleValues = this._typedMemberData[crossRoleKey];\n if (crossRoleValues) {\n const filteredTypedMembers: { [axisId: string]: { value: string; memberName: string } } = {};\n field.crossRoleTypedMembers.forEach(tm => {\n const val = crossRoleValues[tm.axisId];\n if (val !== undefined && val !== null && val !== '') {\n filteredTypedMembers[tm.axisId] = { value: val, memberName: tm.typedMemberId };\n }\n });\n if (Object.keys(filteredTypedMembers).length > 0) {\n instanceEntry.typedMembers = filteredTypedMembers;\n }\n }\n }\n\n submissionData.push(instanceEntry);\n });\n }\n }\n }\n\n // Recursively process children\n if (concept.children) {\n this._processConceptsForSubmission(concept.children, submissionData, section);\n }\n });\n }\n\n private _handleReset() {\n this._formData = { ...this.initialData };\n this._touched.clear();\n this._dirty = false;\n this._submitted = false;\n\n // Clear preserved data when form is reset\n this._preservedFormData = {};\n this._preservedTypedMemberData = {};\n\n console.log('🔄 Form reset - all data and preserved data cleared');\n\n this._validateForm();\n this.requestUpdate();\n\n this.dispatchEvent(new CustomEvent('form-reset', {\n detail: {},\n bubbles: true\n }));\n }\n\n private _getFormState(): FormState {\n return {\n data: this._formData,\n errors: this._errors,\n touched: this._touched,\n dirty: this._dirty,\n valid: this._valid,\n submitted: this._submitted\n };\n }\n\n /**\n * Analyze all visible roles on form load to set initial border statuses\n */\n private _analyzeAllVisibleRoles() {\n if (!this._currentSchema || !this._currentSchema.sections || this._currentSchema.sections.length === 0) {\n console.log('⏭️ No sections to analyze for initial border status');\n return;\n }\n\n console.log(`🔍 Analyzing ${this._currentSchema.sections.length} visible roles for initial border status...`);\n\n for (const section of this._currentSchema.sections) {\n this._analyzeAndLogRole(section.id);\n }\n\n console.log(`✅ Initial border status analysis complete for all visible roles`);\n }\n\n /**\n * Handle right-click on role item to show context menu\n */\n private _handleRoleContextMenu(event: MouseEvent, roleId: string, roleTitle: string) {\n event.preventDefault();\n event.stopPropagation();\n\n this._contextMenuX = event.clientX;\n this._contextMenuY = event.clientY;\n this._contextMenuRoleId = roleId;\n this._showRoleContextMenu = true;\n\n console.log(`🖱️ Context menu opened for role: ${roleTitle} (ID: ${roleId})`);\n\n this.requestUpdate();\n }\n\n /**\n * Close the context menu\n */\n private _closeRoleContextMenu() {\n this._showRoleContextMenu = false;\n this._contextMenuRoleId = null;\n this.requestUpdate();\n }\n\n /**\n * Handle remove role action - removes role from side panel\n */\n private _handleRemoveRole() {\n if (!this._contextMenuRoleId) {\n this._closeRoleContextMenu();\n return;\n }\n\n const role = this._allSections.find(s => s.id === this._contextMenuRoleId);\n const roleTitle = role?.title || 'Unknown';\n\n console.log(`🗑️ Removing role from side panel:`);\n console.log(` - Role ID: ${this._contextMenuRoleId}`);\n console.log(` - Role Title: ${roleTitle}`);\n\n // 1. Remove from selected role IDs\n if (Array.isArray(this._selectedRoleIds)) {\n // Handle both string array and object array formats\n if (this._selectedRoleIds.length > 0 && typeof this._selectedRoleIds[0] === 'object') {\n // Object format: { roleId, roleURI, order }\n this._selectedRoleIds = (this._selectedRoleIds as Array<{ roleId: string; roleURI: string; order: number }>)\n .filter(r => r.roleId !== this._contextMenuRoleId);\n } else {\n // String array format\n this._selectedRoleIds = (this._selectedRoleIds as string[])\n .filter(id => id !== this._contextMenuRoleId);\n }\n }\n\n console.log(`✅ Role removed from _selectedRoleIds. Remaining roles: ${this._selectedRoleIds.length}`);\n\n // 2. If removed role was active, select another role\n if (this._activeSidePanelRoleId === this._contextMenuRoleId) {\n // Find first available role after removal\n const remainingRoleIds = this._getRoleIdsArray();\n this._activeSidePanelRoleId = remainingRoleIds.length > 0 ? remainingRoleIds[0] : null;\n console.log(`📌 Active role changed to: ${this._activeSidePanelRoleId || 'None'}`);\n }\n\n // 3. Apply role filter to update visible sections\n this._applyRoleFilter();\n\n // 4. Emit custom event for external listeners\n this.dispatchEvent(new CustomEvent('role-removed', {\n detail: {\n roleId: this._contextMenuRoleId,\n roleTitle: roleTitle,\n remainingRolesCount: this._selectedRoleIds.length\n },\n bubbles: true,\n composed: true\n }));\n\n console.log(`✅ Role \"${roleTitle}\" successfully removed from side panel`);\n console.log(`ℹ️ User can re-add this role using the Filter Roles dialog`);\n\n this._closeRoleContextMenu();\n }\n\n private _handleRoleCompletedChange(roleId: string, checked: boolean) {\n if (checked) {\n this._roleCompletedStates.set(roleId, true);\n } else {\n this._roleCompletedStates.delete(roleId);\n }\n this._roleCompletedStates = new Map(this._roleCompletedStates);\n this._handleSaveDraft('auto');\n }\n\n private _handleSidePanelRoleClick(roleId: string) {\n // Check the previous role before switching\n if (this._activeSidePanelRoleId && this._activeSidePanelRoleId !== roleId) {\n this._analyzeAndLogRole(this._activeSidePanelRoleId);\n }\n\n this._activeSidePanelRoleId = roleId;\n }\n\n private _analyzeAndLogRole(roleId: string) {\n const section = this._allSections.find(s => s.id === roleId);\n if (!section) {\n console.warn(`⚠️ Section not found for roleId: ${roleId}`);\n return;\n }\n\n console.warn(`\\n========================================`);\n console.warn(`🔍 ANALYZING ROLE: \"${section.title}\"`);\n console.warn(`========================================`);\n\n // Log masterData if it exists\n if (this.masterData) {\n console.warn(`📦 masterData keys:`, Object.keys(this.masterData));\n } else {\n console.warn(`📦 masterData: NOT PROVIDED`);\n }\n\n // Collect all fields\n const allFields: Array<{ conceptId: string; columnId: string; value: any; isEmpty: boolean }> = [];\n this._collectAllFields(section.concepts || [], new Set((section.columns || []).map(col => col.id)), section.columns || [], allFields);\n\n // console.warn(`📊 Total fields found: ${allFields.length}`);\n //console.warn(`\\n📋 FIELD DETAILS:`);\n\n // allFields.forEach((field, index) => {\n // const status = field.isEmpty ? '❌ EMPTY' : '✅ FILLED';\n // console.warn(` ${index + 1}. ${field.conceptId} [${field.columnId}]: ${status} = ${JSON.stringify(field.value)}`);\n // });\n\n // Check for errors\n const hasErrors = this._roleHasErrors(roleId);\n\n // Count empty fields\n const emptyCount = allFields.filter(f => f.isEmpty).length;\n const filledCount = allFields.filter(f => !f.isEmpty).length;\n\n console.warn(`\\n📈 SUMMARY:`);\n console.warn(` Total Fields: ${allFields.length}`);\n console.warn(` Filled: ${filledCount}`);\n console.warn(` Empty: ${emptyCount}`);\n console.warn(` Has Errors: ${hasErrors}`);\n\n // Determine result\n let result: 'INVALID' | 'UNTOUCHED' | 'INCOMPLETE' | 'COMPLETE';\n\n if (hasErrors) {\n result = 'INVALID';\n console.warn(`\\n🔴 RESULT: INVALID (contains validation errors)`);\n } else if (filledCount === 0) {\n result = 'UNTOUCHED';\n console.warn(`\\n⬜ RESULT: UNTOUCHED (no data entered)`);\n } else if (emptyCount > 0) {\n result = 'INCOMPLETE';\n console.warn(`\\n🟠 RESULT: INCOMPLETE (${emptyCount} field(s) blank)`);\n } else {\n result = 'COMPLETE';\n console.warn(`\\n🟢 RESULT: COMPLETE (all fields filled)`);\n }\n\n console.warn(`========================================\\n`);\n\n // Update border status\n if (result === 'INVALID') {\n // Errors are already handled by has-errors class\n } else if (result === 'UNTOUCHED') {\n this._roleBorderStatuses.set(roleId, 'untouched');\n this._roleBorderStatuses = new Map(this._roleBorderStatuses);\n } else if (result === 'INCOMPLETE') {\n this._roleBorderStatuses.set(roleId, 'incomplete');\n this._roleBorderStatuses = new Map(this._roleBorderStatuses);\n } else {\n this._roleBorderStatuses.set(roleId, 'complete');\n this._roleBorderStatuses = new Map(this._roleBorderStatuses);\n }\n }\n\n private _collectAllFields(\n concepts: ConceptTree[],\n sectionColumnIds: Set<string>,\n sectionColumns: FormColumn[],\n allFields: Array<{ conceptId: string; columnId: string; value: any; isEmpty: boolean }>\n ) {\n for (const concept of concepts) {\n if (concept.abstract) {\n if (concept.children && concept.children.length > 0) {\n this._collectAllFields(concept.children, sectionColumnIds, sectionColumns, allFields);\n }\n continue;\n }\n\n if (concept.fields && concept.fields.length > 0) {\n const relevantFields = concept.fields.filter(field => sectionColumnIds.has(field.columnId));\n\n for (const field of relevantFields) {\n // CRITICAL: _formData is keyed by concept.id (which may have a suffix like __4qukyf)\n // because concept-tree.ts passes concept.id as conceptId to jupiter-form-field,\n // and form-field dispatches field-change events using that same id.\n // field.conceptId holds the original XBRL concept ID (without suffix).\n // We must check BOTH keys to correctly find stored values.\n const conceptIdWithSuffix = concept.id; // e.g. \"kvk-i_BusinessNames__4qukyf\"\n const fieldConceptId = field.conceptId; // e.g. \"kvk-i_BusinessNames\"\n\n // Prefer the suffixed concept.id lookup (primary storage key used by form-field),\n // fall back to the original fieldConceptId for backward compatibility.\n let value = this._formData[conceptIdWithSuffix]?.[field.columnId];\n if (value === undefined && conceptIdWithSuffix !== fieldConceptId) {\n value = this._formData[fieldConceptId]?.[field.columnId];\n }\n\n // If the field has no user-entered value, fall back to masterData.\n // masterData fields are rendered disabled in the form but their values\n // must still be included in the final/draft data (they are often mandatory).\n const masterValue = this._effectiveMasterData?.[fieldConceptId];\n if ((value === null || value === undefined || (typeof value === 'string' && value.trim() === ''))\n && masterValue !== undefined) {\n value = masterValue;\n console.warn(` 📦 Using masterData value for: ${fieldConceptId} [${field.columnId}] = ${JSON.stringify(value)}`);\n }\n\n let isEmpty = value === null || value === undefined ||\n (typeof value === 'string' && value.trim() === '');\n\n // If value is empty in _formData, check if there's a matching XBRL fact\n // that is pre-populating this field visually (facts are displayed in UI but\n // not stored in _formData until the user edits the field).\n if (isEmpty && concept.facts && concept.facts.length > 0) {\n const column = sectionColumns.find(col => col.id === field.columnId);\n const cellContext = {\n conceptId: fieldConceptId,\n columnId: field.columnId,\n periodStartDate: field.periodStartDate || column?.periodStartDate,\n periodEndDate: field.periodEndDate || column?.periodEndDate,\n periodInstantDate: field.periodInstantDate || (field.periodType === 'instant' ? (field.periodEndDate || field.periodStartDate) : undefined),\n periodType: field.periodType,\n dimensionData: column?.dimensionData\n };\n const matchedFact = FactMatcher.findMatchingFact(concept.facts as any[], cellContext as any);\n if (matchedFact && matchedFact.value !== null && matchedFact.value !== undefined && matchedFact.value !== '') {\n value = matchedFact.value;\n isEmpty = false;\n // console.warn(` ✨ FACT PRE-POPULATED: ${fieldConceptId} [${field.columnId}] = ${JSON.stringify(value)}`);\n }\n }\n\n// console.warn(` 🔍 Field lookup: concept.id=\"${conceptIdWithSuffix}\", field.conceptId=\"${fieldConceptId}\", value=${JSON.stringify(value)}, isEmpty=${isEmpty}`);\n\n allFields.push({\n conceptId: fieldConceptId,\n columnId: field.columnId,\n value: value,\n isEmpty: isEmpty\n });\n }\n }\n\n if (concept.children && concept.children.length > 0) {\n this._collectAllFields(concept.children, sectionColumnIds, sectionColumns, allFields);\n }\n }\n }\n\n private _handleSidePanelSearchInput(event: Event) {\n const input = event.target as HTMLInputElement;\n this._sidePanelSearchQuery = input.value;\n }\n\n private _clearSidePanelSearch() {\n this._sidePanelSearchQuery = '';\n const searchInput = this.shadowRoot?.querySelector('.side-panel-search-input') as HTMLInputElement;\n if (searchInput) {\n searchInput.value = '';\n searchInput.focus();\n }\n }\n\n private _toggleSidePanelCollapse() {\n this._sidePanelCollapsed = !this._sidePanelCollapsed;\n }\n\n /**\n * Returns true when every non-abstract concept row in the section has no value\n * in any column. Used in readonly mode to hide fully-blank sections.\n */\n private _isSectionBlank(section: FormSection): boolean {\n const columns = section.columns || this._columns;\n\n const hasValue = (concepts: ConceptTree[]): boolean => {\n for (const concept of concepts) {\n if (!concept.abstract) {\n for (const column of columns) {\n const value = this._formData[concept.id]?.[column.id];\n if (value !== null && value !== undefined && value !== '') {\n return true;\n }\n }\n }\n if (concept.children && concept.children.length > 0) {\n if (hasValue(concept.children)) return true;\n }\n }\n return false;\n };\n\n return !hasValue(section.concepts);\n }\n\n private _getConceptSearchMatchIds(searchText: string): Set<string> {\n const result = new Set<string>();\n if (!searchText.trim() || !this.xbrlInput?.presentation?.length) {\n return result;\n }\n\n const query = searchText.toLowerCase().trim();\n\n const walkConcepts = (concepts: any[]) => {\n for (const concept of concepts) {\n let matches = concept.conceptName?.toLowerCase().includes(query) || concept.id?.toLowerCase().includes(query);\n if (!matches && Array.isArray(concept.labels)) {\n matches = concept.labels.some((l: any) => l.label?.toLowerCase().includes(query));\n }\n if (matches) {\n result.add(concept.id); // id uses underscore format matching originalConceptId in ConceptTree\n }\n if (concept.children?.length) {\n walkConcepts(concept.children);\n }\n }\n };\n\n for (const presentationData of this.xbrlInput.presentation) {\n for (const role of presentationData.roles || []) {\n walkConcepts(role.presentationLinkbase?.concepts || []);\n }\n }\n\n return result;\n }\n\n private _isSectionConceptSearchMatch(section: FormSection, matchIds: Set<string>): boolean {\n if (matchIds.size === 0) return false;\n\n const checkConcepts = (concepts: ConceptTree[]): boolean => {\n for (const concept of concepts) {\n if (matchIds.has(concept.originalConceptId)) return true;\n if (concept.children?.length && checkConcepts(concept.children)) return true;\n }\n return false;\n };\n\n return checkConcepts(section.concepts);\n }\n\n private _filterSidePanelSections(sections: FormSection[]): FormSection[] {\n if (!this._sidePanelSearchQuery.trim()) {\n return sections;\n }\n\n const query = this._sidePanelSearchQuery.toLowerCase().trim();\n return sections.filter(section => {\n // Search in section title\n const titleMatch = section.title.toLowerCase().includes(query);\n\n // Search in section ID\n const idMatch = section.id.toLowerCase().includes(query);\n\n // Search in section description if available\n const descriptionMatch = section.description?.toLowerCase().includes(query) || false;\n\n // Search in roleURI if available\n const uriMatch = section.metadata?.roleURI?.toLowerCase().includes(query) || false;\n\n return titleMatch || idMatch || descriptionMatch || uriMatch;\n });\n }\n\n private _renderAdminModeContent(section?: FormSection) {\n if (!section) {\n return html`\n <div class=\"admin-mode-container\">\n <p>No role selected</p>\n </div>\n `;\n }\n\n // CRITICAL: Read from _periodPreferences (which is persisted/restored) instead of _adminRoleConfigs\n const showPreviousYearChecked = this._periodPreferences[section.id]?.showPreviousYear ?? section.showPreviousYear ?? false;\n\n // Get dimensions for this role\n const dimensions = this._getDimensionsForRole(section.id);\n const hasDimensions = dimensions.length > 0;\n\n // Initialize dimension selections with all members checked by default if not already set\n if (hasDimensions && !this._periodPreferences[section.id]?.dimensionSelections) {\n const currentPref = this._periodPreferences[section.id] || {\n showDuration: true,\n showInstant: true,\n showPreviousYear: false\n };\n\n currentPref.dimensionSelections = [];\n\n dimensions.forEach((dimension: any) => {\n const allMembers = this._getAllDimensionMembers(dimension.members);\n const allMemberIds = allMembers.map((m: any) => m.id);\n const dimensionLabel = dimension.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n\n if (currentPref.dimensionSelections) {\n currentPref.dimensionSelections.push({\n dimensionId: dimension.id,\n dimensionLabel: dimensionLabel,\n selectedMemberIds: allMemberIds\n });\n }\n });\n\n this._periodPreferences = {\n ...this._periodPreferences,\n [section.id]: currentPref\n };\n\n console.log('✅ [Admin Mode] Initialized all dimension members as selected by default for role:', section.id);\n }\n\n return html`\n <div class=\"admin-mode-container\">\n <h2 class=\"admin-mode-title\">Role Configuration: ${section.title}</h2>\n <div class=\"admin-roles-list\">\n <div class=\"admin-role-item\">\n <div class=\"admin-role-checkbox\">\n <input\n type=\"checkbox\"\n id=\"admin-prev-year-${section.id}\"\n .checked=\"${showPreviousYearChecked}\"\n @change=\"${(e: Event) => this._handleAdminCheckboxChange(section.id, 'showPreviousYear', (e.target as HTMLInputElement).checked)}\"\n />\n <label for=\"admin-prev-year-${section.id}\">Show Previous Year Column</label>\n </div>\n </div>\n \n ${hasDimensions ? html`\n <div class=\"admin-dimension-section\">\n <div class=\"admin-dimension-header\">📊 ${I18n.t('filter.dimensionMemberSelection')}</div>\n ${dimensions.map((dimension: any) => {\n const allMembers = this._getAllDimensionMembers(dimension.members);\n const dimensionLabel = dimension.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimension.conceptName;\n const isSingleMember = this._isSingleMemberDimension(dimension);\n\n return html`\n <div class=\"admin-dimension-group\">\n <div class=\"admin-dimension-label\">${dimensionLabel}${isSingleMember ? ' (Mandatory)' : ''}</div>\n <div class=\"admin-dimension-members\">\n ${allMembers.map((member: any) => {\n const memberLabel = member.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || member.conceptName;\n const isChecked = this._isAdminDimensionMemberSelected(section.id, dimension.id, member.id);\n\n return html`\n <label class=\"admin-member-checkbox-item\">\n <input\n type=\"checkbox\"\n class=\"admin-member-checkbox\"\n .checked=\"${isChecked}\"\n ?disabled=\"${isSingleMember}\"\n @change=\"${(e: Event) => this._handleAdminDimensionMemberChange(e, section.id, dimension.id, member.id)}\"\n />\n <span class=\"admin-member-checkbox-label\">${memberLabel}</span>\n </label>\n `;\n })}\n </div>\n ${!isSingleMember ? html`\n <div class=\"admin-member-select-controls\">\n <button \n class=\"admin-member-select-btn\"\n @click=\"${() => this._selectAllAdminDimensionMembers(section.id, dimension.id)}\"\n >\n ${I18n.t('filter.selectAllMembers')}\n </button>\n <button \n class=\"admin-member-select-btn\"\n @click=\"${() => this._deselectAllAdminDimensionMembers(section.id, dimension.id)}\"\n >\n ${I18n.t('filter.clearMembers')}\n </button>\n </div>\n ` : ''}\n </div>\n `;\n })}\n </div>\n ` : ''}\n </div>\n </div>\n `;\n }\n\n private _handleAdminCheckboxChange(roleId: string, field: 'showPreviousYear' | 'instant' | 'duration', checked: boolean) {\n const currentConfig = this._adminRoleConfigs[roleId] || { showPreviousYear: false };\n this._adminRoleConfigs = {\n ...this._adminRoleConfigs,\n [roleId]: {\n ...currentConfig,\n [field]: checked\n }\n };\n\n // CRITICAL: Also update _periodPreferences so settings are saved to metadata/localStorage\n const currentPeriodPref = this._periodPreferences[roleId] || {\n showDuration: true,\n showInstant: true,\n showPreviousYear: false\n };\n this._periodPreferences = {\n ...this._periodPreferences,\n [roleId]: {\n ...currentPeriodPref,\n [field]: checked\n }\n };\n\n console.log(`✅ [Admin Mode] Updated ${field} = ${checked} for role ${roleId}`);\n console.log(`📋 [Admin Mode] _periodPreferences now includes:`, this._periodPreferences[roleId]);\n }\n\n /**\n * Get dimensions for a specific role from hypercube data\n */\n private _getDimensionsForRole(roleId: string): any[] {\n if (!this.xbrlInput?.hypercubes?.[0]) {\n return [];\n }\n\n const hypercubeRole = this.xbrlInput.hypercubes[0].roles?.find((r: any) => r.roleId === roleId);\n if (!hypercubeRole?.items?.length) {\n return [];\n }\n\n const dimensionsMap = new Map<string, any>();\n\n hypercubeRole.items.forEach((item: any) => {\n if (item.dimensions) {\n item.dimensions.forEach((dimension: any) => {\n if (!dimensionsMap.has(dimension.id)) {\n dimensionsMap.set(dimension.id, dimension);\n }\n });\n }\n });\n\n return Array.from(dimensionsMap.values());\n }\n\n /**\n * Get all dimension members recursively\n */\n private _getAllDimensionMembers(members: any[]): any[] {\n if (!members || members.length === 0) {\n return [];\n }\n\n let allMembers: any[] = [];\n members.forEach((member: any) => {\n allMembers.push(member);\n if (member.children && member.children.length > 0) {\n allMembers = allMembers.concat(this._getAllDimensionMembers(member.children));\n }\n });\n\n return allMembers;\n }\n\n /**\n * Check if a dimension has only one member (single choice, mandatory)\n */\n private _isSingleMemberDimension(dimension: any): boolean {\n if (!dimension || !dimension.members) {\n return false;\n }\n const allMembers = this._getAllDimensionMembers(dimension.members);\n return allMembers.length === 1;\n }\n\n /**\n * Handle dimension member selection in admin mode\n */\n private _handleAdminDimensionMemberChange(event: Event, roleId: string, dimensionId: string, memberId: string) {\n event.stopPropagation();\n const checkbox = event.target as HTMLInputElement;\n\n const currentPref = this._periodPreferences[roleId] || {\n showDuration: true,\n showInstant: true,\n showPreviousYear: false,\n dimensionSelections: []\n };\n\n // Initialize dimensionSelections if not present\n if (!currentPref.dimensionSelections) {\n currentPref.dimensionSelections = [];\n }\n\n // Find or create dimension selection entry\n let dimensionSelection = currentPref.dimensionSelections.find(\n ds => ds.dimensionId === dimensionId\n );\n\n if (!dimensionSelection) {\n // Get dimension label\n const dimensions = this._getDimensionsForRole(roleId);\n const dimension = dimensions.find((d: any) => d.id === dimensionId);\n const dimensionLabel = dimension?.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimensionId;\n\n dimensionSelection = {\n dimensionId: dimensionId,\n dimensionLabel: dimensionLabel,\n selectedMemberIds: []\n };\n currentPref.dimensionSelections.push(dimensionSelection);\n }\n\n // Update selected members\n if (checkbox.checked) {\n if (!dimensionSelection.selectedMemberIds.includes(memberId)) {\n dimensionSelection.selectedMemberIds.push(memberId);\n }\n } else {\n dimensionSelection.selectedMemberIds = dimensionSelection.selectedMemberIds.filter(\n id => id !== memberId\n );\n }\n\n this._periodPreferences = {\n ...this._periodPreferences,\n [roleId]: currentPref\n };\n\n console.log('📊 [Admin Mode] Updated dimension selections:', this._periodPreferences[roleId].dimensionSelections);\n this.requestUpdate();\n }\n\n /**\n * Check if a dimension member is selected in admin mode\n * Returns true by default if no explicit preference exists (all members checked by default)\n */\n private _isAdminDimensionMemberSelected(roleId: string, dimensionId: string, memberId: string): boolean {\n const preferences = this._periodPreferences[roleId];\n if (!preferences?.dimensionSelections) {\n // No preferences set yet - default to all checked\n return true;\n }\n\n const dimensionSelection = preferences.dimensionSelections.find(\n ds => ds.dimensionId === dimensionId\n );\n\n if (!dimensionSelection) {\n // This dimension hasn't been explicitly configured - default to checked\n return true;\n }\n\n return dimensionSelection.selectedMemberIds.includes(memberId);\n }\n\n /**\n * Select all members for a dimension in admin mode\n */\n private _selectAllAdminDimensionMembers(roleId: string, dimensionId: string) {\n const dimensions = this._getDimensionsForRole(roleId);\n const dimension = dimensions.find((d: any) => d.id === dimensionId);\n if (!dimension) return;\n\n const allMembers = this._getAllDimensionMembers(dimension.members);\n const allMemberIds = allMembers.map((m: any) => m.id);\n\n const currentPref = this._periodPreferences[roleId] || {\n showDuration: true,\n showInstant: true,\n showPreviousYear: false,\n dimensionSelections: []\n };\n\n if (!currentPref.dimensionSelections) {\n currentPref.dimensionSelections = [];\n }\n\n // Find or create dimension selection entry\n let dimensionSelection = currentPref.dimensionSelections.find(\n ds => ds.dimensionId === dimensionId\n );\n\n if (!dimensionSelection) {\n const dimensionLabel = dimension.labels?.find((l: any) => l.role === 'http://www.xbrl.org/2003/role/label')?.label || dimensionId;\n dimensionSelection = {\n dimensionId: dimensionId,\n dimensionLabel: dimensionLabel,\n selectedMemberIds: []\n };\n currentPref.dimensionSelections.push(dimensionSelection);\n }\n\n dimensionSelection.selectedMemberIds = allMemberIds;\n\n this._periodPreferences = {\n ...this._periodPreferences,\n [roleId]: currentPref\n };\n\n this.requestUpdate();\n }\n\n /**\n * Deselect all members for a dimension in admin mode\n */\n private _deselectAllAdminDimensionMembers(roleId: string, dimensionId: string) {\n const currentPref = this._periodPreferences[roleId];\n if (!currentPref?.dimensionSelections) {\n return;\n }\n\n const dimensionSelection = currentPref.dimensionSelections.find(\n ds => ds.dimensionId === dimensionId\n );\n\n if (dimensionSelection) {\n dimensionSelection.selectedMemberIds = [];\n }\n\n this._periodPreferences = {\n ...this._periodPreferences,\n [roleId]: currentPref\n };\n\n this.requestUpdate();\n }\n\n private _handleAdminModeSubmit() {\n if (!this.xbrlInput?.presentation?.[0]?.roles) {\n console.error('No presentation data available');\n return;\n }\n\n // Create a deep copy of the presentation data\n const updatedPresentationData = JSON.parse(JSON.stringify(this.xbrlInput.presentation[0]));\n\n // Get IDs of selected roles (roles that user can configure in admin mode)\n const selectedRoleIds = new Set(\n this._currentSchema?.sections.map(s => s.id) || []\n );\n\n // Update each role with the new settings\n updatedPresentationData.roles = updatedPresentationData.roles.map((role: any) => {\n const isSelected = selectedRoleIds.has(role.id);\n const config = this._adminRoleConfigs[role.id];\n\n const updatedRole: any = {\n ...role,\n display: isSelected ? 'yes' : 'no'\n };\n\n // Only update configuration for selected roles\n if (config !== undefined && isSelected) {\n updatedRole.showPreviousYear = config.showPreviousYear;\n }\n\n return updatedRole;\n });\n\n // Get the saved metadata from localStorage\n const savedMetadata = this.dynaformsMetadata || this._loadMetadataFromLocalStorage();\n\n // Print the updated presentation data\n console.log('📋 Updated Presentation Data:', updatedPresentationData);\n console.log('📋 Metadata from localStorage:', savedMetadata);\n\n // Emit custom event with updated data including metadata\n this.dispatchEvent(new CustomEvent('admin-config-updated', {\n detail: {\n presentationData: updatedPresentationData,\n roleConfigs: this._adminRoleConfigs,\n metadata: savedMetadata\n },\n bubbles: true,\n composed: true\n }));\n\n console.log('✅ Admin configuration saved successfully with metadata');\n }\n\n private _loadMetadataFromLocalStorage(): any {\n try {\n const metadataStr = localStorage.getItem('jupiter-form-draft-metadata');\n if (metadataStr) {\n return JSON.parse(metadataStr);\n }\n } catch (error) {\n console.error('Failed to load metadata from localStorage:', error);\n }\n return null;\n }\n\n private _renderAccordionLayout(schema: XBRLFormSchema, config: ComponentConfig, showValidationSummary: boolean, errorCount: number) {\n return html`\n <div class=\"form-sections\">\n <!-- Validation Summary -->\n ${showValidationSummary ? html`\n <div class=\"validation-summary\">\n <h4 class=\"validation-summary-title\">${I18n.t('validation.summary')}</h4>\n <ul class=\"validation-summary-list\">\n ${this._errors\n .filter(e => e.severity === 'error')\n .map(error => html`\n <li class=\"validation-summary-item\">${error.message}</li>\n `)}\n </ul>\n </div>\n ` : ''}\n\n <!-- Form Sections or No Selection Message (hidden in admin mode) -->\n ${this.mode === 'admin' ? schema.sections.map((section, index) => html`\n <div class=\"admin-mode-placeholder\">\n ${this._renderAdminModeContent(section)}\n </div>\n `) : schema.sections.length === 0 ? html`\n <div class=\"no-roles-message\">\n <h3>${I18n.t('form.noRoleSelected')}</h3>\n <p>${I18n.t('filter.selectRoles')}</p>\n <p>${I18n.t('filter.roles')}: ${this._allSections.length}</p>\n </div>\n ` : (() => {\n const conceptMatchIds = this._getConceptSearchMatchIds(this._conceptSearchText);\n const hasConceptSearch = this._conceptSearchText.trim().length > 0;\n let sections = schema.sections;\n if (this.mode === 'readonly' || this._showFactsOnly) {\n sections = sections.filter(s => !this._isSectionBlank(s));\n }\n if (hasConceptSearch) {\n sections = sections.filter(s => this._isSectionConceptSearchMatch(s, conceptMatchIds));\n }\n return sections.map((section, index) => html`\n <jupiter-form-section\n section-id=\"${section.id}\"\n .section=\"${section}\"\n .columns=\"${section.columns || this._columns}\"\n .datatypes=\"${section.datatypes || this.xbrlInput?.datatypes}\"\n .formData=\"${this._formData}\"\n .periodData=\"${this._periodData}\"\n .unitData=\"${this._unitData}\"\n .decimalsData=\"${this._decimalsData}\"\n .globalDecimals=\"${this.decimals}\"\n .typedMemberData=\"${this._typedMemberData}\"\n .repeatCounts=\"${this._repeatCounts}\"\n .defaultUnits=\"${this.defaultUnits}\"\n .disabled=\"${this.disabled || this.readonly}\"\n .collapsible=\"${config.collapsibleSections !== false}\"\n .locale=\"${config.locale || 'en-US'}\"\n .language=\"${this.language}\"\n .isFirstSection=\"${index === 0}\"\n .availableDimensions=\"${this._getAvailableDimensionsForSection(section.id)}\"\n .mode=\"${this.mode}\"\n .showFactsOnly=\"${this._showFactsOnly}\"\n .conceptMatchIds=\"${hasConceptSearch ? conceptMatchIds : undefined}\"\n .masterData=\"${this._effectiveMasterData}\"\n .periodStartDate=\"${this.periodStartDate}\"\n .periodEndDate=\"${this.periodEndDate}\"\n @field-change=\"${this._handleFieldChange}\"\n @period-change=\"${this._handlePeriodChange}\"\n @typed-member-change=\"${this._handleTypedMemberChange}\"\n @add-concept-repeat=\"${this._handleAddConceptRepeat}\"\n @remove-concept-repeat=\"${this._handleRemoveConceptRepeat}\"\n @section-expand=\"${this._handleSectionExpand}\"\n @concept-expand=\"${this._handleConceptExpand}\"\n @column-remove=\"${this._handleColumnRemove}\"\n @column-add-request=\"${this._handleColumnAddRequest}\"\n ></jupiter-form-section>\n `);\n })()}\n </div>\n `;\n }\n\n private _renderSidePanelLayout(schema: XBRLFormSchema, config: ComponentConfig, showValidationSummary: boolean, errorCount: number) {\n const conceptMatchIds = this._getConceptSearchMatchIds(this._conceptSearchText);\n const hasConceptSearch = this._conceptSearchText.trim().length > 0;\n\n // In readonly/showFactsOnly mode, hide sections where all rows are blank\n let visibleSections = (this.mode === 'readonly' || this._showFactsOnly)\n ? schema.sections.filter(s => !this._isSectionBlank(s))\n : schema.sections;\n\n if (hasConceptSearch) {\n visibleSections = visibleSections.filter(s => this._isSectionConceptSearchMatch(s, conceptMatchIds));\n }\n\n // Apply search filter to visible sections\n const filteredSections = this._filterSidePanelSections(visibleSections);\n\n // Select first visible role by default if none selected or if current selection is not visible\n if (!this._activeSidePanelRoleId || !filteredSections.find(s => s.id === this._activeSidePanelRoleId)) {\n this._activeSidePanelRoleId = filteredSections.length > 0 ? filteredSections[0].id : null;\n }\n\n const activeSection = visibleSections.find(s => s.id === this._activeSidePanelRoleId);\n\n return html`\n <div class=\"side-panel-layout\">\n <!-- Left: Roles List (filtered) -->\n <div class=\"side-panel-roles-list ${this._sidePanelCollapsed ? 'collapsed' : ''}\">\n <!-- Toggle Button -->\n <button \n class=\"side-panel-toggle-btn ${this._sidePanelCollapsed ? 'collapsed' : ''}\"\n @click=\"${this._toggleSidePanelCollapse}\"\n title=\"${this._sidePanelCollapsed ? I18n.t('form.expandPanel') : I18n.t('form.collapsePanel')}\"\n >\n <svg viewBox=\"0 0 24 24\">\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/>\n </svg>\n </button>\n \n ${!this._sidePanelCollapsed ? html`\n <!-- Search Input -->\n <div class=\"side-panel-search-container\">\n <input\n type=\"text\"\n class=\"side-panel-search-input\"\n placeholder=\"${I18n.t('filter.searchPlaceholder')}\"\n .value=\"${this._sidePanelSearchQuery}\"\n @input=\"${this._handleSidePanelSearchInput}\"\n />\n ${this._sidePanelSearchQuery ? html`\n <button class=\"side-panel-clear-search\" @click=\"${this._clearSidePanelSearch}\" title=\"${I18n.t('filter.clearSearch')}\">\n ×\n </button>\n ` : html`\n <svg class=\"side-panel-search-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"/>\n </svg>\n `}\n </div>\n \n <!-- Search Results Info -->\n ${this._sidePanelSearchQuery.trim() && filteredSections.length !== visibleSections.length ? html`\n <div class=\"side-panel-search-results-info\">\n ${filteredSections.length} ${I18n.t('filter.of')} ${visibleSections.length} ${I18n.t('filter.roles')}\n </div>\n ` : ''}\n \n <!-- Roles List -->\n ${filteredSections.length === 0 ? html`\n <div class=\"side-panel-no-results\">\n ${I18n.t('filter.noRolesFound')} \"${this._sidePanelSearchQuery}\"<br>\n ${I18n.t('filter.tryDifferentSearch')}\n </div>\n ` : html`\n ${filteredSections.map(section => {\n const hasErrors = this._roleHasErrors(section.id);\n const borderStatus = this._roleBorderStatuses.get(section.id);\n\n const isManuallyCompleted = this._roleCompletedStates.get(section.id) === true;\n // Priority: manually completed (green) > errors (red) > untouched (gray) > incomplete (orange) > analysis-complete (green)\n const statusClass = isManuallyCompleted ? 'has-complete-data' :\n hasErrors ? 'has-errors' :\n borderStatus === 'untouched' ? 'has-no-data' :\n borderStatus === 'incomplete' ? 'has-empty-fields' :\n borderStatus === 'complete' ? 'has-complete-data' : '';\n\n return html`\n <div \n class=\"side-panel-role-item ${section.id === this._activeSidePanelRoleId ? 'active' : ''} ${statusClass}\"\n @click=\"${() => this._handleSidePanelRoleClick(section.id)}\"\n @contextmenu=\"${(e: MouseEvent) => this._handleRoleContextMenu(e, section.id, section.title)}\"\n >\n ${section.title}\n </div>\n `;\n })}\n `}\n ` : ''}\n </div>\n\n <!-- Right: Active Section Content -->\n <div class=\"side-panel-content\">\n <div class=\"form-sections\">\n <!-- Validation Summary -->\n ${showValidationSummary ? html`\n <div class=\"validation-summary\">\n <h4 class=\"validation-summary-title\">Please fix the following errors:</h4>\n <ul class=\"validation-summary-list\">\n ${this._errors\n .filter(e => e.severity === 'error')\n .map(error => html`\n <li class=\"validation-summary-item\">${error.message}</li>\n `)}\n </ul>\n </div>\n ` : ''}\n\n <!-- Active Section (hidden in admin mode) -->\n ${this.mode === 'admin' ? html`\n <div class=\"admin-mode-placeholder\">\n ${this._renderAdminModeContent(activeSection)}\n </div>\n ` : activeSection ? html`\n <jupiter-form-section\n section-id=\"${activeSection.id}\"\n .section=\"${activeSection}\"\n .columns=\"${activeSection.columns || this._columns}\"\n .datatypes=\"${activeSection.datatypes || this.xbrlInput?.datatypes}\"\n .formData=\"${this._formData}\"\n .periodData=\"${this._periodData}\"\n .unitData=\"${this._unitData}\"\n .decimalsData=\"${this._decimalsData}\"\n .globalDecimals=\"${this.decimals}\"\n .typedMemberData=\"${this._typedMemberData}\"\n .repeatCounts=\"${this._repeatCounts}\"\n .defaultUnits=\"${this.defaultUnits}\"\n .disabled=\"${this.disabled || this.readonly}\"\n .collapsible=\"${false}\"\n .hideHeader=\"${true}\"\n .locale=\"${config.locale || 'en-US'}\"\n .language=\"${this.language}\"\n .isFirstSection=\"${true}\"\n .availableDimensions=\"${this._getAvailableDimensionsForSection(activeSection.id)}\"\n .mode=\"${this.mode}\"\n .showFactsOnly=\"${this._showFactsOnly}\"\n .conceptMatchIds=\"${hasConceptSearch ? conceptMatchIds : undefined}\"\n .masterData=\"${this._effectiveMasterData}\"\n .periodStartDate=\"${this.periodStartDate}\"\n .periodEndDate=\"${this.periodEndDate}\"\n @field-change=\"${this._handleFieldChange}\"\n @typed-member-change=\"${this._handleTypedMemberChange}\"\n @add-concept-repeat=\"${this._handleAddConceptRepeat}\"\n @remove-concept-repeat=\"${this._handleRemoveConceptRepeat}\"\n @section-expand=\"${this._handleSectionExpand}\"\n @concept-expand=\"${this._handleConceptExpand}\"\n @column-remove=\"${this._handleColumnRemove}\"\n @column-add-request=\"${this._handleColumnAddRequest}\"\n ></jupiter-form-section>\n <div class=\"role-completion-row\">\n <input\n type=\"checkbox\"\n id=\"role-complete-${activeSection.id}\"\n .checked=\"${this._roleCompletedStates.get(activeSection.id) === true}\"\n @change=\"${(e: Event) => this._handleRoleCompletedChange(activeSection.id, (e.target as HTMLInputElement).checked)}\"\n >\n <label for=\"role-complete-${activeSection.id}\">${I18n.t('form.markAsComplete')}</label>\n </div>\n ` : html`\n <div class=\"no-roles-message\">\n <h3>${I18n.t('form.noRoleSelected')}</h3>\n <p>${I18n.t('form.pleaseSelectRole')}</p>\n </div>\n `}\n </div>\n </div>\n </div>\n `;\n }\n\n // Public API methods\n public getData(): FormData {\n return { ...this._formData };\n }\n\n public setData(data: FormData) {\n this._formData = { ...data };\n this._dirty = true;\n this._validateForm();\n this.requestUpdate();\n }\n\n public validate(): boolean {\n this._validateForm();\n return this._valid;\n }\n\n /**\n * Updates the validation status and footer UI accordingly.\n * Called by the hosting application after triggering external validation.\n * @param status 'inProgress' | 'cancel' | 'complete'\n */\n public setValidation(status: 'inProgress' | 'cancel' | 'complete'): void {\n console.log(`🔍 Validation status updated: ${status}`);\n if (status === 'cancel') {\n this._validationStatus = 'idle';\n } else {\n this._validationStatus = status;\n }\n this.requestUpdate();\n }\n\n public reset() {\n this._handleReset();\n }\n\n public getState(): FormState {\n return this._getFormState();\n }\n\n render() {\n const errorCount = this._errors.filter(e => e.severity === 'error').length;\n const config = this.config || {};\n const showValidationSummary = config.showValidationSummary !== false &&\n errorCount > 0 &&\n this._submitted;\n\n const schema = this._currentSchema;\n if (!schema) {\n return html`<div>${I18n.t('form.loading')}</div>`;\n }\n\n return html`\n <div class=\"form-container\">\n <!-- Form Header - Hidden in side panel mode -->\n ${this.display !== 'sidePanel' ? html`\n <div class=\"form-header\">\n <h1 class=\"form-title\">${schema.title}</h1>\n ${schema.description ? html`\n <p class=\"form-description\">${schema.description}</p>\n ` : ''}\n </div>\n ` : ''}\n\n <!-- Form Content -->\n ${this.display === 'sidePanel' ? this._renderSidePanelLayout(schema, config, showValidationSummary, errorCount) : this._renderAccordionLayout(schema, config, showValidationSummary, errorCount)}\n\n <!-- Form Actions - Fixed Footer (hidden in readonly mode) -->\n ${this.mode !== 'readonly' ? html`\n <div class=\"form-actions\">\n <!-- Filter Roles Button (shown when more than 10 roles) -->\n ${this._shouldShowFilterButton() ? html`\n <button \n class=\"filter-roles-button\"\n @click=\"${this._handleFilterRolesClick}\"\n ?disabled=\"${this.disabled || this.readonly}\"\n >\n <svg class=\"filter-icon\" viewBox=\"0 0 24 24\">\n <path d=\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\"/>\n </svg>\n ${this._selectedRoleIds.length === 0 ? I18n.t('filter.selectRoles') : I18n.t('filter.filterRoles')}\n <span class=\"roles-count\">${this._selectedRoleIds.length}/${this._allSections.length}</span>\n </button>\n ` : ''}\n \n ${this.mode !== 'admin' ? html`\n <button \n class=\"btn-secondary\"\n @click=\"${this._handleSaveDraft}\"\n ?disabled=\"${this.disabled || this.readonly || this.isDraftSaving}\"\n >\n ${this.isDraftSaving ? I18n.t('form.savingDraft') : I18n.t('form.saveDraft')}\n </button>\n ` : ''}\n \n\n <!-- Validation state buttons -->\n ${this._validationStatus === 'inProgress' ? html`\n <button\n class=\"btn-preview\"\n @click=\"${() => this.dispatchEvent(new CustomEvent('showPreview', { bubbles: true, composed: true }))}\"\n ?disabled=\"${this.disabled || this.readonly}\"\n >\n ${I18n.t('form.preview')}\n </button>\n ` : ''}\n\n ${this._validationStatus === 'complete' || this.showLastValidationResultBtn ? html`\n <button\n class=\"btn-secondary btn-last-results\"\n @click=\"${() => this.dispatchEvent(new CustomEvent('show-validation-results', { bubbles: true, composed: true }))}\"\n ?disabled=\"${this.disabled || this.readonly}\"\n >\n ${I18n.t('form.lastValidationResults')}\n </button>\n ` : ''}\n\n\n <button\n class=\"btn-primary\"\n @click=\"${this._handleSubmit}\"\n ?disabled=\"${this.disabled || this.readonly || this._submitDisabled || this._validationStatus === 'inProgress'}\"\n >\n ${this.submitButtonLabel || (this.mode === 'admin' ? I18n.t('form.save') : I18n.t('form.submit'))}\n </button>\n\n </div>\n ` : ''}\n\n <!-- Filter Roles Dialog -->\n ${this._showFilterDialog ? html`\n <jupiter-filter-roles-dialog\n ?open=\"${this._showFilterDialog}\"\n .availableRoles=\"${this._allSections}\"\n .selectedRoleIds=\"${this._getRoleIdsArray()}\"\n .periodPreferences=\"${this._periodPreferences}\"\n .hypercubeData=\"${this.xbrlInput?.hypercubes}\"\n .mode=\"${this.mode}\"\n .showFactsOnly=\"${this._showFactsOnly}\"\n .conceptSearchText=\"${this._conceptSearchText}\"\n @dialog-cancel=\"${this._handleFilterDialogCancel}\"\n @roles-filter-apply=\"${this._handleRoleFilterApply}\"\n @advanced-filter-apply=\"${this._handleAdvancedFilterApply}\"\n @click=\"${this._handleFilterDialogCancel}\"\n ></jupiter-filter-roles-dialog>\n ` : ''}\n \n <!-- Validation Error Popup -->\n ${this._showErrorPopup ? html`\n <div class=\"error-popup-overlay\" @click=\"${() => { this._showErrorPopup = false; this.requestUpdate(); }}\">\n <div class=\"error-popup\" @click=\"${(e: Event) => e.stopPropagation()}\">\n <div class=\"error-popup-header\">\n <h3>⚠️ ${I18n.t('error.popup.title')}</h3>\n <button class=\"error-popup-close\" @click=\"${() => { this._showErrorPopup = false; this.requestUpdate(); }}\">×</button>\n </div>\n <div class=\"error-popup-content\">\n <p>${I18n.t('error.popup.message')}</p>\n <ul class=\"error-list\">\n ${this._xbrlFormErrors.map(error => {\n const concept = this._findConceptInAllSections(error.conceptId);\n const column = this._findColumnById(error.columnId);\n const fieldLabel = concept?.label || error.conceptId;\n const columnTitle = column?.title || error.columnId;\n return html`\n <li>\n <strong>${I18n.t('error.popup.field')}</strong>\n <a\n href=\"javascript:void(0)\"\n class=\"error-field-link\"\n @click=\"${() => this._handleErrorFieldClick(error.conceptId, error.columnId, error.sectionId)}\"\n title=\"${I18n.t('error.popup.clickToFocus')}\"\n >\n ${fieldLabel} (${columnTitle})\n </a><br>\n <strong>${I18n.t('error.popup.value')}</strong> ${error.value}<br>\n <strong>${I18n.t('error.popup.errors')}</strong>\n <ul>\n ${error.errors.map(err => html`<li>${err.message}</li>`)}\n </ul>\n </li>\n `; })}\n </ul>\n </div>\n <div class=\"error-popup-footer\">\n <button class=\"btn-primary\" @click=\"${() => { this._showErrorPopup = false; this.requestUpdate(); }}\">${I18n.t('error.popup.ok')}</button>\n </div>\n </div>\n </div>\n ` : ''}\n \n <!-- Role Context Menu -->\n ${this._showRoleContextMenu ? html`\n <div \n class=\"role-context-menu\"\n style=\"left: ${this._contextMenuX}px; top: ${this._contextMenuY}px;\"\n @click=\"${(e: Event) => { e.stopPropagation(); }}\"\n >\n <div \n class=\"context-menu-item danger\"\n @click=\"${() => this._handleRemoveRole()}\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\"/>\n </svg>\n Remove\n </div>\n </div>\n ` : ''}\n </div>\n `;\n }\n}\n","// Main entry point for Jupiter Dynamic Forms\nexport * from './core/dynamic-form';\nexport * from './core/form-section';\nexport * from './core/concept-tree';\nexport * from './core/form-field';\nexport * from './core/add-column-dialog';\nexport * from './core/filter-roles-dialog';\nexport * from './core/advanced-filter';\nexport * from './schema/types';\nexport * from './utils/validation';\nexport * from './utils/xbrl-validation';\nexport * from './utils/type-input-mapping';\nexport * from './utils/fact-matcher';\n\n// Register all custom elements\nimport './core/dynamic-form';\nimport './core/form-section';\nimport './core/concept-tree';\nimport './core/form-field';\nimport './core/add-column-dialog';\nimport './core/filter-roles-dialog';\nimport './core/advanced-filter';\n\n// Version export\nexport const version = '1.5.0';\n"],"names":["t","e","o","s","r","n","c","i","h","_a","error","l","section","column","field","item","d","axisLabel","dimensionInfo","columns","f","validation","u","__decorateClass","property","state","customElement","next","dimensions","dimension","_b","a","b","customElements","draft","_c"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","x_google_ignoreList":[0,1,2,3,4]}
|