@memberjunction/ng-core-entity-forms 5.34.1 → 5.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/custom/Lists/list-form.component.d.ts +6 -0
- package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.js +271 -204
- package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.d.ts +25 -1
- package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.js +898 -547
- package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts +56 -1
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.js +1647 -788
- package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
- package/dist/lib/custom/custom-forms.module.d.ts +25 -24
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
- package/dist/lib/custom/custom-forms.module.js +4 -0
- package/dist/lib/custom/custom-forms.module.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +178 -176
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentAction/mjaiagentaction.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJAIAgentAction/mjaiagentaction.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentDataSource/mjaiagentdatasource.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJAIAgentDataSource/mjaiagentdatasource.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentExample/mjaiagentexample.form.component.js +3 -3
- package/dist/lib/generated/Entities/MJAIAgentExample/mjaiagentexample.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentLearningCycle/mjaiagentlearningcycle.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAIAgentLearningCycle/mjaiagentlearningcycle.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentNote/mjaiagentnote.form.component.js +3 -3
- package/dist/lib/generated/Entities/MJAIAgentNote/mjaiagentnote.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentPermission/mjaiagentpermission.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAIAgentPermission/mjaiagentpermission.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentPrompt/mjaiagentprompt.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAIAgentPrompt/mjaiagentprompt.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRelationship/mjaiagentrelationship.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRelationship/mjaiagentrelationship.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRequest/mjaiagentrequest.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRequest/mjaiagentrequest.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +6 -6
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRunMedia/mjaiagentrunmedia.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRunMedia/mjaiagentrunmedia.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentSearchScope/mjaiagentsearchscope.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJAIAgentSearchScope/mjaiagentsearchscope.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentStep/mjaiagentstep.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJAIAgentStep/mjaiagentstep.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentType/mjaiagenttype.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJAIAgentType/mjaiagenttype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIArchitecture/mjaiarchitecture.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAIArchitecture/mjaiarchitecture.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIConfiguration/mjaiconfiguration.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAIConfiguration/mjaiconfiguration.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIModelCost/mjaimodelcost.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAIModelCost/mjaimodelcost.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIModelModality/mjaimodelmodality.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAIModelModality/mjaimodelmodality.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIModelType/mjaimodeltype.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAIModelType/mjaimodeltype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js +3 -3
- package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIPromptModel/mjaipromptmodel.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJAIPromptModel/mjaipromptmodel.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +3 -3
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIPromptRunMedia/mjaipromptrunmedia.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAIPromptRunMedia/mjaipromptrunmedia.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIResultCache/mjairesultcache.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJAIResultCache/mjairesultcache.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIVendorType/mjaivendortype.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAIVendorType/mjaivendortype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAPIKey/mjapikey.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAPIKey/mjapikey.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAPIKeyUsageLog/mjapikeyusagelog.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAPIKeyUsageLog/mjapikeyusagelog.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAccessControlRule/mjaccesscontrolrule.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJAccessControlRule/mjaccesscontrolrule.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJActionExecutionLog/mjactionexecutionlog.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJActionExecutionLog/mjactionexecutionlog.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJArchiveConfiguration/mjarchiveconfiguration.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJArchiveConfiguration/mjarchiveconfiguration.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJArchiveConfigurationEntity/mjarchiveconfigurationentity.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJArchiveConfigurationEntity/mjarchiveconfigurationentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJArchiveRun/mjarchiverun.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJArchiveRun/mjarchiverun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJArchiveRunDetail/mjarchiverundetail.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJArchiveRunDetail/mjarchiverundetail.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJArtifactType/mjartifacttype.form.component.js +43 -37
- package/dist/lib/generated/Entities/MJArtifactType/mjartifacttype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJArtifactVersion/mjartifactversion.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJArtifactVersion/mjartifactversion.form.component.js +52 -32
- package/dist/lib/generated/Entities/MJArtifactVersion/mjartifactversion.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJArtifactVersionAttribute/mjartifactversionattribute.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJArtifactVersionAttribute/mjartifactversionattribute.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCollection/mjcollection.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJCollection/mjcollection.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCommunicationLog/mjcommunicationlog.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJCommunicationLog/mjcommunicationlog.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCommunicationRun/mjcommunicationrun.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJCommunicationRun/mjcommunicationrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCompanyIntegration/mjcompanyintegration.form.component.js +3 -3
- package/dist/lib/generated/Entities/MJCompanyIntegration/mjcompanyintegration.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCompanyIntegrationEntityMap/mjcompanyintegrationentitymap.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJCompanyIntegrationEntityMap/mjcompanyintegrationentitymap.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCompanyIntegrationRun/mjcompanyintegrationrun.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJCompanyIntegrationRun/mjcompanyintegrationrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCompanyIntegrationRunAPILog/mjcompanyintegrationrunapilog.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJCompanyIntegrationRunAPILog/mjcompanyintegrationrunapilog.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCompanyIntegrationRunDetail/mjcompanyintegrationrundetail.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJCompanyIntegrationRunDetail/mjcompanyintegrationrundetail.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJComponentLibrary/mjcomponentlibrary.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJComponentLibrary/mjcomponentlibrary.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentProcessRunDetail/mjcontentprocessrundetail.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJContentProcessRunDetail/mjcontentprocessrundetail.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js +3 -3
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversationDetailAttachment/mjconversationdetailattachment.form.component.js +8 -6
- package/dist/lib/generated/Entities/MJConversationDetailAttachment/mjconversationdetailattachment.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJDashboard/mjdashboard.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJDashboard/mjdashboard.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJDashboardCategoryPermission/mjdashboardcategorypermission.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJDashboardCategoryPermission/mjdashboardcategorypermission.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJDashboardUserPreference/mjdashboarduserpreference.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJDashboardUserPreference/mjdashboarduserpreference.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJDataContextItem/mjdatacontextitem.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJDataContextItem/mjdatacontextitem.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJDatasetItem/mjdatasetitem.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJDatasetItem/mjdatasetitem.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJDuplicateRun/mjduplicaterun.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJDuplicateRun/mjduplicaterun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEmployee/mjemployee.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJEmployee/mjemployee.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +5 -5
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js +3 -3
- package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityOrganicKey/mjentityorganickey.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJEntityOrganicKey/mjentityorganickey.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityOrganicKeyRelatedEntity/mjentityorganickeyrelatedentity.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJEntityOrganicKeyRelatedEntity/mjentityorganickeyrelatedentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityPermission/mjentitypermission.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJEntityPermission/mjentitypermission.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityRecordDocument/mjentityrecorddocument.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJEntityRecordDocument/mjentityrecorddocument.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityRelationship/mjentityrelationship.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJEntityRelationship/mjentityrelationship.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEnvironment/mjenvironment.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJEnvironment/mjenvironment.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJErrorLog/mjerrorlog.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJErrorLog/mjerrorlog.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJGeneratedCode/mjgeneratedcode.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJGeneratedCode/mjgeneratedcode.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJIntegrationObjectField/mjintegrationobjectfield.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJIntegrationObjectField/mjintegrationobjectfield.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJIntegrationURLFormat/mjintegrationurlformat.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJIntegrationURLFormat/mjintegrationurlformat.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJKnowledgeHubSavedSearch/mjknowledgehubsavedsearch.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJKnowledgeHubSavedSearch/mjknowledgehubsavedsearch.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJList/mjlist.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJList/mjlist.form.component.js +45 -27
- package/dist/lib/generated/Entities/MJList/mjlist.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJListCategory/mjlistcategory.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJListCategory/mjlistcategory.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJMCPServer/mjmcpserver.form.component.js +3 -3
- package/dist/lib/generated/Entities/MJMCPServer/mjmcpserver.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJMCPServerConnection/mjmcpserverconnection.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJMCPServerConnection/mjmcpserverconnection.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJMCPServerTool/mjmcpservertool.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJMCPServerTool/mjmcpservertool.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJMCPToolExecutionLog/mjmcptoolexecutionlog.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJMCPToolExecutionLog/mjmcptoolexecutionlog.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJPermissionDomain/mjpermissiondomain.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJPermissionDomain/mjpermissiondomain.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJPublicLink/mjpubliclink.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJPublicLink/mjpubliclink.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJQueue/mjqueue.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJQueue/mjqueue.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJQueueTask/mjqueuetask.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJQueueTask/mjqueuetask.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRecommendationRun/mjrecommendationrun.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJRecommendationRun/mjrecommendationrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRecordChange/mjrecordchange.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJRecordChange/mjrecordchange.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRecordGeoCode/mjrecordgeocode.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJRecordGeoCode/mjrecordgeocode.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRecordLink/mjrecordlink.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJRecordLink/mjrecordlink.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRecordMergeLog/mjrecordmergelog.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJRecordMergeLog/mjrecordmergelog.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJReport/mjreport.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJReport/mjreport.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJResourcePermission/mjresourcepermission.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJResourcePermission/mjresourcepermission.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJResourceType/mjresourcetype.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJResourceType/mjresourcetype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJScheduledAction/mjscheduledaction.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJScheduledAction/mjscheduledaction.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJScheduledJob/mjscheduledjob.form.component.js +3 -3
- package/dist/lib/generated/Entities/MJScheduledJob/mjscheduledjob.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJScheduledJobRun/mjscheduledjobrun.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJScheduledJobRun/mjscheduledjobrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJSearchExecutionLog/mjsearchexecutionlog.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJSearchExecutionLog/mjsearchexecutionlog.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJSearchProvider/mjsearchprovider.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJSearchProvider/mjsearchprovider.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJSearchScope/mjsearchscope.form.component.js +3 -3
- package/dist/lib/generated/Entities/MJSearchScope/mjsearchscope.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJSearchScopeEntity/mjsearchscopeentity.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJSearchScopeEntity/mjsearchscopeentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJSearchScopeExternalIndex/mjsearchscopeexternalindex.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJSearchScopeExternalIndex/mjsearchscopeexternalindex.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJSearchScopeProvider/mjsearchscopeprovider.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJSearchScopeProvider/mjsearchscopeprovider.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJSearchScopeTestQuery/mjsearchscopetestquery.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJSearchScopeTestQuery/mjsearchscopetestquery.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTag/mjtag.form.component.js +3 -3
- package/dist/lib/generated/Entities/MJTag/mjtag.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTagSuggestion/mjtagsuggestion.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJTagSuggestion/mjtagsuggestion.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTask/mjtask.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJTask/mjtask.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTemplate/mjtemplate.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJTemplate/mjtemplate.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTemplateCategory/mjtemplatecategory.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJTemplateCategory/mjtemplatecategory.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTemplateParam/mjtemplateparam.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJTemplateParam/mjtemplateparam.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTestRunOutput/mjtestrunoutput.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJTestRunOutput/mjtestrunoutput.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTestSuite/mjtestsuite.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJTestSuite/mjtestsuite.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTestSuiteRun/mjtestsuiterun.form.component.js +4 -4
- package/dist/lib/generated/Entities/MJTestSuiteRun/mjtestsuiterun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +123 -105
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUserNotificationType/mjusernotificationtype.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJUserNotificationType/mjusernotificationtype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUserRecordLog/mjuserrecordlog.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJUserRecordLog/mjuserrecordlog.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUserView/mjuserview.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJUserView/mjuserview.form.component.js +27 -9
- package/dist/lib/generated/Entities/MJUserView/mjuserview.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUserViewCategory/mjuserviewcategory.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJUserViewCategory/mjuserviewcategory.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJVectorIndex/mjvectorindex.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJVectorIndex/mjvectorindex.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJVersionInstallation/mjversioninstallation.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJVersionInstallation/mjversioninstallation.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJVersionLabel/mjversionlabel.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJVersionLabel/mjversionlabel.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJWorkspace/mjworkspace.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJWorkspace/mjworkspace.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJWorkspaceItem/mjworkspaceitem.form.component.js +1 -1
- package/dist/lib/generated/Entities/MJWorkspaceItem/mjworkspaceitem.form.component.js.map +1 -1
- package/package.json +37 -36
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-suite-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Tests/test-suite-form.component.ts","../../../../src/lib/custom/Tests/test-suite-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, HostListener, AfterViewInit, ViewChild, ViewContainerRef, ElementRef, inject } from '@angular/core';\nimport * as d3 from 'd3';\nimport { Subject } from 'rxjs';\nimport { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { CompositeKey, Metadata, RunView } from '@memberjunction/core';\nimport { MJTestSuiteEntity, MJTestSuiteTestEntity, MJTestSuiteRunEntity, MJTestRunEntity, MJTestRunFeedbackEntity, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { SharedService, NavigationService } from '@memberjunction/ng-shared';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { MJTestSuiteFormComponent } from '../../generated/Entities/MJTestSuite/mjtestsuite.form.component';\nimport {\n TestingDialogService,\n TagsHelper,\n TestRunComparison,\n EvaluationPreferencesService,\n EvaluationPreferences\n} from '@memberjunction/ng-testing';\n\n/** Settings key for keyboard shortcuts visibility */\nconst SHORTCUTS_SETTINGS_KEY = '__mj.Testing.ShowKeyboardShortcuts';\n\n@RegisterClass(BaseFormComponent, 'MJ: Test Suites')\n@Component({\n standalone: false,\n selector: 'mj-test-suite-form',\n templateUrl: './test-suite-form.component.html',\n styleUrls: ['./test-suite-form.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MJTestSuiteFormComponentExtended extends MJTestSuiteFormComponent implements OnInit, OnDestroy, AfterViewInit {\n public override record!: MJTestSuiteEntity;\n\n private destroy$ = new Subject<void>();\n\n // UI state\n activeTab = 'overview';\n loading = false;\n loadingTests = false;\n loadingRuns = false;\n loadingAnalytics = false;\n loadingCompare = false;\n testsLoaded = false;\n runsLoaded = false;\n analyticsLoaded = false;\n isRefreshing = false;\n error: string | null = null;\n\n // Related data\n suiteTests: MJTestSuiteTestEntity[] = [];\n suiteRuns: MJTestSuiteRunEntity[] = [];\n\n // Analytics data\n analyticsData: AnalyticsDataPoint[] = [];\n uniqueTags: string[] = [];\n selectedTags: string[] = []; // Multi-select: empty array means \"All Tags\"\n analyticsTimeRange: '7d' | '30d' | '90d' | 'all' = '30d';\n analyticsView: 'summary' | 'matrix' | 'chart' = 'summary';\n matrixData: MatrixDataPoint[] = [];\n loadingMatrix = false;\n matrixLoaded = false;\n\n // Chart\n @ViewChild('chartContainer') chartContainer!: ElementRef<HTMLDivElement>;\n private chartRendered = false;\n\n // Compare data\n compareRunA: MJTestSuiteRunEntity | null = null;\n compareRunB: MJTestSuiteRunEntity | null = null;\n compareResults: TestRunComparison[] = [];\n compareRunATests: MJTestRunEntity[] = [];\n compareRunBTests: MJTestRunEntity[] = [];\n\n // Keyboard shortcuts\n keyboardShortcutsEnabled = true;\n showShortcuts = false; // Hidden by default\n private shortcutsSettingEntity: MJUserSettingEntity | null = null;\n private get metadata() { return this.ProviderToUse; }\n // Evaluation preferences\n evalPreferences: EvaluationPreferences = { showExecution: true, showHuman: true, showAuto: false };\n\n // Filter collapse state\n filtersCollapsed = false;\n\n // Matrix sorting\n matrixSortBy: 'sequence' | 'name' = 'sequence';\n matrixSortAsc = true;\n\n // Matrix row selection\n selectedMatrixTestId: string | null = null;\n\n // Matrix test name filter\n matrixTestFilter = '';\n private matrixFilterSubject$ = new Subject<string>();\n\n // Service injections\n private navigationService = inject(NavigationService);\n public testingDialogService = inject(TestingDialogService);\n private evalPrefsService = inject(EvaluationPreferencesService);\n private viewContainerRef = inject(ViewContainerRef);\n private appManager = inject(ApplicationManager);\n\n async ngOnInit() {\n await super.ngOnInit();\n this.loadShortcutsSetting();\n\n // Subscribe to evaluation preferences\n this.evalPrefsService.preferences$\n .pipe(takeUntil(this.destroy$))\n .subscribe(prefs => {\n this.evalPreferences = prefs;\n this.cdr.markForCheck();\n // Re-render chart when preferences change (D3 chart needs manual update)\n if (this.chartRendered && this.analyticsView === 'chart') {\n this.renderChart();\n }\n });\n\n // Subscribe to matrix filter with debounce\n this.matrixFilterSubject$\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n )\n .subscribe(value => {\n this.matrixTestFilter = value;\n this.cdr.markForCheck();\n });\n\n // Subscribe to panel state changes so the slide panel renders in this form\n this.testingDialogService.PanelStateChanged$\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n this.cdr.detectChanges();\n });\n }\n\n ngAfterViewInit() {\n // Initialize any view-dependent logic\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // Keyboard shortcuts\n @HostListener('document:keydown', ['$event'])\n handleKeyboardShortcut(event: KeyboardEvent) {\n if (!this.keyboardShortcutsEnabled) return;\n\n // Cmd/Ctrl + R: Refresh\n if ((event.metaKey || event.ctrlKey) && event.key === 'r' && !event.shiftKey) {\n event.preventDefault();\n this.refresh();\n return;\n }\n\n // Cmd/Ctrl + Enter: Run suite\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault();\n this.runSuite();\n return;\n }\n\n // Number keys for tabs (1-5)\n if (!event.metaKey && !event.ctrlKey && !event.altKey) {\n switch (event.key) {\n case '1': this.changeTab('overview'); break;\n case '2': this.changeTab('tests'); break;\n case '3': this.changeTab('runs'); break;\n case '4': this.changeTab('analytics'); break;\n case '5': this.changeTab('compare'); break;\n }\n }\n }\n\n changeTab(tab: string) {\n this.activeTab = tab;\n if (tab === 'tests' && !this.testsLoaded) this.loadTests();\n if (tab === 'runs' && !this.runsLoaded) this.loadRuns();\n if (tab === 'analytics' && !this.analyticsLoaded) this.loadAnalytics();\n this.cdr.markForCheck();\n }\n\n private async loadTests() {\n if (this.testsLoaded) return;\n\n this.loadingTests = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJTestSuiteTestEntity>({\n EntityName: 'MJ: Test Suite Tests',\n ExtraFilter: `SuiteID='${this.record.ID}'`,\n OrderBy: 'Sequence',\n ResultType: 'entity_object'\n });\n if (result.Success) this.suiteTests = result.Results || [];\n this.testsLoaded = true;\n } catch (error) {\n console.error('Error loading tests:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load tests', 'error', 3000);\n } finally {\n this.loadingTests = false;\n this.cdr.markForCheck();\n }\n }\n\n private async loadRuns() {\n if (this.runsLoaded) return;\n\n this.loadingRuns = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJTestSuiteRunEntity>({\n EntityName: 'MJ: Test Suite Runs',\n ExtraFilter: `SuiteID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 50,\n ResultType: 'entity_object'\n });\n if (result.Success) this.suiteRuns = result.Results || [];\n this.runsLoaded = true;\n } catch (error) {\n console.error('Error loading runs:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load runs', 'error', 3000);\n } finally {\n this.loadingRuns = false;\n this.cdr.markForCheck();\n }\n }\n\n getStatusColor(): string {\n switch (this.record.Status) {\n case 'Active': return '#10b981';\n case 'Disabled': return '#6b7280';\n case 'Pending': return '#f59e0b';\n default: return '#9ca3af';\n }\n }\n\n getStatusClass(): string {\n return `status-${this.record.Status?.toLowerCase() || 'unknown'}`;\n }\n\n getRunStatusColor(status: string): string {\n switch (status) {\n case 'Completed': return '#10b981';\n case 'Failed': return '#ef4444';\n case 'Running': return '#3b82f6';\n case 'Pending': return '#8b5cf6';\n case 'Cancelled': return '#6b7280';\n default: return '#9ca3af';\n }\n }\n\n formatTimeout(ms: number | null): string {\n if (ms === null || ms === undefined) return 'Default (5 min)';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000) {\n const mins = Math.floor(ms / 60000);\n const secs = Math.floor((ms % 60000) / 1000);\n return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;\n }\n const hours = Math.floor(ms / 3600000);\n const mins = Math.floor((ms % 3600000) / 60000);\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n }\n\n getRelativeTime(date: Date | string | null): string {\n if (!date) return 'N/A';\n const d = new Date(date);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return d.toLocaleDateString();\n }\n\n getPassRate(run: MJTestSuiteRunEntity): number {\n const total = run.TotalTests || 0;\n const passed = run.PassedTests || 0;\n if (total === 0) return 0;\n return (passed / total) * 100;\n }\n\n openTest(testId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Tests', CompositeKey.FromID(testId));\n }\n\n openSuiteRun(runId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Suite Runs', CompositeKey.FromID(runId));\n }\n\n navigateToTestingDashboard(): void {\n const testingApp = this.appManager.GetAppByName('Testing');\n if (testingApp) {\n this.navigationService.SwitchToApp(testingApp.ID);\n }\n }\n\n async runSuite() {\n if (this.record?.ID) {\n this.testingDialogService.OpenSuitePanel(this.record.ID);\n }\n }\n\n OnPanelClosed(): void {\n this.testingDialogService.ClosePanel();\n this.cdr.markForCheck();\n }\n\n async refresh() {\n this.isRefreshing = true;\n this.cdr.markForCheck();\n\n try {\n await this.record.Load(this.record.ID);\n\n // Reset lazy-loaded data\n if (this.testsLoaded) {\n this.testsLoaded = false;\n this.suiteTests = [];\n await this.loadTests();\n }\n if (this.runsLoaded) {\n this.runsLoaded = false;\n this.suiteRuns = [];\n await this.loadRuns();\n }\n if (this.analyticsLoaded) {\n this.analyticsLoaded = false;\n this.analyticsData = [];\n // Also reset matrix data so it reloads with fresh data\n this.matrixLoaded = false;\n this.matrixData = [];\n await this.loadAnalytics();\n // Reload matrix if currently viewing matrix or chart view\n if (this.analyticsView === 'matrix' || this.analyticsView === 'chart') {\n await this.loadMatrixData();\n }\n }\n\n SharedService.Instance.CreateSimpleNotification('Refreshed successfully', 'success', 2000);\n } catch {\n SharedService.Instance.CreateSimpleNotification('Failed to refresh', 'error', 3000);\n } finally {\n this.isRefreshing = false;\n this.cdr.markForCheck();\n }\n }\n\n // ==========================================\n // Analytics Tab Methods\n // ==========================================\n\n private async loadAnalytics() {\n if (this.analyticsLoaded) return;\n\n this.loadingAnalytics = true;\n this.cdr.markForCheck();\n\n try {\n // Load all runs for analytics (not just recent 50)\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJTestSuiteRunEntity>({\n EntityName: 'MJ: Test Suite Runs',\n ExtraFilter: `SuiteID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 200,\n ResultType: 'entity_object'\n });\n\n if (result.Success && result.Results) {\n // Process runs into analytics data points\n this.analyticsData = result.Results.map(run => this.runToDataPoint(run));\n\n // Extract unique tags\n this.uniqueTags = TagsHelper.getUniqueTags(result.Results.map(r => r.Tags));\n\n // Also populate suiteRuns if not already loaded\n if (!this.runsLoaded) {\n this.suiteRuns = result.Results.slice(0, 50);\n this.runsLoaded = true;\n }\n }\n\n this.analyticsLoaded = true;\n } catch (error) {\n console.error('Error loading analytics:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load analytics data', 'error', 3000);\n } finally {\n this.loadingAnalytics = false;\n this.cdr.markForCheck();\n }\n }\n\n private runToDataPoint(run: MJTestSuiteRunEntity): AnalyticsDataPoint {\n const total = run.TotalTests || 0;\n const passed = run.PassedTests || 0;\n return {\n runId: run.ID,\n date: run.StartedAt ? new Date(run.StartedAt) : new Date(),\n passRate: total > 0 ? (passed / total) * 100 : 0,\n totalTests: total,\n passedTests: passed,\n failedTests: run.FailedTests || 0,\n errorTests: run.ErrorTests || 0,\n skippedTests: run.SkippedTests || 0,\n duration: run.TotalDurationSeconds || 0,\n cost: run.TotalCostUSD || 0,\n tags: TagsHelper.parseTags(run.Tags),\n status: run.Status || 'Unknown'\n };\n }\n\n getFilteredAnalyticsData(): AnalyticsDataPoint[] {\n let data = this.analyticsData;\n\n // Apply time range filter\n const now = new Date();\n let cutoffDate: Date | null = null;\n\n switch (this.analyticsTimeRange) {\n case '7d':\n cutoffDate = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case '30d':\n cutoffDate = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n case '90d':\n cutoffDate = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000);\n break;\n }\n\n if (cutoffDate) {\n data = data.filter(d => d.date >= cutoffDate!);\n }\n\n // Apply tag filter (multi-select: empty array means all tags)\n if (this.selectedTags.length > 0) {\n data = data.filter(d => this.selectedTags.some(tag => d.tags.includes(tag)));\n }\n\n return data;\n }\n\n setTimeRange(range: '7d' | '30d' | '90d' | 'all') {\n this.analyticsTimeRange = range;\n // Reload matrix data when time range changes (if currently viewing matrix or chart)\n if (this.analyticsView === 'matrix' || this.analyticsView === 'chart') {\n this.reloadMatrixData();\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Toggle a tag in the multi-select filter.\n * If tag is null, clear all selections (show all tags).\n */\n toggleTagFilter(tag: string | null) {\n if (tag === null) {\n // Clear all - show all tags\n this.selectedTags = [];\n } else {\n // Toggle the tag\n const index = this.selectedTags.indexOf(tag);\n if (index >= 0) {\n this.selectedTags = this.selectedTags.filter(t => t !== tag);\n } else {\n this.selectedTags = [...this.selectedTags, tag];\n }\n }\n // Reload matrix data when tag filter changes (if currently viewing matrix or chart)\n if (this.analyticsView === 'matrix' || this.analyticsView === 'chart') {\n this.reloadMatrixData();\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Check if a tag is currently selected in the filter\n */\n isTagSelected(tag: string): boolean {\n return this.selectedTags.includes(tag);\n }\n\n setAnalyticsView(view: 'summary' | 'matrix' | 'chart') {\n this.analyticsView = view;\n if ((view === 'matrix' || view === 'chart') && !this.matrixLoaded) {\n this.loadMatrixData();\n }\n // Render chart when switching to chart view\n if (view === 'chart' && this.matrixLoaded) {\n setTimeout(() => this.renderChart(), 100);\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Force reload of matrix data (used when filters change)\n */\n private reloadMatrixData() {\n this.matrixLoaded = false;\n this.loadMatrixData();\n }\n\n private async loadMatrixData() {\n if (this.loadingMatrix) return;\n this.loadingMatrix = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const filteredRuns = this.getFilteredAnalyticsData();\n\n // Load test runs for each suite run (limit to most recent 10 for performance)\n const runsToLoad = filteredRuns.slice(0, 10);\n\n const matrixData: MatrixDataPoint[] = [];\n\n // Collect all test run IDs to batch load feedbacks\n const allTestRunIds: string[] = [];\n\n for (const runData of runsToLoad) {\n const testRunsResult = await rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestSuiteRunID='${runData.runId}'`,\n OrderBy: 'Sequence',\n ResultType: 'entity_object'\n });\n\n if (testRunsResult.Success && testRunsResult.Results) {\n const testResults = new Map<string, TestResultCell>();\n\n for (const testRun of testRunsResult.Results) {\n allTestRunIds.push(testRun.ID);\n testResults.set(testRun.TestID, {\n testRunId: testRun.ID,\n testId: testRun.TestID,\n testName: testRun.Test || 'Unknown',\n status: testRun.Status,\n score: testRun.Score,\n duration: testRun.DurationSeconds,\n humanRating: null, // Will be populated below\n humanComments: null, // Will be populated below\n sequence: testRun.Sequence ?? 0\n });\n }\n\n matrixData.push({\n runId: runData.runId,\n date: runData.date,\n tags: runData.tags,\n status: runData.status,\n passRate: runData.passRate,\n testResults\n });\n }\n }\n\n // Batch load feedbacks for all test runs\n if (allTestRunIds.length > 0) {\n const feedbackMap = await this.loadFeedbacksForTestRuns(allTestRunIds);\n\n // Apply feedbacks to matrix data\n for (const run of matrixData) {\n run.testResults.forEach((cell, _testId) => {\n const feedback = feedbackMap.get(cell.testRunId);\n if (feedback) {\n if (feedback.Rating != null) {\n cell.humanRating = feedback.Rating;\n }\n // Use CorrectionSummary if available (from inline feedback), fallback to Comments\n const commentText = feedback.CorrectionSummary || feedback.Comments;\n if (commentText) {\n cell.humanComments = commentText;\n }\n }\n });\n }\n }\n\n this.matrixData = matrixData;\n this.matrixLoaded = true;\n\n // Render chart if currently on chart view\n if (this.analyticsView === 'chart') {\n setTimeout(() => this.renderChart(), 100);\n }\n } catch (error) {\n console.error('Error loading matrix data:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load matrix data', 'error', 3000);\n } finally {\n this.loadingMatrix = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Load feedbacks for a batch of test run IDs\n * Returns a map of testRunId -> MJTestRunFeedbackEntity\n */\n private async loadFeedbacksForTestRuns(testRunIds: string[]): Promise<Map<string, MJTestRunFeedbackEntity>> {\n const feedbackMap = new Map<string, MJTestRunFeedbackEntity>();\n\n if (testRunIds.length === 0) return feedbackMap;\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n // Build IN clause for the IDs (batch in chunks to avoid query size limits)\n const chunkSize = 50;\n for (let i = 0; i < testRunIds.length; i += chunkSize) {\n const chunk = testRunIds.slice(i, i + chunkSize);\n const inClause = chunk.map(id => `'${id}'`).join(',');\n\n const result = await rv.RunView<MJTestRunFeedbackEntity>({\n EntityName: 'MJ: Test Run Feedbacks',\n ExtraFilter: `TestRunID IN (${inClause})`,\n ResultType: 'entity_object'\n });\n\n if (result.Success && result.Results) {\n for (const feedback of result.Results) {\n // If multiple feedbacks exist for same test run, keep the most recent (last one)\n feedbackMap.set(feedback.TestRunID, feedback);\n }\n }\n }\n } catch (error) {\n console.warn('Failed to load feedbacks:', error);\n }\n\n return feedbackMap;\n }\n\n getUniqueTestsFromMatrix(): { testId: string; testName: string; sequence: number }[] {\n const testsMap = new Map<string, { testName: string; sequence: number }>();\n\n for (const runData of this.matrixData) {\n for (const [testId, testResult] of runData.testResults) {\n if (!testsMap.has(testId)) {\n testsMap.set(testId, { testName: testResult.testName, sequence: testResult.sequence });\n }\n }\n }\n\n let tests = Array.from(testsMap.entries()).map(([testId, data]) => ({\n testId,\n testName: data.testName,\n sequence: data.sequence\n }));\n\n // Apply test name filter if set\n if (this.matrixTestFilter.trim()) {\n const filterLower = this.matrixTestFilter.toLowerCase().trim();\n tests = tests.filter(t => t.testName.toLowerCase().includes(filterLower));\n }\n\n // Apply sorting\n if (this.matrixSortBy === 'sequence') {\n tests = tests.sort((a, b) => this.matrixSortAsc ? a.sequence - b.sequence : b.sequence - a.sequence);\n } else {\n tests = tests.sort((a, b) => {\n const cmp = a.testName.localeCompare(b.testName);\n return this.matrixSortAsc ? cmp : -cmp;\n });\n }\n\n return tests;\n }\n\n /**\n * Toggle matrix sort column\n */\n toggleMatrixSort(column: 'sequence' | 'name') {\n if (this.matrixSortBy === column) {\n this.matrixSortAsc = !this.matrixSortAsc;\n } else {\n this.matrixSortBy = column;\n this.matrixSortAsc = true;\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Select/deselect a matrix row for highlighting\n */\n selectMatrixRow(testId: string): void {\n this.selectedMatrixTestId = this.selectedMatrixTestId === testId ? null : testId;\n this.cdr.markForCheck();\n }\n\n /**\n * Handle test name filter input - uses Subject for debounce\n */\n onMatrixFilterInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.matrixFilterSubject$.next(value);\n }\n\n /**\n * Clear the matrix test name filter\n */\n clearMatrixFilter(): void {\n this.matrixTestFilter = '';\n this.matrixFilterSubject$.next('');\n this.cdr.markForCheck();\n }\n\n getTestResultForRun(runId: string, testId: string): TestResultCell | null {\n const runData = this.matrixData.find(r => r.runId === runId);\n if (!runData) return null;\n return runData.testResults.get(testId) || null;\n }\n\n getMatrixCellClass(result: TestResultCell | null): string {\n if (!result) return 'cell-none cell-not-run';\n switch (result.status) {\n case 'Passed': return 'cell-passed';\n case 'Failed': return 'cell-failed';\n case 'Error': return 'cell-error';\n case 'Timeout': return 'cell-timeout';\n case 'Skipped': return 'cell-skipped cell-not-run';\n case 'Running': return 'cell-running';\n default: return 'cell-pending';\n }\n }\n\n /**\n * Get descriptive tooltip for execution status\n */\n getStatusTooltip(status: string): string {\n switch (status) {\n case 'Passed': return 'Status: Passed - Test completed without error';\n case 'Failed': return 'Status: Failed - Test assertions did not pass';\n case 'Error': return 'Status: Error - Test encountered an exception';\n case 'Timeout': return 'Status: Timeout - Test exceeded time limit';\n case 'Skipped': return 'Status: Skipped - Test was not executed';\n case 'Running': return 'Status: Running - Test is currently executing';\n case 'Pending': return 'Status: Pending - Test waiting to run';\n default: return `Status: ${status}`;\n }\n }\n\n /**\n * Get tooltip for human review with rating and optional comments\n */\n getHumanTooltip(rating: number, comments: string | null): string {\n let tooltip = `Human Review: ${rating}/10 rating`;\n if (comments) {\n const truncated = comments.length > 200 ? comments.substring(0, 200) + '...' : comments;\n tooltip += `\\n\\n\"${truncated}\"`;\n }\n return tooltip;\n }\n\n /**\n * Get the count of enabled evaluation types for matrix cell layout\n */\n getEvalCount(): number {\n let count = 0;\n if (this.evalPreferences.showExecution) count++;\n if (this.evalPreferences.showHuman) count++;\n if (this.evalPreferences.showAuto) count++;\n return count;\n }\n\n // ===========================\n // Matrix Totals Row Methods\n // ===========================\n\n /**\n * Get count of passed tests for a run\n */\n getRunPassedCount(run: MatrixDataPoint): number {\n let count = 0;\n run.testResults.forEach(result => {\n if (result.status === 'Passed') count++;\n });\n return count;\n }\n\n /**\n * Get total count of tests for a run\n */\n getRunTotalCount(run: MatrixDataPoint): number {\n return run.testResults.size;\n }\n\n /**\n * Get average human rating for a run (only from tests that have ratings)\n */\n getRunHumanAvg(run: MatrixDataPoint): number | null {\n let sum = 0;\n let count = 0;\n run.testResults.forEach(result => {\n if (result.humanRating != null) {\n sum += result.humanRating;\n count++;\n }\n });\n return count > 0 ? sum / count : null;\n }\n\n /**\n * Get count of tests with human ratings for a run\n */\n getRunHumanCount(run: MatrixDataPoint): number {\n let count = 0;\n run.testResults.forEach(result => {\n if (result.humanRating != null) count++;\n });\n return count;\n }\n\n /**\n * Get average auto score for a run (only from tests that have scores)\n */\n getRunAutoAvg(run: MatrixDataPoint): number | null {\n let sum = 0;\n let count = 0;\n run.testResults.forEach(result => {\n if (result.score != null) {\n sum += result.score;\n count++;\n }\n });\n return count > 0 ? sum / count : null;\n }\n\n /**\n * Get count of tests with auto scores for a run\n */\n getRunAutoCount(run: MatrixDataPoint): number {\n let count = 0;\n run.testResults.forEach(result => {\n if (result.score != null) count++;\n });\n return count;\n }\n\n /**\n * Navigate to a test run when clicking a matrix cell\n */\n openTestRun(testRunId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Runs', CompositeKey.FromID(testRunId));\n }\n\n /**\n * Handle matrix cell click - navigate to the test run\n */\n onMatrixCellClick(result: TestResultCell | null, event: Event): void {\n event.stopPropagation(); // Prevent row click from also firing\n if (result?.testRunId) {\n this.openTestRun(result.testRunId);\n }\n }\n\n // ===========================\n // D3 Chart Rendering\n // ===========================\n\n /**\n * Renders an interactive heatmap-style chart showing test results across runs\n * with trend lines and better visual hierarchy\n */\n private renderChart(): void {\n if (!this.chartContainer?.nativeElement || this.matrixData.length === 0) {\n return;\n }\n\n const container = this.chartContainer.nativeElement;\n const tests = this.getUniqueTestsFromMatrix();\n const runs = this.matrixData;\n\n // Dynamic sizing based on content and evaluation preferences\n const width = container.clientWidth || 900;\n const evalCount = this.getEvalCount();\n // Adjust row height and column width based on how many eval types are shown\n const rowHeight = evalCount >= 3 ? 34 : evalCount === 2 ? 30 : 28;\n const minColWidth = evalCount >= 3 ? 65 : evalCount === 2 ? 55 : 50;\n const colWidth = Math.min(90, Math.max(minColWidth, (width - 250) / runs.length));\n const margin = { top: 80, right: 40, bottom: 20, left: 220 };\n const chartWidth = runs.length * colWidth;\n const chartHeight = tests.length * rowHeight;\n const height = chartHeight + margin.top + margin.bottom;\n\n // Update container height\n container.style.height = `${Math.max(400, height)}px`;\n\n // Clear previous chart\n d3.select(container).selectAll('*').remove();\n\n // Status colors with better contrast\n const statusColors: Record<string, string> = {\n 'Passed': '#22c55e',\n 'Failed': '#ef4444',\n 'Error': '#f97316',\n 'Skipped': '#a1a1aa',\n 'Running': '#3b82f6',\n 'Pending': '#d1d5db'\n };\n\n // Create SVG\n const svg = d3.select(container)\n .append('svg')\n .attr('width', width)\n .attr('height', height);\n\n // Create tooltip div\n const tooltip = d3.select(container)\n .append('div')\n .attr('class', 'chart-tooltip')\n .style('position', 'absolute')\n .style('opacity', 0)\n .style('background', 'rgba(15, 23, 42, 0.95)')\n .style('color', 'white')\n .style('padding', '10px 14px')\n .style('border-radius', '8px')\n .style('font-size', '12px')\n .style('pointer-events', 'none')\n .style('z-index', '1000')\n .style('box-shadow', '0 4px 20px rgba(0,0,0,0.3)')\n .style('max-width', '280px');\n\n // Create chart group\n const chart = svg.append('g')\n .attr('transform', `translate(${margin.left}, ${margin.top})`);\n\n // Add gradient definitions for cells\n const defs = svg.append('defs');\n\n // Create gradient for each status\n Object.entries(statusColors).forEach(([status, color]) => {\n const gradient = defs.append('linearGradient')\n .attr('id', `gradient-${status.toLowerCase()}`)\n .attr('x1', '0%')\n .attr('y1', '0%')\n .attr('x2', '0%')\n .attr('y2', '100%');\n\n gradient.append('stop')\n .attr('offset', '0%')\n .attr('stop-color', color)\n .attr('stop-opacity', 0.95);\n\n gradient.append('stop')\n .attr('offset', '100%')\n .attr('stop-color', d3.color(color)?.darker(0.3)?.toString() || color)\n .attr('stop-opacity', 0.95);\n });\n\n // Draw evaluation legend at top-left corner\n this.renderChartLegend(chart, margin);\n\n // Draw column headers (run dates) at top\n runs.forEach((run, i) => {\n const x = i * colWidth + colWidth / 2;\n\n // Date text\n chart.append('text')\n .attr('x', x)\n .attr('y', -45)\n .attr('text-anchor', 'middle')\n .attr('fill', '#475569')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text(this.getRelativeTime(run.date))\n .style('cursor', 'pointer')\n .on('click', () => this.openSuiteRun(run.runId));\n\n // Pass rate badge\n const passRateColor = run.passRate >= 80 ? '#22c55e' : run.passRate >= 50 ? '#f97316' : '#ef4444';\n const badgeWidth = 36;\n const badgeHeight = 18;\n\n chart.append('rect')\n .attr('x', x - badgeWidth / 2)\n .attr('y', -35)\n .attr('width', badgeWidth)\n .attr('height', badgeHeight)\n .attr('rx', 9)\n .attr('fill', passRateColor)\n .attr('opacity', 0.15);\n\n chart.append('text')\n .attr('x', x)\n .attr('y', -22)\n .attr('text-anchor', 'middle')\n .attr('fill', passRateColor)\n .attr('font-size', '11px')\n .attr('font-weight', '700')\n .text(`${run.passRate.toFixed(0)}%`);\n\n // Tags indicator - styled pills\n if (run.tags.length > 0) {\n const tagsToShow = run.tags.slice(0, 2);\n const tagPillWidth = 42;\n const tagPillHeight = 14;\n const tagGap = 4;\n const totalTagsWidth = tagsToShow.length * tagPillWidth + (tagsToShow.length - 1) * tagGap;\n const tagStartX = x - totalTagsWidth / 2;\n\n tagsToShow.forEach((tag, tagIndex) => {\n const tagX = tagStartX + tagIndex * (tagPillWidth + tagGap);\n const tagY = -68;\n\n // Pill background with gradient\n chart.append('rect')\n .attr('x', tagX)\n .attr('y', tagY)\n .attr('width', tagPillWidth)\n .attr('height', tagPillHeight)\n .attr('rx', 7)\n .attr('fill', '#dbeafe')\n .attr('stroke', '#93c5fd')\n .attr('stroke-width', 1)\n .style('cursor', 'pointer')\n .on('click', () => this.openSuiteRun(run.runId));\n\n // Tag text\n chart.append('text')\n .attr('x', tagX + tagPillWidth / 2)\n .attr('y', tagY + tagPillHeight / 2 + 3)\n .attr('text-anchor', 'middle')\n .attr('fill', '#1d4ed8')\n .attr('font-size', '8px')\n .attr('font-weight', '600')\n .text(tag.length > 8 ? tag.substring(0, 7) + '…' : tag)\n .style('cursor', 'pointer')\n .on('click', () => this.openSuiteRun(run.runId));\n });\n\n // Show +N indicator if more tags\n if (run.tags.length > 2) {\n const moreX = tagStartX + tagsToShow.length * (tagPillWidth + tagGap);\n chart.append('text')\n .attr('x', moreX)\n .attr('y', -68 + tagPillHeight / 2 + 3)\n .attr('text-anchor', 'start')\n .attr('fill', '#64748b')\n .attr('font-size', '8px')\n .attr('font-weight', '500')\n .text(`+${run.tags.length - 2}`);\n }\n }\n });\n\n // Draw row labels (test names) on left\n tests.forEach((test, i) => {\n const y = i * rowHeight + rowHeight / 2;\n\n chart.append('text')\n .attr('x', -12)\n .attr('y', y + 4)\n .attr('text-anchor', 'end')\n .attr('fill', '#334155')\n .attr('font-size', '11px')\n .text(test.testName.length > 28 ? test.testName.substring(0, 28) + '...' : test.testName)\n .style('cursor', 'pointer')\n .on('click', () => {\n SharedService.Instance.OpenEntityRecord('MJ: Tests', CompositeKey.FromID(test.testId));\n })\n .on('mouseover', function() {\n d3.select(this).attr('fill', '#3b82f6').attr('font-weight', '600');\n })\n .on('mouseout', function() {\n d3.select(this).attr('fill', '#334155').attr('font-weight', 'normal');\n });\n });\n\n // Draw grid lines\n tests.forEach((_, i) => {\n chart.append('line')\n .attr('x1', 0)\n .attr('y1', (i + 1) * rowHeight)\n .attr('x2', chartWidth)\n .attr('y2', (i + 1) * rowHeight)\n .attr('stroke', '#e2e8f0')\n .attr('stroke-width', 1);\n });\n\n runs.forEach((_, i) => {\n chart.append('line')\n .attr('x1', (i + 1) * colWidth)\n .attr('y1', 0)\n .attr('x2', (i + 1) * colWidth)\n .attr('y2', chartHeight)\n .attr('stroke', '#e2e8f0')\n .attr('stroke-width', 1);\n });\n\n // Draw cells with evaluation toggle support\n const cellPadding = 3;\n\n runs.forEach((run, runIndex) => {\n tests.forEach((test, testIndex) => {\n const result = run.testResults.get(test.testId);\n const x = runIndex * colWidth + cellPadding;\n const y = testIndex * rowHeight + cellPadding;\n const cellWidth = colWidth - cellPadding * 2;\n const cellHeight = rowHeight - cellPadding * 2;\n\n if (!result) {\n // Empty cell indicator\n chart.append('rect')\n .attr('x', x)\n .attr('y', y)\n .attr('width', cellWidth)\n .attr('height', cellHeight)\n .attr('rx', 4)\n .attr('fill', '#f8fafc')\n .attr('stroke', '#e2e8f0')\n .attr('stroke-width', 1);\n\n chart.append('text')\n .attr('x', x + cellWidth / 2)\n .attr('y', y + cellHeight / 2 + 4)\n .attr('text-anchor', 'middle')\n .attr('fill', '#cbd5e1')\n .attr('font-size', '12px')\n .text('—');\n return;\n }\n\n // Build tooltip content based on evaluation preferences\n const tooltipParts: string[] = [];\n if (this.evalPreferences.showExecution) {\n tooltipParts.push(`<div style=\"display:inline-block; padding:2px 8px; border-radius:4px; background:${statusColors[result.status]}; color:white; font-size:11px; font-weight:600\">${result.status}</div>`);\n }\n if (this.evalPreferences.showHuman) {\n tooltipParts.push(`<div style=\"margin-top:4px\"><span style=\"color:var(--mj-status-warning)\">👤</span> <strong>Human:</strong> <span style=\"color:var(--mj-text-disabled)\">Needs review</span></div>`);\n }\n if (this.evalPreferences.showAuto && result.score != null) {\n tooltipParts.push(`<div style=\"margin-top:4px\"><span style=\"color:var(--mj-status-info)\">🤖</span> <strong>Auto:</strong> ${(result.score * 100).toFixed(1)}%</div>`);\n }\n const durationText = result.duration != null ? `<div><strong>Duration:</strong> ${result.duration.toFixed(2)}s</div>` : '';\n\n const cellGroup = chart.append('g')\n .attr('class', 'result-cell')\n .style('cursor', 'pointer')\n .on('click', () => this.openTestRun(result.testRunId))\n .on('mouseover', (event: MouseEvent) => {\n d3.select(event.currentTarget as Element).select('rect.cell-bg')\n .attr('stroke', '#1e40af')\n .attr('stroke-width', 2);\n\n tooltip\n .style('opacity', 1)\n .html(`\n <div style=\"font-weight:600; margin-bottom:6px; color:#f1f5f9\">${result.testName}</div>\n ${tooltipParts.join('')}\n ${durationText}\n <div style=\"margin-top:6px; color:#94a3b8; font-size:10px\">${this.getRelativeTime(run.date)} • Click to view</div>\n `)\n .style('left', `${event.offsetX + 15}px`)\n .style('top', `${event.offsetY - 10}px`);\n })\n .on('mouseout', (event: MouseEvent) => {\n d3.select(event.currentTarget as Element).select('rect.cell-bg')\n .attr('stroke', 'none')\n .attr('stroke-width', 0);\n tooltip.style('opacity', 0);\n });\n\n // Determine cell background color based on eval preferences\n let cellBgColor = '#f1f5f9';\n let cellBgGradient = '';\n\n if (this.evalPreferences.showExecution) {\n // Use status-based gradient\n cellBgGradient = `url(#gradient-${result.status.toLowerCase()})`;\n } else if (this.evalPreferences.showAuto && result.score != null) {\n // Use score-based color\n const scoreColor = result.score >= 0.8 ? '#22c55e' : result.score >= 0.5 ? '#f97316' : '#ef4444';\n cellBgColor = scoreColor;\n } else {\n // Neutral background when only Human is selected\n cellBgColor = '#fef3c7';\n }\n\n // Cell background\n cellGroup.append('rect')\n .attr('class', 'cell-bg')\n .attr('x', x)\n .attr('y', y)\n .attr('width', cellWidth)\n .attr('height', cellHeight)\n .attr('rx', 4)\n .attr('fill', cellBgGradient || cellBgColor)\n .attr('stroke', 'none')\n .attr('stroke-width', 0)\n .style('transition', 'all 0.15s ease');\n\n // Calculate icon positions based on how many eval types are shown\n // With wider cells, we can use larger icons and better spacing\n const iconSize = evalCount === 1 ? 14 : evalCount === 2 ? 12 : 10;\n const iconSpacing = evalCount === 1 ? 0 : evalCount === 2 ? 16 : 14;\n const startX = x + cellWidth / 2 - ((evalCount - 1) * iconSpacing) / 2;\n\n let iconIndex = 0;\n\n // Status icon (execution)\n if (this.evalPreferences.showExecution) {\n const iconText: Record<string, string> = {\n 'Passed': '✓',\n 'Failed': '✕',\n 'Error': '!',\n 'Skipped': '»',\n 'Running': '●',\n 'Pending': '○'\n };\n\n const iconX = startX + iconIndex * iconSpacing;\n\n // If status is NOT the only thing shown, add a small circular bg\n if (evalCount > 1) {\n cellGroup.append('circle')\n .attr('cx', iconX)\n .attr('cy', y + cellHeight / 2)\n .attr('r', iconSize / 2 + 3)\n .attr('fill', statusColors[result.status])\n .attr('opacity', 0.9);\n }\n\n cellGroup.append('text')\n .attr('x', iconX)\n .attr('y', y + cellHeight / 2 + iconSize / 3)\n .attr('text-anchor', 'middle')\n .attr('fill', 'white')\n .attr('font-size', `${iconSize}px`)\n .attr('font-weight', 'bold')\n .attr('font-family', 'system-ui, -apple-system, sans-serif')\n .text(iconText[result.status] || '?');\n\n iconIndex++;\n }\n\n // Human icon\n if (this.evalPreferences.showHuman) {\n const iconX = startX + iconIndex * iconSpacing;\n\n // Human evaluation indicator (clock icon for pending)\n cellGroup.append('circle')\n .attr('cx', iconX)\n .attr('cy', y + cellHeight / 2)\n .attr('r', iconSize / 2 + 3)\n .attr('fill', '#fef3c7')\n .attr('stroke', '#f59e0b')\n .attr('stroke-width', 1);\n\n cellGroup.append('text')\n .attr('x', iconX)\n .attr('y', y + cellHeight / 2 + iconSize / 3)\n .attr('text-anchor', 'middle')\n .attr('fill', '#d97706')\n .attr('font-size', `${iconSize - 2}px`)\n .attr('font-weight', '500')\n .text('⏱');\n\n iconIndex++;\n }\n\n // Auto score icon/indicator\n if (this.evalPreferences.showAuto) {\n const iconX = startX + iconIndex * iconSpacing;\n\n if (result.score != null) {\n const scorePercent = Math.round(result.score * 100);\n const scoreColor = result.score >= 0.8 ? '#22c55e' : result.score >= 0.5 ? '#f97316' : '#ef4444';\n\n // Score pill background\n if (evalCount > 1) {\n cellGroup.append('rect')\n .attr('x', iconX - 10)\n .attr('y', y + cellHeight / 2 - iconSize / 2 - 1)\n .attr('width', 20)\n .attr('height', iconSize + 2)\n .attr('rx', (iconSize + 2) / 2)\n .attr('fill', scoreColor)\n .attr('opacity', 0.9);\n }\n\n cellGroup.append('text')\n .attr('x', iconX)\n .attr('y', y + cellHeight / 2 + iconSize / 3)\n .attr('text-anchor', 'middle')\n .attr('fill', evalCount > 1 ? 'white' : 'white')\n .attr('font-size', `${iconSize - 1}px`)\n .attr('font-weight', '700')\n .text(`${scorePercent}`);\n } else {\n // No auto score available\n cellGroup.append('circle')\n .attr('cx', iconX)\n .attr('cy', y + cellHeight / 2)\n .attr('r', iconSize / 2 + 2)\n .attr('fill', '#e2e8f0')\n .attr('stroke', '#94a3b8')\n .attr('stroke-width', 1);\n\n cellGroup.append('text')\n .attr('x', iconX)\n .attr('y', y + cellHeight / 2 + iconSize / 3)\n .attr('text-anchor', 'middle')\n .attr('fill', '#94a3b8')\n .attr('font-size', `${iconSize - 2}px`)\n .text('—');\n }\n }\n });\n });\n\n // Draw trend line for pass rate across runs\n if (runs.length > 1) {\n const trendLineY = chartHeight + 50;\n const trendHeight = 40;\n\n // Trend line label\n chart.append('text')\n .attr('x', -12)\n .attr('y', trendLineY + trendHeight / 2)\n .attr('text-anchor', 'end')\n .attr('fill', '#64748b')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text('Pass Rate Trend');\n\n // Create trend line path\n const lineGenerator = d3.line<MatrixDataPoint>()\n .x((_, i) => i * colWidth + colWidth / 2)\n .y(d => trendLineY + trendHeight - (d.passRate / 100) * trendHeight)\n .curve(d3.curveMonotoneX);\n\n // Draw area under line\n const areaGenerator = d3.area<MatrixDataPoint>()\n .x((_, i) => i * colWidth + colWidth / 2)\n .y0(trendLineY + trendHeight)\n .y1(d => trendLineY + trendHeight - (d.passRate / 100) * trendHeight)\n .curve(d3.curveMonotoneX);\n\n chart.append('path')\n .datum(runs)\n .attr('d', areaGenerator)\n .attr('fill', 'url(#trendGradient)')\n .attr('opacity', 0.3);\n\n // Create gradient for trend area\n const trendGradient = defs.append('linearGradient')\n .attr('id', 'trendGradient')\n .attr('x1', '0%')\n .attr('y1', '0%')\n .attr('x2', '0%')\n .attr('y2', '100%');\n\n trendGradient.append('stop')\n .attr('offset', '0%')\n .attr('stop-color', '#3b82f6')\n .attr('stop-opacity', 0.4);\n\n trendGradient.append('stop')\n .attr('offset', '100%')\n .attr('stop-color', '#3b82f6')\n .attr('stop-opacity', 0);\n\n chart.append('path')\n .datum(runs)\n .attr('d', lineGenerator)\n .attr('fill', 'none')\n .attr('stroke', '#3b82f6')\n .attr('stroke-width', 2.5)\n .attr('stroke-linecap', 'round');\n\n // Draw dots on trend line\n runs.forEach((run, i) => {\n const cx = i * colWidth + colWidth / 2;\n const cy = trendLineY + trendHeight - (run.passRate / 100) * trendHeight;\n\n chart.append('circle')\n .attr('cx', cx)\n .attr('cy', cy)\n .attr('r', 4)\n .attr('fill', 'white')\n .attr('stroke', '#3b82f6')\n .attr('stroke-width', 2);\n });\n\n // Update container height for trend line\n container.style.height = `${Math.max(400, height + 80)}px`;\n svg.attr('height', height + 80);\n }\n\n this.chartRendered = true;\n }\n\n /**\n * Renders a legend showing which evaluation types are currently displayed\n */\n private renderChartLegend(chart: d3.Selection<SVGGElement, unknown, null, undefined>, margin: { top: number; right: number; bottom: number; left: number }): void {\n const legendGroup = chart.append('g')\n .attr('class', 'eval-legend')\n .attr('transform', `translate(${-margin.left + 10}, ${-margin.top + 15})`);\n\n // Legend title\n legendGroup.append('text')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', '#64748b')\n .attr('font-size', '9px')\n .attr('font-weight', '600')\n .attr('text-transform', 'uppercase')\n .text('SHOWING:');\n\n let xOffset = 55;\n\n // Status indicator\n if (this.evalPreferences.showExecution) {\n const statusGroup = legendGroup.append('g')\n .attr('transform', `translate(${xOffset}, -4)`);\n\n statusGroup.append('circle')\n .attr('cx', 6)\n .attr('cy', 0)\n .attr('r', 6)\n .attr('fill', '#22c55e');\n\n statusGroup.append('text')\n .attr('x', 6)\n .attr('y', 4)\n .attr('text-anchor', 'middle')\n .attr('fill', 'white')\n .attr('font-size', '8px')\n .attr('font-weight', 'bold')\n .text('✓');\n\n statusGroup.append('text')\n .attr('x', 16)\n .attr('y', 3)\n .attr('fill', '#475569')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text('Status');\n\n xOffset += 60;\n }\n\n // Human indicator\n if (this.evalPreferences.showHuman) {\n const humanGroup = legendGroup.append('g')\n .attr('transform', `translate(${xOffset}, -4)`);\n\n humanGroup.append('circle')\n .attr('cx', 6)\n .attr('cy', 0)\n .attr('r', 6)\n .attr('fill', '#fef3c7')\n .attr('stroke', '#f59e0b')\n .attr('stroke-width', 1);\n\n humanGroup.append('text')\n .attr('x', 6)\n .attr('y', 3)\n .attr('text-anchor', 'middle')\n .attr('fill', '#d97706')\n .attr('font-size', '7px')\n .text('⏱');\n\n humanGroup.append('text')\n .attr('x', 16)\n .attr('y', 3)\n .attr('fill', '#475569')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text('Human');\n\n xOffset += 60;\n }\n\n // Auto indicator\n if (this.evalPreferences.showAuto) {\n const autoGroup = legendGroup.append('g')\n .attr('transform', `translate(${xOffset}, -4)`);\n\n autoGroup.append('rect')\n .attr('x', 0)\n .attr('y', -6)\n .attr('width', 18)\n .attr('height', 12)\n .attr('rx', 6)\n .attr('fill', '#3b82f6');\n\n autoGroup.append('text')\n .attr('x', 9)\n .attr('y', 3)\n .attr('text-anchor', 'middle')\n .attr('fill', 'white')\n .attr('font-size', '7px')\n .attr('font-weight', '700')\n .text('%');\n\n autoGroup.append('text')\n .attr('x', 24)\n .attr('y', 3)\n .attr('fill', '#475569')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text('Auto');\n }\n }\n\n getAveragePassRate(): number {\n const data = this.getFilteredAnalyticsData();\n if (data.length === 0) return 0;\n return data.reduce((sum, d) => sum + d.passRate, 0) / data.length;\n }\n\n getTotalRuns(): number {\n return this.getFilteredAnalyticsData().length;\n }\n\n getAverageDuration(): number {\n const data = this.getFilteredAnalyticsData();\n if (data.length === 0) return 0;\n return data.reduce((sum, d) => sum + d.duration, 0) / data.length;\n }\n\n getTotalCost(): number {\n return this.getFilteredAnalyticsData().reduce((sum, d) => sum + d.cost, 0);\n }\n\n getPassRateTrend(): { direction: 'up' | 'down' | 'stable'; value: number } {\n const data = this.getFilteredAnalyticsData();\n if (data.length < 2) return { direction: 'stable', value: 0 };\n\n // Compare recent half to older half\n const midpoint = Math.floor(data.length / 2);\n const recentData = data.slice(0, midpoint);\n const olderData = data.slice(midpoint);\n\n const recentAvg = recentData.reduce((s, d) => s + d.passRate, 0) / recentData.length;\n const olderAvg = olderData.reduce((s, d) => s + d.passRate, 0) / olderData.length;\n\n const diff = recentAvg - olderAvg;\n if (Math.abs(diff) < 1) return { direction: 'stable', value: diff };\n return { direction: diff > 0 ? 'up' : 'down', value: Math.abs(diff) };\n }\n\n formatDuration(seconds: number): string {\n if (seconds < 60) return `${seconds.toFixed(1)}s`;\n if (seconds < 3600) {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;\n }\n const hours = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n }\n\n formatCost(cost: number): string {\n if (cost < 0.01) return `$${cost.toFixed(6)}`;\n if (cost < 1) return `$${cost.toFixed(4)}`;\n return `$${cost.toFixed(2)}`;\n }\n\n // ==========================================\n // Compare Tab Methods\n // ==========================================\n\n async selectCompareRunA(run: MJTestSuiteRunEntity) {\n this.compareRunA = run;\n await this.loadCompareData();\n }\n\n async selectCompareRunB(run: MJTestSuiteRunEntity) {\n this.compareRunB = run;\n await this.loadCompareData();\n }\n\n clearCompareSelection() {\n this.compareRunA = null;\n this.compareRunB = null;\n this.compareResults = [];\n this.compareRunATests = [];\n this.compareRunBTests = [];\n this.cdr.markForCheck();\n }\n\n private async loadCompareData() {\n if (!this.compareRunA || !this.compareRunB) {\n this.compareResults = [];\n this.cdr.markForCheck();\n return;\n }\n\n this.loadingCompare = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Load test runs for both suite runs in parallel\n const [resultA, resultB] = await Promise.all([\n rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestSuiteRunID='${this.compareRunA.ID}'`,\n OrderBy: 'Sequence ASC',\n ResultType: 'entity_object'\n }),\n rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestSuiteRunID='${this.compareRunB.ID}'`,\n OrderBy: 'Sequence ASC',\n ResultType: 'entity_object'\n })\n ]);\n\n this.compareRunATests = resultA.Success ? resultA.Results || [] : [];\n this.compareRunBTests = resultB.Success ? resultB.Results || [] : [];\n\n // Build comparison results\n this.compareResults = this.buildComparisonResults(this.compareRunATests, this.compareRunBTests);\n } catch (error) {\n console.error('Error loading comparison data:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load comparison data', 'error', 3000);\n } finally {\n this.loadingCompare = false;\n this.cdr.markForCheck();\n }\n }\n\n private buildComparisonResults(testsA: MJTestRunEntity[], testsB: MJTestRunEntity[]): TestRunComparison[] {\n const results: TestRunComparison[] = [];\n const testMap = new Map<string, { a?: MJTestRunEntity; b?: MJTestRunEntity; name: string }>();\n\n // Map all tests from run A\n for (const test of testsA) {\n testMap.set(test.TestID, { a: test, name: test.Test || 'Unknown Test' });\n }\n\n // Map all tests from run B\n for (const test of testsB) {\n const existing = testMap.get(test.TestID);\n if (existing) {\n existing.b = test;\n } else {\n testMap.set(test.TestID, { b: test, name: test.Test || 'Unknown Test' });\n }\n }\n\n // Build comparison array\n for (const [testId, { a, b, name }] of testMap) {\n const comparison: TestRunComparison = {\n testId,\n testName: name,\n runA: a ? {\n status: a.Status || 'Unknown',\n score: a.Score,\n duration: a.DurationSeconds,\n cost: a.CostUSD\n } : null,\n runB: b ? {\n status: b.Status || 'Unknown',\n score: b.Score,\n duration: b.DurationSeconds,\n cost: b.CostUSD\n } : null,\n scoreDiff: (a?.Score != null && b?.Score != null) ? b.Score - a.Score : null,\n durationDiff: (a?.DurationSeconds != null && b?.DurationSeconds != null) ? b.DurationSeconds - a.DurationSeconds : null,\n statusChanged: (a?.Status || 'none') !== (b?.Status || 'none')\n };\n results.push(comparison);\n }\n\n return results;\n }\n\n getComparePassRateDiff(): number | null {\n if (!this.compareRunA || !this.compareRunB) return null;\n const rateA = this.getPassRate(this.compareRunA);\n const rateB = this.getPassRate(this.compareRunB);\n return rateB - rateA;\n }\n\n getCompareDurationDiff(): number | null {\n if (!this.compareRunA || !this.compareRunB) return null;\n const durA = this.compareRunA.TotalDurationSeconds || 0;\n const durB = this.compareRunB.TotalDurationSeconds || 0;\n return durB - durA;\n }\n\n getAbsCompareDurationDiff(): number {\n const diff = this.getCompareDurationDiff();\n return diff != null ? Math.abs(diff) : 0;\n }\n\n getCompareCostDiff(): number | null {\n if (!this.compareRunA || !this.compareRunB) return null;\n const costA = this.compareRunA.TotalCostUSD || 0;\n const costB = this.compareRunB.TotalCostUSD || 0;\n return costB - costA;\n }\n\n getCompareImprovedCount(): number {\n return this.compareResults.filter(r =>\n r.runA && r.runB &&\n r.runA.status !== 'Passed' && r.runB.status === 'Passed'\n ).length;\n }\n\n getCompareRegressedCount(): number {\n return this.compareResults.filter(r =>\n r.runA && r.runB &&\n r.runA.status === 'Passed' && r.runB.status !== 'Passed'\n ).length;\n }\n\n // ==========================================\n // Excel Export Methods\n // ==========================================\n\n async exportToExcel() {\n try {\n // Ensure runs are loaded\n if (!this.runsLoaded) await this.loadRuns();\n\n const data = this.suiteRuns.map(run => ({\n 'Run ID': run.ID,\n 'Status': run.Status,\n 'Started At': run.StartedAt ? new Date(run.StartedAt).toLocaleString() : 'N/A',\n 'Completed At': run.CompletedAt ? new Date(run.CompletedAt).toLocaleString() : 'N/A',\n 'Duration (s)': run.TotalDurationSeconds?.toFixed(2) || 'N/A',\n 'Total Tests': run.TotalTests || 0,\n 'Passed': run.PassedTests || 0,\n 'Failed': run.FailedTests || 0,\n 'Errors': run.ErrorTests || 0,\n 'Skipped': run.SkippedTests || 0,\n 'Pass Rate (%)': run.TotalTests ? ((run.PassedTests || 0) / run.TotalTests * 100).toFixed(1) : 'N/A',\n 'Total Cost ($)': run.TotalCostUSD?.toFixed(6) || 'N/A',\n 'Tags': TagsHelper.parseTags(run.Tags).join(', ') || 'None',\n 'Environment': run.Environment || 'N/A',\n 'Trigger Type': run.TriggerType || 'N/A',\n 'Run By': run.RunByUser || 'N/A'\n }));\n\n this.downloadAsCSV(data, `${this.record.Name}_runs_export.csv`);\n SharedService.Instance.CreateSimpleNotification('Export successful', 'success', 2000);\n } catch (error) {\n console.error('Export failed:', error);\n SharedService.Instance.CreateSimpleNotification('Export failed', 'error', 3000);\n }\n }\n\n private downloadAsCSV(data: Record<string, string | number>[], filename: string) {\n if (data.length === 0) return;\n\n const headers = Object.keys(data[0]);\n const csvContent = [\n headers.join(','),\n ...data.map(row =>\n headers.map(h => {\n const val = row[h];\n // Escape quotes and wrap in quotes if contains comma\n const strVal = String(val);\n if (strVal.includes(',') || strVal.includes('\"') || strVal.includes('\\n')) {\n return `\"${strVal.replace(/\"/g, '\"\"')}\"`;\n }\n return strVal;\n }).join(',')\n )\n ].join('\\n');\n\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = filename;\n link.click();\n URL.revokeObjectURL(link.href);\n }\n\n getRunTags(run: MJTestSuiteRunEntity): string[] {\n return TagsHelper.parseTags(run.Tags);\n }\n\n /**\n * Export matrix view data to CSV\n */\n exportMatrixToCSV() {\n if (this.matrixData.length === 0) {\n SharedService.Instance.CreateSimpleNotification('No data to export', 'warning', 2000);\n return;\n }\n\n try {\n const tests = this.getUniqueTestsFromMatrix();\n const runs = this.matrixData;\n\n // Build CSV rows\n const rows: Record<string, string | number>[] = [];\n\n for (const test of tests) {\n const row: Record<string, string | number> = {\n 'Seq': test.sequence,\n 'Test Name': test.testName\n };\n\n // Add column for each run\n for (const run of runs) {\n const result = run.testResults.get(test.testId);\n const runLabel = run.tags.length > 0\n ? `${run.tags.slice(0, 2).join('/')} (${this.getRelativeTime(run.date)})`\n : this.getRelativeTime(run.date);\n\n if (result) {\n // Build cell value based on what's shown\n const parts: string[] = [];\n if (this.evalPreferences.showExecution) parts.push(result.status);\n if (this.evalPreferences.showHuman) parts.push(result.humanRating != null ? `H:${result.humanRating}` : 'H:-');\n if (this.evalPreferences.showAuto) parts.push(result.score != null ? `A:${Math.round(result.score * 100)}%` : 'A:-');\n row[runLabel] = parts.join(' | ');\n } else {\n row[runLabel] = 'Not Run';\n }\n }\n\n rows.push(row);\n }\n\n this.downloadAsCSV(rows, `${this.record.Name}_matrix_export.csv`);\n SharedService.Instance.CreateSimpleNotification('Matrix exported successfully', 'success', 2000);\n } catch (error) {\n console.error('Matrix export failed:', error);\n SharedService.Instance.CreateSimpleNotification('Export failed', 'error', 3000);\n }\n }\n\n // ==========================================\n // Keyboard Shortcuts Settings\n // ==========================================\n\n /**\n * Load keyboard shortcuts visibility setting from user settings\n */\n private loadShortcutsSetting(): void {\n try {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === SHORTCUTS_SETTINGS_KEY);\n\n if (setting) {\n this.shortcutsSettingEntity = setting;\n this.showShortcuts = setting.Value === 'true';\n } else {\n // Default to hidden\n this.showShortcuts = false;\n }\n this.cdr.markForCheck();\n } catch (error) {\n console.warn('Failed to load shortcuts setting:', error);\n }\n }\n\n /**\n * Toggle analytics filters visibility\n */\n toggleFilters(): void {\n this.filtersCollapsed = !this.filtersCollapsed;\n this.cdr.markForCheck();\n }\n\n /**\n * Toggle keyboard shortcuts visibility and save preference\n */\n async toggleShortcuts(): Promise<void> {\n this.showShortcuts = !this.showShortcuts;\n this.cdr.markForCheck();\n\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) return;\n\n if (!this.shortcutsSettingEntity) {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === SHORTCUTS_SETTINGS_KEY);\n\n if (setting) {\n this.shortcutsSettingEntity = setting;\n } else {\n this.shortcutsSettingEntity = await this.metadata.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n this.shortcutsSettingEntity.UserID = userId;\n this.shortcutsSettingEntity.Setting = SHORTCUTS_SETTINGS_KEY;\n }\n }\n\n this.shortcutsSettingEntity.Value = this.showShortcuts ? 'true' : 'false';\n await this.shortcutsSettingEntity.Save();\n } catch (error) {\n console.warn('Failed to save shortcuts setting:', error);\n }\n }\n\n /** Case-insensitive UUID check whether a run is the currently selected Run A (baseline). */\n public IsCompareRunA(run: MJTestSuiteRunEntity): boolean {\n return UUIDsEqual(this.compareRunA?.ID, run.ID);\n }\n\n /** Case-insensitive UUID check whether a run is the currently selected Run B (compare). */\n public IsCompareRunB(run: MJTestSuiteRunEntity): boolean {\n return UUIDsEqual(this.compareRunB?.ID, run.ID);\n }\n}\n\n/**\n * Analytics data point for charting\n */\ninterface AnalyticsDataPoint {\n runId: string;\n date: Date;\n passRate: number;\n totalTests: number;\n passedTests: number;\n failedTests: number;\n errorTests: number;\n skippedTests: number;\n duration: number;\n cost: number;\n tags: string[];\n status: string;\n}\n\n/**\n * Matrix data point for the matrix view - shows test results across suite runs\n */\ninterface MatrixDataPoint {\n runId: string;\n date: Date;\n tags: string[];\n status: string;\n passRate: number;\n testResults: Map<string, TestResultCell>;\n}\n\ninterface TestResultCell {\n testRunId: string;\n testId: string;\n testName: string;\n status: string;\n score: number | null;\n duration: number | null;\n humanRating: number | null;\n humanComments: string | null;\n sequence: number;\n}\n","<div class=\"test-suite-form\">\n <!-- Header Section -->\n <div class=\"suite-header\">\n <!-- Breadcrumb Navigation -->\n <nav class=\"breadcrumb\" aria-label=\"Breadcrumb\">\n <ol>\n <li>\n <a href=\"javascript:void(0)\" (click)=\"navigateToTestingDashboard()\">\n <i class=\"fas fa-vial\"></i>\n <span class=\"breadcrumb-text\">Testing</span>\n </a>\n </li>\n <li class=\"current\">\n <i class=\"fas fa-chevron-right separator\"></i>\n <i class=\"fas fa-layer-group\"></i>\n <span>{{ record.Name }}</span>\n </li>\n </ol>\n </nav>\n\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"suite-icon\" [style.background-color]=\"getStatusColor()\">\n <i class=\"fas fa-layer-group\"></i>\n </div>\n <div class=\"suite-info\">\n <h1>{{ record.Name }}</h1>\n <div class=\"suite-meta\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass()\">\n <i class=\"fas\" [ngClass]=\"record.Status === 'Active' ? 'fa-circle-check' : 'fa-circle-pause'\"></i>\n {{ record.Status }}\n </span>\n @if (testsLoaded) {\n <span class=\"test-count\">\n <i class=\"fas fa-flask\"></i>\n {{ suiteTests.length }} tests\n </span>\n }\n </div>\n </div>\n </div>\n <div class=\"header-actions\">\n <app-evaluation-mode-toggle></app-evaluation-mode-toggle>\n <button mjButton (click)=\"exportToExcel()\" title=\"Export to CSV\">\n <i class=\"fas fa-file-excel\"></i> Export\n </button>\n <button mjButton (click)=\"runSuite()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Suite\n </button>\n <button mjButton (click)=\"refresh()\" [disabled]=\"isRefreshing\">\n <i class=\"fas\" [ngClass]=\"isRefreshing ? 'fa-sync fa-spin' : 'fa-sync'\"></i>\n {{ isRefreshing ? 'Refreshing...' : 'Refresh' }}\n </button>\n </div>\n </div>\n @if (record.Description) {\n <div class=\"suite-description\">\n <p>{{ record.Description }}</p>\n </div>\n }\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs-container\">\n <div class=\"tabs\" role=\"tablist\">\n <button class=\"tab\"\n [class.active]=\"activeTab === 'overview'\"\n (click)=\"changeTab('overview')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'overview'\">\n <i class=\"fas fa-th-large\"></i> Overview\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'tests'\"\n (click)=\"changeTab('tests')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'tests'\">\n <i class=\"fas fa-flask\"></i> Tests\n @if (testsLoaded) {\n <span class=\"tab-badge\">{{ suiteTests.length }}</span>\n }\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'runs'\"\n (click)=\"changeTab('runs')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'runs'\">\n <i class=\"fas fa-history\"></i> Runs\n @if (runsLoaded) {\n <span class=\"tab-badge\">{{ suiteRuns.length }}</span>\n }\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'analytics'\"\n (click)=\"changeTab('analytics')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'analytics'\">\n <i class=\"fas fa-chart-line\"></i> Analytics\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'compare'\"\n (click)=\"changeTab('compare')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'compare'\">\n <i class=\"fas fa-balance-scale\"></i> Compare\n </button>\n </div>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tab-content\">\n <!-- Overview Tab -->\n @if (activeTab === 'overview') {\n <div class=\"overview-tab\">\n <div class=\"info-section\">\n <h3><i class=\"fas fa-info-circle\"></i> Suite Information</h3>\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <div class=\"info-label\">Name</div>\n <div class=\"info-value\">{{ record.Name }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Status</div>\n <div class=\"info-value\">\n <span class=\"status-badge-inline\" [ngClass]=\"getStatusClass()\">{{ record.Status }}</span>\n </div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Created</div>\n <div class=\"info-value\">{{ record.__mj_CreatedAt | date:'medium' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Updated</div>\n <div class=\"info-value\">{{ record.__mj_UpdatedAt | date:'medium' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Max Execution Time</div>\n <div class=\"info-value\">{{ formatTimeout(record.MaxExecutionTimeMS) }}</div>\n </div>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-cogs\"></i> Execution Settings</h3>\n <div class=\"config-grid\">\n <div class=\"config-item\">\n <label>Max Execution Time (ms)</label>\n <input type=\"number\" [(ngModel)]=\"record.MaxExecutionTimeMS\" class=\"config-input\" placeholder=\"Default: 300000 (5 min)\" />\n <span class=\"config-hint\">Default timeout for tests in this suite</span>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Tests Tab -->\n @if (activeTab === 'tests') {\n <div class=\"tests-tab\">\n <!-- Loading State -->\n @if (loadingTests) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2,3,4,5]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-sequence\"></div>\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Tests List -->\n @if (!loadingTests && suiteTests.length > 0) {\n <div class=\"tests-list\">\n @for (test of suiteTests; track test) {\n <div class=\"test-item\" (click)=\"openTest(test.TestID)\">\n <div class=\"test-sequence\">{{ test.Sequence }}</div>\n <div class=\"test-icon\"><i class=\"fas fa-flask\"></i></div>\n <div class=\"test-content\">\n <div class=\"test-name\">{{ test.Test }}</div>\n <div class=\"test-status\">\n @if (test.Status) {\n <span><i class=\"fas fa-info-circle\"></i> {{ test.Status }}</span>\n }\n </div>\n </div>\n <i class=\"fas fa-chevron-right\"></i>\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (testsLoaded && !loadingTests && suiteTests.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-flask\"></i>\n </div>\n <h4>No Tests in Suite</h4>\n <p>Add tests to this suite to start running them together.</p>\n </div>\n }\n </div>\n }\n\n <!-- Runs Tab -->\n @if (activeTab === 'runs') {\n <div class=\"runs-tab\">\n <!-- Loading State -->\n @if (loadingRuns) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2,3]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Runs List -->\n @if (!loadingRuns && suiteRuns.length > 0) {\n <div class=\"runs-list\">\n @for (run of suiteRuns; track run) {\n <div class=\"run-item\" (click)=\"openSuiteRun(run.ID)\">\n <div class=\"run-icon\" [style.background-color]=\"getRunStatusColor(run.Status)\">\n <i class=\"fas\"\n [class.fa-check]=\"run.Status === 'Completed'\"\n [class.fa-times]=\"run.Status === 'Failed'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"\n [class.fa-ban]=\"run.Status === 'Cancelled'\"></i>\n </div>\n <div class=\"run-content\">\n <div class=\"run-header\">\n <span class=\"run-id\">Run #{{ run.ID.substring(0, 8) }}</span>\n <span class=\"run-status\" [style.color]=\"getRunStatusColor(run.Status)\">{{ run.Status }}</span>\n </div>\n <div class=\"run-meta\">\n <span><i class=\"fas fa-calendar\"></i> {{ getRelativeTime(run.StartedAt) }}</span>\n @if (run.TotalTests) {\n <span>\n <i class=\"fas fa-check-circle\"></i> {{ run.PassedTests }}/{{ run.TotalTests }}\n ({{ getPassRate(run).toFixed(0) }}%)\n </span>\n }\n </div>\n <!-- Evaluation metrics row -->\n <div class=\"run-eval-metrics\">\n <!-- Status badge -->\n @if (evalPreferences.showExecution) {\n <span class=\"eval-metric status\" [class]=\"'status-' + run.Status.toLowerCase()\">\n <i class=\"fas\"\n [class.fa-circle-check]=\"run.Status === 'Completed'\"\n [class.fa-circle-xmark]=\"run.Status === 'Failed'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"\n [class.fa-ban]=\"run.Status === 'Cancelled'\"></i>\n </span>\n }\n <!-- Human score (placeholder - need avg from suite run) -->\n @if (evalPreferences.showHuman) {\n <span class=\"eval-metric human\" title=\"Human evaluation\">\n <i class=\"fas fa-user\"></i>\n <span class=\"eval-pending\"><i class=\"fas fa-clock\"></i></span>\n </span>\n }\n <!-- Auto score (pass rate as proxy) -->\n @if (evalPreferences.showAuto && run.TotalTests) {\n <span class=\"eval-metric auto\"\n [class.high]=\"getPassRate(run) >= 80\"\n [class.medium]=\"getPassRate(run) >= 50 && getPassRate(run) < 80\"\n [class.low]=\"getPassRate(run) < 50\"\n title=\"Auto score (pass rate)\">\n <i class=\"fas fa-robot\"></i>\n <span>{{ getPassRate(run).toFixed(0) }}%</span>\n </span>\n }\n </div>\n <!-- Tags display -->\n @if (getRunTags(run).length > 0) {\n <div class=\"run-tags\">\n @for (tag of getRunTags(run); track tag) {\n <span class=\"tag-chip\">{{ tag }}</span>\n }\n </div>\n }\n </div>\n <i class=\"fas fa-chevron-right\"></i>\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (runsLoaded && !loadingRuns && suiteRuns.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-play-circle\"></i>\n </div>\n <h4>No Suite Runs Yet</h4>\n <p>Run this suite to see execution history and results here.</p>\n <button mjButton (click)=\"runSuite()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Suite Now\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Analytics Tab -->\n @if (activeTab === 'analytics') {\n <div class=\"analytics-tab\">\n <!-- Loading State -->\n @if (loadingAnalytics) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading analytics data...\"></mj-loading>\n </div>\n }\n @if (!loadingAnalytics && analyticsLoaded) {\n <!-- View Toggle Sub-nav -->\n <div class=\"analytics-subnav\">\n <div class=\"subnav-tabs\">\n <button class=\"subnav-tab\"\n [class.active]=\"analyticsView === 'summary'\"\n (click)=\"setAnalyticsView('summary')\">\n <i class=\"fas fa-chart-bar\"></i>\n <span>Summary</span>\n </button>\n <button class=\"subnav-tab\"\n [class.active]=\"analyticsView === 'matrix'\"\n (click)=\"setAnalyticsView('matrix')\">\n <i class=\"fas fa-th\"></i>\n <span>Matrix</span>\n </button>\n <button class=\"subnav-tab\"\n [class.active]=\"analyticsView === 'chart'\"\n (click)=\"setAnalyticsView('chart')\">\n <i class=\"fas fa-project-diagram\"></i>\n <span>Chart</span>\n </button>\n </div>\n </div>\n <!-- Collapsible Filters (shared by both views) -->\n <div class=\"analytics-filters\" [class.collapsed]=\"filtersCollapsed\">\n <div class=\"filters-header\" (click)=\"toggleFilters()\">\n <span class=\"filters-title\">\n <i class=\"fas fa-filter\"></i>\n Filters\n @if (filtersCollapsed) {\n <span class=\"filter-summary\">\n {{ analyticsTimeRange === 'all' ? 'All Time' : analyticsTimeRange }}\n @if (selectedTags.length > 0) {\n <span> · {{ selectedTags.length }} tags</span>\n }\n </span>\n }\n </span>\n <i class=\"fas\" [ngClass]=\"filtersCollapsed ? 'fa-chevron-down' : 'fa-chevron-up'\"></i>\n </div>\n @if (!filtersCollapsed) {\n <div class=\"filters-content\">\n <div class=\"filter-group\">\n <label>Time Range</label>\n <div class=\"filter-buttons\">\n <button class=\"filter-btn\" [class.active]=\"analyticsTimeRange === '7d'\" (click)=\"setTimeRange('7d')\">7 Days</button>\n <button class=\"filter-btn\" [class.active]=\"analyticsTimeRange === '30d'\" (click)=\"setTimeRange('30d')\">30 Days</button>\n <button class=\"filter-btn\" [class.active]=\"analyticsTimeRange === '90d'\" (click)=\"setTimeRange('90d')\">90 Days</button>\n <button class=\"filter-btn\" [class.active]=\"analyticsTimeRange === 'all'\" (click)=\"setTimeRange('all')\">All Time</button>\n </div>\n </div>\n @if (uniqueTags.length > 0) {\n <div class=\"filter-group\">\n <label>Filter by Tag @if (selectedTags.length > 0) {\n <span class=\"filter-hint\">({{ selectedTags.length }} selected)</span>\n }</label>\n <div class=\"filter-buttons tag-filters\">\n <button class=\"filter-btn tag-btn all-tags-btn\"\n [class.active]=\"selectedTags.length === 0\"\n (click)=\"toggleTagFilter(null)\">\n <i class=\"fas fa-layer-group\"></i> All Tags\n </button>\n @for (tag of uniqueTags; track tag) {\n <button class=\"filter-btn tag-btn\"\n [class.active]=\"isTagSelected(tag)\"\n (click)=\"toggleTagFilter(tag)\">\n @if (isTagSelected(tag)) {\n <i class=\"fas fa-check\"></i>\n }\n {{ tag }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n <!-- Summary View -->\n @if (analyticsView === 'summary') {\n <!-- KPI Cards -->\n <div class=\"analytics-kpis\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\"><i class=\"fas fa-play-circle\"></i></div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ getTotalRuns() }}</div>\n <div class=\"kpi-label\">Total Runs</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon success\"><i class=\"fas fa-check-circle\"></i></div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ getAveragePassRate().toFixed(1) }}%</div>\n <div class=\"kpi-label\">Avg Pass Rate</div>\n <div class=\"kpi-trend\" [ngClass]=\"{'trend-up': getPassRateTrend().direction === 'up', 'trend-down': getPassRateTrend().direction === 'down'}\">\n <i class=\"fas\" [ngClass]=\"{'fa-arrow-up': getPassRateTrend().direction === 'up', 'fa-arrow-down': getPassRateTrend().direction === 'down', 'fa-minus': getPassRateTrend().direction === 'stable'}\"></i>\n {{ getPassRateTrend().value.toFixed(1) }}%\n </div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon info\"><i class=\"fas fa-clock\"></i></div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ formatDuration(getAverageDuration()) }}</div>\n <div class=\"kpi-label\">Avg Duration</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon warning\"><i class=\"fas fa-dollar-sign\"></i></div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ formatCost(getTotalCost()) }}</div>\n <div class=\"kpi-label\">Total Cost</div>\n </div>\n </div>\n </div>\n <!-- Runs Table -->\n <div class=\"analytics-table-section\">\n <h3><i class=\"fas fa-table\"></i> Run History</h3>\n <div class=\"analytics-table-wrapper\">\n <table class=\"analytics-table\">\n <thead>\n <tr>\n <th>Date</th>\n <th>Status</th>\n <th>Pass Rate</th>\n <th>Tests</th>\n <th>Duration</th>\n <th>Cost</th>\n <th>Tags</th>\n </tr>\n </thead>\n <tbody>\n @for (dp of getFilteredAnalyticsData(); track dp) {\n <tr (click)=\"openSuiteRun(dp.runId)\" class=\"clickable-row\">\n <td>{{ dp.date | date:'short' }}</td>\n <td>\n <span class=\"status-chip\" [ngClass]=\"'status-' + dp.status.toLowerCase()\">{{ dp.status }}</span>\n </td>\n <td>\n <div class=\"pass-rate-cell\">\n <div class=\"pass-rate-bar\" [style.width.%]=\"dp.passRate\" [ngClass]=\"{'high': dp.passRate >= 80, 'medium': dp.passRate >= 50 && dp.passRate < 80, 'low': dp.passRate < 50}\"></div>\n <span>{{ dp.passRate.toFixed(0) }}%</span>\n </div>\n </td>\n <td>{{ dp.passedTests }}/{{ dp.totalTests }}</td>\n <td>{{ formatDuration(dp.duration) }}</td>\n <td>{{ formatCost(dp.cost) }}</td>\n <td>\n <div class=\"tag-cell\">\n @for (tag of dp.tags.slice(0, 2); track tag) {\n <span class=\"tag-chip-table\">{{ tag }}</span>\n }\n @if (dp.tags.length > 2) {\n <span class=\"tag-more\">+{{ dp.tags.length - 2 }}</span>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n @if (getFilteredAnalyticsData().length === 0) {\n <div class=\"empty-state small\">\n <p>No runs match the current filters.</p>\n </div>\n }\n </div>\n }\n <!-- Matrix View -->\n @if (analyticsView === 'matrix') {\n <!-- Loading Matrix -->\n @if (loadingMatrix) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading test matrix...\"></mj-loading>\n </div>\n }\n <!-- Matrix Content -->\n @if (!loadingMatrix && matrixLoaded && matrixData.length > 0) {\n <div class=\"matrix-section\">\n <div class=\"matrix-header\">\n <h3><i class=\"fas fa-th\"></i> Test Results Matrix</h3>\n <div class=\"matrix-header-right\">\n <div class=\"matrix-filter-input\">\n <i class=\"fas fa-search\"></i>\n <input type=\"text\"\n placeholder=\"Filter tests...\"\n [value]=\"matrixTestFilter\"\n (input)=\"onMatrixFilterInput($event)\"\n class=\"filter-input\">\n @if (matrixTestFilter) {\n <button class=\"clear-filter-btn\" (click)=\"clearMatrixFilter()\" title=\"Clear filter\">\n <i class=\"fas fa-times\"></i>\n </button>\n }\n </div>\n <span class=\"matrix-run-count\">{{ matrixData.length }} runs · {{ getUniqueTestsFromMatrix().length }} tests</span>\n <button mjButton (click)=\"exportMatrixToCSV()\" [disabled]=\"matrixData.length === 0\" title=\"Export matrix to CSV\">\n <i class=\"fas fa-download\"></i> Export\n </button>\n </div>\n </div>\n <div class=\"matrix-scroll-container\">\n <table class=\"test-matrix\">\n <thead>\n <tr>\n <th class=\"seq-header\" (click)=\"toggleMatrixSort('sequence')\" title=\"Sort by sequence\">\n #\n <i class=\"fas\" [ngClass]=\"matrixSortBy === 'sequence' ? (matrixSortAsc ? 'fa-sort-up' : 'fa-sort-down') : 'fa-sort'\"></i>\n </th>\n <th class=\"test-name-header\" (click)=\"toggleMatrixSort('name')\" title=\"Sort by name\">\n Test\n <i class=\"fas\" [ngClass]=\"matrixSortBy === 'name' ? (matrixSortAsc ? 'fa-sort-up' : 'fa-sort-down') : 'fa-sort'\"></i>\n </th>\n @for (run of matrixData; track run) {\n <th class=\"run-header\" (click)=\"openSuiteRun(run.runId)\" [title]=\"'Click to view suite run - ' + (run.date | date:'medium')\">\n <div class=\"run-header-content\">\n @if (run.tags.length > 0) {\n <div class=\"run-tags-header\">\n @for (tag of run.tags.slice(0, 2); track tag) {\n <span class=\"tag-chip-header\">{{ tag }}</span>\n }\n @if (run.tags.length > 2) {\n <span class=\"tag-more-header\">+{{ run.tags.length - 2 }}</span>\n }\n </div>\n }\n <div class=\"run-date\">{{ getRelativeTime(run.date) }}</div>\n <div class=\"run-pass-rate\" [ngClass]=\"{'high': run.passRate >= 80, 'medium': run.passRate >= 50 && run.passRate < 80, 'low': run.passRate < 50}\">\n {{ run.passRate.toFixed(0) }}%\n </div>\n </div>\n </th>\n }\n <th class=\"spacer-header\"></th>\n </tr>\n </thead>\n <tbody>\n @for (test of getUniqueTestsFromMatrix(); track test) {\n <tr\n [class.row-selected]=\"selectedMatrixTestId === test.testId\"\n (click)=\"selectMatrixRow(test.testId)\">\n <td class=\"seq-cell\">{{ test.sequence }}</td>\n <td class=\"test-name-cell\">\n <span class=\"test-name\" [title]=\"test.testName\">{{ test.testName }}</span>\n </td>\n @for (run of matrixData; track run) {\n <td class=\"result-cell\"\n [ngClass]=\"getMatrixCellClass(getTestResultForRun(run.runId, test.testId))\"\n [class.clickable]=\"getTestResultForRun(run.runId, test.testId)\"\n [class.cell-not-run]=\"!getTestResultForRun(run.runId, test.testId)\"\n [title]=\"getTestResultForRun(run.runId, test.testId)?.status + ' - Click to view test run' || 'Not Run'\"\n (click)=\"onMatrixCellClick(getTestResultForRun(run.runId, test.testId), $event)\">\n @if (getTestResultForRun(run.runId, test.testId); as result) {\n <div class=\"cell-eval-stack\">\n <!-- Status indicator -->\n @if (evalPreferences.showExecution) {\n <span class=\"cell-status\"\n [ngClass]=\"'status-' + result.status.toLowerCase()\"\n [class.cell-skipped-status]=\"result.status === 'Skipped' || result.status === 'Pending'\"\n [title]=\"getStatusTooltip(result.status)\">\n <i class=\"fas\"\n [class.fa-check]=\"result.status === 'Passed'\"\n [class.fa-times]=\"result.status === 'Failed'\"\n [class.fa-exclamation]=\"result.status === 'Error'\"\n [class.fa-hourglass-end]=\"result.status === 'Timeout'\"\n [class.fa-forward]=\"result.status === 'Skipped'\"\n [class.fa-spinner]=\"result.status === 'Running'\"\n [class.fa-clock]=\"result.status === 'Pending'\"></i>\n </span>\n }\n <!-- Human score - slashed icon if no feedback, colored by rating if has feedback -->\n @if (evalPreferences.showHuman && !result.humanRating) {\n <span class=\"cell-human no-feedback\"\n title=\"Human Review: No rating submitted yet\">\n <i class=\"fas fa-user-slash\"></i>\n </span>\n }\n @if (evalPreferences.showHuman && result.humanRating) {\n <span class=\"cell-human has-feedback\"\n [class.rating-low]=\"result.humanRating <= 4\"\n [class.rating-medium]=\"result.humanRating >= 5 && result.humanRating <= 6\"\n [class.rating-good]=\"result.humanRating >= 7 && result.humanRating <= 8\"\n [class.rating-excellent]=\"result.humanRating >= 9\"\n [title]=\"getHumanTooltip(result.humanRating, result.humanComments)\">\n <i class=\"fas fa-user\"></i>\n <span class=\"rating-value\">{{ result.humanRating }}</span>\n </span>\n }\n <!-- Auto score - colored by percentage -->\n @if (evalPreferences.showAuto && result.score != null) {\n <span class=\"cell-auto has-score\"\n [class.score-low]=\"result.score < 0.5\"\n [class.score-medium]=\"result.score >= 0.5 && result.score < 0.7\"\n [class.score-good]=\"result.score >= 0.7 && result.score < 0.85\"\n [class.score-excellent]=\"result.score >= 0.85\"\n [title]=\"'Auto Score: ' + (result.score * 100).toFixed(0) + '% automated evaluation'\">\n <i class=\"fas fa-robot\"></i>\n <span class=\"score-value\">{{ (result.score * 100).toFixed(0) }}</span>\n </span>\n }\n @if (evalPreferences.showAuto && result.score == null) {\n <span class=\"cell-auto no-score\"\n title=\"Auto Score: No automated score available\">\n <i class=\"fas fa-robot\"></i>\n </span>\n }\n </div>\n }\n @if (!getTestResultForRun(run.runId, test.testId)) {\n <span class=\"cell-not-run-indicator\">\n <i class=\"fas fa-minus\"></i>\n </span>\n }\n </td>\n }\n <td class=\"spacer-cell\"></td>\n </tr>\n }\n </tbody>\n <!-- Footer row with totals -->\n <tfoot>\n <tr class=\"totals-row\">\n <td class=\"seq-cell totals-label\"></td>\n <td class=\"test-name-cell totals-label\">\n <strong>Totals</strong>\n </td>\n @for (run of matrixData; track run) {\n <td class=\"result-cell totals-cell\">\n <div class=\"cell-eval-stack totals-stack\">\n <!-- Status totals -->\n @if (evalPreferences.showExecution) {\n <span class=\"totals-status\">\n <span class=\"pass-count\">{{ getRunPassedCount(run) }}/{{ getRunTotalCount(run) }}</span>\n </span>\n }\n <!-- Human totals -->\n @if (evalPreferences.showHuman) {\n <span class=\"totals-human\">\n @if (getRunHumanAvg(run) != null) {\n <span class=\"avg-label\">{{ getRunHumanAvg(run)?.toFixed(1) }}</span>\n }\n <span class=\"count-label\">({{ getRunHumanCount(run) }})</span>\n </span>\n }\n <!-- Auto totals -->\n @if (evalPreferences.showAuto) {\n <span class=\"totals-auto\">\n @if (getRunAutoAvg(run) != null) {\n <span class=\"avg-label\">{{ (getRunAutoAvg(run)! * 100).toFixed(0) }}%</span>\n }\n <span class=\"count-label\">({{ getRunAutoCount(run) }})</span>\n </span>\n }\n </div>\n </td>\n }\n <td class=\"spacer-cell\"></td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n }\n <!-- Empty Matrix State -->\n @if (!loadingMatrix && matrixLoaded && matrixData.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-th\"></i>\n </div>\n <h4>No Matrix Data</h4>\n <p>No suite runs match the current filters.</p>\n </div>\n }\n }\n <!-- Chart View -->\n @if (analyticsView === 'chart') {\n <!-- Loading Chart -->\n @if (loadingMatrix) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading chart data...\"></mj-loading>\n </div>\n }\n <!-- Chart Content -->\n @if (!loadingMatrix && matrixLoaded && matrixData.length > 0) {\n <div class=\"chart-section\">\n <div class=\"chart-header\">\n <h3><i class=\"fas fa-project-diagram\"></i> Test Results Flow</h3>\n <div class=\"chart-legend\">\n <span class=\"legend-item chart-passed\"><i class=\"fas fa-check\"></i> Passed</span>\n <span class=\"legend-item chart-failed\"><i class=\"fas fa-times\"></i> Failed</span>\n <span class=\"legend-item chart-error\"><i class=\"fas fa-exclamation\"></i> Error</span>\n <span class=\"legend-item chart-skipped\"><i class=\"fas fa-forward\"></i> Skipped</span>\n </div>\n </div>\n <div class=\"chart-container\">\n <div #chartContainer class=\"d3-chart\"></div>\n </div>\n <div class=\"chart-info\">\n <i class=\"fas fa-info-circle\"></i>\n Interactive visualization showing test results across {{ matrixData.length }} runs.\n Hover over elements for details, click nodes to navigate.\n </div>\n </div>\n }\n <!-- Empty Chart State -->\n @if (!loadingMatrix && matrixLoaded && matrixData.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-project-diagram\"></i>\n </div>\n <h4>No Chart Data</h4>\n <p>No suite runs match the current filters.</p>\n </div>\n }\n }\n }\n <!-- Empty State -->\n @if (!loadingAnalytics && analyticsLoaded && analyticsData.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-chart-line\"></i>\n </div>\n <h4>No Analytics Data</h4>\n <p>Run this suite to start collecting analytics data.</p>\n <button mjButton (click)=\"runSuite()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Suite Now\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Compare Tab -->\n @if (activeTab === 'compare') {\n <div class=\"compare-tab\">\n <!-- Run Selection -->\n <div class=\"compare-selection\">\n <div class=\"compare-run-selector\">\n <h4>Run A (Baseline)</h4>\n @if (!loadingRuns && suiteRuns.length > 0) {\n <div class=\"run-selector-list\">\n @for (run of suiteRuns; track run) {\n <div class=\"run-selector-item\"\n [class.selected]=\"IsCompareRunA(run)\"\n (click)=\"selectCompareRunA(run)\">\n <div class=\"selector-status\" [style.background-color]=\"getRunStatusColor(run.Status)\"></div>\n <div class=\"selector-content\">\n <div class=\"selector-date\">{{ run.StartedAt | date:'short' }}</div>\n <div class=\"selector-rate\">{{ getPassRate(run).toFixed(0) }}% pass</div>\n </div>\n @if (getRunTags(run).length > 0) {\n <div class=\"selector-tags\">\n @for (tag of getRunTags(run).slice(0, 2); track tag) {\n <span class=\"tag-mini\">{{ tag }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n @if (compareRunA) {\n <div class=\"selected-run-preview\">\n <div class=\"preview-header\">\n <span class=\"preview-label\">Selected:</span>\n <button class=\"clear-btn\" (click)=\"compareRunA = null; compareResults = []\">Clear</button>\n </div>\n <div class=\"preview-details\">\n <span>{{ compareRunA.StartedAt | date:'medium' }}</span>\n <span class=\"preview-rate\">{{ getPassRate(compareRunA).toFixed(1) }}%</span>\n </div>\n </div>\n }\n </div>\n <div class=\"compare-vs\"><i class=\"fas fa-exchange-alt\"></i></div>\n <div class=\"compare-run-selector\">\n <h4>Run B (Compare)</h4>\n @if (!loadingRuns && suiteRuns.length > 0) {\n <div class=\"run-selector-list\">\n @for (run of suiteRuns; track run) {\n <div class=\"run-selector-item\"\n [class.selected]=\"IsCompareRunB(run)\"\n [class.disabled]=\"IsCompareRunA(run)\"\n (click)=\"!IsCompareRunA(run) && selectCompareRunB(run)\">\n <div class=\"selector-status\" [style.background-color]=\"getRunStatusColor(run.Status)\"></div>\n <div class=\"selector-content\">\n <div class=\"selector-date\">{{ run.StartedAt | date:'short' }}</div>\n <div class=\"selector-rate\">{{ getPassRate(run).toFixed(0) }}% pass</div>\n </div>\n @if (getRunTags(run).length > 0) {\n <div class=\"selector-tags\">\n @for (tag of getRunTags(run).slice(0, 2); track tag) {\n <span class=\"tag-mini\">{{ tag }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n @if (compareRunB) {\n <div class=\"selected-run-preview\">\n <div class=\"preview-header\">\n <span class=\"preview-label\">Selected:</span>\n <button class=\"clear-btn\" (click)=\"compareRunB = null; compareResults = []\">Clear</button>\n </div>\n <div class=\"preview-details\">\n <span>{{ compareRunB.StartedAt | date:'medium' }}</span>\n <span class=\"preview-rate\">{{ getPassRate(compareRunB).toFixed(1) }}%</span>\n </div>\n </div>\n }\n </div>\n </div>\n <!-- Comparison Results -->\n @if (compareRunA && compareRunB && !loadingCompare) {\n <div class=\"compare-results\">\n <!-- Summary Cards -->\n <div class=\"compare-summary\">\n <div class=\"compare-summary-card\">\n <div class=\"summary-label\">Pass Rate Change</div>\n <div class=\"summary-value\" [ngClass]=\"{'positive': getComparePassRateDiff()! > 0, 'negative': getComparePassRateDiff()! < 0}\">\n <i class=\"fas\" [ngClass]=\"{'fa-arrow-up': getComparePassRateDiff()! > 0, 'fa-arrow-down': getComparePassRateDiff()! < 0, 'fa-minus': getComparePassRateDiff() === 0}\"></i>\n {{ getComparePassRateDiff()! > 0 ? '+' : '' }}{{ getComparePassRateDiff()?.toFixed(1) }}%\n </div>\n </div>\n <div class=\"compare-summary-card\">\n <div class=\"summary-label\">Duration Change</div>\n <div class=\"summary-value\" [ngClass]=\"{'positive': getCompareDurationDiff()! < 0, 'negative': getCompareDurationDiff()! > 0}\">\n <i class=\"fas\" [ngClass]=\"{'fa-arrow-down': getCompareDurationDiff()! < 0, 'fa-arrow-up': getCompareDurationDiff()! > 0, 'fa-minus': getCompareDurationDiff() === 0}\"></i>\n {{ formatDuration(getAbsCompareDurationDiff()) }}\n </div>\n </div>\n <div class=\"compare-summary-card improved\">\n <div class=\"summary-label\">Improved</div>\n <div class=\"summary-value\">{{ getCompareImprovedCount() }}</div>\n </div>\n <div class=\"compare-summary-card regressed\">\n <div class=\"summary-label\">Regressed</div>\n <div class=\"summary-value\">{{ getCompareRegressedCount() }}</div>\n </div>\n </div>\n <!-- Detailed Comparison Table -->\n <div class=\"compare-table-section\">\n <h3><i class=\"fas fa-list\"></i> Test-by-Test Comparison</h3>\n <div class=\"compare-table-wrapper\">\n <table class=\"compare-table\">\n <thead>\n <tr>\n <th>Test</th>\n <th>Run A Status</th>\n <th>Run B Status</th>\n <th>Score Diff</th>\n <th>Duration Diff</th>\n <th>Change</th>\n </tr>\n </thead>\n <tbody>\n @for (result of compareResults; track result) {\n <tr [ngClass]=\"{'improved': result.runA && result.runB && result.runA.status !== 'Passed' && result.runB.status === 'Passed', 'regressed': result.runA && result.runB && result.runA.status === 'Passed' && result.runB.status !== 'Passed'}\">\n <td class=\"test-name-cell\">{{ result.testName }}</td>\n <td>\n @if (result.runA) {\n <span class=\"status-chip\" [ngClass]=\"'status-' + result.runA.status.toLowerCase()\">{{ result.runA.status }}</span>\n }\n @if (!result.runA) {\n <span class=\"status-chip status-missing\">N/A</span>\n }\n </td>\n <td>\n @if (result.runB) {\n <span class=\"status-chip\" [ngClass]=\"'status-' + result.runB.status.toLowerCase()\">{{ result.runB.status }}</span>\n }\n @if (!result.runB) {\n <span class=\"status-chip status-missing\">N/A</span>\n }\n </td>\n <td>\n @if (result.scoreDiff != null) {\n <span [ngClass]=\"{'positive': result.scoreDiff > 0, 'negative': result.scoreDiff < 0}\">\n {{ result.scoreDiff > 0 ? '+' : '' }}{{ (result.scoreDiff * 100).toFixed(1) }}%\n </span>\n }\n @if (result.scoreDiff == null) {\n <span class=\"muted\">-</span>\n }\n </td>\n <td>\n @if (result.durationDiff != null) {\n <span [ngClass]=\"{'positive': result.durationDiff < 0, 'negative': result.durationDiff > 0}\">\n {{ result.durationDiff > 0 ? '+' : '' }}{{ result.durationDiff.toFixed(1) }}s\n </span>\n }\n @if (result.durationDiff == null) {\n <span class=\"muted\">-</span>\n }\n </td>\n <td>\n @if (result.runA && result.runB && result.runA.status !== 'Passed' && result.runB.status === 'Passed') {\n <span class=\"change-indicator improved\">\n <i class=\"fas fa-arrow-up\"></i> Fixed\n </span>\n }\n @if (result.runA && result.runB && result.runA.status === 'Passed' && result.runB.status !== 'Passed') {\n <span class=\"change-indicator regressed\">\n <i class=\"fas fa-arrow-down\"></i> Broke\n </span>\n }\n @if (!result.statusChanged) {\n <span class=\"change-indicator unchanged\">\n <i class=\"fas fa-minus\"></i>\n </span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n </div>\n }\n <!-- Loading State for Compare -->\n @if (loadingCompare) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading comparison data...\"></mj-loading>\n </div>\n }\n <!-- Empty State -->\n @if (!compareRunA || !compareRunB) {\n <div class=\"compare-empty\">\n <div class=\"compare-empty-icon\">\n <i class=\"fas fa-balance-scale\"></i>\n </div>\n <h4>Select Two Runs to Compare</h4>\n <p>Choose a baseline run (A) and a comparison run (B) from the lists above to see a detailed side-by-side comparison.</p>\n </div>\n }\n <!-- No Runs State -->\n @if (runsLoaded && suiteRuns.length < 2) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-balance-scale\"></i>\n </div>\n <h4>Not Enough Runs to Compare</h4>\n <p>You need at least 2 suite runs to use the comparison feature.</p>\n <button mjButton (click)=\"runSuite()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Suite Now\n </button>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Keyboard Shortcuts Toggle Button -->\n <button class=\"shortcuts-toggle\" (click)=\"toggleShortcuts()\" [title]=\"showShortcuts ? 'Hide keyboard shortcuts' : 'Show keyboard shortcuts'\">\n <i class=\"fas fa-keyboard\"></i>\n </button>\n\n <!-- Keyboard Shortcuts Hint (Desktop Only) -->\n @if (showShortcuts) {\n <div class=\"keyboard-shortcuts\">\n <div class=\"shortcuts-header\">\n <i class=\"fas fa-keyboard\"></i>\n Shortcuts\n <button class=\"shortcuts-close\" (click)=\"toggleShortcuts()\" title=\"Hide shortcuts\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"shortcut-list\">\n <div class=\"shortcut-item\">\n <span>Refresh</span>\n <span class=\"shortcut-keys\"><kbd>Cmd</kbd><kbd>R</kbd></span>\n </div>\n <div class=\"shortcut-item\">\n <span>Run Suite</span>\n <span class=\"shortcut-keys\"><kbd>Cmd</kbd><kbd>Enter</kbd></span>\n </div>\n <div class=\"shortcut-item\">\n <span>Switch Tabs</span>\n <span class=\"shortcut-keys\"><kbd>1</kbd>-<kbd>5</kbd></span>\n </div>\n </div>\n </div>\n }\n\n <!-- Slide Panel for Suite Execution -->\n @if (testingDialogService.IsPanelOpen) {\n <mj-slide-panel\n Mode=\"slide\"\n [Title]=\"testingDialogService.PanelOptions?.suiteId ? 'Suite Execution' : 'Run Suite'\"\n [Resizable]=\"true\"\n (Closed)=\"OnPanelClosed()\">\n <app-test-run-dialog\n [PanelMode]=\"true\"\n [selectedTestId]=\"testingDialogService.PanelOptions?.testId ?? null\"\n [selectedSuiteId]=\"testingDialogService.PanelOptions?.suiteId ?? null\"\n [runMode]=\"testingDialogService.PanelOptions?.mode ?? 'suite'\"\n (PanelClose)=\"OnPanelClosed()\">\n </app-test-run-dialog>\n </mj-slide-panel>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"test-suite-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Tests/test-suite-form.component.ts","../../../../src/lib/custom/Tests/test-suite-form.component.html"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAqB,uBAAuB,EAAE,YAAY,EAAiB,SAAS,EAAE,gBAAgB,EAAc,MAAM,EAAE,MAAM,eAAe,CAAC;AACpK,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAY,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAe,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAA+I,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC5M,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iEAAiE,CAAC;AAC3G,OAAO,EACL,oBAAoB,EACpB,UAAU,EAEV,4BAA4B,EAE7B,MAAM,4BAA4B,CAAC;;;;;;;;;;mBCiQrB,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC;mBA+FT,CAAC,EAAC,CAAC,EAAC,CAAC;;;;;;;;;IArVN,gCAA4F;IAAA,sBAAC;IAAA,iBAAO;;;IASpG,gCAAyB;IACvB,wBAA4B;IAC5B,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,+DACF;;;IAGA,gCAA4D;IAC1D,wBAA6B;IAAC,yBAChC;IAAA,iBAAO;;;IAqBb,AADF,+BAA+B,QAC1B;IAAA,YAAwB;IAC7B,AAD6B,iBAAI,EAC3B;;;IADD,eAAwB;IAAxB,+CAAwB;;;IAsBzB,gCAAwB;IAAA,YAAuB;IAAA,iBAAO;;;IAA9B,cAAuB;IAAvB,8CAAuB;;;IAU/C,gCAAwB;IAAA,YAAsB;IAAA,iBAAO;;;IAA7B,cAAsB;IAAtB,6CAAsB;;;IAgEpC,kCAAwB;IAAA,YAAS;IAAA,iBAAS;;;IAAlC,gCAAe;IAAC,cAAS;IAAT,4BAAS;;;IAgBnC,kCAAyB;IAAA,YAAY;IAAA,iBAAS;;;IAAtC,iCAAgB;IAAC,cAAY;IAAZ,+BAAY;;;;IASrC,gCAAgC;IAC9B,YACA;IAAA,kCAAoI;IAA3F,sNAAS,wBAAc,wBAAE,wBAAwB,KAAC;IACzF,wBAA4B;IAEhC,AADE,iBAAS,EACJ;;;IAJL,cACA;IADA,uCACA;IAA4F,cAAuC;;;;;IA/D3I,AADF,AADF,AAFF,+BAA0B,kBAEM,iBACQ,SAC9B;IAAA,wBAAoC;IAAC,wBAAO;IAAA,iBAAK;IACrD,6BAA4B;IAAA,mFAA8D;IAC5F,AAD4F,iBAAI,EACvF;IAGL,AADF,AADF,+BAAuB,cACoB,iBACf;IAAA,sBAAK;IAAA,iCAAuB;IAAA,kBAAC;IAAO,AAAP,iBAAO,EAAQ;IACpE,kCAME;IADA,gUAAyB;IAE7B,AAPE,iBAME,EACE;IAGJ,AADF,gCAAyC,iBACR;IAAA,4BAAW;IAAA,iBAAQ;IAClD,qCAOC;IADC,oQAAgD,IAAI,KAAC;IAEzD,AADG,iBAAW,EACR;IAGJ,AADF,gCAAwB,iBACI;IAAA,uBAAM;IAAA,iBAAQ;IAEtC,AADF,gCAA4B,kBAKzB;IADC,qUAA2B;IAE3B,0IAEC;IAGP,AADE,AADE,iBAAS,EACL,EACF;IAGJ,AADF,gCAAwB,iBACI;IAAA,6BAAY;IAAA,iBAAQ;IAC9C,mCAKC;IADC,+PAA6C,IAAI,KAAC;IAElD,mCAAyB;IAAA,+CAAoB;IAAA,iBAAS;IACtD,wHAEC;IAEL,AADE,iBAAS,EACL;IAGJ,AADF,gCAAyC,iBACf;IAAA,qBAAI;IAAA,iBAAQ;IACpC,gCAAmD;IAA3B,wMAAS,mBAAgB,KAAC;IAChD,wIAOC;IACD,qCASE;IAHA,0TAAsB;IAEtB,AADA,+MAAW,gCAAyB,KAAC,sLAC7B,wBAAiB,KAAC;IAE9B,AAVE,iBASE,EACE;IACN,iCAA0B;IAAA,kGAAiF;IAGjH,AADE,AADE,AAD6G,iBAAO,EAC9G,EACF,EACE;IAKN,AADF,AADF,oCAA8B,kBACQ,UAC9B;IAAA,yBAA2B;IAAC,oCAAkB;IACpD,AADoD,iBAAK,EAChD;IAGL,AADF,AADF,gCAAuB,eACG,iBACK;IAAA,wCAAuB;IAAA,iBAAQ;IAC1D,kCAOE;IADA,yQAAwD,EAAE,eAAe,IAAI,GAAG,IAAI,eAAW;IANjG,iBAOE;IACF,iCAA0B;IAAA,aAAkG;IAGlI,AADE,AADE,AAD8H,iBAAO,EAC/H,EACF,EACE;IAMJ,AADF,AADF,AADF,oCAA8B,eACL,eACE,eACG;IAAA,wBAAO;IAAA,iBAAM;IACrC,gCAAwB;IAAA,aAA2C;;IACrE,AADqE,iBAAM,EACrE;IAEJ,AADF,gCAAuB,eACG;IAAA,6BAAY;IAAA,iBAAM;IAC1C,gCAAwB;IAAA,aAA2C;;IACrE,AADqE,iBAAM,EACrE;IAEJ,AADF,gCAAuB,eACG;IAAA,yBAAQ;IAAA,iBAAM;IACtC,gCAAkC;IAAA,aAAe;IAIzD,AADE,AADE,AADE,AADmD,iBAAM,EACnD,EACF,EACE,EACN;;;IA/GI,gBAAyB;IAAzB,kDAAyB;IAWzB,eAA8B;IAA9B,mDAA8B;IAW5B,eAA2B;IAA3B,oDAA2B;IAE3B,cAEC;IAFD,mCAEC;IAUH,eAA2B;IAA3B,gDAA2B;IAGnB,cAAgB;IAAhB,8BAAgB;IACxB,eAEC;IAFD,wCAEC;IAOD,eAOC;IAPD,0BAOC;IAMC,eAA4E;IAA5E,iGAA4E;IAC5E,+CAAsB;IAuBxB,gBAAqC;IAArC,0DAAqC;IAGb,eAAkG;IAAlG,qIAAkG;IAUpG,eAA2C;IAA3C,oFAA2C;IAI3C,eAA2C;IAA3C,oFAA2C;IAIjC,eAAe;IAAf,sCAAe;;;IAejD,gCAAoC;IAAA,YAAuB;IAAA,iBAAO;;;IAA9B,cAAuB;IAAvB,8CAAuB;;;IAgBzD,gCAA2B;IAEzB,AADA,2BAAqC,eACJ;IACjC,gCAA8B;IAE5B,AADA,2BAAsC,eACE;IAE5C,AADE,iBAAM,EACF;;;IATV,AADF,+BAA2B,eACE;IACzB,qJASC;IAEL,AADE,iBAAM,EACF;;IAXF,eASC;IATD,yCASC;;;IAkBO,4BAAM;IAAA,yBAAkC;IAAC,YAAiB;IAAA,iBAAO;;;IAAxB,eAAiB;IAAjB,2CAAiB;;;IAexD,yBAAsC;;;IAEtC,wBACF;;;;IAZJ,gCAAoE;IAAnC,0MAAS,wBAAwB,KAAC;IACjE,iCAAuC;IAAA,kCAAkB;IAAA,iBAAO;IAChE,mCAKC;IAFC,gSAAS,0CAA+B,KAAC;IAKvC,AAFF,qJAAsB,qHAEb;IAGX,iBAAS;IACT,mCAKC;IAFC,iPAAS,+BAAwB,KAAC;IAGlC,wBACF;IACF,AADE,iBAAS,EACL;;;IAhBF,eAA2B;IAA3B,gDAA2B;IAE3B,cAIC;IAJD,+CAIC;IAMD,eAA2B;IAA3B,gDAA2B;;;;IAM/B,mCAMC;IADC,gSAAS,0CAA+B,KAAC;IAEzC,wBAA4B;IAC9B,iBAAS;IACT,8BAA6E;IAAhC,qRAAS,gCAAqB,KAAC;IAAC,iBAAI;;;;IAhDnF,AADF,gCAAuF,gBACa;IAChG,yBAAoC;IACtC,iBAAO;IACP,gCAA2B;IAAA,YAAmB;IAAA,iBAAM;IACpD,gCAAuB;IAAA,wBAA4B;IAAA,iBAAM;IACzD,gCAA0D;IAAhC,oPAAS,gCAAqB,KAAC;IACvD,gCAAuB;IAAA,YAAe;IAAA,iBAAM;IAC5C,iCAAyB;IACvB,sIAAmB;IAIvB,AADE,iBAAM,EACF;IA0BJ,AAxBF,0IAA+C,wGAwBtC;IAYX,iBAAM;;;;IAnDyB,mFAAuD;IAIzD,eAAmB;IAAnB,uCAAmB;IAGrB,eAAe;IAAf,mCAAe;IAEpC,eAEC;IAFD,2CAEC;IAIL,cAmCC;IAnCD,8EAmCC;;;;IApDP,gCAA8E;IAA1C,kPAAsB,yBAAkB,KAAC;IAC3E,oIAqDC;IACH,iBAAM;;;IAtDJ,cAqDC;IArDD,gCAqDC;;;;IAMD,AADF,gCAAyB,eACC;IACtB,wBAA4B;IAC9B,iBAAM;IACN,0BAAI;IAAA,iCAAiB;IAAA,iBAAK;IAC1B,yBAAG;IAAA,uEAAuD;IAAA,iBAAI;IAC9D,kCAAkE;IAA/B,sNAAS,2BAAoB,KAAC;IAC/D,wBAA2B;IAAC,2BAC9B;IACF,AADE,iBAAS,EACL;;;;IApGJ,AADF,AADF,AAFF,+BAAuB,cAEQ,cACO,aACxB;IAAA,2BAAW;IAAA,iBAAS;IAC5B,mHAAmB;IAGnB,gCAAmC;IAAA,4DAAuC;IAC5E,AAD4E,iBAAO,EAC7E;IAEJ,AADF,+BAAqC,iBAC8D;IAA9D,qMAAS,2BAAoB,KAAC;IAC/D,yBAA2B;IAAC,4BAC9B;IAEJ,AADE,AADE,iBAAS,EACL,EACF;IAGN,oHAAoB;IAiBpB,qHAA8C;IA2D9C,sHAA+D;IAYjE,iBAAM;;;IArGA,eAEC;IAFD,6CAEC;IAIiE,eAA8B;IAA9B,mDAA8B;IAOpG,eAeC;IAfD,+CAeC;IAED,cAyDC;IAzDD,gFAyDC;IAED,cAWC;IAXD,wGAWC;;;IAYO,gCAA2B;IACzB,2BAAiC;IACjC,gCAA8B;IAE5B,AADA,2BAAsC,eACE;IAE5C,AADE,iBAAM,EACF;;;IARV,AADF,+BAA2B,eACE;IACzB,oJAQC;IAEL,AADE,iBAAM,EACF;;IAVF,eAQC;IARD,yCAQC;;;IAyBO,4BAAM;IACJ,yBAAmC;IAAC,YAEtC;IAAA,iBAAO;;;;IAF+B,eAEtC;IAFsC,6HAEtC;;;IAOA,iCAAgF;IAC9E,yBAKgD;IAClD,iBAAO;;;IAP0B,uDAA8C;IAE3E,cAAoD;IAItD,AADE,AADA,AADA,AADA,iEAAoD,gDACH,4CACJ,0CACF,0CACF;;;IAK7C,iCAAyD;IACvD,yBAA2B;IAC3B,iCAA2B;IAAA,yBAA4B;IACzD,AADyD,iBAAO,EACzD;;;IAIP,iCAIiC;IAC/B,yBAA4B;IAC5B,4BAAM;IAAA,YAAkC;IAC1C,AAD0C,iBAAO,EAC1C;;;;IAJL,AADA,AADA,yDAAqC,iFAC2B,yCAC7B;IAG7B,eAAkC;IAAlC,sEAAkC;;;IAQxC,iCAAuB;IAAA,YAAS;IAAA,iBAAO;;;IAAhB,cAAS;IAAT,6BAAS;;;IAFpC,gCAAsB;IACpB,0KAEC;IACH,iBAAM;;;;IAHJ,cAEC;IAFD,cAAA,0BAAe,CAEd;;;;IA5DT,gCAAqD;IAA/B,kPAAS,+BAAoB,KAAC;IAClD,gCAA+E;IAC7E,yBAKgD;IAClD,iBAAM;IAGF,AADF,AADF,gCAAyB,eACC,gBACD;IAAA,YAAiC;IAAA,iBAAO;IAC7D,iCAAuE;IAAA,YAAgB;IACzF,AADyF,iBAAO,EAC1F;IAEJ,AADF,gCAAsB,YACd;IAAA,0BAA+B;IAAC,aAAoC;IAAA,iBAAO;IACjF,qIAAsB;IAMxB,iBAAM;IAEN,iCAA8B;IAE5B,2IAAqC;IAWrC,0IAAiC;IAOjC,0IAAkD;IAUpD,iBAAM;IAEN,yIAAkC;IAOpC,iBAAM;IACN,0BAAoC;IACtC,iBAAM;;;;IAhEkB,cAAwD;IAAxD,4EAAwD;IAE1E,cAA6C;IAI/C,AADE,AADA,AADA,AADA,0DAA6C,yCACH,4CACG,0CACF,0CACF;IAIpB,eAAiC;IAAjC,0DAAiC;IAC7B,cAA6C;IAA7C,iEAA6C;IAAC,cAAgB;IAAhB,oCAAgB;IAGjD,eAAoC;IAApC,qEAAoC;IAC1E,cAKC;IALD,8CAKC;IAKD,eASC;IATD,gEASC;IAED,cAKC;IALD,4DAKC;IAED,cASC;IATD,iFASC;IAGH,cAMC;IAND,iEAMC;;;IAhET,gCAAuB;IACrB,sJAmEC;IACH,iBAAM;;;IApEJ,cAmEC;IAnED,+BAmEC;;;;IAMD,AADF,gCAAyB,eACC;IACtB,yBAAkC;IACpC,iBAAM;IACN,0BAAI;IAAA,iCAAiB;IAAA,iBAAK;IAC1B,yBAAG;IAAA,yEAAyD;IAAA,iBAAI;IAChE,kCAAwD;IAAvC,qNAAS,iBAAU,KAAC;IACnC,wBAA2B;IAAC,+BAC9B;IACF,AADE,iBAAS,EACL;;;IArGV,+BAAsB;IAEpB,kHAAmB;IAgBnB,mHAA4C;IAyE5C,oHAA4D;IAY9D,iBAAM;;;IArGJ,cAcC;IAdD,6CAcC;IAED,cAuEC;IAvED,6EAuEC;IAED,cAWC;IAXD,oGAWC;;;IASC,+BAA2B;IACzB,kCAA0D;IAC5D,iBAAM;;;IAoCM,4BAAM;IAAC,YAAgC;IAAA,iBAAO;;;IAAvC,cAAgC;IAAhC,sEAAgC;;;IAH3C,iCAA6B;IAC3B,YACA;IAAA,4IAA+B;IAGjC,iBAAO;;;IAJL,cACA;IADA,6GACA;IAAA,cAEC;IAFD,yDAEC;;;IAoBC,iCAA0B;IAAA,YAAoC;IAAA,iBAAO;;;IAA3C,cAAoC;IAApC,oEAAoC;;;IAaxD,yBAA4B;;;;IAJhC,mCAEiC;IAA/B,mRAAS,+BAAoB,KAAC;IAC9B,mKAA0B;IAG1B,YACF;IAAA,iBAAS;;;;IANP,uDAAmC;IAEnC,cAEC;IAFD,wDAEC;IACD,cACF;IADE,wCACF;;;;IAjBJ,AADF,gCAA0B,YACjB;IAAA,8BAAc;IAAA,gKAA+B;IAEnD,iBAAQ;IAEP,AADF,gCAAwC,kBAGJ;IAAhC,mPAAS,uBAAgB,IAAI,CAAC,KAAC;IAC/B,wBAAkC;IAAC,0BACrC;IAAA,iBAAS;IACT,qLASC;IAEL,AADE,iBAAM,EACF;;;IApBiB,eAEpB;IAFoB,yDAEpB;IAGG,eAA0C;IAA1C,0DAA0C;IAI5C,eASC;IATD,gCASC;;;;IA5BL,AADF,AADF,gCAA6B,eACD,YACjB;IAAA,0BAAU;IAAA,iBAAQ;IAEvB,AADF,gCAA4B,kBAC2E;IAA7B,oOAAS,oBAAa,IAAI,CAAC,KAAC;IAAC,sBAAM;IAAA,iBAAS;IACpH,mCAAuG;IAA9B,oOAAS,oBAAa,KAAK,CAAC,KAAC;IAAC,uBAAO;IAAA,iBAAS;IACvH,mCAAuG;IAA9B,oOAAS,oBAAa,KAAK,CAAC,KAAC;IAAC,wBAAO;IAAA,iBAAS;IACvH,oCAAuG;IAA9B,qOAAS,oBAAa,KAAK,CAAC,KAAC;IAAC,yBAAQ;IAEnH,AADE,AADiH,iBAAS,EACpH,EACF;IACN,mJAA6B;IAwB/B,iBAAM;;;IA9B2B,eAA4C;IAA5C,4DAA4C;IAC5C,eAA6C;IAA7C,6DAA6C;IAC7C,eAA6C;IAA7C,6DAA6C;IAC7C,eAA6C;IAA7C,6DAA6C;IAG5E,eAuBC;IAvBD,wDAuBC;;;IA4Ea,iCAA6B;IAAA,YAAS;IAAA,iBAAO;;;IAAhB,cAAS;IAAT,6BAAS;;;IAGtC,iCAAuB;IAAA,YAAyB;IAAA,iBAAO;;;IAAhC,cAAyB;IAAzB,kDAAyB;;;;IApBxD,+BAA2D;IAAvD,gQAAS,iCAAsB,KAAC;IAClC,0BAAI;IAAA,YAA4B;;IAAA,iBAAK;IAEnC,AADF,0BAAI,gBACwE;IAAA,YAAe;IAC3F,AAD2F,iBAAO,EAC7F;IAEH,AADF,0BAAI,eAC0B;IAC1B,2BAAiL;IACjL,6BAAM;IAAA,aAA6B;IAEvC,AADE,AADqC,iBAAO,EACtC,EACH;IACL,2BAAI;IAAA,aAAwC;IAAA,iBAAK;IACjD,2BAAI;IAAA,aAAiC;IAAA,iBAAK;IAC1C,2BAAI;IAAA,aAAyB;IAAA,iBAAK;IAEhC,AADF,2BAAI,gBACoB;IACpB,6KAEC;IACD,0JAA0B;IAKhC,AADE,AADE,iBAAM,EACH,EACF;;;;IAvBC,eAA4B;IAA5B,iEAA4B;IAEJ,eAA+C;IAA/C,iEAA+C;IAAC,cAAe;IAAf,mCAAe;IAI5D,eAA6B;IAA7B,6CAA6B;IAAC,iJAAiH;IACpK,eAA6B;IAA7B,0DAA6B;IAGnC,eAAwC;IAAxC,qEAAwC;IACxC,eAAiC;IAAjC,4DAAiC;IACjC,eAAyB;IAAzB,oDAAyB;IAGzB,eAEC;IAFD,cAAA,kBAAc,CAAC,EAAE,CAAC,CAAC,CAElB;IACD,eAEC;IAFD,kDAEC;;;IAUX,AADF,gCAA+B,QAC1B;IAAA,kDAAkC;IACvC,AADuC,iBAAI,EACrC;;;IAlFN,AADF,AADF,gCAA4B,eACJ,eACE;IAAA,yBAAkC;IAAA,iBAAM;IAE5D,AADF,gCAAyB,eACA;IAAA,YAAoB;IAAA,iBAAM;IACjD,gCAAuB;IAAA,0BAAU;IAErC,AADE,AADmC,iBAAM,EACnC,EACF;IAEJ,AADF,gCAAsB,gBACU;IAAA,0BAAmC;IAAA,iBAAM;IAErE,AADF,iCAAyB,gBACA;IAAA,aAAsC;IAAA,iBAAM;IACnE,iCAAuB;IAAA,8BAAa;IAAA,iBAAM;IAC1C,iCAA8I;IAC5I,yBAAuM;IACvM,aACF;IAEJ,AADE,AADE,iBAAM,EACF,EACF;IAEJ,AADF,iCAAsB,gBACO;IAAA,0BAA4B;IAAA,iBAAM;IAE3D,AADF,iCAAyB,gBACA;IAAA,aAA0C;IAAA,iBAAM;IACvE,iCAAuB;IAAA,6BAAY;IAEvC,AADE,AADqC,iBAAM,EACrC,EACF;IAEJ,AADF,iCAAsB,gBACU;IAAA,0BAAkC;IAAA,iBAAM;IAEpE,AADF,iCAAyB,gBACA;IAAA,aAAgC;IAAA,iBAAM;IAC7D,iCAAuB;IAAA,2BAAU;IAGvC,AADE,AADE,AADmC,iBAAM,EACnC,EACF,EACF;IAGJ,AADF,iCAAqC,UAC/B;IAAA,0BAA4B;IAAC,6BAAW;IAAA,iBAAK;IAKzC,AADF,AADF,AADF,AADF,iCAAqC,kBACJ,aACtB,UACD,UACE;IAAA,qBAAI;IAAA,iBAAK;IACb,2BAAI;IAAA,uBAAM;IAAA,iBAAK;IACf,2BAAI;IAAA,0BAAS;IAAA,iBAAK;IAClB,2BAAI;IAAA,sBAAK;IAAA,iBAAK;IACd,2BAAI;IAAA,yBAAQ;IAAA,iBAAK;IACjB,2BAAI;IAAA,qBAAI;IAAA,iBAAK;IACb,2BAAI;IAAA,qBAAI;IAEZ,AADE,AADU,iBAAK,EACV,EACC;IACR,8BAAO;IACL,sKA0BC;IAGP,AADE,AADE,iBAAQ,EACF,EACJ;IACN,kJAA+C;IAKjD,iBAAM;;;IAlFuB,eAAoB;IAApB,2CAAoB;IAOpB,eAAsC;IAAtC,sEAAsC;IAEtC,eAAsH;IAAtH,kJAAsH;IAC5H,cAAmL;IAAnL,qMAAmL;IAClM,cACF;IADE,4EACF;IAMuB,eAA0C;IAA1C,wEAA0C;IAO1C,eAAgC;IAAhC,8DAAgC;IAsBrD,gBA0BC;IA1BD,cAAA,iCAA0B,CA0BzB;IAIP,eAIC;IAJD,0EAIC;;;IAOD,+BAA2B;IACzB,kCAAuD;IACzD,iBAAM;;;;IAgBI,mCAAoF;IAAnD,gQAAS,0BAAmB,KAAC;IAC5D,wBAA4B;IAC9B,iBAAS;;;IA2BG,iCAA8B;IAAA,YAAS;IAAA,iBAAO;;;IAAhB,cAAS;IAAT,6BAAS;;;IAGvC,iCAA8B;IAAA,YAA0B;IAAA,iBAAO;;;IAAjC,cAA0B;IAA1B,mDAA0B;;;IAL5D,gCAA6B;IAC3B,uMAEC;IACD,oLAA2B;IAG7B,iBAAM;;;IANJ,cAEC;IAFD,cAAA,mBAAe,CAAC,EAAE,CAAC,CAAC,CAEnB;IACD,eAEC;IAFD,kDAEC;;;;IATT,+BAA6H;;IAAtG,+QAAS,kCAAuB,KAAC;IACtD,gCAAgC;IAC9B,qKAA2B;IAU3B,gCAAsB;IAAA,YAA+B;IAAA,iBAAM;IAC3D,gCAAiJ;IAC/I,YACF;IAEJ,AADE,AADE,iBAAM,EACF,EACH;;;;IAjBoD,mGAAmE;IAExH,eASC;IATD,kDASC;IACqB,eAA+B;IAA/B,0DAA+B;IAC1B,cAAqH;IAArH,oJAAqH;IAC9I,cACF;IADE,6DACF;;;IA2BM,iCAG4C;IAC1C,yBAOmD;IACrD,iBAAO;;;;IAVL,yGAAwF;IACxF,AAFA,qEAAmD,qDAEV;IAEvC,cAA6C;IAM/C,AADE,AADA,AADA,AADA,AADA,AADA,0DAA6C,4CACA,iDACK,qDACI,+CACN,+CACA,6CACJ;;;IAKhD,iCACgD;IAC9C,yBAAiC;IACnC,iBAAO;;;IAGP,iCAKsE;IACpE,yBAA2B;IAC3B,iCAA2B;IAAA,YAAwB;IACrD,AADqD,iBAAO,EACrD;;;;IAJL,AADA,AADA,AADA,yDAA4C,6EAC8B,2EACF,iDACtB;IAClD,gGAAmE;IAExC,eAAwB;IAAxB,4CAAwB;;;IAKrD,iCAKwF;IACtF,yBAA4B;IAC5B,iCAA0B;IAAA,YAAqC;IACjE,AADiE,iBAAO,EACjE;;;IAJL,AADA,AADA,AADA,mDAAsC,mEAC0B,kEACD,6CACjB;IAC9C,uGAAqF;IAE3D,eAAqC;IAArC,yDAAqC;;;IAIjE,iCACmD;IACjD,yBAA4B;IAC9B,iBAAO;;;IAnDX,gCAA6B;IAE3B,2LAAqC;IAgBrC,0LAAwD;IAMxD,2LAAuD;IAYvD,2LAAwD;IAWxD,0LAAwD;IAM1D,iBAAM;;;;IAnDJ,cAcC;IAdD,+DAcC;IAED,cAKC;IALD,sFAKC;IACD,cAUC;IAVD,qFAUC;IAED,cAUC;IAVD,sFAUC;IACD,cAKC;IALD,sFAKC;;;IAIH,iCAAqC;IACnC,yBAA4B;IAC9B,iBAAO;;;;IAjEX,+BAKmF;IAAjF,0UAAS,yBAAkB,0DAA2C,SAAS,KAAC;IAChF,2KAA8D;IAwD9D,4KAAoD;IAKtD,iBAAK;;;;;;;IAhEH,AADA,uFAA+D,6EACI;IACnE,AAHA,+GAA2E,gKAG6B;IAExG,cAuDC;IAvDD,4GAuDC;IACD,cAIC;IAJD,sFAIC;;;;IA1EP,+BAEyC;IAAvC,gRAAS,uCAA4B,KAAC;IACtC,+BAAqB;IAAA,YAAmB;IAAA,iBAAK;IAE3C,AADF,+BAA2B,gBACuB;IAAA,YAAmB;IACrE,AADqE,iBAAO,EACvE;IACL,uLAqEC;IACD,0BAA6B;IAC/B,iBAAK;;;;IA7EH,+EAA2D;IAEtC,eAAmB;IAAnB,uCAAmB;IAEd,eAAuB;IAAvB,yCAAuB;IAAC,cAAmB;IAAnB,uCAAmB;IAErE,cAqEC;IArED,gCAqEC;;;IAkBO,AADF,iCAA4B,gBACD;IAAA,YAAwD;IACnF,AADmF,iBAAO,EACnF;;;;IADoB,eAAwD;IAAxD,mGAAwD;;;IAO/E,iCAAwB;IAAA,YAAqC;IAAA,iBAAO;;;;;IAA5C,cAAqC;IAArC,sGAAqC;;;IAFjE,iCAA2B;IACzB,oLAAmC;IAGnC,iCAA0B;IAAA,YAA6B;IACzD,AADyD,iBAAO,EACzD;;;;IAJL,cAEC;IAFD,iEAEC;IACyB,eAA6B;IAA7B,iEAA6B;;;IAOrD,iCAAwB;IAAA,YAA6C;IAAA,iBAAO;;;;IAApD,cAA6C;IAA7C,gFAA6C;;;IAFzE,iCAA0B;IACxB,oLAAkC;IAGlC,iCAA0B;IAAA,YAA4B;IACxD,AADwD,iBAAO,EACxD;;;;IAJL,cAEC;IAFD,gEAEC;IACyB,eAA4B;IAA5B,gEAA4B;;;IAtB5D,AADF,+BAAoC,eACQ;IAExC,sKAAqC;IAMrC,sKAAiC;IASjC,sKAAgC;IASpC,AADE,iBAAM,EACH;;;IAxBD,eAIC;IAJD,+DAIC;IAED,cAOC;IAPD,2DAOC;IAED,cAOC;IAPD,0DAOC;;;;IA5Kb,AADF,AADF,gCAA4B,eACC,SACrB;IAAA,yBAAyB;IAAC,oCAAmB;IAAA,iBAAK;IAEpD,AADF,gCAAiC,eACE;IAC/B,yBAA6B;IAC7B,kCAIuB;IADrB,uPAAS,kCAA2B,KAAC;IAHvC,iBAIuB;IACvB,iKAAwB;IAK1B,iBAAM;IACN,kCAA+B;IAAA,aAA4E;IAAA,iBAAO;IAClH,oCAAiH;IAAhG,mPAAS,0BAAmB,KAAC;IAC5C,0BAA+B;IAAC,yBAClC;IAEJ,AADE,AADE,iBAAS,EACL,EACF;IAKE,AADF,AADF,AADF,AADF,iCAAqC,kBACR,aAClB,UACD,eACqF;IAAhE,+OAAS,wBAAiB,UAAU,CAAC,KAAC;IAC3D,oBACA;IAAA,yBAAyH;IAC3H,iBAAK;IACL,gCAAqF;IAAxD,+OAAS,wBAAiB,MAAM,CAAC,KAAC;IAC7D,uBACA;IAAA,yBAAqH;IACvH,iBAAK;IACL,mLAmBC;IACD,2BAA+B;IAEnC,AADE,iBAAK,EACC;IACR,8BAAO;IACL,kLAgFC;IACH,iBAAQ;IAGN,AADF,8BAAO,eACkB;IACrB,2BAAuC;IAErC,AADF,gCAAwC,cAC9B;IAAA,uBAAM;IAChB,AADgB,iBAAS,EACpB;IACL,kLA6BC;IACD,2BAA6B;IAKvC,AADE,AADE,AADE,AADE,iBAAK,EACC,EACF,EACJ,EACF;;;IA/KI,eAA0B;IAA1B,+CAA0B;IAG5B,cAIC;IAJD,kDAIC;IAE4B,eAA4E;IAA5E,wHAA4E;IAC5D,cAAoC;IAApC,yDAAoC;IAW9D,eAAqG;IAArG,+HAAqG;IAIrG,eAAiG;IAAjG,2HAAiG;IAElH,cAmBC;IAnBD,gCAmBC;IAKH,eAgFC;IAhFD,cAAA,iCAA0B,CAgFzB;IASC,eA6BC;IA7BD,gCA6BC;;;IAWT,AADF,gCAAyB,eACC;IACtB,yBAAyB;IAC3B,iBAAM;IACN,0BAAI;IAAA,8BAAc;IAAA,iBAAK;IACvB,yBAAG;IAAA,wDAAwC;IAC7C,AAD6C,iBAAI,EAC3C;;;IAxMR,+IAAqB;IAMrB,iJAA+D;IA2L/D,gJAAiE;;;IAjMjE,+CAIC;IAED,cAyLC;IAzLD,uGAyLC;IAED,cAQC;IARD,yGAQC;;;IAMC,+BAA2B;IACzB,kCAAsD;IACxD,iBAAM;;;IAMF,AADF,AADF,gCAA2B,eACC,SACpB;IAAA,yBAAsC;IAAC,kCAAiB;IAAA,iBAAK;IAE/D,AADF,gCAA0B,gBACe;IAAA,yBAA4B;IAAC,uBAAM;IAAA,iBAAO;IACjF,iCAAuC;IAAA,yBAA4B;IAAC,wBAAM;IAAA,iBAAO;IACjF,kCAAsC;IAAA,0BAAkC;IAAC,uBAAK;IAAA,iBAAO;IACrF,kCAAwC;IAAA,0BAA8B;IAAC,yBAAO;IAElF,AADE,AADgF,iBAAO,EACjF,EACF;IACN,iCAA6B;IAC3B,+BAA4C;IAC9C,iBAAM;IACN,iCAAwB;IACtB,0BAAkC;IAClC,aAEF;IACF,AADE,iBAAM,EACF;;;IAHF,gBAEF;IAFE,+KAEF;;;IAMA,AADF,gCAAyB,eACC;IACtB,yBAAsC;IACxC,iBAAM;IACN,0BAAI;IAAA,6BAAa;IAAA,iBAAK;IACtB,yBAAG;IAAA,wDAAwC;IAC7C,AAD6C,iBAAI,EAC3C;;;IAnCR,+IAAqB;IAMrB,iJAA+D;IAsB/D,gJAAiE;;;IA5BjE,+CAIC;IAED,cAoBC;IApBD,uGAoBC;IAED,cAQC;IARD,yGAQC;;;;IA3ZC,AADF,AADF,gCAA8B,eACH,kBAGiB;IAAtC,qNAAS,wBAAiB,SAAS,CAAC,KAAC;IACrC,yBAAgC;IAChC,4BAAM;IAAA,uBAAO;IACf,AADe,iBAAO,EACb;IACT,mCAEuC;IAArC,qNAAS,wBAAiB,QAAQ,CAAC,KAAC;IACpC,yBAAyB;IACzB,4BAAM;IAAA,sBAAM;IACd,AADc,iBAAO,EACZ;IACT,oCAEsC;IAApC,sNAAS,wBAAiB,OAAO,CAAC,KAAC;IACnC,0BAAsC;IACtC,6BAAM;IAAA,sBAAK;IAGjB,AADE,AADE,AADa,iBAAO,EACX,EACL,EACF;IAGJ,AADF,iCAAoE,gBACZ;IAA1B,mNAAS,sBAAe,KAAC;IACnD,kCAA4B;IAC1B,0BAA6B;IAC7B,0BACA;IAAA,oIAAwB;IAQ1B,iBAAO;IACP,yBAAsF;IACxF,iBAAM;IACN,oIAAyB;IAqC3B,iBAAM;IAEN,yHAAmC;IA2FnC,uHAAkC;IA8MlC,uHAAiC;;;IApX3B,eAA4C;IAA5C,4DAA4C;IAM5C,eAA2C;IAA3C,2DAA2C;IAM3C,eAA0C;IAA1C,0DAA0C;IAQjB,eAAoC;IAApC,oDAAoC;IAK7D,eAOC;IAPD,mDAOC;IAEY,cAAkE;IAAlE,uFAAkE;IAEnF,cAoCC;IApCD,oDAoCC;IAGH,cAyFC;IAzFD,8DAyFC;IAED,cA4MC;IA5MD,6DA4MC;IAED,cAuCC;IAvCD,4DAuCC;;;;IAKC,AADF,gCAAyB,eACC;IACtB,wBAAiC;IACnC,iBAAM;IACN,0BAAI;IAAA,iCAAiB;IAAA,iBAAK;IAC1B,yBAAG;IAAA,kEAAkD;IAAA,iBAAI;IACzD,kCAAwD;IAAvC,qNAAS,iBAAU,KAAC;IACnC,wBAA2B;IAAC,+BAC9B;IACF,AADE,iBAAS,EACL;;;IApbV,+BAA2B;IAEzB,kHAAwB;IAKxB,yGAA4C;IAma5C,oHAA0E;IAY5E,iBAAM;;;IApbJ,cAIC;IAJD,kDAIC;IACD,cAiaC;IAjaD,6EAiaC;IAED,cAWC;IAXD,kHAWC;;;IAyBiB,iCAAuB;IAAA,YAAS;IAAA,iBAAO;;;IAAhB,cAAS;IAAT,6BAAS;;;IAFpC,gCAA2B;IACzB,yKAEC;IACH,iBAAM;;;;IAHJ,cAEC;IAFD,cAAA,0BAAe,OAAO,CAAC,EAAE,CAAC,CAAC,CAE1B;;;;IAZP,gCAEmC;IAAjC,kPAAS,iCAAsB,KAAC;IAChC,2BAA4F;IAE1F,AADF,gCAA8B,eACD;IAAA,YAAkC;;IAAA,iBAAM;IACnE,gCAA2B;IAAA,YAAuC;IACpE,AADoE,iBAAM,EACpE;IACN,uIAAkC;IAOpC,iBAAM;;;;IAdJ,yDAAqC;IAER,cAAwD;IAAxD,4EAAwD;IAExD,eAAkC;IAAlC,sEAAkC;IAClC,eAAuC;IAAvC,2EAAuC;IAEpE,cAMC;IAND,gEAMC;;;IAhBP,gCAA+B;IAC7B,qJAiBC;IACH,iBAAM;;;IAlBJ,cAiBC;IAjBD,+BAiBC;;;;IAMC,AADF,AADF,gCAAkC,eACJ,gBACE;IAAA,yBAAS;IAAA,iBAAO;IAC5C,mCAA4E;IAAlD,oNAAuB,IAAI,uDAAsB;IAAC,qBAAK;IACnF,AADmF,iBAAS,EACtF;IAEJ,AADF,gCAA6B,WACrB;IAAA,YAA2C;;IAAA,iBAAO;IACxD,kCAA2B;IAAA,aAA0C;IAEzE,AADE,AADuE,iBAAO,EACxE,EACF;;;IAHI,eAA2C;IAA3C,kFAA2C;IACtB,eAA0C;IAA1C,iFAA0C;;;IAuB7D,iCAAuB;IAAA,YAAS;IAAA,iBAAO;;;IAAhB,cAAS;IAAT,6BAAS;;;IAFpC,gCAA2B;IACzB,0KAEC;IACH,iBAAM;;;;IAHJ,cAEC;IAFD,cAAA,0BAAe,OAAO,CAAC,EAAE,CAAC,CAAC,CAE1B;;;;IAbP,gCAG0D;IAAxD,oPAAU,6BAAkB,IAAI,iCAAsB,KAAC;IACvD,2BAA4F;IAE1F,AADF,gCAA8B,eACD;IAAA,YAAkC;;IAAA,iBAAM;IACnE,gCAA2B;IAAA,YAAuC;IACpE,AADoE,iBAAM,EACpE;IACN,wIAAkC;IAOpC,iBAAM;;;;IAdJ,AADA,yDAAqC,2CACA;IAER,cAAwD;IAAxD,4EAAwD;IAExD,eAAkC;IAAlC,sEAAkC;IAClC,eAAuC;IAAvC,2EAAuC;IAEpE,cAMC;IAND,gEAMC;;;IAjBP,gCAA+B;IAC7B,sJAkBC;IACH,iBAAM;;;IAnBJ,cAkBC;IAlBD,+BAkBC;;;;IAMC,AADF,AADF,gCAAkC,eACJ,gBACE;IAAA,yBAAS;IAAA,iBAAO;IAC5C,mCAA4E;IAAlD,qNAAuB,IAAI,uDAAsB;IAAC,qBAAK;IACnF,AADmF,iBAAS,EACtF;IAEJ,AADF,gCAA6B,WACrB;IAAA,YAA2C;;IAAA,iBAAO;IACxD,kCAA2B;IAAA,aAA0C;IAEzE,AADE,AADuE,iBAAO,EACxE,EACF;;;IAHI,eAA2C;IAA3C,kFAA2C;IACtB,eAA0C;IAA1C,iFAA0C;;;IAuD3D,iCAAmF;IAAA,YAAwB;IAAA,iBAAO;;;IAAxF,0EAAwD;IAAC,cAAwB;IAAxB,4CAAwB;;;IAG3G,iCAAyC;IAAA,mBAAG;IAAA,iBAAO;;;IAKnD,iCAAmF;IAAA,YAAwB;IAAA,iBAAO;;;IAAxF,0EAAwD;IAAC,cAAwB;IAAxB,4CAAwB;;;IAG3G,iCAAyC;IAAA,mBAAG;IAAA,iBAAO;;;IAKnD,iCAAuF;IACrF,YACF;IAAA,iBAAO;;;IAFD,wGAAgF;IACpF,cACF;IADE,kHACF;;;IAGA,iCAAoB;IAAA,iBAAC;IAAA,iBAAO;;;IAK5B,iCAA6F;IAC3F,YACF;IAAA,iBAAO;;;IAFD,8GAAsF;IAC1F,cACF;IADE,gHACF;;;IAGA,iCAAoB;IAAA,iBAAC;IAAA,iBAAO;;;IAK5B,iCAAwC;IACtC,yBAA+B;IAAC,uBAClC;IAAA,iBAAO;;;IAGP,iCAAyC;IACvC,yBAAiC;IAAC,uBACpC;IAAA,iBAAO;;;IAGP,iCAAyC;IACvC,yBAA4B;IAC9B,iBAAO;;;IAnDX,AADF,+BAA8O,cACjN;IAAA,YAAqB;IAAA,iBAAK;IACrD,0BAAI;IACF,0IAAmB;IAGnB,0IAAoB;IAGtB,iBAAK;IACL,0BAAI;IACF,0IAAmB;IAGnB,0IAAoB;IAGtB,iBAAK;IACL,0BAAI;IACF,4IAAgC;IAKhC,4IAAgC;IAGlC,iBAAK;IACL,2BAAI;IACF,4IAAmC;IAKnC,4IAAmC;IAGrC,iBAAK;IACL,2BAAI;IACF,4IAAwG;IAKxG,4IAAwG;IAKxG,4IAA6B;IAMjC,AADE,iBAAK,EACF;;;IAvDD,yRAAyO;IAChN,eAAqB;IAArB,yCAAqB;IAE9C,eAEC;IAFD,0CAEC;IACD,cAEC;IAFD,2CAEC;IAGD,eAEC;IAFD,0CAEC;IACD,cAEC;IAFD,2CAEC;IAGD,eAIC;IAJD,wDAIC;IACD,cAEC;IAFD,wDAEC;IAGD,eAIC;IAJD,2DAIC;IACD,cAEC;IAFD,2DAEC;IAGD,eAIC;IAJD,4IAIC;IACD,cAIC;IAJD,4IAIC;IACD,cAIC;IAJD,qDAIC;;;IA5FX,AADF,AADF,AAFF,gCAA6B,eAEE,eACO,eACL;IAAA,gCAAgB;IAAA,iBAAM;IACjD,gCAA8H;IAC5H,wBAA0K;IAC1K,YACF;IACF,AADE,iBAAM,EACF;IAEJ,AADF,gCAAkC,eACL;IAAA,gCAAe;IAAA,iBAAM;IAChD,iCAA8H;IAC5H,yBAA0K;IAC1K,aACF;IACF,AADE,iBAAM,EACF;IAEJ,AADF,iCAA2C,gBACd;IAAA,yBAAQ;IAAA,iBAAM;IACzC,iCAA2B;IAAA,aAA+B;IAC5D,AAD4D,iBAAM,EAC5D;IAEJ,AADF,iCAA4C,gBACf;IAAA,0BAAS;IAAA,iBAAM;IAC1C,iCAA2B;IAAA,aAAgC;IAE/D,AADE,AAD6D,iBAAM,EAC7D,EACF;IAGJ,AADF,iCAAmC,UAC7B;IAAA,0BAA2B;IAAC,yCAAuB;IAAA,iBAAK;IAKpD,AADF,AADF,AADF,AADF,iCAAmC,kBACJ,aACpB,UACD,UACE;IAAA,qBAAI;IAAA,iBAAK;IACb,2BAAI;IAAA,6BAAY;IAAA,iBAAK;IACrB,2BAAI;IAAA,6BAAY;IAAA,iBAAK;IACrB,2BAAI;IAAA,2BAAU;IAAA,iBAAK;IACnB,2BAAI;IAAA,8BAAa;IAAA,iBAAK;IACtB,2BAAI;IAAA,uBAAM;IAEd,AADE,AADY,iBAAK,EACZ,EACC;IACR,8BAAO;IACL,wJAyDC;IAKX,AADE,AADE,AADE,AADE,iBAAQ,EACF,EACJ,EACF,EACF;;;;IAnG2B,eAAkG;IAAlG,8HAAkG;IAC5G,cAAsJ;IAAtJ,sKAAsJ;IACrK,cACF;IADE,qKACF;IAI2B,eAAkG;IAAlG,+HAAkG;IAC5G,cAAsJ;IAAtJ,sKAAsJ;IACrK,cACF;IADE,0FACF;IAI2B,eAA+B;IAA/B,sDAA+B;IAI/B,eAAgC;IAAhC,uDAAgC;IAmBvD,gBAyDC;IAzDD,oCAyDC;;;IASX,+BAA2B;IACzB,kCAA2D;IAC7D,iBAAM;;;IAKJ,AADF,gCAA2B,eACO;IAC9B,wBAAoC;IACtC,iBAAM;IACN,0BAAI;IAAA,0CAA0B;IAAA,iBAAK;IACnC,yBAAG;IAAA,kIAAkH;IACvH,AADuH,iBAAI,EACrH;;;;IAKJ,AADF,gCAAyB,eACC;IACtB,wBAAoC;IACtC,iBAAM;IACN,0BAAI;IAAA,0CAA0B;IAAA,iBAAK;IACnC,yBAAG;IAAA,6EAA6D;IAAA,iBAAI;IACpE,kCAAwD;IAAvC,sNAAS,iBAAU,KAAC;IACnC,wBAA2B;IAAC,+BAC9B;IACF,AADE,iBAAS,EACL;;;IAnNJ,AADF,AADF,AAFF,+BAAyB,eAEQ,eACK,SAC5B;IAAA,gCAAgB;IAAA,iBAAK;IACzB,mHAA4C;IAsB5C,oHAAmB;IAYrB,iBAAM;IACN,gCAAwB;IAAA,yBAAmC;IAAA,iBAAM;IAE/D,AADF,gCAAkC,UAC5B;IAAA,gCAAe;IAAA,iBAAK;IACxB,qHAA4C;IAuB5C,sHAAmB;IAavB,AADE,iBAAM,EACF;IAEN,uHAAqD;IA4GrD,oHAAsB;IAMtB,qHAAoC;IAUpC,sHAA0C;IAY5C,iBAAM;;;IApNA,eAqBC;IArBD,6EAqBC;IACD,cAWC;IAXD,6CAWC;IAKD,eAsBC;IAtBD,8EAsBC;IACD,cAWC;IAXD,8CAWC;IAIL,cA0GC;IA1GD,8FA0GC;IAED,cAIC;IAJD,iDAIC;IAED,cAQC;IARD,sEAQC;IAED,cAWC;IAXD,4EAWC;;;;IAaH,AADF,+BAAgC,eACA;IAC5B,wBAA+B;IAC/B,2BACA;IAAA,mCAAmF;IAAnD,sMAAS,wBAAiB,KAAC;IACzD,wBAA4B;IAEhC,AADE,iBAAS,EACL;IAGF,AADF,AADF,gCAA2B,eACE,WACnB;IAAA,4BAAY;IAAA,iBAAO;IACG,AAA5B,kCAA4B,WAAK;IAAA,oBAAG;IAAA,iBAAM;IAAA,4BAAK;IAAA,kBAAC;IAClD,AADwD,AAAN,iBAAM,EAAO,EACzD;IAEJ,AADF,iCAA2B,YACnB;IAAA,wBAAO;IAAA,iBAAO;IACQ,AAA5B,kCAA4B,WAAK;IAAA,oBAAG;IAAA,iBAAM;IAAA,4BAAK;IAAA,kBAAC;IAClD,AADwD,AAAN,iBAAM,EAAO,EACzD;IAEJ,AADF,iCAA2B,YACnB;IAAA,0BAAS;IAAA,iBAAO;IACM,AAA5B,kCAA4B,WAAK;IAAA,oBAAG;IAAA,iBAAM;IAAA,4BAAK;IAAA,sBAAK;IACtD,AAD4D,AAAN,iBAAM,EAAO,EAC7D;IAEJ,AADF,iCAA2B,YACnB;IAAA,4BAAW;IAAA,iBAAO;IACI,AAA5B,kCAA4B,WAAK;IAAA,kBAAC;IAAA,iBAAM;IAAA,kBAAC;IAAA,4BAAK;IAAA,kBAAC;IAGrD,AADE,AADE,AADuD,AAAN,iBAAM,EAAO,EACxD,EACF,EACF;;;;IAKN,2CAI6B;IAA3B,gNAAU,sBAAe,KAAC;IAC1B,gDAKiC;IAA/B,6NAAc,sBAAe,KAAC;IAElC,AADE,iBAAsB,EACP;;;IATf,AADA,sKAAsF,mBACpE;IAGhB,cAAkB;IAGlB,AADA,AADA,AADA,gCAAkB,uIACkD,yIACE,iIACR;;;;IA8B5D,mCAA0G;IAAxD,8OAA0B,EAAE,KAAC;IAC7E,wBAA4B;IAC9B,iBAAS;;;IAOP,8BAAQ;IAAA,YAA+B;IAAA,iBAAS;IAAC,0BACnD;;;IADU,cAA+B;IAA/B,sDAA+B;;;IAEvC,YACF;;;IADE,+IACF;;;IAcA,gCAA4B;IAC1B,kCAAiD;IACnD,iBAAM;;;IAIF,yBAAmC;IACnC,0BAAI;IAAA,iDAAiC;IAAA,iBAAK;IAC1C,yBAAG;IAAA,8FAA8E;IAAA,iBAAI;;;IAErF,yBAA6B;IAC7B,0BAAI;IAAA,0BAAU;IAAA,iBAAK;IACnB,yBAAG;IAAA,YAAsC;IAAA,iBAAI;;;IAA1C,eAAsC;IAAtC,wEAAsC;;;IAR7C,gCAA0B;IAKtB,AAJF,sHAAmC,gGAI1B;IAKX,iBAAM;;;IATJ,cAQC;IARD,4DAQC;;;IAeO,yBAA4B;;;IAM5B,gCAA6B;IAAA,YAAmB;IAAA,iBAAM;;;IAAzB,cAAmB;IAAnB,uCAAmB;;;IAKhD,iCAA8B;IAAA,YAAY;IAAA,iBAAO;;;IAAnB,cAAY;IAAZ,gCAAY;;;;IArBhD,+BAOC;IAJC,gPAAS,mCAAwB,KAAC;IAKlC,iCAA2B;IACzB,sIAA2B;IAG7B,iBAAO;IAEL,AADF,gCAA6B,eACE;IAAA,YAAY;IAAA,iBAAM;IAC/C,wIAAqB;IAGvB,iBAAM;IACN,gCAA6B;IAC3B,yIAAc;IAGd,iCAAmG;IAAA,aAAc;IAErH,AADE,AADmH,iBAAO,EACpH,EACH;;;;IAvBH,sEAAkD;;IAOhD,eAEC;IAFD,yDAEC;IAG4B,eAAY;IAAZ,gCAAY;IACzC,cAEC;IAFD,4CAEC;IAGD,eAEC;IAFD,qCAEC;IACqD,cAA4C;;IAAC,cAAc;IAAd,kCAAc;;;IAzBzH,+BAAwB;IACtB,mIA2BC;IACH,iBAAK;;;IA5BH,cA2BC;IA3BD,4CA2BC;;;IAaD,yBAAsC;IAAC,8BACzC;;;IAGI,2BACF;;;IACE,4BACF;;;IACE,YACF;;;IADE,2EACF;;;IAPA,yBAA4B;IAK1B,AAFA,AAFF,sHAAuC,gGAEO,gGAErC;;;IAJT,cAMC;IAND,6GAMC;;;;IAlHT,gCAA6D;IAAhC,mMAAS,4BAAqB,KAAC;IAAC,iBAAM;IACnE,gCAAuI;IAAnC,sKAAS,wBAAwB,KAAC;IAElI,AADF,gCAA2B,cAC4B;IACnD,yBAAkC;IAAC,oCACrC;IAAA,iBAAK;IACL,mCAAyH;IAA9E,sMAAS,4BAAqB,KAAC;IACxE,wBAA4B;IAEhC,AADE,iBAAS,EACL;IAEN,gCAA2B;IACzB,yBAAgD;IAChD,sCAOE;IAFA,uUAA4B;IAL9B,iBAOE;IACF,wHAAsB;IAKxB,iBAAM;IAGJ,AADF,iCAA4B,iBACU;IAGhC,AAFF,yGAAqC,mFAEA;IAGvC,iBAAO;IAEL,AADF,iCAAoC,mBACoH;IAAxG,uMAAS,0BAAmB,KAAC;IACzE,6BACF;IAAA,iBAAS;IACT,oCAAyH;IAA3E,uMAAS,0BAAmB,KAAC;IACzE,wBACF;IAEJ,AADE,AADE,iBAAS,EACL,EACF;IAEN,iCAAyB;IAiBrB,AAZA,AAJF,qHAA6B,+FAIqB,8FAYzC;IAgCX,iBAAM;IAGJ,AADF,iCAA2B,mBAMxB;IAFC,uMAAS,wBAAiB,KAAC;IAKzB,AAFF,yGAAqB,mFAEZ;IAUX,iBAAS;IACT,oCAKC;IAFC,uMAAS,4BAAqB,KAAC;IAG/B,yBACF;IAEJ,AADE,AADE,iBAAS,EACL,EACF;;;IAxHyE,eAA0B;IAA1B,+CAA0B;IAYnG,eAA4B;IAA5B,qDAA4B;IAG9B,eAIC;IAJD,iDAIC;IAKC,eAIC;IAJD,qGAIC;IAG2E,eAAyE;IAAzE,qGAAyE;IAGzE,eAA4C;IAA5C,iEAA4C;IAO1H,eA+CC;IA/CD,0GA+CC;IAQC,eAA6D;IAA7D,yFAA6D;IAE7D,cAWC;IAXD,gDAWC;IAMD,eAA0B;IAA1B,+CAA0B;;;IAuBxB,YACF;;;IADE,iEACF;;;IACE,YACF;;;IADE,4EACF;;;IAcA,yBAAsC;IAAC,8BACzC;;;IACE,yBAA4B;IAAC,8BAC7B;IAA2B,AAA3B,iCAA2B,UAAK;IAAA,sBAAC;IAAA,iBAAM;IAAA,2BAAK;IAAA,iBAAC;IAAM,AAAN,iBAAM,EAAO;;ADxzCpE,qDAAqD;AACrD,MAAM,sBAAsB,GAAG,oCAAoC,CAAC;AAU7D,IAAM,gCAAgC,GAAtC,MAAM,gCAAiC,SAAQ,wBAAwB;IAAvE;;QAGG,aAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;QAEvC,WAAW;QACX,cAAS,GAAG,UAAU,CAAC;QACvB,YAAO,GAAG,KAAK,CAAC;QAChB,iBAAY,GAAG,KAAK,CAAC;QACrB,gBAAW,GAAG,KAAK,CAAC;QACpB,qBAAgB,GAAG,KAAK,CAAC;QACzB,mBAAc,GAAG,KAAK,CAAC;QACvB,gBAAW,GAAG,KAAK,CAAC;QACpB,eAAU,GAAG,KAAK,CAAC;QACnB,oBAAe,GAAG,KAAK,CAAC;QACxB,iBAAY,GAAG,KAAK,CAAC;QACrB,UAAK,GAAkB,IAAI,CAAC;QAE5B,eAAe;QACf,eAAU,GAA4B,EAAE,CAAC;QACzC,cAAS,GAA2B,EAAE,CAAC;QAEvC,iBAAiB;QACjB,kBAAa,GAAyB,EAAE,CAAC;QACzC,eAAU,GAAa,EAAE,CAAC;QAC1B,iBAAY,GAAa,EAAE,CAAC,CAAE,6CAA6C;QAC3E,uBAAkB,GAAiC,KAAK,CAAC;QACzD,kBAAa,GAAmC,SAAS,CAAC;QAC1D,eAAU,GAAsB,EAAE,CAAC;QACnC,kBAAa,GAAG,KAAK,CAAC;QACtB,iBAAY,GAAG,KAAK,CAAC;QAIb,kBAAa,GAAG,KAAK,CAAC;QAE9B,eAAe;QACf,gBAAW,GAAgC,IAAI,CAAC;QAChD,gBAAW,GAAgC,IAAI,CAAC;QAChD,mBAAc,GAAwB,EAAE,CAAC;QACzC,qBAAgB,GAAsB,EAAE,CAAC;QACzC,qBAAgB,GAAsB,EAAE,CAAC;QAEzC,qBAAqB;QACrB,6BAAwB,GAAG,IAAI,CAAC;QAChC,kBAAa,GAAG,KAAK,CAAC,CAAC,oBAAoB;QACnC,2BAAsB,GAA+B,IAAI,CAAC;QAElE,yBAAyB;QACzB,oBAAe,GAA0B,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAEnG,wBAAwB;QACxB,qBAAgB,GAAG,KAAK,CAAC;QAEzB,iBAAiB;QACjB,iBAAY,GAAwB,UAAU,CAAC;QAC/C,kBAAa,GAAG,IAAI,CAAC;QAErB,uBAAuB;QACvB,yBAAoB,GAAkB,IAAI,CAAC;QAE3C,0BAA0B;QAC1B,qBAAgB,GAAG,EAAE,CAAC;QACd,yBAAoB,GAAG,IAAI,OAAO,EAAU,CAAC;QAErD,aAAa;QACb,aAAQ,GAAG,KAAK,CAAC;QACjB,uBAAkB,GAAwB,EAAE,CAAC;QAC7C,aAAQ,GAAG,EAAE,CAAC;QACL,kBAAa,GAAsB,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAE9E,yBAAyB;QACzB,uBAAkB,GAAG,KAAK,CAAC;QAC3B,mBAAc,GAAmB,EAAE,CAAC;QACpC,0BAAqB,GAAG,KAAK,CAAC;QAC9B,yBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;QACzC,mBAAc,GAAG,EAAE,CAAC;QACpB,kBAAa,GAAG,KAAK,CAAC;QAEtB,gDAAgD;QAChD,gCAA2B,GAAkB,IAAI,CAAC;QAClD,mBAAc,GAAG,KAAK,CAAC;QAEvB,gBAAgB;QAChB,sBAAiB,GAAG,KAAK,CAAC;QAE1B,qBAAqB;QACb,sBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC/C,yBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACnD,qBAAgB,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;QACxD,qBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC5C,eAAU,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;KAkqEjD;IA9sEC,IAAY,QAAQ,KAAK,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IA8CrD,KAAK,CAAC,QAAQ;QACZ,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,uDAAuD;QACvD,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAE9B,sCAAsC;QACtC,IAAI,CAAC,gBAAgB,CAAC,YAAY;aAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC9B,SAAS,CAAC,KAAK,CAAC,EAAE;YACjB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACxB,yEAAyE;YACzE,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;gBACzD,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;QAEL,2CAA2C;QAC3C,IAAI,CAAC,oBAAoB;aACtB,IAAI,CACH,YAAY,CAAC,GAAG,CAAC,EACjB,oBAAoB,EAAE,EACtB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB;aACA,SAAS,CAAC,KAAK,CAAC,EAAE;YACjB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEL,2EAA2E;QAC3E,IAAI,CAAC,oBAAoB,CAAC,kBAAkB;aACzC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC9B,SAAS,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;IACP,CAAC;IAED,eAAe;QACb,sCAAsC;IACxC,CAAC;IAED,WAAW;QACT,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAED,qBAAqB;IAErB,sBAAsB,CAAC,KAAoB;QACzC,IAAI,CAAC,IAAI,CAAC,wBAAwB;YAAE,OAAO;QAE3C,gCAAgC;QAChC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7E,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,CAAC;YACD,OAAO;QACT,CAAC;QAED,wBAAwB;QACxB,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7E,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QAED,8BAA8B;QAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YAC9D,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,iEAAiE;QACjE,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACpF,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC;gBAClB,KAAK,GAAG;oBAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;oBAAC,MAAM;gBAC5C,KAAK,GAAG;oBAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;oBAAC,MAAM;gBACzC,KAAK,GAAG;oBAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;oBAAC,MAAM;gBACxC,KAAK,GAAG;oBAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;oBAAC,MAAM;gBAC7C,KAAK,GAAG;oBAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;oBAAC,MAAM;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAED,yEAAyE;IAEzE,kBAAkB,CAAC,KAAwB;QACzC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,kBAAkB;QACxB,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC;QAClC,IAAI,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;QACtB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;QACvB,OAAO,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,QAAQ,IAAK,EAAkB,CAAC,iBAAiB,CAAC;IAC5G,CAAC;IAED,SAAS,CAAC,GAAW;QACnB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QACrB,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3D,IAAI,GAAG,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxD,IAAI,GAAG,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,IAAI,CAAC,aAAa,EAAE,CAAC;QACvE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,SAAS;QACrB,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAE7B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAwB;gBACrD,UAAU,EAAE,sBAAsB;gBAClC,WAAW,EAAE,YAAY,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG;gBAC1C,OAAO,EAAE,UAAU;gBACnB,UAAU,EAAE,eAAe;aAC5B,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,OAAO;gBAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;YAC3D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,sBAAsB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACzF,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAE5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAuB;gBACpD,UAAU,EAAE,qBAAqB;gBACjC,WAAW,EAAE,YAAY,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG;gBAC1C,OAAO,EAAE,gBAAgB;gBACzB,OAAO,EAAE,EAAE;gBACX,UAAU,EAAE,eAAe;aAC5B,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,OAAO;gBAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;YAC1D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC5C,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,qBAAqB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACxF,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,cAAc;QACZ,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC3B,KAAK,QAAQ,CAAC,CAAC,OAAO,SAAS,CAAC;YAChC,KAAK,UAAU,CAAC,CAAC,OAAO,SAAS,CAAC;YAClC,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC;YACjC,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,cAAc;QACZ,OAAO,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,SAAS,EAAE,CAAC;IACpE,CAAC;IAED,iBAAiB,CAAC,MAAc;QAC9B,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,WAAW,CAAC,CAAC,OAAO,SAAS,CAAC;YACnC,KAAK,QAAQ,CAAC,CAAC,OAAO,SAAS,CAAC;YAChC,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC;YACjC,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC;YACjC,KAAK,WAAW,CAAC,CAAC,OAAO,SAAS,CAAC;YACnC,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,aAAa,CAAC,EAAiB;QAC7B,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,SAAS;YAAE,OAAO,iBAAiB,CAAC;QAC9D,IAAI,EAAE,GAAG,IAAI;YAAE,OAAO,GAAG,EAAE,IAAI,CAAC;QAChC,IAAI,EAAE,GAAG,KAAK;YAAE,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QACpD,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YAC7C,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC;QACrD,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;QAChD,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;IACvD,CAAC;IAED,eAAe,CAAC,IAA0B;QACxC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;QAE/C,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,UAAU,CAAC;QACpC,IAAI,QAAQ,GAAG,EAAE;YAAE,OAAO,GAAG,QAAQ,OAAO,CAAC;QAC7C,IAAI,SAAS,GAAG,EAAE;YAAE,OAAO,GAAG,SAAS,OAAO,CAAC;QAC/C,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,GAAG,QAAQ,OAAO,CAAC;QAC5C,OAAO,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAChC,CAAC;IAED,WAAW,CAAC,GAAyB;QACnC,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC;QACpC,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAC1B,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;IAChC,CAAC;IAED,QAAQ,CAAC,MAAc;QACrB,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACpF,CAAC;IAED,YAAY,CAAC,KAAa;QACxB,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,qBAAqB,EAAE,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,0BAA0B;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC3D,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;YACpB,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,aAAa;QACX,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAEvC,yBAAyB;YACzB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;gBACrB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACzB,CAAC;YACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;gBACxB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;gBACpB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxB,CAAC;YACD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;gBAC7B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;gBACxB,uDAAuD;gBACvD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;gBACrB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC3B,0DAA0D;gBAC1D,IAAI,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;oBACtE,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC9B,CAAC;YACH,CAAC;YAED,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,wBAAwB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAC7F,CAAC;QAAC,MAAM,CAAC;YACP,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,mBAAmB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACtF,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,wBAAwB;IACxB,6CAA6C;IAErC,KAAK,CAAC,aAAa;QACzB,IAAI,IAAI,CAAC,eAAe;YAAE,OAAO;QAEjC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,mDAAmD;YACnD,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAuB;gBACpD,UAAU,EAAE,qBAAqB;gBACjC,WAAW,EAAE,YAAY,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG;gBAC1C,OAAO,EAAE,gBAAgB;gBACzB,OAAO,EAAE,GAAG;gBACZ,UAAU,EAAE,eAAe;aAC5B,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACrC,0CAA0C;gBAC1C,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;gBAEzE,sBAAsB;gBACtB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAE5E,gDAAgD;gBAChD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;oBACrB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC7C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACzB,CAAC;YACH,CAAC;YAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YACjD,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,+BAA+B,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAClG,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,GAAyB;QAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC;QACpC,OAAO;YACL,KAAK,EAAE,GAAG,CAAC,EAAE;YACb,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE;YAC1D,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAChD,UAAU,EAAE,KAAK;YACjB,WAAW,EAAE,MAAM;YACnB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,CAAC;YACjC,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC;YAC/B,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,CAAC;YACnC,QAAQ,EAAE,GAAG,CAAC,oBAAoB,IAAI,CAAC;YACvC,IAAI,EAAE,GAAG,CAAC,YAAY,IAAI,CAAC;YAC3B,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YACpC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,SAAS;SAChC,CAAC;IACJ,CAAC;IAED,wBAAwB;QACtB,IAAI,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;QAE9B,0BAA0B;QAC1B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,UAAU,GAAgB,IAAI,CAAC;QAEnC,QAAQ,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAChC,KAAK,IAAI;gBACP,UAAU,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;gBAC/D,MAAM;YACR,KAAK,KAAK;gBACR,UAAU,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;gBAChE,MAAM;YACR,KAAK,KAAK;gBACR,UAAU,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;gBAChE,MAAM;QACV,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,UAAW,CAAC,CAAC;QACjD,CAAC;QAED,8DAA8D;QAC9D,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/E,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY,CAAC,KAAmC;QAC9C,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,oFAAoF;QACpF,IAAI,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;YACtE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,GAAkB;QAChC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,4BAA4B;YAC5B,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,iBAAiB;YACjB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QACD,oFAAoF;QACpF,IAAI,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;YACtE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,GAAW;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,gBAAgB,CAAC,IAAoC;QACnD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAClE,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;QACD,4CAA4C;QAC5C,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC1C,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO;QAC/B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAErD,8EAA8E;YAC9E,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAE7C,MAAM,UAAU,GAAsB,EAAE,CAAC;YAEzC,mDAAmD;YACnD,MAAM,aAAa,GAAa,EAAE,CAAC;YAEnC,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;gBACjC,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,OAAO,CAAkB;oBACvD,UAAU,EAAE,eAAe;oBAC3B,WAAW,EAAE,mBAAmB,OAAO,CAAC,KAAK,GAAG;oBAChD,OAAO,EAAE,UAAU;oBACnB,UAAU,EAAE,eAAe;iBAC5B,CAAC,CAAC;gBAEH,IAAI,cAAc,CAAC,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;oBACrD,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0B,CAAC;oBAEtD,KAAK,MAAM,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;wBAC7C,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;wBAC/B,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE;4BAC9B,SAAS,EAAE,OAAO,CAAC,EAAE;4BACrB,MAAM,EAAE,OAAO,CAAC,MAAM;4BACtB,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,SAAS;4BACnC,MAAM,EAAE,OAAO,CAAC,MAAM;4BACtB,KAAK,EAAE,OAAO,CAAC,KAAK;4BACpB,QAAQ,EAAE,OAAO,CAAC,eAAe;4BACjC,WAAW,EAAE,IAAI,EAAE,0BAA0B;4BAC7C,aAAa,EAAE,IAAI,EAAE,0BAA0B;4BAC/C,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC;yBAChC,CAAC,CAAC;oBACL,CAAC;oBAED,UAAU,CAAC,IAAI,CAAC;wBACd,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,MAAM,EAAE,OAAO,CAAC,MAAM;wBACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;wBAC1B,WAAW;qBACZ,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,yCAAyC;YACzC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAC;gBAEvE,iCAAiC;gBACjC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;oBAC7B,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;wBACxC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBACjD,IAAI,QAAQ,EAAE,CAAC;4BACb,IAAI,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;gCAC5B,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC;4BACrC,CAAC;4BACD,kFAAkF;4BAClF,MAAM,WAAW,GAAG,QAAQ,CAAC,iBAAiB,IAAI,QAAQ,CAAC,QAAQ,CAAC;4BACpE,IAAI,WAAW,EAAE,CAAC;gCAChB,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;4BACnC,CAAC;wBACH,CAAC;oBACH,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YAEzB,0CAA0C;YAC1C,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;gBACnC,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACnD,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,4BAA4B,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/F,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,wBAAwB,CAAC,UAAoB;QACzD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAmC,CAAC;QAE/D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,WAAW,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,2EAA2E;YAC3E,MAAM,SAAS,GAAG,EAAE,CAAC;YACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;gBACtD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;gBACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAEtD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAA0B;oBACvD,UAAU,EAAE,wBAAwB;oBACpC,WAAW,EAAE,iBAAiB,QAAQ,GAAG;oBACzC,UAAU,EAAE,eAAe;iBAC5B,CAAC,CAAC;gBAEH,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACrC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACtC,iFAAiF;wBACjF,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;oBAChD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,wBAAwB;QACtB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkD,CAAC;QAE3E,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACtC,KAAK,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACvD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC1B,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACzF,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAClE,MAAM;YACN,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC,CAAC;QAEJ,gCAAgC;QAChC,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YAC/D,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;QAC5E,CAAC;QAED,gBAAgB;QAChB,IAAI,IAAI,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;YACrC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QACvG,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACjD,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACzC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,MAA2B;QAC1C,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;YACjC,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;YAC3B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,MAAc;QAC5B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QACjF,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,KAAY;QAC9B,MAAM,KAAK,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QACvD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,mBAAmB,CAAC,KAAa,EAAE,MAAc;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,OAAO,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IACjD,CAAC;IAED,kBAAkB,CAAC,MAA6B;QAC9C,IAAI,CAAC,MAAM;YAAE,OAAO,wBAAwB,CAAC;QAC7C,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,KAAK,QAAQ,CAAC,CAAC,OAAO,aAAa,CAAC;YACpC,KAAK,QAAQ,CAAC,CAAC,OAAO,aAAa,CAAC;YACpC,KAAK,OAAO,CAAC,CAAC,OAAO,YAAY,CAAC;YAClC,KAAK,SAAS,CAAC,CAAC,OAAO,cAAc,CAAC;YACtC,KAAK,SAAS,CAAC,CAAC,OAAO,2BAA2B,CAAC;YACnD,KAAK,SAAS,CAAC,CAAC,OAAO,cAAc,CAAC;YACtC,OAAO,CAAC,CAAC,OAAO,cAAc,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,MAAc;QAC7B,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,QAAQ,CAAC,CAAC,OAAO,+CAA+C,CAAC;YACtE,KAAK,QAAQ,CAAC,CAAC,OAAO,+CAA+C,CAAC;YACtE,KAAK,OAAO,CAAC,CAAC,OAAO,+CAA+C,CAAC;YACrE,KAAK,SAAS,CAAC,CAAC,OAAO,4CAA4C,CAAC;YACpE,KAAK,SAAS,CAAC,CAAC,OAAO,yCAAyC,CAAC;YACjE,KAAK,SAAS,CAAC,CAAC,OAAO,+CAA+C,CAAC;YACvE,KAAK,SAAS,CAAC,CAAC,OAAO,uCAAuC,CAAC;YAC/D,OAAO,CAAC,CAAC,OAAO,WAAW,MAAM,EAAE,CAAC;QACtC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,MAAc,EAAE,QAAuB;QACrD,IAAI,OAAO,GAAG,iBAAiB,MAAM,YAAY,CAAC;QAClD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;YACxF,OAAO,IAAI,QAAQ,SAAS,GAAG,CAAC;QAClC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,YAAY;QACV,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa;YAAE,KAAK,EAAE,CAAC;QAChD,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS;YAAE,KAAK,EAAE,CAAC;QAC5C,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ;YAAE,KAAK,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,8BAA8B;IAC9B,4BAA4B;IAC5B,8BAA8B;IAE9B;;OAEG;IACH,iBAAiB,CAAC,GAAoB;QACpC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC/B,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;gBAAE,KAAK,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,GAAoB;QACnC,OAAO,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,GAAoB;QACjC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC/B,IAAI,MAAM,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;gBAC/B,GAAG,IAAI,MAAM,CAAC,WAAW,CAAC;gBAC1B,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,GAAoB;QACnC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC/B,IAAI,MAAM,CAAC,WAAW,IAAI,IAAI;gBAAE,KAAK,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,GAAoB;QAChC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC/B,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;gBACzB,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC;gBACpB,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,GAAoB;QAClC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC/B,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI;gBAAE,KAAK,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,SAAiB;QAC3B,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,eAAe,EAAE,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,MAA6B,EAAE,KAAY;QAC3D,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,qCAAqC;QAC9D,IAAI,MAAM,EAAE,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,qBAAqB;IACrB,8BAA8B;IAE9B;;;OAGG;IACK,WAAW;QACjB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxE,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;QAE7B,6DAA6D;QAC7D,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,IAAI,GAAG,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACtC,4EAA4E;QAC5E,MAAM,SAAS,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,MAAM,WAAW,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAClF,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;QAC1C,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;QAC7C,MAAM,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;QAExD,0BAA0B;QAC1B,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC;QAEtD,uBAAuB;QACvB,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;QAE7C,qCAAqC;QACrC,MAAM,YAAY,GAA2B;YAC3C,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,SAAS;SACrB,CAAC;QAEF,aAAa;QACb,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC;aAC7B,MAAM,CAAC,KAAK,CAAC;aACb,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;aACpB,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE1B,qBAAqB;QACrB,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC;aACjC,MAAM,CAAC,KAAK,CAAC;aACb,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC;aAC9B,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC;aAC7B,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;aACnB,KAAK,CAAC,YAAY,EAAE,wBAAwB,CAAC;aAC7C,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;aACvB,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC;aAC7B,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC;aAC7B,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC;aAC1B,KAAK,CAAC,gBAAgB,EAAE,MAAM,CAAC;aAC/B,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC;aACxB,KAAK,CAAC,YAAY,EAAE,4BAA4B,CAAC;aACjD,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAE/B,qBAAqB;QACrB,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;aAC1B,IAAI,CAAC,WAAW,EAAE,aAAa,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;QAEjE,qCAAqC;QACrC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEhC,kCAAkC;QAClC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE;YACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;iBAC3C,IAAI,CAAC,IAAI,EAAE,YAAY,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;iBAC9C,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;iBAChB,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;iBAChB,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;iBAChB,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAEtB,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;iBACpB,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;iBACpB,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC;iBACzB,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YAE9B,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;iBACpB,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;iBACtB,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,KAAK,CAAC;iBACrE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,4CAA4C;QAC5C,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAEtC,yCAAyC;QACzC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACtB,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;YAEtC,YAAY;YACZ,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;iBACjB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;iBACZ,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;iBACd,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;iBAC7B,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;iBACvB,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;iBACzB,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC;iBAC1B,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;iBACpC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC;iBAC1B,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YAEnD,kBAAkB;YAClB,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YAClG,MAAM,UAAU,GAAG,EAAE,CAAC;YACtB,MAAM,WAAW,GAAG,EAAE,CAAC;YAEvB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;iBACjB,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC;iBAC7B,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;iBACd,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;iBACzB,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC;iBAC3B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;iBACb,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC;iBAC3B,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAEzB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;iBACjB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;iBACZ,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;iBACd,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;iBAC7B,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC;iBAC3B,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;iBACzB,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC;iBAC1B,IAAI,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAEvC,gCAAgC;YAChC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACxC,MAAM,YAAY,GAAG,EAAE,CAAC;gBACxB,MAAM,aAAa,GAAG,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,CAAC,CAAC;gBACjB,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,GAAG,YAAY,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;gBAC3F,MAAM,SAAS,GAAG,CAAC,GAAG,cAAc,GAAG,CAAC,CAAC;gBAEzC,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;oBACnC,MAAM,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC,CAAC;oBAC5D,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC;oBAEjB,gCAAgC;oBAChC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;yBACjB,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;yBACf,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;yBACf,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC;yBAC3B,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC;yBAC7B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;yBACb,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;yBACvB,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;yBACzB,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;yBACvB,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC;yBAC1B,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;oBAEnD,WAAW;oBACX,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;yBACjB,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,YAAY,GAAG,CAAC,CAAC;yBAClC,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC;yBACvC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;yBAC7B,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;yBACvB,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;yBACxB,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC;yBAC1B,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;yBACtD,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC;yBAC1B,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrD,CAAC,CAAC,CAAC;gBAEH,iCAAiC;gBACjC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxB,MAAM,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC,CAAC;oBACtE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;yBACjB,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;yBAChB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC;yBACtC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC;yBAC5B,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;yBACvB,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;yBACxB,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC;yBAC1B,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,uCAAuC;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACxB,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;YAExC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;iBACjB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;iBACd,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;iBAChB,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC;iBAC1B,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;iBACvB,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;iBACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;iBACxF,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC;iBAC1B,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAChB,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACzF,CAAC,CAAC;iBACD,EAAE,CAAC,WAAW,EAAE;gBACf,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YACrE,CAAC,CAAC;iBACD,EAAE,CAAC,UAAU,EAAE;gBACd,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,kBAAkB;QAClB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACrB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;iBACjB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;iBACb,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;iBAC/B,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;iBACtB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;iBAC/B,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;iBACzB,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACpB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;iBACjB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;iBAC9B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;iBACb,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;iBAC9B,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;iBACvB,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;iBACzB,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,4CAA4C;QAC5C,MAAM,WAAW,GAAG,CAAC,CAAC;QAEtB,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;YAC7B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE;gBAChC,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAChD,MAAM,CAAC,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;gBAC5C,MAAM,CAAC,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;gBAC9C,MAAM,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,CAAC,CAAC;gBAC7C,MAAM,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,CAAC,CAAC;gBAE/C,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,uBAAuB;oBACvB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;yBACjB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;yBACZ,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;yBACZ,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;yBACxB,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;yBAC1B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;yBACb,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;yBACvB,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;yBACzB,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;oBAE3B,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;yBACjB,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;yBAC5B,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;yBACjC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;yBAC7B,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;yBACvB,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;yBACzB,IAAI,CAAC,GAAG,CAAC,CAAC;oBACb,OAAO;gBACT,CAAC;gBAED,wDAAwD;gBACxD,MAAM,YAAY,GAAa,EAAE,CAAC;gBAClC,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;oBACvC,YAAY,CAAC,IAAI,CAAC,oFAAoF,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,mDAAmD,MAAM,CAAC,MAAM,QAAQ,CAAC,CAAC;gBAC7M,CAAC;gBACD,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;oBACnC,YAAY,CAAC,IAAI,CAAC,kLAAkL,CAAC,CAAC;gBACxM,CAAC;gBACD,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;oBAC1D,YAAY,CAAC,IAAI,CAAC,0GAA0G,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACxK,CAAC;gBACD,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,mCAAmC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBAE3H,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;qBAChC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;qBAC5B,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC;qBAC1B,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;qBACrD,EAAE,CAAC,WAAW,EAAE,CAAC,KAAiB,EAAE,EAAE;oBACrC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,aAAwB,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;yBAC7D,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;yBACzB,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;oBAE3B,OAAO;yBACJ,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;yBACnB,IAAI,CAAC;iFAC6D,MAAM,CAAC,QAAQ;kBAC9E,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;kBACrB,YAAY;6EAC+C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;eAC5F,CAAC;yBACD,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,EAAE,IAAI,CAAC;yBACxC,KAAK,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC7C,CAAC,CAAC;qBACD,EAAE,CAAC,UAAU,EAAE,CAAC,KAAiB,EAAE,EAAE;oBACpC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,aAAwB,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;yBAC7D,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;yBACtB,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;oBAC3B,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBAC9B,CAAC,CAAC,CAAC;gBAEL,4DAA4D;gBAC5D,IAAI,WAAW,GAAG,SAAS,CAAC;gBAC5B,IAAI,cAAc,GAAG,EAAE,CAAC;gBAExB,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;oBACvC,4BAA4B;oBAC5B,cAAc,GAAG,iBAAiB,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC;gBACnE,CAAC;qBAAM,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;oBACjE,wBAAwB;oBACxB,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;oBACjG,WAAW,GAAG,UAAU,CAAC;gBAC3B,CAAC;qBAAM,CAAC;oBACN,iDAAiD;oBACjD,WAAW,GAAG,SAAS,CAAC;gBAC1B,CAAC;gBAED,kBAAkB;gBAClB,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;qBACrB,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;qBACxB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;qBACZ,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;qBACZ,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;qBACxB,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;qBAC1B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;qBACb,IAAI,CAAC,MAAM,EAAE,cAAc,IAAI,WAAW,CAAC;qBAC3C,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;qBACtB,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;qBACvB,KAAK,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;gBAEzC,kEAAkE;gBAClE,+DAA+D;gBAC/D,MAAM,QAAQ,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,MAAM,WAAW,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpE,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;gBAEvE,IAAI,SAAS,GAAG,CAAC,CAAC;gBAElB,0BAA0B;gBAC1B,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;oBACvC,MAAM,QAAQ,GAA2B;wBACvC,QAAQ,EAAE,GAAG;wBACb,QAAQ,EAAE,GAAG;wBACb,OAAO,EAAE,GAAG;wBACZ,SAAS,EAAE,GAAG;wBACd,SAAS,EAAE,GAAG;wBACd,SAAS,EAAE,GAAG;qBACf,CAAC;oBAEF,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;oBAE/C,iEAAiE;oBACjE,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;wBAClB,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;6BACvB,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;6BACjB,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC;6BAC9B,IAAI,CAAC,GAAG,EAAE,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;6BAC3B,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;6BACzC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;oBAC1B,CAAC;oBAED,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;yBACrB,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;yBAChB,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,UAAU,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;yBAC5C,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;yBAC7B,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;yBACrB,IAAI,CAAC,WAAW,EAAE,GAAG,QAAQ,IAAI,CAAC;yBAClC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC;yBAC3B,IAAI,CAAC,aAAa,EAAE,sCAAsC,CAAC;yBAC3D,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;oBAExC,SAAS,EAAE,CAAC;gBACd,CAAC;gBAED,aAAa;gBACb,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;oBACnC,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;oBAE/C,sDAAsD;oBACtD,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;yBACvB,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;yBACjB,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC;yBAC9B,IAAI,CAAC,GAAG,EAAE,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;yBAC3B,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;yBACvB,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;yBACzB,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;oBAE3B,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;yBACrB,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;yBAChB,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,UAAU,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;yBAC5C,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;yBAC7B,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;yBACvB,IAAI,CAAC,WAAW,EAAE,GAAG,QAAQ,GAAG,CAAC,IAAI,CAAC;yBACtC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC;yBAC1B,IAAI,CAAC,GAAG,CAAC,CAAC;oBAEb,SAAS,EAAE,CAAC;gBACd,CAAC;gBAED,4BAA4B;gBAC5B,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;oBAClC,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;oBAE/C,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;wBACzB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;wBACpD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;wBAEjG,wBAAwB;wBACxB,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;4BAClB,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;iCACrB,IAAI,CAAC,GAAG,EAAE,KAAK,GAAG,EAAE,CAAC;iCACrB,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,UAAU,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;iCAChD,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;iCACjB,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,CAAC,CAAC;iCAC5B,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;iCAC9B,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;iCACxB,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;wBAC1B,CAAC;wBAED,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;6BACrB,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;6BAChB,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,UAAU,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;6BAC5C,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;6BAC7B,IAAI,CAAC,MAAM,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;6BAC/C,IAAI,CAAC,WAAW,EAAE,GAAG,QAAQ,GAAG,CAAC,IAAI,CAAC;6BACtC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC;6BAC1B,IAAI,CAAC,GAAG,YAAY,EAAE,CAAC,CAAC;oBAC7B,CAAC;yBAAM,CAAC;wBACN,0BAA0B;wBAC1B,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;6BACvB,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;6BACjB,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC;6BAC9B,IAAI,CAAC,GAAG,EAAE,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;6BAC3B,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;6BACvB,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;6BACzB,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;wBAE3B,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;6BACrB,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;6BAChB,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,UAAU,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;6BAC5C,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;6BAC7B,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;6BACvB,IAAI,CAAC,WAAW,EAAE,GAAG,QAAQ,GAAG,CAAC,IAAI,CAAC;6BACtC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACf,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,4CAA4C;QAC5C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,UAAU,GAAG,WAAW,GAAG,EAAE,CAAC;YACpC,MAAM,WAAW,GAAG,EAAE,CAAC;YAEvB,mBAAmB;YACnB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;iBACjB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;iBACd,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,WAAW,GAAG,CAAC,CAAC;iBACvC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC;iBAC1B,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;iBACvB,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;iBACzB,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC;iBAC1B,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAE3B,yBAAyB;YACzB,MAAM,aAAa,GAAG,EAAE,CAAC,IAAI,EAAmB;iBAC7C,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;iBACxC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,WAAW,CAAC;iBACnE,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;YAE5B,uBAAuB;YACvB,MAAM,aAAa,GAAG,EAAE,CAAC,IAAI,EAAmB;iBAC7C,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;iBACxC,EAAE,CAAC,UAAU,GAAG,WAAW,CAAC;iBAC5B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,WAAW,CAAC;iBACpE,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;YAE5B,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;iBACjB,KAAK,CAAC,IAAI,CAAC;iBACX,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC;iBACxB,IAAI,CAAC,MAAM,EAAE,qBAAqB,CAAC;iBACnC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAExB,iCAAiC;YACjC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;iBAChD,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC;iBAC3B,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;iBAChB,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;iBAChB,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;iBAChB,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAEtB,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC;iBACzB,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;iBACpB,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC;iBAC7B,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;YAE7B,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC;iBACzB,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;iBACtB,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC;iBAC7B,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YAE3B,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;iBACjB,KAAK,CAAC,IAAI,CAAC;iBACX,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC;iBACxB,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;iBACpB,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;iBACzB,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC;iBACzB,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;YAEnC,0BAA0B;YAC1B,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;gBACtB,MAAM,EAAE,GAAG,CAAC,GAAG,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;gBACvC,MAAM,EAAE,GAAG,UAAU,GAAG,WAAW,GAAG,CAAC,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,WAAW,CAAC;gBAEzE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;qBACnB,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;qBACd,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;qBACd,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;qBACZ,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;qBACrB,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;qBACzB,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,yCAAyC;YACzC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC;YAC3D,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,KAA0D,EAAE,MAAoE;QACxJ,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;aAClC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;aAC5B,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;QAE7E,eAAe;QACf,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;aACvB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;aACZ,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;aACZ,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;aACvB,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;aACxB,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC;aAC1B,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC;aACnC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEpB,IAAI,OAAO,GAAG,EAAE,CAAC;QAEjB,mBAAmB;QACnB,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxC,IAAI,CAAC,WAAW,EAAE,aAAa,OAAO,OAAO,CAAC,CAAC;YAElD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;iBACzB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;iBACb,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;iBACb,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;iBACZ,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAE3B,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;iBACvB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;iBACZ,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;iBACZ,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;iBAC7B,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;iBACrB,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;iBACxB,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC;iBAC3B,IAAI,CAAC,GAAG,CAAC,CAAC;YAEb,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;iBACvB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;iBACb,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;iBACZ,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;iBACvB,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;iBACzB,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC;iBAC1B,IAAI,CAAC,QAAQ,CAAC,CAAC;YAElB,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,kBAAkB;QAClB,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;iBACvC,IAAI,CAAC,WAAW,EAAE,aAAa,OAAO,OAAO,CAAC,CAAC;YAElD,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC;iBACxB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;iBACb,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;iBACb,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;iBACZ,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;iBACvB,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;iBACzB,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YAE3B,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;iBACtB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;iBACZ,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;iBACZ,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;iBAC7B,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;iBACvB,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;iBACxB,IAAI,CAAC,GAAG,CAAC,CAAC;YAEb,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;iBACtB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;iBACb,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;iBACZ,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;iBACvB,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;iBACzB,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC;iBAC1B,IAAI,CAAC,OAAO,CAAC,CAAC;YAEjB,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,iBAAiB;QACjB,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;iBACtC,IAAI,CAAC,WAAW,EAAE,aAAa,OAAO,OAAO,CAAC,CAAC;YAElD,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;iBACrB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;iBACZ,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;iBACb,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;iBACjB,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;iBAClB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;iBACb,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAE3B,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;iBACrB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;iBACZ,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;iBACZ,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;iBAC7B,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;iBACrB,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;iBACxB,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC;iBAC1B,IAAI,CAAC,GAAG,CAAC,CAAC;YAEb,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;iBACrB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;iBACb,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;iBACZ,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;iBACvB,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;iBACzB,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC;iBAC1B,IAAI,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,kBAAkB;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC7C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACpE,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,wBAAwB,EAAE,CAAC,MAAM,CAAC;IAChD,CAAC;IAED,kBAAkB;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC7C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACpE,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,wBAAwB,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,gBAAgB;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC7C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAE9D,oCAAoC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEvC,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;QACrF,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC;QAElF,MAAM,IAAI,GAAG,SAAS,GAAG,QAAQ,CAAC;QAClC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACpE,OAAO,EAAE,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;IACxE,CAAC;IAED,cAAc,CAAC,OAAe;QAC5B,IAAI,OAAO,GAAG,EAAE;YAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QAClD,IAAI,OAAO,GAAG,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;YACtC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC;QACrD,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;IACvD,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,IAAI,IAAI,GAAG,IAAI;YAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,IAAI,IAAI,GAAG,CAAC;YAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/B,CAAC;IAED,6CAA6C;IAC7C,sBAAsB;IACtB,6CAA6C;IAE7C,KAAK,CAAC,iBAAiB,CAAC,GAAyB;QAC/C,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;QACvB,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,GAAyB;QAC/C,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;QACvB,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IAC/B,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3C,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAE5D,iDAAiD;YACjD,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC3C,EAAE,CAAC,OAAO,CAAkB;oBAC1B,UAAU,EAAE,eAAe;oBAC3B,WAAW,EAAE,mBAAmB,IAAI,CAAC,WAAW,CAAC,EAAE,GAAG;oBACtD,OAAO,EAAE,cAAc;oBACvB,UAAU,EAAE,eAAe;iBAC5B,CAAC;gBACF,EAAE,CAAC,OAAO,CAAkB;oBAC1B,UAAU,EAAE,eAAe;oBAC3B,WAAW,EAAE,mBAAmB,IAAI,CAAC,WAAW,CAAC,EAAE,GAAG;oBACtD,OAAO,EAAE,cAAc;oBACvB,UAAU,EAAE,eAAe;iBAC5B,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAErE,2BAA2B;YAC3B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAClG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YACvD,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,gCAAgC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACnG,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,MAAyB,EAAE,MAAyB;QACjF,MAAM,OAAO,GAAwB,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsE,CAAC;QAE9F,2BAA2B;QAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,cAAc,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,2BAA2B;QAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,cAAc,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,KAAK,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC;YAC/C,MAAM,UAAU,GAAsB;gBACpC,MAAM;gBACN,QAAQ,EAAE,IAAI;gBACd,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBACR,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS;oBAC7B,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,QAAQ,EAAE,CAAC,CAAC,eAAe;oBAC3B,IAAI,EAAE,CAAC,CAAC,OAAO;iBAChB,CAAC,CAAC,CAAC,IAAI;gBACR,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBACR,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS;oBAC7B,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,QAAQ,EAAE,CAAC,CAAC,eAAe;oBAC3B,IAAI,EAAE,CAAC,CAAC,OAAO;iBAChB,CAAC,CAAC,CAAC,IAAI;gBACR,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;gBAC5E,YAAY,EAAE,CAAC,CAAC,EAAE,eAAe,IAAI,IAAI,IAAI,CAAC,EAAE,eAAe,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI;gBACvH,aAAa,EAAE,CAAC,CAAC,EAAE,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,IAAI,MAAM,CAAC;aAC/D,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,sBAAsB;QACpB,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,OAAO,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,sBAAsB;QACpB,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,oBAAoB,IAAI,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,oBAAoB,IAAI,CAAC,CAAC;QACxD,OAAO,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,yBAAyB;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC3C,OAAO,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,IAAI,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,IAAI,CAAC,CAAC;QACjD,OAAO,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,uBAAuB;QACrB,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACpC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI;YAChB,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CACzD,CAAC,MAAM,CAAC;IACX,CAAC;IAED,wBAAwB;QACtB,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACpC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI;YAChB,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CACzD,CAAC,MAAM,CAAC;IACX,CAAC;IAED,6CAA6C;IAC7C,uBAAuB;IACvB,6CAA6C;IAE7C,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC;YACH,yBAAyB;YACzB,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YAE5C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACtC,QAAQ,EAAE,GAAG,CAAC,EAAE;gBAChB,QAAQ,EAAE,GAAG,CAAC,MAAM;gBACpB,YAAY,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK;gBAC9E,cAAc,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK;gBACpF,cAAc,EAAE,GAAG,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK;gBAC7D,aAAa,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC;gBAClC,QAAQ,EAAE,GAAG,CAAC,WAAW,IAAI,CAAC;gBAC9B,QAAQ,EAAE,GAAG,CAAC,WAAW,IAAI,CAAC;gBAC9B,QAAQ,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC;gBAC7B,SAAS,EAAE,GAAG,CAAC,YAAY,IAAI,CAAC;gBAChC,eAAe,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;gBACpG,gBAAgB,EAAE,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK;gBACvD,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;gBAC3D,aAAa,EAAE,GAAG,CAAC,WAAW,IAAI,KAAK;gBACvC,cAAc,EAAE,GAAG,CAAC,WAAW,IAAI,KAAK;gBACxC,QAAQ,EAAE,GAAG,CAAC,SAAS,IAAI,KAAK;aACjC,CAAC,CAAC,CAAC;YAEJ,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,kBAAkB,CAAC,CAAC;YAChE,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,mBAAmB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACxF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACvC,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,IAAuC,EAAE,QAAgB;QAC7E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE9B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG;YACjB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YACjB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBACd,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;gBACnB,qDAAqD;gBACrD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC3B,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1E,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;gBAC3C,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CACb;SACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,UAAU,CAAC,GAAyB;QAClC,OAAO,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,mBAAmB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YACtF,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;YAE7B,iBAAiB;YACjB,MAAM,IAAI,GAAsC,EAAE,CAAC;YAEnD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAoC;oBAC3C,KAAK,EAAE,IAAI,CAAC,QAAQ;oBACpB,WAAW,EAAE,IAAI,CAAC,QAAQ;iBAC3B,CAAC;gBAEF,0BAA0B;gBAC1B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAChD,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;wBAClC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG;wBACzE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAEnC,IAAI,MAAM,EAAE,CAAC;wBACX,yCAAyC;wBACzC,MAAM,KAAK,GAAa,EAAE,CAAC;wBAC3B,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa;4BAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;wBAClE,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS;4BAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;wBAC/G,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ;4BAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;wBACrH,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACpC,CAAC;yBAAM,CAAC;wBACN,GAAG,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;oBAC5B,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;YAED,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,oBAAoB,CAAC,CAAC;YAClE,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,8BAA8B,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACnG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC9C,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,8BAA8B;IAC9B,6CAA6C;IAE7C;;OAEG;IACK,oBAAoB;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,sBAAsB,CAAC,CAAC;YAEpF,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC;gBACtC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,oBAAoB;gBACpB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC7B,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa;QACX,IAAI,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,MAAM;gBAAE,OAAO;YAEpB,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC;gBACvC,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,sBAAsB,CAAC,CAAC;gBAEpF,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC;gBACxC,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,sBAAsB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAsB,mBAAmB,CAAC,CAAC;oBAC5G,IAAI,CAAC,sBAAsB,CAAC,MAAM,GAAG,MAAM,CAAC;oBAC5C,IAAI,CAAC,sBAAsB,CAAC,OAAO,GAAG,sBAAsB,CAAC;gBAC/D,CAAC;YACH,CAAC;YAED,IAAI,CAAC,sBAAsB,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1E,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,4FAA4F;IACrF,aAAa,CAAC,GAAyB;QAC5C,OAAO,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,2FAA2F;IACpF,aAAa,CAAC,GAAyB;QAC5C,OAAO,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,6CAA6C;IAC7C,sBAAsB;IACtB,6CAA6C;IAE7C,8DAA8D;IAC9D,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,KAAK,IAAI,CAAC;IACrC,CAAC;IAED,gEAAgE;IAChE,IAAI,eAAe;QACjB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM;YAAE,OAAO,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC;IAED,oEAAoE;IACpE,IAAI,IAAI;QACN,OAAO,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,sBAAsB;QAClC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAoB;gBACjD,UAAU,EAAE,iBAAiB;gBAC7B,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE;gBAC/D,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,eAAe;aAC5B,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;gBAC/C,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC1B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE3C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,EAAE,EAAE,CAAC;gBACP,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,aAAa,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAClF,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,eAAe,IAAI,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,IAAI,aAAa,CAAC;gBACjH,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;YAC/D,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACtE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,cAAc;QACZ,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC;YAAE,OAAO;QACtD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,gEAAgE;IAChE,eAAe;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,wDAAwD;QACxD,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3B,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,2BAA2B;IAC3B,SAAS,CAAC,GAAW;QACnB,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/D,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,qEAAqE;IACrE,iBAAiB,CAAC,KAAoB;QACpC,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YAC/C,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,iDAAiD;QACjD,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC;YACtB,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnB,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,iDAAiD;IACjD,6CAA6C;IAE7C,mEAAmE;IACnE,KAAK,CAAC,kBAAkB;QACtB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;QAC9C,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACzB,CAAC;YAED,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YACtE,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAe;gBAC5C,UAAU,EAAE,WAAW;gBACvB,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,eAAe;aAC5B,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,IAAI,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACvF,CAAC;iBAAM,CAAC;gBACN,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,sBAAsB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;YACrD,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,sBAAsB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACzF,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;YACnC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,mBAAmB;QACjB,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO;QAC/B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;QAC9C,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,kBAAkB,CAAC,MAAc;QAC/B,IAAI,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QACD,qEAAqE;QACrE,IAAI,CAAC,oBAAoB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC/D,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,aAAa,CAAC,MAAc;QAC1B,OAAO,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,iDAAiD;IACjD,IAAI,sBAAsB;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACnD,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,cAAc,CAAC;QACnC,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACpC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CACzC,CAAC;IACJ,CAAC;IAED,iBAAiB;QACf,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC5C,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,oBAAoB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC/D,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,oFAAoF;IACpF,KAAK,CAAC,eAAe;QACnB,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO;QAEvE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;QACpC,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9F,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACvD,0EAA0E;QAC1E,wEAAwE;QACxE,qDAAqD;QACrD,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAC7C,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,sBAAsB,EAAE,CAAC;YACnD,MAAM,OAAO,GAA4B,EAAE,CAAC;YAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAwB,sBAAsB,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;gBAChH,GAAG,CAAC,SAAS,EAAE,CAAC;gBAChB,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7B,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACzB,GAAG,CAAC,QAAQ,GAAG,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC;gBACrC,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC;gBACtB,GAAG,CAAC,gBAAgB,GAAG,EAAE,CAAC;gBAC1B,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;YAED,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;YAC7B,IAAI,EAAE,EAAE,CAAC;gBACP,sEAAsE;gBACtE,iEAAiE;gBACjE,iEAAiE;gBACjE,mBAAmB;gBACnB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;oBAC1B,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;wBACd,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;wBAC1C,IAAI,IAAI,EAAE,CAAC;4BACT,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;wBACxB,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,CAAC;gBACnD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;gBAExB,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAC7C,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,uBAAuB,EACzF,SAAS,EACT,IAAI,CACL,CAAC;gBACF,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAChC,IAAI,CAAC,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;gBAC9C,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBAC5E,MAAM,MAAM,GAAG,MAAM,EAAE,YAAY,EAAE,eAAe,IAAI,qBAAqB,CAAC;gBAC9E,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;YACvE,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACtE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,iBAAiB,CAAC,SAAgC,EAAE,KAAa;QAC/D,IAAI,KAAK;YAAE,KAAK,CAAC,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,2BAA2B,GAAG,SAAS,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,gBAAgB,CAAC,KAAa;QAC5B,IAAI,KAAK;YAAE,KAAK,CAAC,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,iBAAiB,CAAC,SAAgC,EAAE,KAAa;QACrE,IAAI,KAAK;YAAE,KAAK,CAAC,eAAe,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO;QAChC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;YACpC,IAAI,EAAE,EAAE,CAAC;gBACP,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC/E,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,yBAAyB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAC9F,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,EAAE,eAAe,IAAI,uBAAuB,CAAC;gBAClF,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;YACzE,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACtE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC;YACxC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,KAAK,CAAC,UAAU,CAAC,KAA2C;QAC1D,IAAI,KAAK,CAAC,aAAa,KAAK,KAAK,CAAC,YAAY;YAAE,OAAO;QAEvD,qBAAqB;QACrB,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QACvC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QACpE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,8EAA8E;QAC9E,MAAM,KAAK,GAA4B,EAAE,CAAC;QAC1C,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC;YACvB,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;gBAC5B,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE/B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,sBAAsB,EAAE,CAAC;YACnD,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;gBACxB,GAAG,CAAC,gBAAgB,GAAG,EAAE,CAAC;gBAC1B,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YACnB,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;YAC7B,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBAC1E,MAAM,MAAM,GAAG,MAAM,EAAE,YAAY,EAAE,eAAe,IAAI,0BAA0B,CAAC;gBACnF,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;gBACvE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;YAC5E,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACpE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACzB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC/B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;oTA5vEU,gCAAgC,yBAAhC,gCAAgC;oEAAhC,gCAAgC;;;;;;YAAhC,+GAAA,kCAA8B,0BAAE,4GAAhC,8BAA0B,wBAAM;;YCxBnC,AADF,AADF,AADF,AAFF,AAFF,8BAA6B,aAED,aAEwB,SAC1C,SACE,WACkE;YAAvC,wGAAS,gCAA4B,IAAC;YACjE,uBAA2B;YAC3B,+BAA8B;YAAA,uBAAO;YAEzC,AADE,AADuC,iBAAO,EAC1C,EACD;YACL,6BAAoB;YAElB,AADA,yBAA8C,aACZ;YAClC,6BAAM;YAAA,aAAiB;YAG7B,AADE,AADE,AADyB,iBAAO,EAC3B,EACF,EACD;YAIF,AADF,AADF,gCAA4B,eACD,eAC6C;YAClE,yBAAkC;YACpC,iBAAM;YAEJ,AADF,gCAAwB,UAClB;YACF,aACA;YAAA,sGAAe;YAGjB,iBAAK;YAEH,AADF,gCAAwB,gBACkC;YACtD,yBAAkG;YAClG,aACF;YAAA,iBAAO;YACP,sGAAmB;YAMnB,sGAAe;YAOrB,AADE,AADE,iBAAM,EACF,EACF;YACN,gCAA4B;YAC1B,8CAAyD;YACzD,mCAAiE;YAAhD,8GAAS,mBAAe,IAAC;YACxC,yBAAiC;YAAC,yBACpC;YAAA,iBAAS;YACT,mCAAwD;YAAvC,8GAAS,cAAU,IAAC;YACnC,yBAA2B;YAAC,4BAC9B;YAAA,iBAAS;YACT,mCAA+D;YAA9C,8GAAS,aAAS,IAAC;YAClC,yBAA4E;YAC5E,aACF;YAEJ,AADE,AADE,iBAAS,EACL,EACF;YACN,qGAA0B;YAK5B,iBAAM;YAKF,AADF,AADF,gCAA4B,eACO,kBAKmB;YAFhD,8GAAS,cAAU,UAAU,CAAC,IAAC;YAG/B,yBAA+B;YAAC,2BAClC;YAAA,iBAAS;YACT,mCAI+C;YAF7C,8GAAS,cAAU,OAAO,CAAC,IAAC;YAG5B,yBAA4B;YAAC,wBAC7B;YAAA,sGAAmB;YAGrB,iBAAS;YACT,mCAI8C;YAF5C,8GAAS,cAAU,MAAM,CAAC,IAAC;YAG3B,yBAA8B;YAAC,uBAC/B;YAAA,sGAAkB;YAGpB,iBAAS;YACT,mCAImD;YAFjD,8GAAS,cAAU,WAAW,CAAC,IAAC;YAGhC,yBAAiC;YAAC,4BACpC;YAAA,iBAAS;YACT,mCAIiD;YAF/C,8GAAS,cAAU,SAAS,CAAC,IAAC;YAG9B,yBAAoC;YAAC,0BACvC;YAEJ,AADE,AADE,iBAAS,EACL,EACF;YAGN,gCAAuD;YAErD,uGAAgC;YAmIhC,sGAA6B;YA+G7B,qGAA4B;YA4G5B,qGAAiC;YA2bjC,sGAA+B;YA4NjC,iBAAM;YAGN,mCAA6I;YAA5G,8GAAS,qBAAiB,IAAC;YAC1D,yBAA+B;YACjC,iBAAS;YAGT,sGAAqB;YA+BrB,gHAAwC;YAiBxC,4FAA0B;YA4ItB,AADF,AAPF,gCAMC,eAC+B,gBACkB;YAAA,uBAAC;YAAA,iBAAO;YAEpD,AADF,iCAA4B,cAClB;YAAA,gCAAe;YAAA,iBAAS;YAChC,iCAA8B;YAG1B,AAFF,0FAAoC,oEAEK;YAK/C,AADE,AADE,iBAAO,EACF,EACH;YAEJ,AADF,gCAA8B,kBAQ3B;YAJC,8GAAS,iBAAa,IAAC;YAOrB,AAFF,0FAAgB,oEAEP;YAIX,iBAAS;YACT,mCAOC;YAJC,8GAAS,oBAAgB,IAAC;YAK1B,yBAA2B;YAAC,0BAC9B;YAGN,AADE,AADE,AADE,iBAAS,EACL,EACF,EACF;;YA50CU,gBAAiB;YAAjB,qCAAiB;YAOD,eAA2C;YAA3C,wDAA2C;YAK/D,eACA;YADA,gDACA;YAAA,cAEC;YAFD,uCAEC;YAG0B,eAA4B;YAA5B,8CAA4B;YACtC,cAA8E;YAA9E,gGAA8E;YAC7F,cACF;YADE,kDACF;YACA,cAKC;YALD,2CAKC;YACD,cAIC;YAJD,uCAIC;YAYgC,eAAyB;YAAzB,2CAAyB;YAC7C,cAAwD;YAAxD,0EAAwD;YACvE,cACF;YADE,+EACF;YAGJ,cAIC;YAJD,kDAIC;YAOG,eAAyC;YAAzC,sDAAyC;;YAOzC,eAAsC;YAAtC,mDAAsC;;YAKtC,eAEC;YAFD,2CAEC;YAGD,cAAqC;YAArC,kDAAqC;;YAKrC,eAEC;YAFD,0CAEC;YAGD,cAA0C;YAA1C,uDAA0C;;YAO1C,eAAwC;YAAxC,qDAAwC;;YAUrB,eAA6B;YAA7B,0CAA6B;YAEpD,cAgIC;YAhID,wDAgIC;YAGD,cA4GC;YA5GD,qDA4GC;YAGD,cAyGC;YAzGD,oDAyGC;YAGD,cAwbC;YAxbD,yDAwbC;YAGD,cA2NC;YA3ND,uDA2NC;YAI0D,cAA+E;YAA/E,iGAA+E;YAK5I,eA4BC;YA5BD,6CA4BC;YAGD,cAcC;YAdD,gEAcC;YAGD,cAgIC;YAhID,kDAgIC;YAMC,cAAmC;YAAnC,gDAAmC;;YAU7B,eAIC;YAJD,kGAIC;YASH,eAAiC;YAAjC,uDAAiC;;YAIjC,cAKC;YALD,wCAKC;YAMD,eAAiC;YAAjC,uDAAiC;;;;ADpzC5B,gCAAgC;IAR5C,aAAa,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;GAQvC,gCAAgC,CA6vE5C;;iFA7vEY,gCAAgC;cAP5C,SAAS;6BACI,KAAK,YACP,oBAAoB,mBAGb,uBAAuB,CAAC,MAAM;;kBAmC9C,SAAS;mBAAC,gBAAgB;;kBA4G1B,YAAY;mBAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC;;kBAwC3C,YAAY;mBAAC,qBAAqB,EAAE,CAAC,QAAQ,CAAC;;kFArLpC,gCAAgC","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, HostListener, AfterViewInit, ViewChild, ViewContainerRef, ElementRef, inject } from '@angular/core';\nimport * as d3 from 'd3';\nimport { Subject } from 'rxjs';\nimport { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { CompositeKey, Metadata, RunView } from '@memberjunction/core';\nimport { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { MJTestEntity, MJTestSuiteEntity, MJTestSuiteTestEntity, MJTestSuiteRunEntity, MJTestRunEntity, MJTestRunFeedbackEntity, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { SharedService, NavigationService } from '@memberjunction/ng-shared';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { MJTestSuiteFormComponent } from '../../generated/Entities/MJTestSuite/mjtestsuite.form.component';\nimport {\n TestingDialogService,\n TagsHelper,\n TestRunComparison,\n EvaluationPreferencesService,\n EvaluationPreferences\n} from '@memberjunction/ng-testing';\n\n/** Settings key for keyboard shortcuts visibility */\nconst SHORTCUTS_SETTINGS_KEY = '__mj.Testing.ShowKeyboardShortcuts';\n\n@RegisterClass(BaseFormComponent, 'MJ: Test Suites')\n@Component({\n standalone: false,\n selector: 'mj-test-suite-form',\n templateUrl: './test-suite-form.component.html',\n styleUrls: ['./test-suite-form.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MJTestSuiteFormComponentExtended extends MJTestSuiteFormComponent implements OnInit, OnDestroy, AfterViewInit {\n public override record!: MJTestSuiteEntity;\n\n private destroy$ = new Subject<void>();\n\n // UI state\n activeTab = 'overview';\n loading = false;\n loadingTests = false;\n loadingRuns = false;\n loadingAnalytics = false;\n loadingCompare = false;\n testsLoaded = false;\n runsLoaded = false;\n analyticsLoaded = false;\n isRefreshing = false;\n error: string | null = null;\n\n // Related data\n suiteTests: MJTestSuiteTestEntity[] = [];\n suiteRuns: MJTestSuiteRunEntity[] = [];\n\n // Analytics data\n analyticsData: AnalyticsDataPoint[] = [];\n uniqueTags: string[] = [];\n selectedTags: string[] = []; // Multi-select: empty array means \"All Tags\"\n analyticsTimeRange: '7d' | '30d' | '90d' | 'all' = '30d';\n analyticsView: 'summary' | 'matrix' | 'chart' = 'summary';\n matrixData: MatrixDataPoint[] = [];\n loadingMatrix = false;\n matrixLoaded = false;\n\n // Chart\n @ViewChild('chartContainer') chartContainer!: ElementRef<HTMLDivElement>;\n private chartRendered = false;\n\n // Compare data\n compareRunA: MJTestSuiteRunEntity | null = null;\n compareRunB: MJTestSuiteRunEntity | null = null;\n compareResults: TestRunComparison[] = [];\n compareRunATests: MJTestRunEntity[] = [];\n compareRunBTests: MJTestRunEntity[] = [];\n\n // Keyboard shortcuts\n keyboardShortcutsEnabled = true;\n showShortcuts = false; // Hidden by default\n private shortcutsSettingEntity: MJUserSettingEntity | null = null;\n private get metadata() { return this.ProviderToUse; }\n // Evaluation preferences\n evalPreferences: EvaluationPreferences = { showExecution: true, showHuman: true, showAuto: false };\n\n // Filter collapse state\n filtersCollapsed = false;\n\n // Matrix sorting\n matrixSortBy: 'sequence' | 'name' = 'sequence';\n matrixSortAsc = true;\n\n // Matrix row selection\n selectedMatrixTestId: string | null = null;\n\n // Matrix test name filter\n matrixTestFilter = '';\n private matrixFilterSubject$ = new Subject<string>();\n\n // Edit state\n isSaving = false;\n parentSuiteOptions: MJTestSuiteEntity[] = [];\n tagDraft = '';\n readonly statusOptions: readonly string[] = ['Active', 'Pending', 'Disabled'];\n\n // Add Tests picker state\n showAddTestsDialog = false;\n availableTests: MJTestEntity[] = [];\n loadingAvailableTests = false;\n selectedTestIdsToAdd = new Set<string>();\n addTestsSearch = '';\n isAddingTests = false;\n\n // Remove-confirm state (per-row inline confirm)\n confirmingRemoveSuiteTestId: string | null = null;\n isRemovingTest = false;\n\n // Reorder state\n isReorderingTests = false;\n\n // Service injections\n private navigationService = inject(NavigationService);\n public testingDialogService = inject(TestingDialogService);\n private evalPrefsService = inject(EvaluationPreferencesService);\n private viewContainerRef = inject(ViewContainerRef);\n private appManager = inject(ApplicationManager);\n\n async ngOnInit() {\n await super.ngOnInit();\n this.loadShortcutsSetting();\n // Fire-and-forget: parent suite list for the edit form\n this.loadParentSuiteOptions();\n\n // Subscribe to evaluation preferences\n this.evalPrefsService.preferences$\n .pipe(takeUntil(this.destroy$))\n .subscribe(prefs => {\n this.evalPreferences = prefs;\n this.cdr.markForCheck();\n // Re-render chart when preferences change (D3 chart needs manual update)\n if (this.chartRendered && this.analyticsView === 'chart') {\n this.renderChart();\n }\n });\n\n // Subscribe to matrix filter with debounce\n this.matrixFilterSubject$\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n )\n .subscribe(value => {\n this.matrixTestFilter = value;\n this.cdr.markForCheck();\n });\n\n // Subscribe to panel state changes so the slide panel renders in this form\n this.testingDialogService.PanelStateChanged$\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n this.cdr.detectChanges();\n });\n }\n\n ngAfterViewInit() {\n // Initialize any view-dependent logic\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // Keyboard shortcuts\n @HostListener('document:keydown', ['$event'])\n handleKeyboardShortcut(event: KeyboardEvent) {\n if (!this.keyboardShortcutsEnabled) return;\n\n // Cmd/Ctrl + S: Save (if dirty)\n if ((event.metaKey || event.ctrlKey) && event.key === 's' && !event.shiftKey) {\n if (this.isDirty) {\n event.preventDefault();\n this.saveChanges();\n }\n return;\n }\n\n // Cmd/Ctrl + R: Refresh\n if ((event.metaKey || event.ctrlKey) && event.key === 'r' && !event.shiftKey) {\n event.preventDefault();\n this.refresh();\n return;\n }\n\n // Cmd/Ctrl + Enter: Run suite\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault();\n this.runSuite();\n return;\n }\n\n // Number keys for tabs (1-5) — skip when typing into form inputs\n if (!event.metaKey && !event.ctrlKey && !event.altKey && !this.isTextInputFocused()) {\n switch (event.key) {\n case '1': this.changeTab('overview'); break;\n case '2': this.changeTab('tests'); break;\n case '3': this.changeTab('runs'); break;\n case '4': this.changeTab('analytics'); break;\n case '5': this.changeTab('compare'); break;\n }\n }\n }\n\n // Warn before tab close / hard navigation when there are unsaved changes\n @HostListener('window:beforeunload', ['$event'])\n handleBeforeUnload(event: BeforeUnloadEvent) {\n if (this.isDirty) {\n event.preventDefault();\n event.returnValue = '';\n }\n }\n\n private isTextInputFocused(): boolean {\n const el = document.activeElement;\n if (!el) return false;\n const tag = el.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || (el as HTMLElement).isContentEditable;\n }\n\n changeTab(tab: string) {\n this.activeTab = tab;\n if (tab === 'tests' && !this.testsLoaded) this.loadTests();\n if (tab === 'runs' && !this.runsLoaded) this.loadRuns();\n if (tab === 'analytics' && !this.analyticsLoaded) this.loadAnalytics();\n this.cdr.markForCheck();\n }\n\n private async loadTests() {\n if (this.testsLoaded) return;\n\n this.loadingTests = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJTestSuiteTestEntity>({\n EntityName: 'MJ: Test Suite Tests',\n ExtraFilter: `SuiteID='${this.record.ID}'`,\n OrderBy: 'Sequence',\n ResultType: 'entity_object'\n });\n if (result.Success) this.suiteTests = result.Results || [];\n this.testsLoaded = true;\n } catch (error) {\n console.error('Error loading tests:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load tests', 'error', 3000);\n } finally {\n this.loadingTests = false;\n this.cdr.markForCheck();\n }\n }\n\n private async loadRuns() {\n if (this.runsLoaded) return;\n\n this.loadingRuns = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJTestSuiteRunEntity>({\n EntityName: 'MJ: Test Suite Runs',\n ExtraFilter: `SuiteID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 50,\n ResultType: 'entity_object'\n });\n if (result.Success) this.suiteRuns = result.Results || [];\n this.runsLoaded = true;\n } catch (error) {\n console.error('Error loading runs:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load runs', 'error', 3000);\n } finally {\n this.loadingRuns = false;\n this.cdr.markForCheck();\n }\n }\n\n getStatusColor(): string {\n switch (this.record.Status) {\n case 'Active': return '#10b981';\n case 'Disabled': return '#6b7280';\n case 'Pending': return '#f59e0b';\n default: return '#9ca3af';\n }\n }\n\n getStatusClass(): string {\n return `status-${this.record.Status?.toLowerCase() || 'unknown'}`;\n }\n\n getRunStatusColor(status: string): string {\n switch (status) {\n case 'Completed': return '#10b981';\n case 'Failed': return '#ef4444';\n case 'Running': return '#3b82f6';\n case 'Pending': return '#8b5cf6';\n case 'Cancelled': return '#6b7280';\n default: return '#9ca3af';\n }\n }\n\n formatTimeout(ms: number | null): string {\n if (ms === null || ms === undefined) return 'Default (5 min)';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000) {\n const mins = Math.floor(ms / 60000);\n const secs = Math.floor((ms % 60000) / 1000);\n return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;\n }\n const hours = Math.floor(ms / 3600000);\n const mins = Math.floor((ms % 3600000) / 60000);\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n }\n\n getRelativeTime(date: Date | string | null): string {\n if (!date) return 'N/A';\n const d = new Date(date);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return d.toLocaleDateString();\n }\n\n getPassRate(run: MJTestSuiteRunEntity): number {\n const total = run.TotalTests || 0;\n const passed = run.PassedTests || 0;\n if (total === 0) return 0;\n return (passed / total) * 100;\n }\n\n openTest(testId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Tests', CompositeKey.FromID(testId));\n }\n\n openSuiteRun(runId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Suite Runs', CompositeKey.FromID(runId));\n }\n\n navigateToTestingDashboard(): void {\n const testingApp = this.appManager.GetAppByName('Testing');\n if (testingApp) {\n this.navigationService.SwitchToApp(testingApp.ID);\n }\n }\n\n async runSuite() {\n if (this.record?.ID) {\n this.testingDialogService.OpenSuitePanel(this.record.ID);\n }\n }\n\n OnPanelClosed(): void {\n this.testingDialogService.ClosePanel();\n this.cdr.markForCheck();\n }\n\n async refresh() {\n this.isRefreshing = true;\n this.cdr.markForCheck();\n\n try {\n await this.record.Load(this.record.ID);\n\n // Reset lazy-loaded data\n if (this.testsLoaded) {\n this.testsLoaded = false;\n this.suiteTests = [];\n await this.loadTests();\n }\n if (this.runsLoaded) {\n this.runsLoaded = false;\n this.suiteRuns = [];\n await this.loadRuns();\n }\n if (this.analyticsLoaded) {\n this.analyticsLoaded = false;\n this.analyticsData = [];\n // Also reset matrix data so it reloads with fresh data\n this.matrixLoaded = false;\n this.matrixData = [];\n await this.loadAnalytics();\n // Reload matrix if currently viewing matrix or chart view\n if (this.analyticsView === 'matrix' || this.analyticsView === 'chart') {\n await this.loadMatrixData();\n }\n }\n\n SharedService.Instance.CreateSimpleNotification('Refreshed successfully', 'success', 2000);\n } catch {\n SharedService.Instance.CreateSimpleNotification('Failed to refresh', 'error', 3000);\n } finally {\n this.isRefreshing = false;\n this.cdr.markForCheck();\n }\n }\n\n // ==========================================\n // Analytics Tab Methods\n // ==========================================\n\n private async loadAnalytics() {\n if (this.analyticsLoaded) return;\n\n this.loadingAnalytics = true;\n this.cdr.markForCheck();\n\n try {\n // Load all runs for analytics (not just recent 50)\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJTestSuiteRunEntity>({\n EntityName: 'MJ: Test Suite Runs',\n ExtraFilter: `SuiteID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 200,\n ResultType: 'entity_object'\n });\n\n if (result.Success && result.Results) {\n // Process runs into analytics data points\n this.analyticsData = result.Results.map(run => this.runToDataPoint(run));\n\n // Extract unique tags\n this.uniqueTags = TagsHelper.getUniqueTags(result.Results.map(r => r.Tags));\n\n // Also populate suiteRuns if not already loaded\n if (!this.runsLoaded) {\n this.suiteRuns = result.Results.slice(0, 50);\n this.runsLoaded = true;\n }\n }\n\n this.analyticsLoaded = true;\n } catch (error) {\n console.error('Error loading analytics:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load analytics data', 'error', 3000);\n } finally {\n this.loadingAnalytics = false;\n this.cdr.markForCheck();\n }\n }\n\n private runToDataPoint(run: MJTestSuiteRunEntity): AnalyticsDataPoint {\n const total = run.TotalTests || 0;\n const passed = run.PassedTests || 0;\n return {\n runId: run.ID,\n date: run.StartedAt ? new Date(run.StartedAt) : new Date(),\n passRate: total > 0 ? (passed / total) * 100 : 0,\n totalTests: total,\n passedTests: passed,\n failedTests: run.FailedTests || 0,\n errorTests: run.ErrorTests || 0,\n skippedTests: run.SkippedTests || 0,\n duration: run.TotalDurationSeconds || 0,\n cost: run.TotalCostUSD || 0,\n tags: TagsHelper.parseTags(run.Tags),\n status: run.Status || 'Unknown'\n };\n }\n\n getFilteredAnalyticsData(): AnalyticsDataPoint[] {\n let data = this.analyticsData;\n\n // Apply time range filter\n const now = new Date();\n let cutoffDate: Date | null = null;\n\n switch (this.analyticsTimeRange) {\n case '7d':\n cutoffDate = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case '30d':\n cutoffDate = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n case '90d':\n cutoffDate = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000);\n break;\n }\n\n if (cutoffDate) {\n data = data.filter(d => d.date >= cutoffDate!);\n }\n\n // Apply tag filter (multi-select: empty array means all tags)\n if (this.selectedTags.length > 0) {\n data = data.filter(d => this.selectedTags.some(tag => d.tags.includes(tag)));\n }\n\n return data;\n }\n\n setTimeRange(range: '7d' | '30d' | '90d' | 'all') {\n this.analyticsTimeRange = range;\n // Reload matrix data when time range changes (if currently viewing matrix or chart)\n if (this.analyticsView === 'matrix' || this.analyticsView === 'chart') {\n this.reloadMatrixData();\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Toggle a tag in the multi-select filter.\n * If tag is null, clear all selections (show all tags).\n */\n toggleTagFilter(tag: string | null) {\n if (tag === null) {\n // Clear all - show all tags\n this.selectedTags = [];\n } else {\n // Toggle the tag\n const index = this.selectedTags.indexOf(tag);\n if (index >= 0) {\n this.selectedTags = this.selectedTags.filter(t => t !== tag);\n } else {\n this.selectedTags = [...this.selectedTags, tag];\n }\n }\n // Reload matrix data when tag filter changes (if currently viewing matrix or chart)\n if (this.analyticsView === 'matrix' || this.analyticsView === 'chart') {\n this.reloadMatrixData();\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Check if a tag is currently selected in the filter\n */\n isTagSelected(tag: string): boolean {\n return this.selectedTags.includes(tag);\n }\n\n setAnalyticsView(view: 'summary' | 'matrix' | 'chart') {\n this.analyticsView = view;\n if ((view === 'matrix' || view === 'chart') && !this.matrixLoaded) {\n this.loadMatrixData();\n }\n // Render chart when switching to chart view\n if (view === 'chart' && this.matrixLoaded) {\n setTimeout(() => this.renderChart(), 100);\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Force reload of matrix data (used when filters change)\n */\n private reloadMatrixData() {\n this.matrixLoaded = false;\n this.loadMatrixData();\n }\n\n private async loadMatrixData() {\n if (this.loadingMatrix) return;\n this.loadingMatrix = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const filteredRuns = this.getFilteredAnalyticsData();\n\n // Load test runs for each suite run (limit to most recent 10 for performance)\n const runsToLoad = filteredRuns.slice(0, 10);\n\n const matrixData: MatrixDataPoint[] = [];\n\n // Collect all test run IDs to batch load feedbacks\n const allTestRunIds: string[] = [];\n\n for (const runData of runsToLoad) {\n const testRunsResult = await rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestSuiteRunID='${runData.runId}'`,\n OrderBy: 'Sequence',\n ResultType: 'entity_object'\n });\n\n if (testRunsResult.Success && testRunsResult.Results) {\n const testResults = new Map<string, TestResultCell>();\n\n for (const testRun of testRunsResult.Results) {\n allTestRunIds.push(testRun.ID);\n testResults.set(testRun.TestID, {\n testRunId: testRun.ID,\n testId: testRun.TestID,\n testName: testRun.Test || 'Unknown',\n status: testRun.Status,\n score: testRun.Score,\n duration: testRun.DurationSeconds,\n humanRating: null, // Will be populated below\n humanComments: null, // Will be populated below\n sequence: testRun.Sequence ?? 0\n });\n }\n\n matrixData.push({\n runId: runData.runId,\n date: runData.date,\n tags: runData.tags,\n status: runData.status,\n passRate: runData.passRate,\n testResults\n });\n }\n }\n\n // Batch load feedbacks for all test runs\n if (allTestRunIds.length > 0) {\n const feedbackMap = await this.loadFeedbacksForTestRuns(allTestRunIds);\n\n // Apply feedbacks to matrix data\n for (const run of matrixData) {\n run.testResults.forEach((cell, _testId) => {\n const feedback = feedbackMap.get(cell.testRunId);\n if (feedback) {\n if (feedback.Rating != null) {\n cell.humanRating = feedback.Rating;\n }\n // Use CorrectionSummary if available (from inline feedback), fallback to Comments\n const commentText = feedback.CorrectionSummary || feedback.Comments;\n if (commentText) {\n cell.humanComments = commentText;\n }\n }\n });\n }\n }\n\n this.matrixData = matrixData;\n this.matrixLoaded = true;\n\n // Render chart if currently on chart view\n if (this.analyticsView === 'chart') {\n setTimeout(() => this.renderChart(), 100);\n }\n } catch (error) {\n console.error('Error loading matrix data:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load matrix data', 'error', 3000);\n } finally {\n this.loadingMatrix = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Load feedbacks for a batch of test run IDs\n * Returns a map of testRunId -> MJTestRunFeedbackEntity\n */\n private async loadFeedbacksForTestRuns(testRunIds: string[]): Promise<Map<string, MJTestRunFeedbackEntity>> {\n const feedbackMap = new Map<string, MJTestRunFeedbackEntity>();\n\n if (testRunIds.length === 0) return feedbackMap;\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n // Build IN clause for the IDs (batch in chunks to avoid query size limits)\n const chunkSize = 50;\n for (let i = 0; i < testRunIds.length; i += chunkSize) {\n const chunk = testRunIds.slice(i, i + chunkSize);\n const inClause = chunk.map(id => `'${id}'`).join(',');\n\n const result = await rv.RunView<MJTestRunFeedbackEntity>({\n EntityName: 'MJ: Test Run Feedbacks',\n ExtraFilter: `TestRunID IN (${inClause})`,\n ResultType: 'entity_object'\n });\n\n if (result.Success && result.Results) {\n for (const feedback of result.Results) {\n // If multiple feedbacks exist for same test run, keep the most recent (last one)\n feedbackMap.set(feedback.TestRunID, feedback);\n }\n }\n }\n } catch (error) {\n console.warn('Failed to load feedbacks:', error);\n }\n\n return feedbackMap;\n }\n\n getUniqueTestsFromMatrix(): { testId: string; testName: string; sequence: number }[] {\n const testsMap = new Map<string, { testName: string; sequence: number }>();\n\n for (const runData of this.matrixData) {\n for (const [testId, testResult] of runData.testResults) {\n if (!testsMap.has(testId)) {\n testsMap.set(testId, { testName: testResult.testName, sequence: testResult.sequence });\n }\n }\n }\n\n let tests = Array.from(testsMap.entries()).map(([testId, data]) => ({\n testId,\n testName: data.testName,\n sequence: data.sequence\n }));\n\n // Apply test name filter if set\n if (this.matrixTestFilter.trim()) {\n const filterLower = this.matrixTestFilter.toLowerCase().trim();\n tests = tests.filter(t => t.testName.toLowerCase().includes(filterLower));\n }\n\n // Apply sorting\n if (this.matrixSortBy === 'sequence') {\n tests = tests.sort((a, b) => this.matrixSortAsc ? a.sequence - b.sequence : b.sequence - a.sequence);\n } else {\n tests = tests.sort((a, b) => {\n const cmp = a.testName.localeCompare(b.testName);\n return this.matrixSortAsc ? cmp : -cmp;\n });\n }\n\n return tests;\n }\n\n /**\n * Toggle matrix sort column\n */\n toggleMatrixSort(column: 'sequence' | 'name') {\n if (this.matrixSortBy === column) {\n this.matrixSortAsc = !this.matrixSortAsc;\n } else {\n this.matrixSortBy = column;\n this.matrixSortAsc = true;\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Select/deselect a matrix row for highlighting\n */\n selectMatrixRow(testId: string): void {\n this.selectedMatrixTestId = this.selectedMatrixTestId === testId ? null : testId;\n this.cdr.markForCheck();\n }\n\n /**\n * Handle test name filter input - uses Subject for debounce\n */\n onMatrixFilterInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.matrixFilterSubject$.next(value);\n }\n\n /**\n * Clear the matrix test name filter\n */\n clearMatrixFilter(): void {\n this.matrixTestFilter = '';\n this.matrixFilterSubject$.next('');\n this.cdr.markForCheck();\n }\n\n getTestResultForRun(runId: string, testId: string): TestResultCell | null {\n const runData = this.matrixData.find(r => r.runId === runId);\n if (!runData) return null;\n return runData.testResults.get(testId) || null;\n }\n\n getMatrixCellClass(result: TestResultCell | null): string {\n if (!result) return 'cell-none cell-not-run';\n switch (result.status) {\n case 'Passed': return 'cell-passed';\n case 'Failed': return 'cell-failed';\n case 'Error': return 'cell-error';\n case 'Timeout': return 'cell-timeout';\n case 'Skipped': return 'cell-skipped cell-not-run';\n case 'Running': return 'cell-running';\n default: return 'cell-pending';\n }\n }\n\n /**\n * Get descriptive tooltip for execution status\n */\n getStatusTooltip(status: string): string {\n switch (status) {\n case 'Passed': return 'Status: Passed - Test completed without error';\n case 'Failed': return 'Status: Failed - Test assertions did not pass';\n case 'Error': return 'Status: Error - Test encountered an exception';\n case 'Timeout': return 'Status: Timeout - Test exceeded time limit';\n case 'Skipped': return 'Status: Skipped - Test was not executed';\n case 'Running': return 'Status: Running - Test is currently executing';\n case 'Pending': return 'Status: Pending - Test waiting to run';\n default: return `Status: ${status}`;\n }\n }\n\n /**\n * Get tooltip for human review with rating and optional comments\n */\n getHumanTooltip(rating: number, comments: string | null): string {\n let tooltip = `Human Review: ${rating}/10 rating`;\n if (comments) {\n const truncated = comments.length > 200 ? comments.substring(0, 200) + '...' : comments;\n tooltip += `\\n\\n\"${truncated}\"`;\n }\n return tooltip;\n }\n\n /**\n * Get the count of enabled evaluation types for matrix cell layout\n */\n getEvalCount(): number {\n let count = 0;\n if (this.evalPreferences.showExecution) count++;\n if (this.evalPreferences.showHuman) count++;\n if (this.evalPreferences.showAuto) count++;\n return count;\n }\n\n // ===========================\n // Matrix Totals Row Methods\n // ===========================\n\n /**\n * Get count of passed tests for a run\n */\n getRunPassedCount(run: MatrixDataPoint): number {\n let count = 0;\n run.testResults.forEach(result => {\n if (result.status === 'Passed') count++;\n });\n return count;\n }\n\n /**\n * Get total count of tests for a run\n */\n getRunTotalCount(run: MatrixDataPoint): number {\n return run.testResults.size;\n }\n\n /**\n * Get average human rating for a run (only from tests that have ratings)\n */\n getRunHumanAvg(run: MatrixDataPoint): number | null {\n let sum = 0;\n let count = 0;\n run.testResults.forEach(result => {\n if (result.humanRating != null) {\n sum += result.humanRating;\n count++;\n }\n });\n return count > 0 ? sum / count : null;\n }\n\n /**\n * Get count of tests with human ratings for a run\n */\n getRunHumanCount(run: MatrixDataPoint): number {\n let count = 0;\n run.testResults.forEach(result => {\n if (result.humanRating != null) count++;\n });\n return count;\n }\n\n /**\n * Get average auto score for a run (only from tests that have scores)\n */\n getRunAutoAvg(run: MatrixDataPoint): number | null {\n let sum = 0;\n let count = 0;\n run.testResults.forEach(result => {\n if (result.score != null) {\n sum += result.score;\n count++;\n }\n });\n return count > 0 ? sum / count : null;\n }\n\n /**\n * Get count of tests with auto scores for a run\n */\n getRunAutoCount(run: MatrixDataPoint): number {\n let count = 0;\n run.testResults.forEach(result => {\n if (result.score != null) count++;\n });\n return count;\n }\n\n /**\n * Navigate to a test run when clicking a matrix cell\n */\n openTestRun(testRunId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Runs', CompositeKey.FromID(testRunId));\n }\n\n /**\n * Handle matrix cell click - navigate to the test run\n */\n onMatrixCellClick(result: TestResultCell | null, event: Event): void {\n event.stopPropagation(); // Prevent row click from also firing\n if (result?.testRunId) {\n this.openTestRun(result.testRunId);\n }\n }\n\n // ===========================\n // D3 Chart Rendering\n // ===========================\n\n /**\n * Renders an interactive heatmap-style chart showing test results across runs\n * with trend lines and better visual hierarchy\n */\n private renderChart(): void {\n if (!this.chartContainer?.nativeElement || this.matrixData.length === 0) {\n return;\n }\n\n const container = this.chartContainer.nativeElement;\n const tests = this.getUniqueTestsFromMatrix();\n const runs = this.matrixData;\n\n // Dynamic sizing based on content and evaluation preferences\n const width = container.clientWidth || 900;\n const evalCount = this.getEvalCount();\n // Adjust row height and column width based on how many eval types are shown\n const rowHeight = evalCount >= 3 ? 34 : evalCount === 2 ? 30 : 28;\n const minColWidth = evalCount >= 3 ? 65 : evalCount === 2 ? 55 : 50;\n const colWidth = Math.min(90, Math.max(minColWidth, (width - 250) / runs.length));\n const margin = { top: 80, right: 40, bottom: 20, left: 220 };\n const chartWidth = runs.length * colWidth;\n const chartHeight = tests.length * rowHeight;\n const height = chartHeight + margin.top + margin.bottom;\n\n // Update container height\n container.style.height = `${Math.max(400, height)}px`;\n\n // Clear previous chart\n d3.select(container).selectAll('*').remove();\n\n // Status colors with better contrast\n const statusColors: Record<string, string> = {\n 'Passed': '#22c55e',\n 'Failed': '#ef4444',\n 'Error': '#f97316',\n 'Skipped': '#a1a1aa',\n 'Running': '#3b82f6',\n 'Pending': '#d1d5db'\n };\n\n // Create SVG\n const svg = d3.select(container)\n .append('svg')\n .attr('width', width)\n .attr('height', height);\n\n // Create tooltip div\n const tooltip = d3.select(container)\n .append('div')\n .attr('class', 'chart-tooltip')\n .style('position', 'absolute')\n .style('opacity', 0)\n .style('background', 'rgba(15, 23, 42, 0.95)')\n .style('color', 'white')\n .style('padding', '10px 14px')\n .style('border-radius', '8px')\n .style('font-size', '12px')\n .style('pointer-events', 'none')\n .style('z-index', '1000')\n .style('box-shadow', '0 4px 20px rgba(0,0,0,0.3)')\n .style('max-width', '280px');\n\n // Create chart group\n const chart = svg.append('g')\n .attr('transform', `translate(${margin.left}, ${margin.top})`);\n\n // Add gradient definitions for cells\n const defs = svg.append('defs');\n\n // Create gradient for each status\n Object.entries(statusColors).forEach(([status, color]) => {\n const gradient = defs.append('linearGradient')\n .attr('id', `gradient-${status.toLowerCase()}`)\n .attr('x1', '0%')\n .attr('y1', '0%')\n .attr('x2', '0%')\n .attr('y2', '100%');\n\n gradient.append('stop')\n .attr('offset', '0%')\n .attr('stop-color', color)\n .attr('stop-opacity', 0.95);\n\n gradient.append('stop')\n .attr('offset', '100%')\n .attr('stop-color', d3.color(color)?.darker(0.3)?.toString() || color)\n .attr('stop-opacity', 0.95);\n });\n\n // Draw evaluation legend at top-left corner\n this.renderChartLegend(chart, margin);\n\n // Draw column headers (run dates) at top\n runs.forEach((run, i) => {\n const x = i * colWidth + colWidth / 2;\n\n // Date text\n chart.append('text')\n .attr('x', x)\n .attr('y', -45)\n .attr('text-anchor', 'middle')\n .attr('fill', '#475569')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text(this.getRelativeTime(run.date))\n .style('cursor', 'pointer')\n .on('click', () => this.openSuiteRun(run.runId));\n\n // Pass rate badge\n const passRateColor = run.passRate >= 80 ? '#22c55e' : run.passRate >= 50 ? '#f97316' : '#ef4444';\n const badgeWidth = 36;\n const badgeHeight = 18;\n\n chart.append('rect')\n .attr('x', x - badgeWidth / 2)\n .attr('y', -35)\n .attr('width', badgeWidth)\n .attr('height', badgeHeight)\n .attr('rx', 9)\n .attr('fill', passRateColor)\n .attr('opacity', 0.15);\n\n chart.append('text')\n .attr('x', x)\n .attr('y', -22)\n .attr('text-anchor', 'middle')\n .attr('fill', passRateColor)\n .attr('font-size', '11px')\n .attr('font-weight', '700')\n .text(`${run.passRate.toFixed(0)}%`);\n\n // Tags indicator - styled pills\n if (run.tags.length > 0) {\n const tagsToShow = run.tags.slice(0, 2);\n const tagPillWidth = 42;\n const tagPillHeight = 14;\n const tagGap = 4;\n const totalTagsWidth = tagsToShow.length * tagPillWidth + (tagsToShow.length - 1) * tagGap;\n const tagStartX = x - totalTagsWidth / 2;\n\n tagsToShow.forEach((tag, tagIndex) => {\n const tagX = tagStartX + tagIndex * (tagPillWidth + tagGap);\n const tagY = -68;\n\n // Pill background with gradient\n chart.append('rect')\n .attr('x', tagX)\n .attr('y', tagY)\n .attr('width', tagPillWidth)\n .attr('height', tagPillHeight)\n .attr('rx', 7)\n .attr('fill', '#dbeafe')\n .attr('stroke', '#93c5fd')\n .attr('stroke-width', 1)\n .style('cursor', 'pointer')\n .on('click', () => this.openSuiteRun(run.runId));\n\n // Tag text\n chart.append('text')\n .attr('x', tagX + tagPillWidth / 2)\n .attr('y', tagY + tagPillHeight / 2 + 3)\n .attr('text-anchor', 'middle')\n .attr('fill', '#1d4ed8')\n .attr('font-size', '8px')\n .attr('font-weight', '600')\n .text(tag.length > 8 ? tag.substring(0, 7) + '…' : tag)\n .style('cursor', 'pointer')\n .on('click', () => this.openSuiteRun(run.runId));\n });\n\n // Show +N indicator if more tags\n if (run.tags.length > 2) {\n const moreX = tagStartX + tagsToShow.length * (tagPillWidth + tagGap);\n chart.append('text')\n .attr('x', moreX)\n .attr('y', -68 + tagPillHeight / 2 + 3)\n .attr('text-anchor', 'start')\n .attr('fill', '#64748b')\n .attr('font-size', '8px')\n .attr('font-weight', '500')\n .text(`+${run.tags.length - 2}`);\n }\n }\n });\n\n // Draw row labels (test names) on left\n tests.forEach((test, i) => {\n const y = i * rowHeight + rowHeight / 2;\n\n chart.append('text')\n .attr('x', -12)\n .attr('y', y + 4)\n .attr('text-anchor', 'end')\n .attr('fill', '#334155')\n .attr('font-size', '11px')\n .text(test.testName.length > 28 ? test.testName.substring(0, 28) + '...' : test.testName)\n .style('cursor', 'pointer')\n .on('click', () => {\n SharedService.Instance.OpenEntityRecord('MJ: Tests', CompositeKey.FromID(test.testId));\n })\n .on('mouseover', function() {\n d3.select(this).attr('fill', '#3b82f6').attr('font-weight', '600');\n })\n .on('mouseout', function() {\n d3.select(this).attr('fill', '#334155').attr('font-weight', 'normal');\n });\n });\n\n // Draw grid lines\n tests.forEach((_, i) => {\n chart.append('line')\n .attr('x1', 0)\n .attr('y1', (i + 1) * rowHeight)\n .attr('x2', chartWidth)\n .attr('y2', (i + 1) * rowHeight)\n .attr('stroke', '#e2e8f0')\n .attr('stroke-width', 1);\n });\n\n runs.forEach((_, i) => {\n chart.append('line')\n .attr('x1', (i + 1) * colWidth)\n .attr('y1', 0)\n .attr('x2', (i + 1) * colWidth)\n .attr('y2', chartHeight)\n .attr('stroke', '#e2e8f0')\n .attr('stroke-width', 1);\n });\n\n // Draw cells with evaluation toggle support\n const cellPadding = 3;\n\n runs.forEach((run, runIndex) => {\n tests.forEach((test, testIndex) => {\n const result = run.testResults.get(test.testId);\n const x = runIndex * colWidth + cellPadding;\n const y = testIndex * rowHeight + cellPadding;\n const cellWidth = colWidth - cellPadding * 2;\n const cellHeight = rowHeight - cellPadding * 2;\n\n if (!result) {\n // Empty cell indicator\n chart.append('rect')\n .attr('x', x)\n .attr('y', y)\n .attr('width', cellWidth)\n .attr('height', cellHeight)\n .attr('rx', 4)\n .attr('fill', '#f8fafc')\n .attr('stroke', '#e2e8f0')\n .attr('stroke-width', 1);\n\n chart.append('text')\n .attr('x', x + cellWidth / 2)\n .attr('y', y + cellHeight / 2 + 4)\n .attr('text-anchor', 'middle')\n .attr('fill', '#cbd5e1')\n .attr('font-size', '12px')\n .text('—');\n return;\n }\n\n // Build tooltip content based on evaluation preferences\n const tooltipParts: string[] = [];\n if (this.evalPreferences.showExecution) {\n tooltipParts.push(`<div style=\"display:inline-block; padding:2px 8px; border-radius:4px; background:${statusColors[result.status]}; color:white; font-size:11px; font-weight:600\">${result.status}</div>`);\n }\n if (this.evalPreferences.showHuman) {\n tooltipParts.push(`<div style=\"margin-top:4px\"><span style=\"color:var(--mj-status-warning)\">👤</span> <strong>Human:</strong> <span style=\"color:var(--mj-text-disabled)\">Needs review</span></div>`);\n }\n if (this.evalPreferences.showAuto && result.score != null) {\n tooltipParts.push(`<div style=\"margin-top:4px\"><span style=\"color:var(--mj-status-info)\">🤖</span> <strong>Auto:</strong> ${(result.score * 100).toFixed(1)}%</div>`);\n }\n const durationText = result.duration != null ? `<div><strong>Duration:</strong> ${result.duration.toFixed(2)}s</div>` : '';\n\n const cellGroup = chart.append('g')\n .attr('class', 'result-cell')\n .style('cursor', 'pointer')\n .on('click', () => this.openTestRun(result.testRunId))\n .on('mouseover', (event: MouseEvent) => {\n d3.select(event.currentTarget as Element).select('rect.cell-bg')\n .attr('stroke', '#1e40af')\n .attr('stroke-width', 2);\n\n tooltip\n .style('opacity', 1)\n .html(`\n <div style=\"font-weight:600; margin-bottom:6px; color:#f1f5f9\">${result.testName}</div>\n ${tooltipParts.join('')}\n ${durationText}\n <div style=\"margin-top:6px; color:#94a3b8; font-size:10px\">${this.getRelativeTime(run.date)} • Click to view</div>\n `)\n .style('left', `${event.offsetX + 15}px`)\n .style('top', `${event.offsetY - 10}px`);\n })\n .on('mouseout', (event: MouseEvent) => {\n d3.select(event.currentTarget as Element).select('rect.cell-bg')\n .attr('stroke', 'none')\n .attr('stroke-width', 0);\n tooltip.style('opacity', 0);\n });\n\n // Determine cell background color based on eval preferences\n let cellBgColor = '#f1f5f9';\n let cellBgGradient = '';\n\n if (this.evalPreferences.showExecution) {\n // Use status-based gradient\n cellBgGradient = `url(#gradient-${result.status.toLowerCase()})`;\n } else if (this.evalPreferences.showAuto && result.score != null) {\n // Use score-based color\n const scoreColor = result.score >= 0.8 ? '#22c55e' : result.score >= 0.5 ? '#f97316' : '#ef4444';\n cellBgColor = scoreColor;\n } else {\n // Neutral background when only Human is selected\n cellBgColor = '#fef3c7';\n }\n\n // Cell background\n cellGroup.append('rect')\n .attr('class', 'cell-bg')\n .attr('x', x)\n .attr('y', y)\n .attr('width', cellWidth)\n .attr('height', cellHeight)\n .attr('rx', 4)\n .attr('fill', cellBgGradient || cellBgColor)\n .attr('stroke', 'none')\n .attr('stroke-width', 0)\n .style('transition', 'all 0.15s ease');\n\n // Calculate icon positions based on how many eval types are shown\n // With wider cells, we can use larger icons and better spacing\n const iconSize = evalCount === 1 ? 14 : evalCount === 2 ? 12 : 10;\n const iconSpacing = evalCount === 1 ? 0 : evalCount === 2 ? 16 : 14;\n const startX = x + cellWidth / 2 - ((evalCount - 1) * iconSpacing) / 2;\n\n let iconIndex = 0;\n\n // Status icon (execution)\n if (this.evalPreferences.showExecution) {\n const iconText: Record<string, string> = {\n 'Passed': '✓',\n 'Failed': '✕',\n 'Error': '!',\n 'Skipped': '»',\n 'Running': '●',\n 'Pending': '○'\n };\n\n const iconX = startX + iconIndex * iconSpacing;\n\n // If status is NOT the only thing shown, add a small circular bg\n if (evalCount > 1) {\n cellGroup.append('circle')\n .attr('cx', iconX)\n .attr('cy', y + cellHeight / 2)\n .attr('r', iconSize / 2 + 3)\n .attr('fill', statusColors[result.status])\n .attr('opacity', 0.9);\n }\n\n cellGroup.append('text')\n .attr('x', iconX)\n .attr('y', y + cellHeight / 2 + iconSize / 3)\n .attr('text-anchor', 'middle')\n .attr('fill', 'white')\n .attr('font-size', `${iconSize}px`)\n .attr('font-weight', 'bold')\n .attr('font-family', 'system-ui, -apple-system, sans-serif')\n .text(iconText[result.status] || '?');\n\n iconIndex++;\n }\n\n // Human icon\n if (this.evalPreferences.showHuman) {\n const iconX = startX + iconIndex * iconSpacing;\n\n // Human evaluation indicator (clock icon for pending)\n cellGroup.append('circle')\n .attr('cx', iconX)\n .attr('cy', y + cellHeight / 2)\n .attr('r', iconSize / 2 + 3)\n .attr('fill', '#fef3c7')\n .attr('stroke', '#f59e0b')\n .attr('stroke-width', 1);\n\n cellGroup.append('text')\n .attr('x', iconX)\n .attr('y', y + cellHeight / 2 + iconSize / 3)\n .attr('text-anchor', 'middle')\n .attr('fill', '#d97706')\n .attr('font-size', `${iconSize - 2}px`)\n .attr('font-weight', '500')\n .text('⏱');\n\n iconIndex++;\n }\n\n // Auto score icon/indicator\n if (this.evalPreferences.showAuto) {\n const iconX = startX + iconIndex * iconSpacing;\n\n if (result.score != null) {\n const scorePercent = Math.round(result.score * 100);\n const scoreColor = result.score >= 0.8 ? '#22c55e' : result.score >= 0.5 ? '#f97316' : '#ef4444';\n\n // Score pill background\n if (evalCount > 1) {\n cellGroup.append('rect')\n .attr('x', iconX - 10)\n .attr('y', y + cellHeight / 2 - iconSize / 2 - 1)\n .attr('width', 20)\n .attr('height', iconSize + 2)\n .attr('rx', (iconSize + 2) / 2)\n .attr('fill', scoreColor)\n .attr('opacity', 0.9);\n }\n\n cellGroup.append('text')\n .attr('x', iconX)\n .attr('y', y + cellHeight / 2 + iconSize / 3)\n .attr('text-anchor', 'middle')\n .attr('fill', evalCount > 1 ? 'white' : 'white')\n .attr('font-size', `${iconSize - 1}px`)\n .attr('font-weight', '700')\n .text(`${scorePercent}`);\n } else {\n // No auto score available\n cellGroup.append('circle')\n .attr('cx', iconX)\n .attr('cy', y + cellHeight / 2)\n .attr('r', iconSize / 2 + 2)\n .attr('fill', '#e2e8f0')\n .attr('stroke', '#94a3b8')\n .attr('stroke-width', 1);\n\n cellGroup.append('text')\n .attr('x', iconX)\n .attr('y', y + cellHeight / 2 + iconSize / 3)\n .attr('text-anchor', 'middle')\n .attr('fill', '#94a3b8')\n .attr('font-size', `${iconSize - 2}px`)\n .text('—');\n }\n }\n });\n });\n\n // Draw trend line for pass rate across runs\n if (runs.length > 1) {\n const trendLineY = chartHeight + 50;\n const trendHeight = 40;\n\n // Trend line label\n chart.append('text')\n .attr('x', -12)\n .attr('y', trendLineY + trendHeight / 2)\n .attr('text-anchor', 'end')\n .attr('fill', '#64748b')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text('Pass Rate Trend');\n\n // Create trend line path\n const lineGenerator = d3.line<MatrixDataPoint>()\n .x((_, i) => i * colWidth + colWidth / 2)\n .y(d => trendLineY + trendHeight - (d.passRate / 100) * trendHeight)\n .curve(d3.curveMonotoneX);\n\n // Draw area under line\n const areaGenerator = d3.area<MatrixDataPoint>()\n .x((_, i) => i * colWidth + colWidth / 2)\n .y0(trendLineY + trendHeight)\n .y1(d => trendLineY + trendHeight - (d.passRate / 100) * trendHeight)\n .curve(d3.curveMonotoneX);\n\n chart.append('path')\n .datum(runs)\n .attr('d', areaGenerator)\n .attr('fill', 'url(#trendGradient)')\n .attr('opacity', 0.3);\n\n // Create gradient for trend area\n const trendGradient = defs.append('linearGradient')\n .attr('id', 'trendGradient')\n .attr('x1', '0%')\n .attr('y1', '0%')\n .attr('x2', '0%')\n .attr('y2', '100%');\n\n trendGradient.append('stop')\n .attr('offset', '0%')\n .attr('stop-color', '#3b82f6')\n .attr('stop-opacity', 0.4);\n\n trendGradient.append('stop')\n .attr('offset', '100%')\n .attr('stop-color', '#3b82f6')\n .attr('stop-opacity', 0);\n\n chart.append('path')\n .datum(runs)\n .attr('d', lineGenerator)\n .attr('fill', 'none')\n .attr('stroke', '#3b82f6')\n .attr('stroke-width', 2.5)\n .attr('stroke-linecap', 'round');\n\n // Draw dots on trend line\n runs.forEach((run, i) => {\n const cx = i * colWidth + colWidth / 2;\n const cy = trendLineY + trendHeight - (run.passRate / 100) * trendHeight;\n\n chart.append('circle')\n .attr('cx', cx)\n .attr('cy', cy)\n .attr('r', 4)\n .attr('fill', 'white')\n .attr('stroke', '#3b82f6')\n .attr('stroke-width', 2);\n });\n\n // Update container height for trend line\n container.style.height = `${Math.max(400, height + 80)}px`;\n svg.attr('height', height + 80);\n }\n\n this.chartRendered = true;\n }\n\n /**\n * Renders a legend showing which evaluation types are currently displayed\n */\n private renderChartLegend(chart: d3.Selection<SVGGElement, unknown, null, undefined>, margin: { top: number; right: number; bottom: number; left: number }): void {\n const legendGroup = chart.append('g')\n .attr('class', 'eval-legend')\n .attr('transform', `translate(${-margin.left + 10}, ${-margin.top + 15})`);\n\n // Legend title\n legendGroup.append('text')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', '#64748b')\n .attr('font-size', '9px')\n .attr('font-weight', '600')\n .attr('text-transform', 'uppercase')\n .text('SHOWING:');\n\n let xOffset = 55;\n\n // Status indicator\n if (this.evalPreferences.showExecution) {\n const statusGroup = legendGroup.append('g')\n .attr('transform', `translate(${xOffset}, -4)`);\n\n statusGroup.append('circle')\n .attr('cx', 6)\n .attr('cy', 0)\n .attr('r', 6)\n .attr('fill', '#22c55e');\n\n statusGroup.append('text')\n .attr('x', 6)\n .attr('y', 4)\n .attr('text-anchor', 'middle')\n .attr('fill', 'white')\n .attr('font-size', '8px')\n .attr('font-weight', 'bold')\n .text('✓');\n\n statusGroup.append('text')\n .attr('x', 16)\n .attr('y', 3)\n .attr('fill', '#475569')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text('Status');\n\n xOffset += 60;\n }\n\n // Human indicator\n if (this.evalPreferences.showHuman) {\n const humanGroup = legendGroup.append('g')\n .attr('transform', `translate(${xOffset}, -4)`);\n\n humanGroup.append('circle')\n .attr('cx', 6)\n .attr('cy', 0)\n .attr('r', 6)\n .attr('fill', '#fef3c7')\n .attr('stroke', '#f59e0b')\n .attr('stroke-width', 1);\n\n humanGroup.append('text')\n .attr('x', 6)\n .attr('y', 3)\n .attr('text-anchor', 'middle')\n .attr('fill', '#d97706')\n .attr('font-size', '7px')\n .text('⏱');\n\n humanGroup.append('text')\n .attr('x', 16)\n .attr('y', 3)\n .attr('fill', '#475569')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text('Human');\n\n xOffset += 60;\n }\n\n // Auto indicator\n if (this.evalPreferences.showAuto) {\n const autoGroup = legendGroup.append('g')\n .attr('transform', `translate(${xOffset}, -4)`);\n\n autoGroup.append('rect')\n .attr('x', 0)\n .attr('y', -6)\n .attr('width', 18)\n .attr('height', 12)\n .attr('rx', 6)\n .attr('fill', '#3b82f6');\n\n autoGroup.append('text')\n .attr('x', 9)\n .attr('y', 3)\n .attr('text-anchor', 'middle')\n .attr('fill', 'white')\n .attr('font-size', '7px')\n .attr('font-weight', '700')\n .text('%');\n\n autoGroup.append('text')\n .attr('x', 24)\n .attr('y', 3)\n .attr('fill', '#475569')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text('Auto');\n }\n }\n\n getAveragePassRate(): number {\n const data = this.getFilteredAnalyticsData();\n if (data.length === 0) return 0;\n return data.reduce((sum, d) => sum + d.passRate, 0) / data.length;\n }\n\n getTotalRuns(): number {\n return this.getFilteredAnalyticsData().length;\n }\n\n getAverageDuration(): number {\n const data = this.getFilteredAnalyticsData();\n if (data.length === 0) return 0;\n return data.reduce((sum, d) => sum + d.duration, 0) / data.length;\n }\n\n getTotalCost(): number {\n return this.getFilteredAnalyticsData().reduce((sum, d) => sum + d.cost, 0);\n }\n\n getPassRateTrend(): { direction: 'up' | 'down' | 'stable'; value: number } {\n const data = this.getFilteredAnalyticsData();\n if (data.length < 2) return { direction: 'stable', value: 0 };\n\n // Compare recent half to older half\n const midpoint = Math.floor(data.length / 2);\n const recentData = data.slice(0, midpoint);\n const olderData = data.slice(midpoint);\n\n const recentAvg = recentData.reduce((s, d) => s + d.passRate, 0) / recentData.length;\n const olderAvg = olderData.reduce((s, d) => s + d.passRate, 0) / olderData.length;\n\n const diff = recentAvg - olderAvg;\n if (Math.abs(diff) < 1) return { direction: 'stable', value: diff };\n return { direction: diff > 0 ? 'up' : 'down', value: Math.abs(diff) };\n }\n\n formatDuration(seconds: number): string {\n if (seconds < 60) return `${seconds.toFixed(1)}s`;\n if (seconds < 3600) {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;\n }\n const hours = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n }\n\n formatCost(cost: number): string {\n if (cost < 0.01) return `$${cost.toFixed(6)}`;\n if (cost < 1) return `$${cost.toFixed(4)}`;\n return `$${cost.toFixed(2)}`;\n }\n\n // ==========================================\n // Compare Tab Methods\n // ==========================================\n\n async selectCompareRunA(run: MJTestSuiteRunEntity) {\n this.compareRunA = run;\n await this.loadCompareData();\n }\n\n async selectCompareRunB(run: MJTestSuiteRunEntity) {\n this.compareRunB = run;\n await this.loadCompareData();\n }\n\n clearCompareSelection() {\n this.compareRunA = null;\n this.compareRunB = null;\n this.compareResults = [];\n this.compareRunATests = [];\n this.compareRunBTests = [];\n this.cdr.markForCheck();\n }\n\n private async loadCompareData() {\n if (!this.compareRunA || !this.compareRunB) {\n this.compareResults = [];\n this.cdr.markForCheck();\n return;\n }\n\n this.loadingCompare = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Load test runs for both suite runs in parallel\n const [resultA, resultB] = await Promise.all([\n rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestSuiteRunID='${this.compareRunA.ID}'`,\n OrderBy: 'Sequence ASC',\n ResultType: 'entity_object'\n }),\n rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestSuiteRunID='${this.compareRunB.ID}'`,\n OrderBy: 'Sequence ASC',\n ResultType: 'entity_object'\n })\n ]);\n\n this.compareRunATests = resultA.Success ? resultA.Results || [] : [];\n this.compareRunBTests = resultB.Success ? resultB.Results || [] : [];\n\n // Build comparison results\n this.compareResults = this.buildComparisonResults(this.compareRunATests, this.compareRunBTests);\n } catch (error) {\n console.error('Error loading comparison data:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load comparison data', 'error', 3000);\n } finally {\n this.loadingCompare = false;\n this.cdr.markForCheck();\n }\n }\n\n private buildComparisonResults(testsA: MJTestRunEntity[], testsB: MJTestRunEntity[]): TestRunComparison[] {\n const results: TestRunComparison[] = [];\n const testMap = new Map<string, { a?: MJTestRunEntity; b?: MJTestRunEntity; name: string }>();\n\n // Map all tests from run A\n for (const test of testsA) {\n testMap.set(test.TestID, { a: test, name: test.Test || 'Unknown Test' });\n }\n\n // Map all tests from run B\n for (const test of testsB) {\n const existing = testMap.get(test.TestID);\n if (existing) {\n existing.b = test;\n } else {\n testMap.set(test.TestID, { b: test, name: test.Test || 'Unknown Test' });\n }\n }\n\n // Build comparison array\n for (const [testId, { a, b, name }] of testMap) {\n const comparison: TestRunComparison = {\n testId,\n testName: name,\n runA: a ? {\n status: a.Status || 'Unknown',\n score: a.Score,\n duration: a.DurationSeconds,\n cost: a.CostUSD\n } : null,\n runB: b ? {\n status: b.Status || 'Unknown',\n score: b.Score,\n duration: b.DurationSeconds,\n cost: b.CostUSD\n } : null,\n scoreDiff: (a?.Score != null && b?.Score != null) ? b.Score - a.Score : null,\n durationDiff: (a?.DurationSeconds != null && b?.DurationSeconds != null) ? b.DurationSeconds - a.DurationSeconds : null,\n statusChanged: (a?.Status || 'none') !== (b?.Status || 'none')\n };\n results.push(comparison);\n }\n\n return results;\n }\n\n getComparePassRateDiff(): number | null {\n if (!this.compareRunA || !this.compareRunB) return null;\n const rateA = this.getPassRate(this.compareRunA);\n const rateB = this.getPassRate(this.compareRunB);\n return rateB - rateA;\n }\n\n getCompareDurationDiff(): number | null {\n if (!this.compareRunA || !this.compareRunB) return null;\n const durA = this.compareRunA.TotalDurationSeconds || 0;\n const durB = this.compareRunB.TotalDurationSeconds || 0;\n return durB - durA;\n }\n\n getAbsCompareDurationDiff(): number {\n const diff = this.getCompareDurationDiff();\n return diff != null ? Math.abs(diff) : 0;\n }\n\n getCompareCostDiff(): number | null {\n if (!this.compareRunA || !this.compareRunB) return null;\n const costA = this.compareRunA.TotalCostUSD || 0;\n const costB = this.compareRunB.TotalCostUSD || 0;\n return costB - costA;\n }\n\n getCompareImprovedCount(): number {\n return this.compareResults.filter(r =>\n r.runA && r.runB &&\n r.runA.status !== 'Passed' && r.runB.status === 'Passed'\n ).length;\n }\n\n getCompareRegressedCount(): number {\n return this.compareResults.filter(r =>\n r.runA && r.runB &&\n r.runA.status === 'Passed' && r.runB.status !== 'Passed'\n ).length;\n }\n\n // ==========================================\n // Excel Export Methods\n // ==========================================\n\n async exportToExcel() {\n try {\n // Ensure runs are loaded\n if (!this.runsLoaded) await this.loadRuns();\n\n const data = this.suiteRuns.map(run => ({\n 'Run ID': run.ID,\n 'Status': run.Status,\n 'Started At': run.StartedAt ? new Date(run.StartedAt).toLocaleString() : 'N/A',\n 'Completed At': run.CompletedAt ? new Date(run.CompletedAt).toLocaleString() : 'N/A',\n 'Duration (s)': run.TotalDurationSeconds?.toFixed(2) || 'N/A',\n 'Total Tests': run.TotalTests || 0,\n 'Passed': run.PassedTests || 0,\n 'Failed': run.FailedTests || 0,\n 'Errors': run.ErrorTests || 0,\n 'Skipped': run.SkippedTests || 0,\n 'Pass Rate (%)': run.TotalTests ? ((run.PassedTests || 0) / run.TotalTests * 100).toFixed(1) : 'N/A',\n 'Total Cost ($)': run.TotalCostUSD?.toFixed(6) || 'N/A',\n 'Tags': TagsHelper.parseTags(run.Tags).join(', ') || 'None',\n 'Environment': run.Environment || 'N/A',\n 'Trigger Type': run.TriggerType || 'N/A',\n 'Run By': run.RunByUser || 'N/A'\n }));\n\n this.downloadAsCSV(data, `${this.record.Name}_runs_export.csv`);\n SharedService.Instance.CreateSimpleNotification('Export successful', 'success', 2000);\n } catch (error) {\n console.error('Export failed:', error);\n SharedService.Instance.CreateSimpleNotification('Export failed', 'error', 3000);\n }\n }\n\n private downloadAsCSV(data: Record<string, string | number>[], filename: string) {\n if (data.length === 0) return;\n\n const headers = Object.keys(data[0]);\n const csvContent = [\n headers.join(','),\n ...data.map(row =>\n headers.map(h => {\n const val = row[h];\n // Escape quotes and wrap in quotes if contains comma\n const strVal = String(val);\n if (strVal.includes(',') || strVal.includes('\"') || strVal.includes('\\n')) {\n return `\"${strVal.replace(/\"/g, '\"\"')}\"`;\n }\n return strVal;\n }).join(',')\n )\n ].join('\\n');\n\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = filename;\n link.click();\n URL.revokeObjectURL(link.href);\n }\n\n getRunTags(run: MJTestSuiteRunEntity): string[] {\n return TagsHelper.parseTags(run.Tags);\n }\n\n /**\n * Export matrix view data to CSV\n */\n exportMatrixToCSV() {\n if (this.matrixData.length === 0) {\n SharedService.Instance.CreateSimpleNotification('No data to export', 'warning', 2000);\n return;\n }\n\n try {\n const tests = this.getUniqueTestsFromMatrix();\n const runs = this.matrixData;\n\n // Build CSV rows\n const rows: Record<string, string | number>[] = [];\n\n for (const test of tests) {\n const row: Record<string, string | number> = {\n 'Seq': test.sequence,\n 'Test Name': test.testName\n };\n\n // Add column for each run\n for (const run of runs) {\n const result = run.testResults.get(test.testId);\n const runLabel = run.tags.length > 0\n ? `${run.tags.slice(0, 2).join('/')} (${this.getRelativeTime(run.date)})`\n : this.getRelativeTime(run.date);\n\n if (result) {\n // Build cell value based on what's shown\n const parts: string[] = [];\n if (this.evalPreferences.showExecution) parts.push(result.status);\n if (this.evalPreferences.showHuman) parts.push(result.humanRating != null ? `H:${result.humanRating}` : 'H:-');\n if (this.evalPreferences.showAuto) parts.push(result.score != null ? `A:${Math.round(result.score * 100)}%` : 'A:-');\n row[runLabel] = parts.join(' | ');\n } else {\n row[runLabel] = 'Not Run';\n }\n }\n\n rows.push(row);\n }\n\n this.downloadAsCSV(rows, `${this.record.Name}_matrix_export.csv`);\n SharedService.Instance.CreateSimpleNotification('Matrix exported successfully', 'success', 2000);\n } catch (error) {\n console.error('Matrix export failed:', error);\n SharedService.Instance.CreateSimpleNotification('Export failed', 'error', 3000);\n }\n }\n\n // ==========================================\n // Keyboard Shortcuts Settings\n // ==========================================\n\n /**\n * Load keyboard shortcuts visibility setting from user settings\n */\n private loadShortcutsSetting(): void {\n try {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === SHORTCUTS_SETTINGS_KEY);\n\n if (setting) {\n this.shortcutsSettingEntity = setting;\n this.showShortcuts = setting.Value === 'true';\n } else {\n // Default to hidden\n this.showShortcuts = false;\n }\n this.cdr.markForCheck();\n } catch (error) {\n console.warn('Failed to load shortcuts setting:', error);\n }\n }\n\n /**\n * Toggle analytics filters visibility\n */\n toggleFilters(): void {\n this.filtersCollapsed = !this.filtersCollapsed;\n this.cdr.markForCheck();\n }\n\n /**\n * Toggle keyboard shortcuts visibility and save preference\n */\n async toggleShortcuts(): Promise<void> {\n this.showShortcuts = !this.showShortcuts;\n this.cdr.markForCheck();\n\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) return;\n\n if (!this.shortcutsSettingEntity) {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === SHORTCUTS_SETTINGS_KEY);\n\n if (setting) {\n this.shortcutsSettingEntity = setting;\n } else {\n this.shortcutsSettingEntity = await this.metadata.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n this.shortcutsSettingEntity.UserID = userId;\n this.shortcutsSettingEntity.Setting = SHORTCUTS_SETTINGS_KEY;\n }\n }\n\n this.shortcutsSettingEntity.Value = this.showShortcuts ? 'true' : 'false';\n await this.shortcutsSettingEntity.Save();\n } catch (error) {\n console.warn('Failed to save shortcuts setting:', error);\n }\n }\n\n /** Case-insensitive UUID check whether a run is the currently selected Run A (baseline). */\n public IsCompareRunA(run: MJTestSuiteRunEntity): boolean {\n return UUIDsEqual(this.compareRunA?.ID, run.ID);\n }\n\n /** Case-insensitive UUID check whether a run is the currently selected Run B (compare). */\n public IsCompareRunB(run: MJTestSuiteRunEntity): boolean {\n return UUIDsEqual(this.compareRunB?.ID, run.ID);\n }\n\n // ==========================================\n // Edit / Save Methods\n // ==========================================\n\n /** True if the suite record has any unsaved field changes. */\n get isDirty(): boolean {\n return this.record?.Dirty === true;\n }\n\n /** Names of fields with pending edits, used by the save bar. */\n get dirtyFieldNames(): string[] {\n if (!this.record?.Fields) return [];\n return this.record.Fields.filter(f => f.Dirty).map(f => f.Name);\n }\n\n /** Parsed tags as a plain array — derived from record.Tags JSON. */\n get tags(): string[] {\n return TagsHelper.parseTags(this.record?.Tags);\n }\n\n /**\n * Load all suites for the Parent Suite dropdown. Excludes the current\n * suite (a suite cannot be its own parent).\n */\n private async loadParentSuiteOptions() {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJTestSuiteEntity>({\n EntityName: 'MJ: Test Suites',\n ExtraFilter: this.record?.ID ? `ID <> '${this.record.ID}'` : '',\n OrderBy: 'Name',\n ResultType: 'entity_object'\n });\n if (result.Success) {\n this.parentSuiteOptions = result.Results || [];\n this.cdr.markForCheck();\n }\n } catch (error) {\n console.warn('Failed to load parent suite options:', error);\n }\n }\n\n /** Save all pending changes on the suite record. */\n async saveChanges(): Promise<void> {\n if (!this.isDirty || this.isSaving) return;\n\n this.isSaving = true;\n this.cdr.markForCheck();\n try {\n const ok = await this.SaveRecord(false);\n if (ok) {\n SharedService.Instance.CreateSimpleNotification('Suite saved', 'success', 2000);\n } else {\n const detail = this.record?.LatestResult?.CompleteMessage || this.record?.LatestResult?.Message || 'Save failed';\n SharedService.Instance.CreateSimpleNotification(detail, 'error', 4000);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Save failed';\n SharedService.Instance.CreateSimpleNotification(msg, 'error', 4000);\n } finally {\n this.isSaving = false;\n this.cdr.markForCheck();\n }\n }\n\n /** Discard all pending field changes on the suite. */\n discardChanges(): void {\n if (!this.isDirty) return;\n if (!confirm('Discard your unsaved changes?')) return;\n this.record.Revert();\n this.tagDraft = '';\n this.cdr.markForCheck();\n }\n\n /** Add a tag from tagDraft (called on Enter / comma / blur). */\n addTagFromDraft(): void {\n const raw = this.tagDraft.trim();\n if (!raw) return;\n // Allow comma-separated entry: \"alpha, beta\" → two tags\n const incoming = raw.split(',').map(t => t.trim()).filter(t => t.length > 0);\n const existing = this.tags;\n const merged = [...existing];\n for (const t of incoming) {\n if (!merged.includes(t)) merged.push(t);\n }\n this.record.Tags = TagsHelper.toJson(merged);\n this.tagDraft = '';\n this.cdr.markForCheck();\n }\n\n /** Remove a single tag. */\n removeTag(tag: string): void {\n this.record.Tags = TagsHelper.removeTag(this.record.Tags, tag);\n this.cdr.markForCheck();\n }\n\n /** Handle Enter / comma in the tag input to commit the draft tag. */\n onTagInputKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ',') {\n event.preventDefault();\n this.addTagFromDraft();\n return;\n }\n // Backspace on an empty draft pops the last chip\n if (event.key === 'Backspace' && !this.tagDraft) {\n const all = this.tags;\n if (all.length > 0) {\n event.preventDefault();\n this.removeTag(all[all.length - 1]);\n }\n }\n }\n\n // ==========================================\n // Suite Membership: Add / Remove / Reorder Tests\n // ==========================================\n\n /** Open the picker dialog and load tests not yet in this suite. */\n async openAddTestsDialog(): Promise<void> {\n this.showAddTestsDialog = true;\n this.selectedTestIdsToAdd = new Set<string>();\n this.addTestsSearch = '';\n this.loadingAvailableTests = true;\n this.cdr.markForCheck();\n\n try {\n if (!this.testsLoaded) {\n await this.loadTests();\n }\n\n const existingTestIds = new Set(this.suiteTests.map(st => st.TestID));\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJTestEntity>({\n EntityName: 'MJ: Tests',\n OrderBy: 'Name',\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.availableTests = (result.Results || []).filter(t => !existingTestIds.has(t.ID));\n } else {\n SharedService.Instance.CreateSimpleNotification('Failed to load tests', 'error', 3000);\n }\n } catch (err) {\n console.error('Error loading available tests:', err);\n SharedService.Instance.CreateSimpleNotification('Failed to load tests', 'error', 3000);\n } finally {\n this.loadingAvailableTests = false;\n this.cdr.markForCheck();\n }\n }\n\n closeAddTestsDialog(): void {\n if (this.isAddingTests) return;\n this.showAddTestsDialog = false;\n this.selectedTestIdsToAdd = new Set<string>();\n this.addTestsSearch = '';\n this.cdr.markForCheck();\n }\n\n toggleAddSelection(testId: string): void {\n if (this.selectedTestIdsToAdd.has(testId)) {\n this.selectedTestIdsToAdd.delete(testId);\n } else {\n this.selectedTestIdsToAdd.add(testId);\n }\n // Set mutation alone doesn't trigger OnPush — assign a new reference\n this.selectedTestIdsToAdd = new Set(this.selectedTestIdsToAdd);\n this.cdr.markForCheck();\n }\n\n isAddSelected(testId: string): boolean {\n return this.selectedTestIdsToAdd.has(testId);\n }\n\n /** Tests that match the picker search filter. */\n get filteredAvailableTests(): MJTestEntity[] {\n const q = this.addTestsSearch.trim().toLowerCase();\n if (!q) return this.availableTests;\n return this.availableTests.filter(t =>\n (t.Name || '').toLowerCase().includes(q) ||\n (t.Description || '').toLowerCase().includes(q) ||\n (t.Type || '').toLowerCase().includes(q)\n );\n }\n\n selectAllFiltered(): void {\n for (const t of this.filteredAvailableTests) {\n this.selectedTestIdsToAdd.add(t.ID);\n }\n this.selectedTestIdsToAdd = new Set(this.selectedTestIdsToAdd);\n this.cdr.markForCheck();\n }\n\n clearAddSelection(): void {\n this.selectedTestIdsToAdd = new Set<string>();\n this.cdr.markForCheck();\n }\n\n /** Create suite-test rows for every selected test, appended after existing ones. */\n async confirmAddTests(): Promise<void> {\n if (this.selectedTestIdsToAdd.size === 0 || this.isAddingTests) return;\n\n this.isAddingTests = true;\n this.cdr.markForCheck();\n\n const provider = this.ProviderToUse;\n const startSequence = this.suiteTests.reduce((max, st) => Math.max(max, st.Sequence ?? 0), 0);\n const idsToAdd = Array.from(this.selectedTestIdsToAdd);\n // Snapshot test names from the picker so we can hydrate the joined \"Test\"\n // column on the optimistic rows (BaseEntity's joined view fields aren't\n // always populated through a TransactionGroup save).\n const testNameById = new Map<string, string>(\n this.availableTests.map(t => [t.ID, t.Name])\n );\n\n try {\n const tg = await provider.CreateTransactionGroup();\n const newRows: MJTestSuiteTestEntity[] = [];\n\n for (let i = 0; i < idsToAdd.length; i++) {\n const row = await provider.GetEntityObject<MJTestSuiteTestEntity>('MJ: Test Suite Tests', provider.CurrentUser);\n row.NewRecord();\n row.SuiteID = this.record.ID;\n row.TestID = idsToAdd[i];\n row.Sequence = startSequence + i + 1;\n row.Status = 'Active';\n row.TransactionGroup = tg;\n await row.Save();\n newRows.push(row);\n }\n\n const ok = await tg.Submit();\n if (ok) {\n // Optimistic UI update: append the saved rows immediately so the user\n // sees the new tests right away. If the joined \"Test\" name field\n // didn't come back from the save (TG quirk), hydrate it from the\n // picker snapshot.\n for (const row of newRows) {\n if (!row.Test) {\n const name = testNameById.get(row.TestID);\n if (name) {\n row.Set('Test', name);\n }\n }\n }\n this.suiteTests = [...this.suiteTests, ...newRows];\n this.cdr.markForCheck();\n\n SharedService.Instance.CreateSimpleNotification(\n idsToAdd.length === 1 ? 'Test added to suite' : `${idsToAdd.length} tests added to suite`,\n 'success',\n 2000\n );\n this.showAddTestsDialog = false;\n this.selectedTestIdsToAdd = new Set<string>();\n this.addTestsSearch = '';\n } else {\n const failed = newRows.find(r => r.LatestResult && !r.LatestResult.Success);\n const detail = failed?.LatestResult?.CompleteMessage || 'Failed to add tests';\n SharedService.Instance.CreateSimpleNotification(detail, 'error', 4000);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Failed to add tests';\n SharedService.Instance.CreateSimpleNotification(msg, 'error', 4000);\n } finally {\n this.isAddingTests = false;\n this.cdr.markForCheck();\n }\n }\n\n /** Show the inline remove-confirm for one suite-test row. */\n requestRemoveTest(suiteTest: MJTestSuiteTestEntity, event?: Event): void {\n if (event) event.stopPropagation();\n this.confirmingRemoveSuiteTestId = suiteTest.ID;\n this.cdr.markForCheck();\n }\n\n cancelRemoveTest(event?: Event): void {\n if (event) event.stopPropagation();\n this.confirmingRemoveSuiteTestId = null;\n this.cdr.markForCheck();\n }\n\n /** Delete the suite-test join row and refresh the list. */\n async confirmRemoveTest(suiteTest: MJTestSuiteTestEntity, event?: Event): Promise<void> {\n if (event) event.stopPropagation();\n if (this.isRemovingTest) return;\n this.isRemovingTest = true;\n this.cdr.markForCheck();\n\n try {\n const ok = await suiteTest.Delete();\n if (ok) {\n this.suiteTests = this.suiteTests.filter(t => !UUIDsEqual(t.ID, suiteTest.ID));\n SharedService.Instance.CreateSimpleNotification('Test removed from suite', 'success', 2000);\n } else {\n const detail = suiteTest.LatestResult?.CompleteMessage || 'Failed to remove test';\n SharedService.Instance.CreateSimpleNotification(detail, 'error', 4000);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Failed to remove test';\n SharedService.Instance.CreateSimpleNotification(msg, 'error', 4000);\n } finally {\n this.isRemovingTest = false;\n this.confirmingRemoveSuiteTestId = null;\n this.cdr.markForCheck();\n }\n }\n\n /** Handle CDK drag-drop reordering — persists new Sequence values. */\n async onTestDrop(event: CdkDragDrop<MJTestSuiteTestEntity[]>): Promise<void> {\n if (event.previousIndex === event.currentIndex) return;\n\n // Optimistic reorder\n const reordered = [...this.suiteTests];\n moveItemInArray(reordered, event.previousIndex, event.currentIndex);\n this.suiteTests = reordered;\n this.cdr.markForCheck();\n\n // Compute which rows actually changed sequence (1-based contiguous numbering)\n const dirty: MJTestSuiteTestEntity[] = [];\n reordered.forEach((row, idx) => {\n const newSeq = idx + 1;\n if (row.Sequence !== newSeq) {\n row.Sequence = newSeq;\n dirty.push(row);\n }\n });\n\n if (dirty.length === 0) return;\n\n this.isReorderingTests = true;\n this.cdr.markForCheck();\n\n const provider = this.ProviderToUse;\n try {\n const tg = await provider.CreateTransactionGroup();\n for (const row of dirty) {\n row.TransactionGroup = tg;\n await row.Save();\n }\n const ok = await tg.Submit();\n if (!ok) {\n const failed = dirty.find(r => r.LatestResult && !r.LatestResult.Success);\n const detail = failed?.LatestResult?.CompleteMessage || 'Failed to save new order';\n SharedService.Instance.CreateSimpleNotification(detail, 'error', 4000);\n this.testsLoaded = false;\n await this.loadTests();\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Failed to save new order';\n SharedService.Instance.CreateSimpleNotification(msg, 'error', 4000);\n this.testsLoaded = false;\n await this.loadTests();\n } finally {\n this.isReorderingTests = false;\n this.cdr.markForCheck();\n }\n }\n}\n\n/**\n * Analytics data point for charting\n */\ninterface AnalyticsDataPoint {\n runId: string;\n date: Date;\n passRate: number;\n totalTests: number;\n passedTests: number;\n failedTests: number;\n errorTests: number;\n skippedTests: number;\n duration: number;\n cost: number;\n tags: string[];\n status: string;\n}\n\n/**\n * Matrix data point for the matrix view - shows test results across suite runs\n */\ninterface MatrixDataPoint {\n runId: string;\n date: Date;\n tags: string[];\n status: string;\n passRate: number;\n testResults: Map<string, TestResultCell>;\n}\n\ninterface TestResultCell {\n testRunId: string;\n testId: string;\n testName: string;\n status: string;\n score: number | null;\n duration: number | null;\n humanRating: number | null;\n humanComments: string | null;\n sequence: number;\n}\n","<div class=\"test-suite-form\">\n <!-- Header Section -->\n <div class=\"suite-header\">\n <!-- Breadcrumb Navigation -->\n <nav class=\"breadcrumb\" aria-label=\"Breadcrumb\">\n <ol>\n <li>\n <a href=\"javascript:void(0)\" (click)=\"navigateToTestingDashboard()\">\n <i class=\"fas fa-vial\"></i>\n <span class=\"breadcrumb-text\">Testing</span>\n </a>\n </li>\n <li class=\"current\">\n <i class=\"fas fa-chevron-right separator\"></i>\n <i class=\"fas fa-layer-group\"></i>\n <span>{{ record.Name }}</span>\n </li>\n </ol>\n </nav>\n\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"suite-icon\" [style.background-color]=\"getStatusColor()\">\n <i class=\"fas fa-layer-group\"></i>\n </div>\n <div class=\"suite-info\">\n <h1>\n {{ record.Name }}\n @if (isDirty) {\n <span class=\"dirty-indicator\" title=\"You have unsaved changes\" aria-label=\"Unsaved changes\">●</span>\n }\n </h1>\n <div class=\"suite-meta\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass()\">\n <i class=\"fas\" [ngClass]=\"record.Status === 'Active' ? 'fa-circle-check' : 'fa-circle-pause'\"></i>\n {{ record.Status }}\n </span>\n @if (testsLoaded) {\n <span class=\"test-count\">\n <i class=\"fas fa-flask\"></i>\n {{ suiteTests.length }} tests\n </span>\n }\n @if (isDirty) {\n <span class=\"unsaved-pill\" title=\"You have unsaved changes\">\n <i class=\"fas fa-circle\"></i> Unsaved\n </span>\n }\n </div>\n </div>\n </div>\n <div class=\"header-actions\">\n <app-evaluation-mode-toggle></app-evaluation-mode-toggle>\n <button mjButton (click)=\"exportToExcel()\" title=\"Export to CSV\">\n <i class=\"fas fa-file-excel\"></i> Export\n </button>\n <button mjButton (click)=\"runSuite()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Suite\n </button>\n <button mjButton (click)=\"refresh()\" [disabled]=\"isRefreshing\">\n <i class=\"fas\" [ngClass]=\"isRefreshing ? 'fa-sync fa-spin' : 'fa-sync'\"></i>\n {{ isRefreshing ? 'Refreshing...' : 'Refresh' }}\n </button>\n </div>\n </div>\n @if (record.Description) {\n <div class=\"suite-description\">\n <p>{{ record.Description }}</p>\n </div>\n }\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs-container\">\n <div class=\"tabs\" role=\"tablist\">\n <button class=\"tab\"\n [class.active]=\"activeTab === 'overview'\"\n (click)=\"changeTab('overview')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'overview'\">\n <i class=\"fas fa-th-large\"></i> Overview\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'tests'\"\n (click)=\"changeTab('tests')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'tests'\">\n <i class=\"fas fa-flask\"></i> Tests\n @if (testsLoaded) {\n <span class=\"tab-badge\">{{ suiteTests.length }}</span>\n }\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'runs'\"\n (click)=\"changeTab('runs')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'runs'\">\n <i class=\"fas fa-history\"></i> Runs\n @if (runsLoaded) {\n <span class=\"tab-badge\">{{ suiteRuns.length }}</span>\n }\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'analytics'\"\n (click)=\"changeTab('analytics')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'analytics'\">\n <i class=\"fas fa-chart-line\"></i> Analytics\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'compare'\"\n (click)=\"changeTab('compare')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'compare'\">\n <i class=\"fas fa-balance-scale\"></i> Compare\n </button>\n </div>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tab-content\" [class.has-savebar]=\"isDirty\">\n <!-- Overview Tab -->\n @if (activeTab === 'overview') {\n <div class=\"overview-tab\">\n <!-- Editable Details -->\n <section class=\"edit-section\">\n <header class=\"edit-section-header\">\n <h3><i class=\"fas fa-pen-to-square\"></i> Details</h3>\n <p class=\"edit-section-sub\">Edit any field — changes are saved with the bar at the bottom.</p>\n </header>\n <div class=\"edit-grid\">\n <div class=\"edit-field edit-field--full\">\n <label for=\"suite-name\">Name <span class=\"required\">*</span></label>\n <input\n id=\"suite-name\"\n type=\"text\"\n class=\"config-input\"\n placeholder=\"e.g., Core Agent Test Suite\"\n [(ngModel)]=\"record.Name\"\n />\n </div>\n\n <div class=\"edit-field edit-field--full\">\n <label for=\"suite-description\">Description</label>\n <textarea\n id=\"suite-description\"\n class=\"config-input config-textarea\"\n rows=\"3\"\n placeholder=\"What does this suite cover?\"\n [ngModel]=\"record.Description\"\n (ngModelChange)=\"record.Description = $event || null\"\n ></textarea>\n </div>\n\n <div class=\"edit-field\">\n <label for=\"suite-status\">Status</label>\n <div class=\"select-wrapper\">\n <select\n id=\"suite-status\"\n class=\"config-input\"\n [(ngModel)]=\"record.Status\"\n >\n @for (opt of statusOptions; track opt) {\n <option [ngValue]=\"opt\">{{ opt }}</option>\n }\n </select>\n </div>\n </div>\n\n <div class=\"edit-field\">\n <label for=\"suite-parent\">Parent Suite</label>\n <select\n id=\"suite-parent\"\n class=\"config-input\"\n [ngModel]=\"record.ParentID\"\n (ngModelChange)=\"record.ParentID = $event || null\"\n >\n <option [ngValue]=\"null\">— None (top-level) —</option>\n @for (s of parentSuiteOptions; track s.ID) {\n <option [ngValue]=\"s.ID\">{{ s.Name }}</option>\n }\n </select>\n </div>\n\n <div class=\"edit-field edit-field--full\">\n <label for=\"suite-tags\">Tags</label>\n <div class=\"tag-editor\" (click)=\"tagInput.focus()\">\n @for (tag of tags; track tag) {\n <span class=\"tag-chip-editable\">\n {{ tag }}\n <button type=\"button\" class=\"tag-remove\" (click)=\"removeTag(tag); $event.stopPropagation()\" [attr.aria-label]=\"'Remove tag ' + tag\">\n <i class=\"fas fa-times\"></i>\n </button>\n </span>\n }\n <input\n #tagInput\n id=\"suite-tags\"\n type=\"text\"\n class=\"tag-input-inline\"\n [placeholder]=\"tags.length === 0 ? 'Add tags, press Enter or comma...' : ''\"\n [(ngModel)]=\"tagDraft\"\n (keydown)=\"onTagInputKeydown($event)\"\n (blur)=\"addTagFromDraft()\"\n />\n </div>\n <span class=\"config-hint\">Press Enter or comma to add a tag. Backspace on empty input removes the last tag.</span>\n </div>\n </div>\n </section>\n\n <!-- Execution Settings -->\n <section class=\"edit-section\">\n <header class=\"edit-section-header\">\n <h3><i class=\"fas fa-cogs\"></i> Execution Settings</h3>\n </header>\n <div class=\"edit-grid\">\n <div class=\"edit-field\">\n <label for=\"suite-timeout\">Max Execution Time (ms)</label>\n <input\n id=\"suite-timeout\"\n type=\"number\"\n class=\"config-input\"\n placeholder=\"Default: 300000 (5 min)\"\n [ngModel]=\"record.MaxExecutionTimeMS\"\n (ngModelChange)=\"record.MaxExecutionTimeMS = $event === '' || $event === null ? null : +$event\"\n />\n <span class=\"config-hint\">Default timeout for tests in this suite. Currently: {{ formatTimeout(record.MaxExecutionTimeMS) }}</span>\n </div>\n </div>\n </section>\n\n <!-- Metadata (read-only) -->\n <section class=\"meta-section\">\n <div class=\"meta-grid\">\n <div class=\"meta-item\">\n <div class=\"meta-label\">Created</div>\n <div class=\"meta-value\">{{ record.__mj_CreatedAt | date:'medium' }}</div>\n </div>\n <div class=\"meta-item\">\n <div class=\"meta-label\">Last updated</div>\n <div class=\"meta-value\">{{ record.__mj_UpdatedAt | date:'medium' }}</div>\n </div>\n <div class=\"meta-item\">\n <div class=\"meta-label\">Suite ID</div>\n <div class=\"meta-value meta-mono\">{{ record.ID }}</div>\n </div>\n </div>\n </section>\n </div>\n }\n\n <!-- Tests Tab -->\n @if (activeTab === 'tests') {\n <div class=\"tests-tab\">\n <!-- Header: action bar -->\n <div class=\"tests-actionbar\">\n <div class=\"tests-actionbar-text\">\n <strong>Suite tests</strong>\n @if (testsLoaded) {\n <span class=\"tests-actionbar-count\">{{ suiteTests.length }}</span>\n }\n <span class=\"tests-actionbar-hint\">Drag to reorder · Hover a row to remove</span>\n </div>\n <div class=\"tests-actionbar-actions\">\n <button mjButton variant=\"primary\" (click)=\"openAddTestsDialog()\" [disabled]=\"isReorderingTests\">\n <i class=\"fas fa-plus\"></i> Add tests\n </button>\n </div>\n </div>\n\n <!-- Loading State -->\n @if (loadingTests) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2,3,4,5]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-sequence\"></div>\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Tests List -->\n @if (!loadingTests && suiteTests.length > 0) {\n <div class=\"tests-list\" cdkDropList (cdkDropListDropped)=\"onTestDrop($event)\">\n @for (test of suiteTests; track test.ID) {\n <div class=\"test-item\" cdkDrag [cdkDragDisabled]=\"isReorderingTests || isRemovingTest\">\n <span class=\"test-drag-handle\" cdkDragHandle title=\"Drag to reorder\" aria-label=\"Drag to reorder\">\n <i class=\"fas fa-grip-vertical\"></i>\n </span>\n <div class=\"test-sequence\">{{ test.Sequence }}</div>\n <div class=\"test-icon\"><i class=\"fas fa-flask\"></i></div>\n <div class=\"test-content\" (click)=\"openTest(test.TestID)\">\n <div class=\"test-name\">{{ test.Test }}</div>\n <div class=\"test-status\">\n @if (test.Status) {\n <span><i class=\"fas fa-info-circle\"></i> {{ test.Status }}</span>\n }\n </div>\n </div>\n <!-- Inline remove confirm OR hover-reveal X -->\n @if (confirmingRemoveSuiteTestId === test.ID) {\n <div class=\"test-remove-confirm\" (click)=\"$event.stopPropagation()\">\n <span class=\"test-remove-confirm-text\">Remove from suite?</span>\n <button\n type=\"button\"\n class=\"test-remove-confirm-btn test-remove-confirm-btn--danger\"\n (click)=\"confirmRemoveTest(test, $event)\"\n [disabled]=\"isRemovingTest\"\n >\n @if (isRemovingTest) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n } @else {\n Remove\n }\n </button>\n <button\n type=\"button\"\n class=\"test-remove-confirm-btn test-remove-confirm-btn--ghost\"\n (click)=\"cancelRemoveTest($event)\"\n [disabled]=\"isRemovingTest\"\n >\n Cancel\n </button>\n </div>\n } @else {\n <button\n type=\"button\"\n class=\"test-remove-btn\"\n title=\"Remove from suite\"\n aria-label=\"Remove from suite\"\n (click)=\"requestRemoveTest(test, $event)\"\n >\n <i class=\"fas fa-times\"></i>\n </button>\n <i class=\"fas fa-chevron-right test-chevron\" (click)=\"openTest(test.TestID)\"></i>\n }\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (testsLoaded && !loadingTests && suiteTests.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-flask\"></i>\n </div>\n <h4>No Tests in Suite</h4>\n <p>Add tests to this suite to start running them together.</p>\n <button mjButton variant=\"primary\" (click)=\"openAddTestsDialog()\">\n <i class=\"fas fa-plus\"></i> Add tests\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Runs Tab -->\n @if (activeTab === 'runs') {\n <div class=\"runs-tab\">\n <!-- Loading State -->\n @if (loadingRuns) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2,3]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Runs List -->\n @if (!loadingRuns && suiteRuns.length > 0) {\n <div class=\"runs-list\">\n @for (run of suiteRuns; track run) {\n <div class=\"run-item\" (click)=\"openSuiteRun(run.ID)\">\n <div class=\"run-icon\" [style.background-color]=\"getRunStatusColor(run.Status)\">\n <i class=\"fas\"\n [class.fa-check]=\"run.Status === 'Completed'\"\n [class.fa-times]=\"run.Status === 'Failed'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"\n [class.fa-ban]=\"run.Status === 'Cancelled'\"></i>\n </div>\n <div class=\"run-content\">\n <div class=\"run-header\">\n <span class=\"run-id\">Run #{{ run.ID.substring(0, 8) }}</span>\n <span class=\"run-status\" [style.color]=\"getRunStatusColor(run.Status)\">{{ run.Status }}</span>\n </div>\n <div class=\"run-meta\">\n <span><i class=\"fas fa-calendar\"></i> {{ getRelativeTime(run.StartedAt) }}</span>\n @if (run.TotalTests) {\n <span>\n <i class=\"fas fa-check-circle\"></i> {{ run.PassedTests }}/{{ run.TotalTests }}\n ({{ getPassRate(run).toFixed(0) }}%)\n </span>\n }\n </div>\n <!-- Evaluation metrics row -->\n <div class=\"run-eval-metrics\">\n <!-- Status badge -->\n @if (evalPreferences.showExecution) {\n <span class=\"eval-metric status\" [class]=\"'status-' + run.Status.toLowerCase()\">\n <i class=\"fas\"\n [class.fa-circle-check]=\"run.Status === 'Completed'\"\n [class.fa-circle-xmark]=\"run.Status === 'Failed'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"\n [class.fa-ban]=\"run.Status === 'Cancelled'\"></i>\n </span>\n }\n <!-- Human score (placeholder - need avg from suite run) -->\n @if (evalPreferences.showHuman) {\n <span class=\"eval-metric human\" title=\"Human evaluation\">\n <i class=\"fas fa-user\"></i>\n <span class=\"eval-pending\"><i class=\"fas fa-clock\"></i></span>\n </span>\n }\n <!-- Auto score (pass rate as proxy) -->\n @if (evalPreferences.showAuto && run.TotalTests) {\n <span class=\"eval-metric auto\"\n [class.high]=\"getPassRate(run) >= 80\"\n [class.medium]=\"getPassRate(run) >= 50 && getPassRate(run) < 80\"\n [class.low]=\"getPassRate(run) < 50\"\n title=\"Auto score (pass rate)\">\n <i class=\"fas fa-robot\"></i>\n <span>{{ getPassRate(run).toFixed(0) }}%</span>\n </span>\n }\n </div>\n <!-- Tags display -->\n @if (getRunTags(run).length > 0) {\n <div class=\"run-tags\">\n @for (tag of getRunTags(run); track tag) {\n <span class=\"tag-chip\">{{ tag }}</span>\n }\n </div>\n }\n </div>\n <i class=\"fas fa-chevron-right\"></i>\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (runsLoaded && !loadingRuns && suiteRuns.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-play-circle\"></i>\n </div>\n <h4>No Suite Runs Yet</h4>\n <p>Run this suite to see execution history and results here.</p>\n <button mjButton (click)=\"runSuite()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Suite Now\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Analytics Tab -->\n @if (activeTab === 'analytics') {\n <div class=\"analytics-tab\">\n <!-- Loading State -->\n @if (loadingAnalytics) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading analytics data...\"></mj-loading>\n </div>\n }\n @if (!loadingAnalytics && analyticsLoaded) {\n <!-- View Toggle Sub-nav -->\n <div class=\"analytics-subnav\">\n <div class=\"subnav-tabs\">\n <button class=\"subnav-tab\"\n [class.active]=\"analyticsView === 'summary'\"\n (click)=\"setAnalyticsView('summary')\">\n <i class=\"fas fa-chart-bar\"></i>\n <span>Summary</span>\n </button>\n <button class=\"subnav-tab\"\n [class.active]=\"analyticsView === 'matrix'\"\n (click)=\"setAnalyticsView('matrix')\">\n <i class=\"fas fa-th\"></i>\n <span>Matrix</span>\n </button>\n <button class=\"subnav-tab\"\n [class.active]=\"analyticsView === 'chart'\"\n (click)=\"setAnalyticsView('chart')\">\n <i class=\"fas fa-project-diagram\"></i>\n <span>Chart</span>\n </button>\n </div>\n </div>\n <!-- Collapsible Filters (shared by both views) -->\n <div class=\"analytics-filters\" [class.collapsed]=\"filtersCollapsed\">\n <div class=\"filters-header\" (click)=\"toggleFilters()\">\n <span class=\"filters-title\">\n <i class=\"fas fa-filter\"></i>\n Filters\n @if (filtersCollapsed) {\n <span class=\"filter-summary\">\n {{ analyticsTimeRange === 'all' ? 'All Time' : analyticsTimeRange }}\n @if (selectedTags.length > 0) {\n <span> · {{ selectedTags.length }} tags</span>\n }\n </span>\n }\n </span>\n <i class=\"fas\" [ngClass]=\"filtersCollapsed ? 'fa-chevron-down' : 'fa-chevron-up'\"></i>\n </div>\n @if (!filtersCollapsed) {\n <div class=\"filters-content\">\n <div class=\"filter-group\">\n <label>Time Range</label>\n <div class=\"filter-buttons\">\n <button class=\"filter-btn\" [class.active]=\"analyticsTimeRange === '7d'\" (click)=\"setTimeRange('7d')\">7 Days</button>\n <button class=\"filter-btn\" [class.active]=\"analyticsTimeRange === '30d'\" (click)=\"setTimeRange('30d')\">30 Days</button>\n <button class=\"filter-btn\" [class.active]=\"analyticsTimeRange === '90d'\" (click)=\"setTimeRange('90d')\">90 Days</button>\n <button class=\"filter-btn\" [class.active]=\"analyticsTimeRange === 'all'\" (click)=\"setTimeRange('all')\">All Time</button>\n </div>\n </div>\n @if (uniqueTags.length > 0) {\n <div class=\"filter-group\">\n <label>Filter by Tag @if (selectedTags.length > 0) {\n <span class=\"filter-hint\">({{ selectedTags.length }} selected)</span>\n }</label>\n <div class=\"filter-buttons tag-filters\">\n <button class=\"filter-btn tag-btn all-tags-btn\"\n [class.active]=\"selectedTags.length === 0\"\n (click)=\"toggleTagFilter(null)\">\n <i class=\"fas fa-layer-group\"></i> All Tags\n </button>\n @for (tag of uniqueTags; track tag) {\n <button class=\"filter-btn tag-btn\"\n [class.active]=\"isTagSelected(tag)\"\n (click)=\"toggleTagFilter(tag)\">\n @if (isTagSelected(tag)) {\n <i class=\"fas fa-check\"></i>\n }\n {{ tag }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n <!-- Summary View -->\n @if (analyticsView === 'summary') {\n <!-- KPI Cards -->\n <div class=\"analytics-kpis\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\"><i class=\"fas fa-play-circle\"></i></div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ getTotalRuns() }}</div>\n <div class=\"kpi-label\">Total Runs</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon success\"><i class=\"fas fa-check-circle\"></i></div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ getAveragePassRate().toFixed(1) }}%</div>\n <div class=\"kpi-label\">Avg Pass Rate</div>\n <div class=\"kpi-trend\" [ngClass]=\"{'trend-up': getPassRateTrend().direction === 'up', 'trend-down': getPassRateTrend().direction === 'down'}\">\n <i class=\"fas\" [ngClass]=\"{'fa-arrow-up': getPassRateTrend().direction === 'up', 'fa-arrow-down': getPassRateTrend().direction === 'down', 'fa-minus': getPassRateTrend().direction === 'stable'}\"></i>\n {{ getPassRateTrend().value.toFixed(1) }}%\n </div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon info\"><i class=\"fas fa-clock\"></i></div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ formatDuration(getAverageDuration()) }}</div>\n <div class=\"kpi-label\">Avg Duration</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon warning\"><i class=\"fas fa-dollar-sign\"></i></div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ formatCost(getTotalCost()) }}</div>\n <div class=\"kpi-label\">Total Cost</div>\n </div>\n </div>\n </div>\n <!-- Runs Table -->\n <div class=\"analytics-table-section\">\n <h3><i class=\"fas fa-table\"></i> Run History</h3>\n <div class=\"analytics-table-wrapper\">\n <table class=\"analytics-table\">\n <thead>\n <tr>\n <th>Date</th>\n <th>Status</th>\n <th>Pass Rate</th>\n <th>Tests</th>\n <th>Duration</th>\n <th>Cost</th>\n <th>Tags</th>\n </tr>\n </thead>\n <tbody>\n @for (dp of getFilteredAnalyticsData(); track dp) {\n <tr (click)=\"openSuiteRun(dp.runId)\" class=\"clickable-row\">\n <td>{{ dp.date | date:'short' }}</td>\n <td>\n <span class=\"status-chip\" [ngClass]=\"'status-' + dp.status.toLowerCase()\">{{ dp.status }}</span>\n </td>\n <td>\n <div class=\"pass-rate-cell\">\n <div class=\"pass-rate-bar\" [style.width.%]=\"dp.passRate\" [ngClass]=\"{'high': dp.passRate >= 80, 'medium': dp.passRate >= 50 && dp.passRate < 80, 'low': dp.passRate < 50}\"></div>\n <span>{{ dp.passRate.toFixed(0) }}%</span>\n </div>\n </td>\n <td>{{ dp.passedTests }}/{{ dp.totalTests }}</td>\n <td>{{ formatDuration(dp.duration) }}</td>\n <td>{{ formatCost(dp.cost) }}</td>\n <td>\n <div class=\"tag-cell\">\n @for (tag of dp.tags.slice(0, 2); track tag) {\n <span class=\"tag-chip-table\">{{ tag }}</span>\n }\n @if (dp.tags.length > 2) {\n <span class=\"tag-more\">+{{ dp.tags.length - 2 }}</span>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n @if (getFilteredAnalyticsData().length === 0) {\n <div class=\"empty-state small\">\n <p>No runs match the current filters.</p>\n </div>\n }\n </div>\n }\n <!-- Matrix View -->\n @if (analyticsView === 'matrix') {\n <!-- Loading Matrix -->\n @if (loadingMatrix) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading test matrix...\"></mj-loading>\n </div>\n }\n <!-- Matrix Content -->\n @if (!loadingMatrix && matrixLoaded && matrixData.length > 0) {\n <div class=\"matrix-section\">\n <div class=\"matrix-header\">\n <h3><i class=\"fas fa-th\"></i> Test Results Matrix</h3>\n <div class=\"matrix-header-right\">\n <div class=\"matrix-filter-input\">\n <i class=\"fas fa-search\"></i>\n <input type=\"text\"\n placeholder=\"Filter tests...\"\n [value]=\"matrixTestFilter\"\n (input)=\"onMatrixFilterInput($event)\"\n class=\"filter-input\">\n @if (matrixTestFilter) {\n <button class=\"clear-filter-btn\" (click)=\"clearMatrixFilter()\" title=\"Clear filter\">\n <i class=\"fas fa-times\"></i>\n </button>\n }\n </div>\n <span class=\"matrix-run-count\">{{ matrixData.length }} runs · {{ getUniqueTestsFromMatrix().length }} tests</span>\n <button mjButton (click)=\"exportMatrixToCSV()\" [disabled]=\"matrixData.length === 0\" title=\"Export matrix to CSV\">\n <i class=\"fas fa-download\"></i> Export\n </button>\n </div>\n </div>\n <div class=\"matrix-scroll-container\">\n <table class=\"test-matrix\">\n <thead>\n <tr>\n <th class=\"seq-header\" (click)=\"toggleMatrixSort('sequence')\" title=\"Sort by sequence\">\n #\n <i class=\"fas\" [ngClass]=\"matrixSortBy === 'sequence' ? (matrixSortAsc ? 'fa-sort-up' : 'fa-sort-down') : 'fa-sort'\"></i>\n </th>\n <th class=\"test-name-header\" (click)=\"toggleMatrixSort('name')\" title=\"Sort by name\">\n Test\n <i class=\"fas\" [ngClass]=\"matrixSortBy === 'name' ? (matrixSortAsc ? 'fa-sort-up' : 'fa-sort-down') : 'fa-sort'\"></i>\n </th>\n @for (run of matrixData; track run) {\n <th class=\"run-header\" (click)=\"openSuiteRun(run.runId)\" [title]=\"'Click to view suite run - ' + (run.date | date:'medium')\">\n <div class=\"run-header-content\">\n @if (run.tags.length > 0) {\n <div class=\"run-tags-header\">\n @for (tag of run.tags.slice(0, 2); track tag) {\n <span class=\"tag-chip-header\">{{ tag }}</span>\n }\n @if (run.tags.length > 2) {\n <span class=\"tag-more-header\">+{{ run.tags.length - 2 }}</span>\n }\n </div>\n }\n <div class=\"run-date\">{{ getRelativeTime(run.date) }}</div>\n <div class=\"run-pass-rate\" [ngClass]=\"{'high': run.passRate >= 80, 'medium': run.passRate >= 50 && run.passRate < 80, 'low': run.passRate < 50}\">\n {{ run.passRate.toFixed(0) }}%\n </div>\n </div>\n </th>\n }\n <th class=\"spacer-header\"></th>\n </tr>\n </thead>\n <tbody>\n @for (test of getUniqueTestsFromMatrix(); track test) {\n <tr\n [class.row-selected]=\"selectedMatrixTestId === test.testId\"\n (click)=\"selectMatrixRow(test.testId)\">\n <td class=\"seq-cell\">{{ test.sequence }}</td>\n <td class=\"test-name-cell\">\n <span class=\"test-name\" [title]=\"test.testName\">{{ test.testName }}</span>\n </td>\n @for (run of matrixData; track run) {\n <td class=\"result-cell\"\n [ngClass]=\"getMatrixCellClass(getTestResultForRun(run.runId, test.testId))\"\n [class.clickable]=\"getTestResultForRun(run.runId, test.testId)\"\n [class.cell-not-run]=\"!getTestResultForRun(run.runId, test.testId)\"\n [title]=\"getTestResultForRun(run.runId, test.testId)?.status + ' - Click to view test run' || 'Not Run'\"\n (click)=\"onMatrixCellClick(getTestResultForRun(run.runId, test.testId), $event)\">\n @if (getTestResultForRun(run.runId, test.testId); as result) {\n <div class=\"cell-eval-stack\">\n <!-- Status indicator -->\n @if (evalPreferences.showExecution) {\n <span class=\"cell-status\"\n [ngClass]=\"'status-' + result.status.toLowerCase()\"\n [class.cell-skipped-status]=\"result.status === 'Skipped' || result.status === 'Pending'\"\n [title]=\"getStatusTooltip(result.status)\">\n <i class=\"fas\"\n [class.fa-check]=\"result.status === 'Passed'\"\n [class.fa-times]=\"result.status === 'Failed'\"\n [class.fa-exclamation]=\"result.status === 'Error'\"\n [class.fa-hourglass-end]=\"result.status === 'Timeout'\"\n [class.fa-forward]=\"result.status === 'Skipped'\"\n [class.fa-spinner]=\"result.status === 'Running'\"\n [class.fa-clock]=\"result.status === 'Pending'\"></i>\n </span>\n }\n <!-- Human score - slashed icon if no feedback, colored by rating if has feedback -->\n @if (evalPreferences.showHuman && !result.humanRating) {\n <span class=\"cell-human no-feedback\"\n title=\"Human Review: No rating submitted yet\">\n <i class=\"fas fa-user-slash\"></i>\n </span>\n }\n @if (evalPreferences.showHuman && result.humanRating) {\n <span class=\"cell-human has-feedback\"\n [class.rating-low]=\"result.humanRating <= 4\"\n [class.rating-medium]=\"result.humanRating >= 5 && result.humanRating <= 6\"\n [class.rating-good]=\"result.humanRating >= 7 && result.humanRating <= 8\"\n [class.rating-excellent]=\"result.humanRating >= 9\"\n [title]=\"getHumanTooltip(result.humanRating, result.humanComments)\">\n <i class=\"fas fa-user\"></i>\n <span class=\"rating-value\">{{ result.humanRating }}</span>\n </span>\n }\n <!-- Auto score - colored by percentage -->\n @if (evalPreferences.showAuto && result.score != null) {\n <span class=\"cell-auto has-score\"\n [class.score-low]=\"result.score < 0.5\"\n [class.score-medium]=\"result.score >= 0.5 && result.score < 0.7\"\n [class.score-good]=\"result.score >= 0.7 && result.score < 0.85\"\n [class.score-excellent]=\"result.score >= 0.85\"\n [title]=\"'Auto Score: ' + (result.score * 100).toFixed(0) + '% automated evaluation'\">\n <i class=\"fas fa-robot\"></i>\n <span class=\"score-value\">{{ (result.score * 100).toFixed(0) }}</span>\n </span>\n }\n @if (evalPreferences.showAuto && result.score == null) {\n <span class=\"cell-auto no-score\"\n title=\"Auto Score: No automated score available\">\n <i class=\"fas fa-robot\"></i>\n </span>\n }\n </div>\n }\n @if (!getTestResultForRun(run.runId, test.testId)) {\n <span class=\"cell-not-run-indicator\">\n <i class=\"fas fa-minus\"></i>\n </span>\n }\n </td>\n }\n <td class=\"spacer-cell\"></td>\n </tr>\n }\n </tbody>\n <!-- Footer row with totals -->\n <tfoot>\n <tr class=\"totals-row\">\n <td class=\"seq-cell totals-label\"></td>\n <td class=\"test-name-cell totals-label\">\n <strong>Totals</strong>\n </td>\n @for (run of matrixData; track run) {\n <td class=\"result-cell totals-cell\">\n <div class=\"cell-eval-stack totals-stack\">\n <!-- Status totals -->\n @if (evalPreferences.showExecution) {\n <span class=\"totals-status\">\n <span class=\"pass-count\">{{ getRunPassedCount(run) }}/{{ getRunTotalCount(run) }}</span>\n </span>\n }\n <!-- Human totals -->\n @if (evalPreferences.showHuman) {\n <span class=\"totals-human\">\n @if (getRunHumanAvg(run) != null) {\n <span class=\"avg-label\">{{ getRunHumanAvg(run)?.toFixed(1) }}</span>\n }\n <span class=\"count-label\">({{ getRunHumanCount(run) }})</span>\n </span>\n }\n <!-- Auto totals -->\n @if (evalPreferences.showAuto) {\n <span class=\"totals-auto\">\n @if (getRunAutoAvg(run) != null) {\n <span class=\"avg-label\">{{ (getRunAutoAvg(run)! * 100).toFixed(0) }}%</span>\n }\n <span class=\"count-label\">({{ getRunAutoCount(run) }})</span>\n </span>\n }\n </div>\n </td>\n }\n <td class=\"spacer-cell\"></td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n }\n <!-- Empty Matrix State -->\n @if (!loadingMatrix && matrixLoaded && matrixData.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-th\"></i>\n </div>\n <h4>No Matrix Data</h4>\n <p>No suite runs match the current filters.</p>\n </div>\n }\n }\n <!-- Chart View -->\n @if (analyticsView === 'chart') {\n <!-- Loading Chart -->\n @if (loadingMatrix) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading chart data...\"></mj-loading>\n </div>\n }\n <!-- Chart Content -->\n @if (!loadingMatrix && matrixLoaded && matrixData.length > 0) {\n <div class=\"chart-section\">\n <div class=\"chart-header\">\n <h3><i class=\"fas fa-project-diagram\"></i> Test Results Flow</h3>\n <div class=\"chart-legend\">\n <span class=\"legend-item chart-passed\"><i class=\"fas fa-check\"></i> Passed</span>\n <span class=\"legend-item chart-failed\"><i class=\"fas fa-times\"></i> Failed</span>\n <span class=\"legend-item chart-error\"><i class=\"fas fa-exclamation\"></i> Error</span>\n <span class=\"legend-item chart-skipped\"><i class=\"fas fa-forward\"></i> Skipped</span>\n </div>\n </div>\n <div class=\"chart-container\">\n <div #chartContainer class=\"d3-chart\"></div>\n </div>\n <div class=\"chart-info\">\n <i class=\"fas fa-info-circle\"></i>\n Interactive visualization showing test results across {{ matrixData.length }} runs.\n Hover over elements for details, click nodes to navigate.\n </div>\n </div>\n }\n <!-- Empty Chart State -->\n @if (!loadingMatrix && matrixLoaded && matrixData.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-project-diagram\"></i>\n </div>\n <h4>No Chart Data</h4>\n <p>No suite runs match the current filters.</p>\n </div>\n }\n }\n }\n <!-- Empty State -->\n @if (!loadingAnalytics && analyticsLoaded && analyticsData.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-chart-line\"></i>\n </div>\n <h4>No Analytics Data</h4>\n <p>Run this suite to start collecting analytics data.</p>\n <button mjButton (click)=\"runSuite()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Suite Now\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Compare Tab -->\n @if (activeTab === 'compare') {\n <div class=\"compare-tab\">\n <!-- Run Selection -->\n <div class=\"compare-selection\">\n <div class=\"compare-run-selector\">\n <h4>Run A (Baseline)</h4>\n @if (!loadingRuns && suiteRuns.length > 0) {\n <div class=\"run-selector-list\">\n @for (run of suiteRuns; track run) {\n <div class=\"run-selector-item\"\n [class.selected]=\"IsCompareRunA(run)\"\n (click)=\"selectCompareRunA(run)\">\n <div class=\"selector-status\" [style.background-color]=\"getRunStatusColor(run.Status)\"></div>\n <div class=\"selector-content\">\n <div class=\"selector-date\">{{ run.StartedAt | date:'short' }}</div>\n <div class=\"selector-rate\">{{ getPassRate(run).toFixed(0) }}% pass</div>\n </div>\n @if (getRunTags(run).length > 0) {\n <div class=\"selector-tags\">\n @for (tag of getRunTags(run).slice(0, 2); track tag) {\n <span class=\"tag-mini\">{{ tag }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n @if (compareRunA) {\n <div class=\"selected-run-preview\">\n <div class=\"preview-header\">\n <span class=\"preview-label\">Selected:</span>\n <button class=\"clear-btn\" (click)=\"compareRunA = null; compareResults = []\">Clear</button>\n </div>\n <div class=\"preview-details\">\n <span>{{ compareRunA.StartedAt | date:'medium' }}</span>\n <span class=\"preview-rate\">{{ getPassRate(compareRunA).toFixed(1) }}%</span>\n </div>\n </div>\n }\n </div>\n <div class=\"compare-vs\"><i class=\"fas fa-exchange-alt\"></i></div>\n <div class=\"compare-run-selector\">\n <h4>Run B (Compare)</h4>\n @if (!loadingRuns && suiteRuns.length > 0) {\n <div class=\"run-selector-list\">\n @for (run of suiteRuns; track run) {\n <div class=\"run-selector-item\"\n [class.selected]=\"IsCompareRunB(run)\"\n [class.disabled]=\"IsCompareRunA(run)\"\n (click)=\"!IsCompareRunA(run) && selectCompareRunB(run)\">\n <div class=\"selector-status\" [style.background-color]=\"getRunStatusColor(run.Status)\"></div>\n <div class=\"selector-content\">\n <div class=\"selector-date\">{{ run.StartedAt | date:'short' }}</div>\n <div class=\"selector-rate\">{{ getPassRate(run).toFixed(0) }}% pass</div>\n </div>\n @if (getRunTags(run).length > 0) {\n <div class=\"selector-tags\">\n @for (tag of getRunTags(run).slice(0, 2); track tag) {\n <span class=\"tag-mini\">{{ tag }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n @if (compareRunB) {\n <div class=\"selected-run-preview\">\n <div class=\"preview-header\">\n <span class=\"preview-label\">Selected:</span>\n <button class=\"clear-btn\" (click)=\"compareRunB = null; compareResults = []\">Clear</button>\n </div>\n <div class=\"preview-details\">\n <span>{{ compareRunB.StartedAt | date:'medium' }}</span>\n <span class=\"preview-rate\">{{ getPassRate(compareRunB).toFixed(1) }}%</span>\n </div>\n </div>\n }\n </div>\n </div>\n <!-- Comparison Results -->\n @if (compareRunA && compareRunB && !loadingCompare) {\n <div class=\"compare-results\">\n <!-- Summary Cards -->\n <div class=\"compare-summary\">\n <div class=\"compare-summary-card\">\n <div class=\"summary-label\">Pass Rate Change</div>\n <div class=\"summary-value\" [ngClass]=\"{'positive': getComparePassRateDiff()! > 0, 'negative': getComparePassRateDiff()! < 0}\">\n <i class=\"fas\" [ngClass]=\"{'fa-arrow-up': getComparePassRateDiff()! > 0, 'fa-arrow-down': getComparePassRateDiff()! < 0, 'fa-minus': getComparePassRateDiff() === 0}\"></i>\n {{ getComparePassRateDiff()! > 0 ? '+' : '' }}{{ getComparePassRateDiff()?.toFixed(1) }}%\n </div>\n </div>\n <div class=\"compare-summary-card\">\n <div class=\"summary-label\">Duration Change</div>\n <div class=\"summary-value\" [ngClass]=\"{'positive': getCompareDurationDiff()! < 0, 'negative': getCompareDurationDiff()! > 0}\">\n <i class=\"fas\" [ngClass]=\"{'fa-arrow-down': getCompareDurationDiff()! < 0, 'fa-arrow-up': getCompareDurationDiff()! > 0, 'fa-minus': getCompareDurationDiff() === 0}\"></i>\n {{ formatDuration(getAbsCompareDurationDiff()) }}\n </div>\n </div>\n <div class=\"compare-summary-card improved\">\n <div class=\"summary-label\">Improved</div>\n <div class=\"summary-value\">{{ getCompareImprovedCount() }}</div>\n </div>\n <div class=\"compare-summary-card regressed\">\n <div class=\"summary-label\">Regressed</div>\n <div class=\"summary-value\">{{ getCompareRegressedCount() }}</div>\n </div>\n </div>\n <!-- Detailed Comparison Table -->\n <div class=\"compare-table-section\">\n <h3><i class=\"fas fa-list\"></i> Test-by-Test Comparison</h3>\n <div class=\"compare-table-wrapper\">\n <table class=\"compare-table\">\n <thead>\n <tr>\n <th>Test</th>\n <th>Run A Status</th>\n <th>Run B Status</th>\n <th>Score Diff</th>\n <th>Duration Diff</th>\n <th>Change</th>\n </tr>\n </thead>\n <tbody>\n @for (result of compareResults; track result) {\n <tr [ngClass]=\"{'improved': result.runA && result.runB && result.runA.status !== 'Passed' && result.runB.status === 'Passed', 'regressed': result.runA && result.runB && result.runA.status === 'Passed' && result.runB.status !== 'Passed'}\">\n <td class=\"test-name-cell\">{{ result.testName }}</td>\n <td>\n @if (result.runA) {\n <span class=\"status-chip\" [ngClass]=\"'status-' + result.runA.status.toLowerCase()\">{{ result.runA.status }}</span>\n }\n @if (!result.runA) {\n <span class=\"status-chip status-missing\">N/A</span>\n }\n </td>\n <td>\n @if (result.runB) {\n <span class=\"status-chip\" [ngClass]=\"'status-' + result.runB.status.toLowerCase()\">{{ result.runB.status }}</span>\n }\n @if (!result.runB) {\n <span class=\"status-chip status-missing\">N/A</span>\n }\n </td>\n <td>\n @if (result.scoreDiff != null) {\n <span [ngClass]=\"{'positive': result.scoreDiff > 0, 'negative': result.scoreDiff < 0}\">\n {{ result.scoreDiff > 0 ? '+' : '' }}{{ (result.scoreDiff * 100).toFixed(1) }}%\n </span>\n }\n @if (result.scoreDiff == null) {\n <span class=\"muted\">-</span>\n }\n </td>\n <td>\n @if (result.durationDiff != null) {\n <span [ngClass]=\"{'positive': result.durationDiff < 0, 'negative': result.durationDiff > 0}\">\n {{ result.durationDiff > 0 ? '+' : '' }}{{ result.durationDiff.toFixed(1) }}s\n </span>\n }\n @if (result.durationDiff == null) {\n <span class=\"muted\">-</span>\n }\n </td>\n <td>\n @if (result.runA && result.runB && result.runA.status !== 'Passed' && result.runB.status === 'Passed') {\n <span class=\"change-indicator improved\">\n <i class=\"fas fa-arrow-up\"></i> Fixed\n </span>\n }\n @if (result.runA && result.runB && result.runA.status === 'Passed' && result.runB.status !== 'Passed') {\n <span class=\"change-indicator regressed\">\n <i class=\"fas fa-arrow-down\"></i> Broke\n </span>\n }\n @if (!result.statusChanged) {\n <span class=\"change-indicator unchanged\">\n <i class=\"fas fa-minus\"></i>\n </span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n </div>\n }\n <!-- Loading State for Compare -->\n @if (loadingCompare) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading comparison data...\"></mj-loading>\n </div>\n }\n <!-- Empty State -->\n @if (!compareRunA || !compareRunB) {\n <div class=\"compare-empty\">\n <div class=\"compare-empty-icon\">\n <i class=\"fas fa-balance-scale\"></i>\n </div>\n <h4>Select Two Runs to Compare</h4>\n <p>Choose a baseline run (A) and a comparison run (B) from the lists above to see a detailed side-by-side comparison.</p>\n </div>\n }\n <!-- No Runs State -->\n @if (runsLoaded && suiteRuns.length < 2) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-balance-scale\"></i>\n </div>\n <h4>Not Enough Runs to Compare</h4>\n <p>You need at least 2 suite runs to use the comparison feature.</p>\n <button mjButton (click)=\"runSuite()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Suite Now\n </button>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Keyboard Shortcuts Toggle Button -->\n <button class=\"shortcuts-toggle\" (click)=\"toggleShortcuts()\" [title]=\"showShortcuts ? 'Hide keyboard shortcuts' : 'Show keyboard shortcuts'\">\n <i class=\"fas fa-keyboard\"></i>\n </button>\n\n <!-- Keyboard Shortcuts Hint (Desktop Only) -->\n @if (showShortcuts) {\n <div class=\"keyboard-shortcuts\">\n <div class=\"shortcuts-header\">\n <i class=\"fas fa-keyboard\"></i>\n Shortcuts\n <button class=\"shortcuts-close\" (click)=\"toggleShortcuts()\" title=\"Hide shortcuts\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"shortcut-list\">\n <div class=\"shortcut-item\">\n <span>Save changes</span>\n <span class=\"shortcut-keys\"><kbd>Cmd</kbd><kbd>S</kbd></span>\n </div>\n <div class=\"shortcut-item\">\n <span>Refresh</span>\n <span class=\"shortcut-keys\"><kbd>Cmd</kbd><kbd>R</kbd></span>\n </div>\n <div class=\"shortcut-item\">\n <span>Run Suite</span>\n <span class=\"shortcut-keys\"><kbd>Cmd</kbd><kbd>Enter</kbd></span>\n </div>\n <div class=\"shortcut-item\">\n <span>Switch Tabs</span>\n <span class=\"shortcut-keys\"><kbd>1</kbd>-<kbd>5</kbd></span>\n </div>\n </div>\n </div>\n }\n\n <!-- Slide Panel for Suite Execution -->\n @if (testingDialogService.IsPanelOpen) {\n <mj-slide-panel\n Mode=\"slide\"\n [Title]=\"testingDialogService.PanelOptions?.suiteId ? 'Suite Execution' : 'Run Suite'\"\n [Resizable]=\"true\"\n (Closed)=\"OnPanelClosed()\">\n <app-test-run-dialog\n [PanelMode]=\"true\"\n [selectedTestId]=\"testingDialogService.PanelOptions?.testId ?? null\"\n [selectedSuiteId]=\"testingDialogService.PanelOptions?.suiteId ?? null\"\n [runMode]=\"testingDialogService.PanelOptions?.mode ?? 'suite'\"\n (PanelClose)=\"OnPanelClosed()\">\n </app-test-run-dialog>\n </mj-slide-panel>\n }\n\n <!-- Add Tests Picker Dialog -->\n @if (showAddTestsDialog) {\n <div class=\"picker-backdrop\" (click)=\"closeAddTestsDialog()\"></div>\n <div class=\"picker-dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"add-tests-dialog-title\" (click)=\"$event.stopPropagation()\">\n <div class=\"picker-header\">\n <h2 id=\"add-tests-dialog-title\" class=\"picker-title\">\n <i class=\"fas fa-plus-circle\"></i> Add tests to suite\n </h2>\n <button type=\"button\" class=\"picker-close\" (click)=\"closeAddTestsDialog()\" [disabled]=\"isAddingTests\" aria-label=\"Close\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n\n <div class=\"picker-search\">\n <i class=\"fas fa-search picker-search-icon\"></i>\n <input\n #pickerSearch\n type=\"text\"\n class=\"picker-search-input\"\n placeholder=\"Search tests by name, description, or type...\"\n [(ngModel)]=\"addTestsSearch\"\n autofocus\n />\n @if (addTestsSearch) {\n <button type=\"button\" class=\"picker-search-clear\" (click)=\"addTestsSearch = ''\" aria-label=\"Clear search\">\n <i class=\"fas fa-times\"></i>\n </button>\n }\n </div>\n\n <div class=\"picker-toolbar\">\n <span class=\"picker-toolbar-status\">\n @if (selectedTestIdsToAdd.size > 0) {\n <strong>{{ selectedTestIdsToAdd.size }}</strong> selected\n } @else if (!loadingAvailableTests) {\n {{ filteredAvailableTests.length }} test{{ filteredAvailableTests.length === 1 ? '' : 's' }} available\n }\n </span>\n <div class=\"picker-toolbar-actions\">\n <button type=\"button\" class=\"picker-link-btn\" (click)=\"selectAllFiltered()\" [disabled]=\"loadingAvailableTests || filteredAvailableTests.length === 0\">\n Select all\n </button>\n <button type=\"button\" class=\"picker-link-btn\" (click)=\"clearAddSelection()\" [disabled]=\"selectedTestIdsToAdd.size === 0\">\n Clear\n </button>\n </div>\n </div>\n\n <div class=\"picker-body\">\n @if (loadingAvailableTests) {\n <div class=\"picker-loading\">\n <mj-loading text=\"Loading tests...\"></mj-loading>\n </div>\n } @else if (filteredAvailableTests.length === 0) {\n <div class=\"picker-empty\">\n @if (availableTests.length === 0) {\n <i class=\"fas fa-check-circle\"></i>\n <h4>Everything's already in the suite</h4>\n <p>This suite contains every available test. Create a new test first to add more.</p>\n } @else {\n <i class=\"fas fa-search\"></i>\n <h4>No matches</h4>\n <p>No tests match \"{{ addTestsSearch }}\".</p>\n }\n </div>\n } @else {\n <ul class=\"picker-list\">\n @for (t of filteredAvailableTests; track t.ID) {\n <li\n class=\"picker-row\"\n [class.picker-row--selected]=\"isAddSelected(t.ID)\"\n (click)=\"toggleAddSelection(t.ID)\"\n role=\"checkbox\"\n [attr.aria-checked]=\"isAddSelected(t.ID)\"\n tabindex=\"0\"\n >\n <span class=\"picker-check\">\n @if (isAddSelected(t.ID)) {\n <i class=\"fas fa-check\"></i>\n }\n </span>\n <div class=\"picker-row-main\">\n <div class=\"picker-row-name\">{{ t.Name }}</div>\n @if (t.Description) {\n <div class=\"picker-row-desc\">{{ t.Description }}</div>\n }\n </div>\n <div class=\"picker-row-meta\">\n @if (t.Type) {\n <span class=\"picker-row-pill\">{{ t.Type }}</span>\n }\n <span class=\"picker-row-pill picker-row-pill--status\" [attr.data-status]=\"t.Status?.toLowerCase()\">{{ t.Status }}</span>\n </div>\n </li>\n }\n </ul>\n }\n </div>\n\n <div class=\"picker-footer\">\n <button\n type=\"button\"\n class=\"picker-btn picker-btn--primary\"\n (click)=\"confirmAddTests()\"\n [disabled]=\"selectedTestIdsToAdd.size === 0 || isAddingTests\"\n >\n @if (isAddingTests) {\n <i class=\"fas fa-spinner fa-spin\"></i> Adding…\n } @else {\n <i class=\"fas fa-check\"></i>\n @if (selectedTestIdsToAdd.size === 0) {\n Add tests\n } @else if (selectedTestIdsToAdd.size === 1) {\n Add 1 test\n } @else {\n Add {{ selectedTestIdsToAdd.size }} tests\n }\n }\n </button>\n <button\n type=\"button\"\n class=\"picker-btn picker-btn--ghost\"\n (click)=\"closeAddTestsDialog()\"\n [disabled]=\"isAddingTests\"\n >\n Cancel\n </button>\n </div>\n </div>\n }\n\n <!-- Sticky Save Bar — always in the DOM so CSS transitions can fire reliably.\n Visibility is controlled by the .save-bar--visible class, driven by isDirty. -->\n <div\n class=\"save-bar\"\n [class.save-bar--visible]=\"isDirty\"\n [attr.aria-hidden]=\"!isDirty\"\n role=\"region\"\n aria-label=\"Unsaved changes\"\n >\n <div class=\"save-bar-message\">\n <span class=\"save-bar-dot\" aria-hidden=\"true\">●</span>\n <span class=\"save-bar-text\">\n <strong>Unsaved changes</strong>\n <span class=\"save-bar-fields\">\n @if (dirtyFieldNames.length === 1) {\n {{ dirtyFieldNames[0] }} edited\n } @else if (dirtyFieldNames.length > 1) {\n {{ dirtyFieldNames.length }} fields edited\n }\n </span>\n </span>\n </div>\n <div class=\"save-bar-actions\">\n <button\n type=\"button\"\n class=\"save-bar-btn save-bar-btn--primary\"\n (click)=\"saveChanges()\"\n [disabled]=\"isSaving || !isDirty\"\n [attr.tabindex]=\"isDirty ? 0 : -1\"\n title=\"Save changes (⌘S)\"\n >\n @if (isSaving) {\n <i class=\"fas fa-spinner fa-spin\"></i> Saving…\n } @else {\n <i class=\"fas fa-check\"></i> Save changes\n <span class=\"save-bar-kbd\"><kbd>⌘</kbd><kbd>S</kbd></span>\n }\n </button>\n <button\n type=\"button\"\n class=\"save-bar-btn save-bar-btn--ghost\"\n (click)=\"discardChanges()\"\n [disabled]=\"isSaving || !isDirty\"\n [attr.tabindex]=\"isDirty ? 0 : -1\"\n title=\"Discard changes\"\n >\n <i class=\"fas fa-undo\"></i> Discard\n </button>\n </div>\n </div>\n</div>\n"]}
|