{"version":3,"file":"validateWorkflow-TQyTQGNS.mjs","sources":["../../admin/src/hooks/useInjectReducer.ts","../../ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/actions.ts","../../ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/AddStage.tsx","../../ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/reducer.ts","../../ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/selectors.ts","../../ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/Stage.tsx","../../ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/Stages.tsx","../../ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/WorkflowAttributes.tsx","../../ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/utils/validateWorkflow.ts"],"sourcesContent":["import { useEffect } from 'react';\n\nimport { Reducer } from '@reduxjs/toolkit';\n\nimport { useTypedStore } from '../core/store/hooks';\n\n/**\n * Inject a new reducer into the global redux-store.\n *\n * @export\n * @param {string} namespace - Store namespace of the injected reducer\n * @param {Function} reducer - Reducer function\n * @return void\n */\n\nexport function useInjectReducer(namespace: string, reducer: Reducer) {\n  const store = useTypedStore();\n\n  useEffect(() => {\n    store.injectReducer(namespace, reducer);\n  }, [store, namespace, reducer]);\n}\n","import { Contracts } from '@strapi/plugin-content-manager/_internal/shared';\n\nimport { Stage, Workflow } from '../../../../../../../shared/contracts/review-workflows';\nimport { Permission, SanitizedAdminRole } from '../../../../../../../shared/contracts/shared';\n\nimport {\n  ACTION_ADD_STAGE,\n  ACTION_CLONE_STAGE,\n  ACTION_DELETE_STAGE,\n  ACTION_RESET_WORKFLOW,\n  ACTION_SET_CONTENT_TYPES,\n  ACTION_SET_IS_LOADING,\n  ACTION_SET_ROLES,\n  ACTION_SET_WORKFLOW,\n  ACTION_SET_WORKFLOWS,\n  ACTION_UPDATE_STAGE,\n  ACTION_UPDATE_STAGES,\n  ACTION_UPDATE_STAGE_POSITION,\n  ACTION_UPDATE_WORKFLOW,\n} from './constants';\n\nexport function cloneStage(id: number) {\n  return {\n    type: ACTION_CLONE_STAGE,\n    payload: { id },\n  };\n}\n\nexport function setWorkflow({ workflow }: { workflow: Workflow | null }) {\n  return {\n    type: ACTION_SET_WORKFLOW,\n    payload: workflow,\n  };\n}\n\nexport function setWorkflows({ workflows }: { workflows: Workflow[] }) {\n  return {\n    type: ACTION_SET_WORKFLOWS,\n    payload: workflows,\n  };\n}\n\nexport function deleteStage(stageId: number) {\n  return {\n    type: ACTION_DELETE_STAGE,\n    payload: {\n      stageId,\n    },\n  };\n}\n\nexport function addStage(stage: Partial<Stage>) {\n  return {\n    type: ACTION_ADD_STAGE,\n    payload: stage,\n  };\n}\n\nexport interface PartialStage extends Omit<Stage, 'permissions'> {\n  permissions?: Partial<Permission>[];\n}\n\nexport function updateStage(stageId: number, payload: Partial<PartialStage>) {\n  return {\n    type: ACTION_UPDATE_STAGE,\n    payload: {\n      stageId,\n      ...payload,\n    },\n  };\n}\n\nexport function updateStages(payload: Partial<PartialStage>) {\n  return {\n    type: ACTION_UPDATE_STAGES,\n    payload,\n  };\n}\n\nexport function updateStagePosition(oldIndex: number, newIndex: number) {\n  return {\n    type: ACTION_UPDATE_STAGE_POSITION,\n    payload: {\n      newIndex,\n      oldIndex,\n    },\n  };\n}\n\nexport function updateWorkflow(payload: Partial<Workflow>) {\n  return {\n    type: ACTION_UPDATE_WORKFLOW,\n    payload,\n  };\n}\n\nexport function resetWorkflow() {\n  return {\n    type: ACTION_RESET_WORKFLOW,\n  };\n}\n\nexport function setContentTypes(payload: {\n  collectionTypes?: Contracts.ContentTypes.ContentType[];\n  singleTypes?: Contracts.ContentTypes.ContentType[];\n}) {\n  return {\n    type: ACTION_SET_CONTENT_TYPES,\n    payload,\n  };\n}\n\nexport function setRoles(payload?: (SanitizedAdminRole & { usersCount?: number | undefined })[]) {\n  return {\n    type: ACTION_SET_ROLES,\n    payload,\n  };\n}\n\nexport function setIsLoading(isLoading: boolean) {\n  return {\n    type: ACTION_SET_IS_LOADING,\n    payload: isLoading,\n  };\n}\n","import React from 'react';\n\nimport { Box, ButtonProps, Flex, Typography } from '@strapi/design-system';\nimport { PlusCircle } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nconst StyledAddIcon = styled(PlusCircle)`\n  > circle {\n    fill: ${({ theme }) => theme.colors.neutral150};\n  }\n  > path {\n    fill: ${({ theme }) => theme.colors.neutral600};\n  }\n`;\n\nconst StyledButton = styled(Box)`\n  border-radius: 26px;\n\n  svg {\n    height: ${({ theme }) => theme.spaces[6]};\n    width: ${({ theme }) => theme.spaces[6]};\n\n    > path {\n      fill: ${({ theme }) => theme.colors.neutral600};\n    }\n  }\n\n  &:hover {\n    color: ${({ theme }) => theme.colors.primary600} !important;\n    ${Typography} {\n      color: ${({ theme }) => theme.colors.primary600} !important;\n    }\n\n    ${StyledAddIcon} {\n      > circle {\n        fill: ${({ theme }) => theme.colors.primary600};\n      }\n      > path {\n        fill: ${({ theme }) => theme.colors.neutral100};\n      }\n    }\n  }\n\n  &:active {\n    ${Typography} {\n      color: ${({ theme }) => theme.colors.primary600};\n    }\n\n    ${StyledAddIcon} {\n      > circle {\n        fill: ${({ theme }) => theme.colors.primary600};\n      }\n      > path {\n        fill: ${({ theme }) => theme.colors.neutral100};\n      }\n    }\n  }\n`;\n\nexport const AddStage = ({ children, ...props }: ButtonProps) => {\n  return (\n    <StyledButton\n      as=\"button\"\n      background=\"neutral0\"\n      border=\"neutral150\"\n      paddingBottom={3}\n      paddingLeft={4}\n      paddingRight={4}\n      paddingTop={3}\n      shadow=\"filterShadow\"\n      {...props}\n    >\n      <Flex gap={2}>\n        <StyledAddIcon aria-hidden />\n\n        <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral500\">\n          {children}\n        </Typography>\n      </Flex>\n    </StyledButton>\n  );\n};\n\nAddStage.propTypes = {\n  children: PropTypes.node.isRequired,\n};\n","import { Schema } from '@strapi/types';\nimport { createDraft, produce } from 'immer';\n\nimport {\n  Stage,\n  StagePermission,\n  Workflow,\n} from '../../../../../../../shared/contracts/review-workflows';\nimport { AdminRole } from '../../../../../../../shared/contracts/shared';\n\nimport {\n  ACTION_ADD_STAGE,\n  ACTION_CLONE_STAGE,\n  ACTION_DELETE_STAGE,\n  ACTION_RESET_WORKFLOW,\n  ACTION_SET_CONTENT_TYPES,\n  ACTION_SET_IS_LOADING,\n  ACTION_SET_ROLES,\n  ACTION_SET_WORKFLOW,\n  ACTION_SET_WORKFLOWS,\n  ACTION_UPDATE_STAGE,\n  ACTION_UPDATE_STAGES,\n  ACTION_UPDATE_STAGE_POSITION,\n  ACTION_UPDATE_WORKFLOW,\n  STAGE_COLOR_DEFAULT,\n} from './constants';\n\nexport type CurrentWorkflow = Partial<\n  Pick<Workflow, 'name' | 'contentTypes' | 'stages' | 'id'> & {\n    permissions?: StagePermission[];\n  }\n>;\n\nexport type PartialWorkflow = Omit<CurrentWorkflow, 'stages'> & { stages?: Partial<Stage>[] };\n\nexport interface ServerState {\n  contentTypes?: {\n    collectionTypes: Schema.CollectionType[];\n    singleTypes: Schema.SingleType[];\n  };\n  roles?: AdminRole[];\n  workflow?: PartialWorkflow | null;\n  workflows?: Workflow[];\n}\n\n// This isn't something we should do.\n// TODO: Revamp the way we are handling this temp key for delete or create\nexport type StageWithTempKey = Stage & { __temp_key__?: number };\nexport interface ClientState {\n  currentWorkflow: {\n    data: Partial<Omit<CurrentWorkflow, 'stages'> & { stages: StageWithTempKey[] }>;\n  };\n  isLoading?: boolean;\n}\n\nexport type State = {\n  serverState: ServerState;\n  clientState: ClientState;\n};\n\nexport const initialState: State = {\n  serverState: {\n    contentTypes: {\n      collectionTypes: [],\n      singleTypes: [],\n    },\n    roles: [],\n    workflow: null,\n    workflows: [],\n  },\n  clientState: {\n    currentWorkflow: {\n      data: {\n        name: '',\n        contentTypes: [],\n        stages: [],\n        permissions: undefined,\n      },\n    },\n    isLoading: true,\n  },\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function reducer(state: State = initialState, action: { type: string; payload?: any }) {\n  return produce(state, (draft) => {\n    const { payload } = action;\n\n    switch (action.type) {\n      case ACTION_SET_CONTENT_TYPES: {\n        draft.serverState.contentTypes = payload;\n        break;\n      }\n\n      case ACTION_SET_IS_LOADING: {\n        draft.clientState.isLoading = payload;\n        break;\n      }\n\n      case ACTION_SET_ROLES: {\n        draft.serverState.roles = payload;\n        break;\n      }\n\n      case ACTION_SET_WORKFLOW: {\n        const workflow: Workflow = payload;\n\n        if (workflow) {\n          draft.serverState.workflow = workflow;\n          draft.clientState.currentWorkflow.data = {\n            ...workflow,\n            stages: workflow.stages.map((stage) => ({\n              ...stage,\n              // A safety net in case a stage does not have a color assigned;\n              // this should not happen\n              color: stage?.color ?? STAGE_COLOR_DEFAULT,\n            })),\n          };\n        }\n        break;\n      }\n\n      case ACTION_SET_WORKFLOWS: {\n        draft.serverState.workflows = payload;\n        break;\n      }\n\n      case ACTION_RESET_WORKFLOW: {\n        draft.clientState = initialState.clientState;\n        draft.serverState = createDraft(initialState.serverState);\n        break;\n      }\n\n      case ACTION_DELETE_STAGE: {\n        const { stageId } = payload;\n        const { currentWorkflow } = state.clientState;\n\n        draft.clientState.currentWorkflow.data.stages = currentWorkflow.data.stages?.filter(\n          (stage) => (stage?.id ?? stage.__temp_key__) !== stageId\n        );\n\n        break;\n      }\n\n      case ACTION_ADD_STAGE: {\n        const { currentWorkflow } = state.clientState;\n\n        if (!currentWorkflow.data) {\n          draft.clientState.currentWorkflow.data = {\n            stages: [],\n          };\n        }\n\n        const newTempKey = getMaxTempKey(draft.clientState.currentWorkflow.data.stages);\n\n        draft.clientState.currentWorkflow.data.stages?.push({\n          ...payload,\n          color: payload?.color ?? STAGE_COLOR_DEFAULT,\n          __temp_key__: newTempKey,\n        });\n\n        break;\n      }\n\n      case ACTION_CLONE_STAGE: {\n        const { currentWorkflow } = state.clientState;\n        const { id } = payload;\n\n        const sourceStageIndex = currentWorkflow.data.stages?.findIndex(\n          (stage) => (stage?.id ?? stage?.__temp_key__) === id\n        );\n\n        if (sourceStageIndex !== undefined && sourceStageIndex !== -1) {\n          const sourceStage = currentWorkflow.data.stages?.[sourceStageIndex];\n\n          draft.clientState.currentWorkflow.data.stages?.splice(sourceStageIndex + 1, 0, {\n            ...sourceStage,\n            // @ts-expect-error - We are handling temporary (unsaved) duplicated stages with temporary keys and undefined ids. It should be revamp imo\n            id: undefined,\n            __temp_key__: getMaxTempKey(draft.clientState.currentWorkflow.data.stages),\n          });\n        }\n\n        break;\n      }\n\n      case ACTION_UPDATE_STAGE: {\n        const { currentWorkflow } = state.clientState;\n        const { stageId, ...modified } = payload;\n\n        draft.clientState.currentWorkflow.data.stages = currentWorkflow.data.stages?.map((stage) =>\n          (stage.id ?? stage.__temp_key__) === stageId\n            ? {\n                ...stage,\n                ...modified,\n              }\n            : stage\n        );\n\n        break;\n      }\n\n      case ACTION_UPDATE_STAGES: {\n        const { currentWorkflow } = state.clientState;\n\n        draft.clientState.currentWorkflow.data.stages = currentWorkflow.data.stages?.map(\n          (stage) => ({\n            ...stage,\n            ...payload,\n          })\n        );\n\n        break;\n      }\n\n      case ACTION_UPDATE_STAGE_POSITION: {\n        const {\n          currentWorkflow: {\n            data: { stages },\n          },\n        } = state.clientState;\n        const { newIndex, oldIndex } = payload;\n\n        if (stages && newIndex >= 0 && newIndex < stages.length) {\n          const stage = stages[oldIndex];\n          const newStages = [...stages];\n\n          newStages.splice(oldIndex, 1);\n          newStages.splice(newIndex, 0, stage);\n\n          draft.clientState.currentWorkflow.data.stages = newStages;\n        }\n\n        break;\n      }\n\n      case ACTION_UPDATE_WORKFLOW: {\n        draft.clientState.currentWorkflow.data = {\n          ...draft.clientState.currentWorkflow.data,\n          ...payload,\n        };\n\n        break;\n      }\n\n      default:\n        break;\n    }\n  });\n}\n\nconst getMaxTempKey = (stages: StageWithTempKey[] = []): number => {\n  const ids = stages.map((stage) => Number(stage.id ?? stage.__temp_key__));\n\n  /**\n   * If there are no ids it will return 0 as the max value\n   * because the max value is -1.\n   */\n  return Math.max(...ids, -1) + 1;\n};\n","import { createSelector } from '@reduxjs/toolkit';\nimport isEqual from 'lodash/isEqual';\n\nimport { RootState } from '../../../../../../../admin/src/core/store/configure';\nimport { Stage } from '../../../../../../../shared/contracts/review-workflows';\n\nimport { REDUX_NAMESPACE } from './constants';\nimport { State, initialState } from './reducer';\n\ninterface Store extends RootState {\n  [REDUX_NAMESPACE]: State;\n}\n\nexport const selectNamespace = (state: Store) => state[REDUX_NAMESPACE] ?? initialState;\n\nexport const selectContentTypes = createSelector(\n  selectNamespace,\n  ({ serverState: { contentTypes } }) => contentTypes\n);\n\nexport const selectRoles = createSelector(selectNamespace, ({ serverState: { roles } }) => roles);\n\nexport const selectCurrentWorkflow = createSelector(\n  selectNamespace,\n  ({ clientState: { currentWorkflow } }) => currentWorkflow.data\n);\n\nexport const selectWorkflows = createSelector(\n  selectNamespace,\n  ({ serverState: { workflows } }) => workflows\n);\n\nexport const selectIsWorkflowDirty = createSelector(\n  selectNamespace,\n  ({ serverState, clientState: { currentWorkflow } }) =>\n    !isEqual(serverState.workflow, currentWorkflow.data)\n);\n\nexport const selectHasDeletedServerStages = createSelector(\n  selectNamespace,\n  ({ serverState, clientState: { currentWorkflow } }) =>\n    !(serverState.workflow?.stages ?? []).every(\n      (stage: Partial<Stage>) => !!currentWorkflow.data.stages?.find(({ id }) => id === stage.id)\n    )\n);\n\nexport const selectIsLoading = createSelector(\n  selectNamespace,\n  ({ clientState: { isLoading } }) => isLoading\n);\n\nexport const selectServerState = createSelector(selectNamespace, ({ serverState }) => serverState);\n","import * as React from 'react';\n\nimport {\n  Accordion,\n  AccordionContent,\n  AccordionToggle,\n  Box,\n  Flex,\n  Grid,\n  GridItem,\n  IconButton,\n  MultiSelect,\n  MultiSelectGroup,\n  MultiSelectOption,\n  SingleSelect,\n  SingleSelectOption,\n  TextInput,\n  Typography,\n  VisuallyHidden,\n} from '@strapi/design-system';\nimport { Menu, MenuItem } from '@strapi/design-system/v2';\nimport {\n  ConfirmDialog,\n  useNotification,\n  NotAllowedInput,\n  useTracking,\n} from '@strapi/helper-plugin';\nimport { Duplicate, Drag, More } from '@strapi/icons';\nimport { useField } from 'formik';\nimport { getEmptyImage } from 'react-dnd-html5-backend';\nimport { useIntl } from 'react-intl';\nimport { useDispatch, useSelector } from 'react-redux';\nimport styled from 'styled-components';\n\nimport { useDragAndDrop } from '../../../../../../../../admin/src/content-manager/hooks/useDragAndDrop';\nimport { composeRefs } from '../../../../../../../../admin/src/content-manager/utils/refs';\nimport { StagePermission } from '../../../../../../../../shared/contracts/review-workflows';\nimport {\n  cloneStage,\n  deleteStage,\n  updateStage,\n  updateStagePosition,\n  updateStages,\n} from '../actions';\nimport { DRAG_DROP_TYPES } from '../constants';\nimport { selectRoles } from '../selectors';\nimport { getAvailableStageColors, getStageColorByHex } from '../utils/colors';\n\nconst NestedOption = styled(MultiSelectOption)`\n  padding-left: ${({ theme }) => theme.spaces[7]};\n`;\n\n// Grow the size of the permission Select\nconst PermissionWrapper = styled(Flex)`\n  > * {\n    flex-grow: 1;\n  }\n`;\n\nconst DeleteMenuItem = styled(MenuItem)`\n  color: ${({ theme }) => theme.colors.danger600};\n`;\n\n// Removing the font-size from the child-span aligns the\n// more icon vertically\nconst ContextMenuTrigger = styled(Menu.Trigger)`\n  :hover,\n  :focus {\n    background-color: ${({ theme }) => theme.colors.neutral100};\n  }\n\n  > span {\n    font-size: 0;\n  }\n`;\n\n// As soon as either `as` or `forwardedAs` is set, the component\n// resets some styles and e.g. the `hasBorder` prop no longer works,\n// which is why this bit of CSS has been added manually ¯\\_(ツ)_/¯\nconst DragIconButton = styled(IconButton)`\n  align-items: center;\n  border-radius: ${({ theme }) => theme.borderRadius};\n  display: flex;\n  justify-content: center;\n\n  :hover,\n  :focus {\n    background-color: ${({ theme }) => theme.colors.neutral100};\n  }\n\n  svg {\n    height: auto;\n    width: ${({ theme }) => theme.spaces[3]}};\n  }\n`;\n\nconst AVAILABLE_COLORS = getAvailableStageColors();\n\nconst StageDropPreview = () => {\n  return (\n    <Box\n      background=\"primary100\"\n      borderStyle=\"dashed\"\n      borderColor=\"primary600\"\n      borderWidth=\"1px\"\n      display=\"block\"\n      hasRadius\n      padding={6}\n      shadow=\"tableShadow\"\n    />\n  );\n};\n\nexport type StageProps = {\n  id: number;\n  index: number;\n  canDelete: boolean;\n  canReorder: boolean;\n  canUpdate: boolean;\n  isOpen: boolean;\n  stagesCount: number;\n};\n\nexport const Stage = ({\n  id,\n  index,\n  canDelete,\n  canReorder,\n  canUpdate,\n  isOpen: isOpenDefault = false,\n  stagesCount,\n}: StageProps) => {\n  const getItemPos = (index: number) => `${index + 1} of ${stagesCount}`;\n\n  const handleGrabStage = (index: number) => {\n    setLiveText(\n      formatMessage(\n        {\n          id: 'dnd.grab-item',\n          defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`,\n        },\n        {\n          item: nameField.value,\n          position: getItemPos(index),\n        }\n      )\n    );\n  };\n\n  const handleDropStage = (index: number) => {\n    setLiveText(\n      formatMessage(\n        {\n          id: 'dnd.drop-item',\n          defaultMessage: `{item}, dropped. Final position in list: {position}.`,\n        },\n        {\n          item: nameField.value,\n          position: getItemPos(index),\n        }\n      )\n    );\n  };\n\n  const handleCancelDragStage = () => {\n    setLiveText(\n      formatMessage(\n        {\n          id: 'dnd.cancel-item',\n          defaultMessage: '{item}, dropped. Re-order cancelled.',\n        },\n        {\n          item: nameField.value,\n        }\n      )\n    );\n  };\n\n  const handleMoveStage = (newIndex: number, oldIndex: number) => {\n    setLiveText(\n      formatMessage(\n        {\n          id: 'dnd.reorder',\n          defaultMessage: '{item}, moved. New position in list: {position}.',\n        },\n        {\n          item: nameField.value,\n          position: getItemPos(newIndex),\n        }\n      )\n    );\n\n    dispatch(updateStagePosition(oldIndex, newIndex));\n  };\n\n  const handleApplyPermissionsToAllStages = () => {\n    setIsApplyAllConfirmationOpen(true);\n  };\n\n  const [liveText, setLiveText] = React.useState(null);\n  const { formatMessage } = useIntl();\n  const { trackUsage } = useTracking();\n  const dispatch = useDispatch();\n  const toggleNotification = useNotification();\n  const [isOpen, setIsOpen] = React.useState(isOpenDefault);\n  const [isApplyAllConfirmationOpen, setIsApplyAllConfirmationOpen] = React.useState(false);\n  const [nameField, nameMeta, nameHelper] = useField(`stages.${index}.name`);\n  const [colorField, colorMeta, colorHelper] = useField(`stages.${index}.color`);\n  const [permissionsField, permissionsMeta, permissionsHelper] = useField<\n    Partial<StagePermission>[]\n  >(`stages.${index}.permissions`);\n  const roles = useSelector(selectRoles);\n  const [{ handlerId, isDragging, handleKeyDown }, stageRef, dropRef, dragRef, dragPreviewRef] =\n    useDragAndDrop(canReorder, {\n      index,\n      item: {\n        index,\n        name: nameField.value,\n      },\n      onGrabItem: handleGrabStage,\n      onDropItem: handleDropStage,\n      onMoveItem: handleMoveStage,\n      onCancel: handleCancelDragStage,\n      type: DRAG_DROP_TYPES.STAGE,\n    });\n\n  const composedRef = composeRefs(stageRef, dropRef);\n\n  const colorOptions = AVAILABLE_COLORS.map(({ hex, name }) => ({\n    value: hex,\n    label: formatMessage(\n      {\n        id: 'Settings.review-workflows.stage.color.name',\n        defaultMessage: '{name}',\n      },\n      { name }\n    ),\n    color: hex,\n  }));\n\n  const { themeColorName } = getStageColorByHex(colorField.value) ?? {};\n\n  const filteredRoles = roles\n    // Super admins always have permissions to do everything and therefore\n    // there is no point for this role to show up in the role combobox\n    ?.filter((role) => role.code !== 'strapi-super-admin');\n\n  React.useEffect(() => {\n    dragPreviewRef(getEmptyImage(), { captureDraggingState: false });\n  }, [dragPreviewRef, index]);\n\n  return (\n    <Box ref={(ref) => composedRef(ref!)}>\n      {liveText && <VisuallyHidden aria-live=\"assertive\">{liveText}</VisuallyHidden>}\n\n      {isDragging ? (\n        <StageDropPreview />\n      ) : (\n        <Accordion\n          size=\"S\"\n          variant=\"primary\"\n          onToggle={() => {\n            setIsOpen(!isOpen);\n\n            if (!isOpen) {\n              trackUsage('willEditStage');\n            }\n          }}\n          expanded={isOpen}\n          shadow=\"tableShadow\"\n          error={nameMeta.error ?? colorMeta?.error ?? permissionsMeta?.error}\n          hasErrorMessage={false}\n        >\n          <AccordionToggle\n            title={nameField.value}\n            togglePosition=\"left\"\n            action={\n              (canDelete || canUpdate) && (\n                <Flex>\n                  <Menu.Root>\n                    <ContextMenuTrigger size=\"S\" endIcon={null} paddingLeft={2} paddingRight={2}>\n                      <More aria-hidden focusable={false} />\n                      <VisuallyHidden as=\"span\">\n                        {formatMessage({\n                          id: '[tbdb].components.DynamicZone.more-actions',\n                          defaultMessage: 'More actions',\n                        })}\n                      </VisuallyHidden>\n                    </ContextMenuTrigger>\n                    {/* z-index needs to be as big as the one defined for the wrapper in Stages, otherwise the menu\n                     * disappears behind the accordion\n                     */}\n                    <Menu.Content popoverPlacement=\"bottom-end\" zIndex={2}>\n                      <Menu.SubRoot>\n                        {canUpdate && (\n                          <MenuItem onClick={() => dispatch(cloneStage(id))}>\n                            {formatMessage({\n                              id: 'Settings.review-workflows.stage.delete',\n                              defaultMessage: 'Duplicate stage',\n                            })}\n                          </MenuItem>\n                        )}\n\n                        {canDelete && (\n                          <DeleteMenuItem onClick={() => dispatch(deleteStage(id))}>\n                            {formatMessage({\n                              id: 'Settings.review-workflows.stage.delete',\n                              defaultMessage: 'Delete',\n                            })}\n                          </DeleteMenuItem>\n                        )}\n                      </Menu.SubRoot>\n                    </Menu.Content>\n                  </Menu.Root>\n\n                  {canUpdate && (\n                    <DragIconButton\n                      background=\"transparent\"\n                      // @ts-expect-error - forwardedAs needs to be defined as string in the IconButton props\n                      forwardedAs=\"div\"\n                      hasRadius\n                      role=\"button\"\n                      noBorder\n                      tabIndex={0}\n                      data-handler-id={handlerId}\n                      ref={dragRef}\n                      label={formatMessage({\n                        id: 'Settings.review-workflows.stage.drag',\n                        defaultMessage: 'Drag',\n                      })}\n                      onClick={(e) => e.stopPropagation()}\n                      onKeyDown={handleKeyDown}\n                    >\n                      <Drag />\n                    </DragIconButton>\n                  )}\n                </Flex>\n              )\n            }\n          />\n          <AccordionContent padding={6} background=\"neutral0\" hasRadius>\n            <Grid gap={4}>\n              <GridItem col={6}>\n                <TextInput\n                  {...nameField}\n                  id={nameField.name}\n                  disabled={!canUpdate}\n                  label={formatMessage({\n                    id: 'Settings.review-workflows.stage.name.label',\n                    defaultMessage: 'Stage name',\n                  })}\n                  error={nameMeta.error ?? false}\n                  onChange={(event) => {\n                    nameHelper.setValue(event.target.value);\n                    dispatch(updateStage(id, { name: event.target.value }));\n                  }}\n                  required\n                />\n              </GridItem>\n\n              <GridItem col={6}>\n                <SingleSelect\n                  disabled={!canUpdate}\n                  error={colorMeta?.error ?? false}\n                  id={colorField.name}\n                  required\n                  label={formatMessage({\n                    id: 'content-manager.reviewWorkflows.stage.color',\n                    defaultMessage: 'Color',\n                  })}\n                  onChange={(value) => {\n                    colorHelper.setValue(value);\n                    dispatch(updateStage(id, { color: String(value) }));\n                  }}\n                  value={colorField.value.toUpperCase()}\n                  startIcon={\n                    <Flex\n                      as=\"span\"\n                      height={2}\n                      background={colorField.value}\n                      // @ts-expect-error - transparent doesn't exist in theme.colors\n                      borderColor={themeColorName === 'neutral0' ? 'neutral150' : 'transparent'}\n                      hasRadius\n                      shrink={0}\n                      width={2}\n                    />\n                  }\n                >\n                  {colorOptions.map(({ value, label, color }) => {\n                    const { themeColorName } = getStageColorByHex(color) || {};\n\n                    return (\n                      <SingleSelectOption\n                        value={value}\n                        key={value}\n                        startIcon={\n                          <Flex\n                            as=\"span\"\n                            height={2}\n                            background={color}\n                            // @ts-expect-error - transparent doesn't exist in theme.colors\n                            borderColor={\n                              themeColorName === 'neutral0' ? 'neutral150' : 'transparent'\n                            }\n                            hasRadius\n                            shrink={0}\n                            width={2}\n                          />\n                        }\n                      >\n                        {label}\n                      </SingleSelectOption>\n                    );\n                  })}\n                </SingleSelect>\n              </GridItem>\n\n              <GridItem col={6}>\n                {filteredRoles?.length === 0 ? (\n                  <NotAllowedInput\n                    description={{\n                      id: 'Settings.review-workflows.stage.permissions.noPermissions.description',\n                      defaultMessage: 'You don’t have the permission to see roles',\n                    }}\n                    intlLabel={{\n                      id: 'Settings.review-workflows.stage.permissions.label',\n                      defaultMessage: 'Roles that can change this stage',\n                    }}\n                    name={permissionsField.name}\n                  />\n                ) : (\n                  <Flex alignItems=\"flex-end\" gap={3}>\n                    <PermissionWrapper grow={1}>\n                      <MultiSelect\n                        {...permissionsField}\n                        disabled={!canUpdate}\n                        error={permissionsMeta.error ?? false}\n                        id={permissionsField.name}\n                        label={formatMessage({\n                          id: 'Settings.review-workflows.stage.permissions.label',\n                          defaultMessage: 'Roles that can change this stage',\n                        })}\n                        onChange={(values) => {\n                          // Because the select components expects strings for values, but\n                          // the yup schema validates we are sending full permission objects to the API,\n                          // we must coerce the string value back to an object\n                          const permissions = values.map((value) => ({\n                            role: parseInt(value, 10),\n                            action: 'admin::review-workflows.stage.transition',\n                          }));\n\n                          permissionsHelper.setValue(permissions);\n                          dispatch(updateStage(id, { permissions }));\n                        }}\n                        placeholder={formatMessage({\n                          id: 'Settings.review-workflows.stage.permissions.placeholder',\n                          defaultMessage: 'Select a role',\n                        })}\n                        required\n                        // The Select component expects strings for values\n                        value={(permissionsField.value ?? []).map(\n                          (permission) => `${permission.role}`\n                        )}\n                        withTags\n                      >\n                        <MultiSelectGroup\n                          label={formatMessage({\n                            id: 'Settings.review-workflows.stage.permissions.allRoles.label',\n                            defaultMessage: 'All roles',\n                          })}\n                          values={filteredRoles?.map((r) => `${r.id}`)}\n                        >\n                          {filteredRoles?.map((role) => {\n                            return (\n                              <NestedOption key={role.id} value={`${role.id}`}>\n                                {role.name}\n                              </NestedOption>\n                            );\n                          })}\n                        </MultiSelectGroup>\n                      </MultiSelect>\n                    </PermissionWrapper>\n\n                    <IconButton\n                      disabled={!canUpdate}\n                      icon={<Duplicate />}\n                      label={formatMessage({\n                        id: 'Settings.review-workflows.stage.permissions.apply.label',\n                        defaultMessage: 'Apply to all stages',\n                      })}\n                      size=\"L\"\n                      variant=\"secondary\"\n                      onClick={() => handleApplyPermissionsToAllStages()}\n                    />\n                  </Flex>\n                )}\n              </GridItem>\n            </Grid>\n          </AccordionContent>\n        </Accordion>\n      )}\n\n      <ConfirmDialog.Root\n        iconRightButton={null}\n        isOpen={isApplyAllConfirmationOpen}\n        onToggleDialog={() => setIsApplyAllConfirmationOpen(false)}\n        onConfirm={() => {\n          dispatch(updateStages({ permissions: permissionsField.value }));\n          setIsApplyAllConfirmationOpen(false);\n          toggleNotification({\n            type: 'success',\n            message: formatMessage({\n              id: 'Settings.review-workflows.page.edit.confirm.stages.permissions.copy.success',\n              defaultMessage: 'Applied roles to all other stages of the workflow',\n            }),\n          });\n        }}\n        variantRightButton=\"default\"\n      >\n        <ConfirmDialog.Body>\n          <Typography textAlign=\"center\" variant=\"omega\">\n            {formatMessage({\n              id: 'Settings.review-workflows.page.edit.confirm.stages.permissions.copy',\n              defaultMessage:\n                'Roles that can change that stage will be applied to all the other stages.',\n            })}\n          </Typography>\n        </ConfirmDialog.Body>\n      </ConfirmDialog.Root>\n    </Box>\n  );\n};\n","import React from 'react';\n\nimport { Box, Flex } from '@strapi/design-system';\nimport { useTracking } from '@strapi/helper-plugin';\nimport { useIntl } from 'react-intl';\nimport { useDispatch } from 'react-redux';\nimport styled from 'styled-components';\n\nimport { Stage as StageType } from '../../../../../../../../shared/contracts/review-workflows';\nimport { addStage } from '../actions';\n\nimport { AddStage } from './AddStage';\nimport { Stage } from './Stage';\n\nconst Background = styled(Box)`\n  transform: translateX(-50%);\n`;\n\nexport type StagesProps = {\n  canDelete?: boolean;\n  canUpdate?: boolean;\n  stages?: StageType[];\n};\n\nexport const Stages = ({ canDelete = true, canUpdate = true, stages = [] }: StagesProps) => {\n  const { formatMessage } = useIntl();\n  const dispatch = useDispatch();\n  const { trackUsage } = useTracking();\n\n  return (\n    <Flex direction=\"column\" gap={6} width=\"100%\">\n      <Box position=\"relative\" width=\"100%\">\n        <Background\n          background=\"neutral200\"\n          height=\"100%\"\n          left=\"50%\"\n          position=\"absolute\"\n          top=\"0\"\n          width={2}\n          zIndex={1}\n        />\n\n        <Flex\n          direction=\"column\"\n          alignItems=\"stretch\"\n          gap={6}\n          zIndex={2}\n          position=\"relative\"\n          as=\"ol\"\n        >\n          {stages.map((stage, index) => {\n            // @ts-expect-error - temp key should be fixed in order to use another value\n            const id = Number(stage?.id ?? stage.__temp_key__);\n\n            return (\n              <Box key={`stage-${id}`} as=\"li\">\n                <Stage\n                  id={id}\n                  index={index}\n                  isOpen={!stage.id}\n                  canDelete={stages.length > 1 && canDelete}\n                  canReorder={stages.length > 1}\n                  canUpdate={canUpdate}\n                  stagesCount={stages.length}\n                />\n              </Box>\n            );\n          })}\n        </Flex>\n      </Box>\n\n      {canUpdate && (\n        <AddStage\n          type=\"button\"\n          onClick={() => {\n            dispatch(addStage({ name: '' }));\n            trackUsage('willCreateStage');\n          }}\n        >\n          {formatMessage({\n            id: 'Settings.review-workflows.stage.add',\n            defaultMessage: 'Add new stage',\n          })}\n        </AddStage>\n      )}\n    </Flex>\n  );\n};\n","import * as React from 'react';\n\nimport {\n  Grid,\n  GridItem,\n  MultiSelect,\n  MultiSelectGroup,\n  MultiSelectOption,\n  TextInput,\n  Typography,\n} from '@strapi/design-system';\nimport { useCollator } from '@strapi/helper-plugin';\nimport { useField } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { useDispatch, useSelector } from 'react-redux';\nimport styled from 'styled-components';\n\nimport { updateWorkflow } from '../actions';\nimport { selectContentTypes, selectCurrentWorkflow, selectWorkflows } from '../selectors';\n\nconst NestedOption = styled(MultiSelectOption)`\n  padding-left: ${({ theme }) => theme.spaces[7]};\n`;\n\nconst ContentTypeTakeNotice = styled(Typography)`\n  font-style: italic;\n`;\n\nexport type WorkflowAttributesProps = {\n  canUpdate?: boolean;\n};\n\nexport const WorkflowAttributes = ({ canUpdate = true }: WorkflowAttributesProps) => {\n  const { formatMessage, locale } = useIntl();\n  const dispatch = useDispatch();\n  const contentTypes = useSelector(selectContentTypes);\n  const currentWorkflow = useSelector(selectCurrentWorkflow);\n  const workflows = useSelector(selectWorkflows);\n  const [nameField, nameMeta, nameHelper] = useField('name');\n  const [contentTypesField, contentTypesMeta, contentTypesHelper] = useField('contentTypes');\n  const formatter = useCollator(locale, {\n    sensitivity: 'base',\n  });\n\n  return (\n    <Grid background=\"neutral0\" hasRadius gap={4} padding={6} shadow=\"tableShadow\">\n      <GridItem col={6}>\n        <TextInput\n          {...nameField}\n          id={nameField.name}\n          disabled={!canUpdate}\n          label={formatMessage({\n            id: 'Settings.review-workflows.workflow.name.label',\n            defaultMessage: 'Workflow Name',\n          })}\n          error={nameMeta.error ?? false}\n          onChange={(event) => {\n            dispatch(updateWorkflow({ name: event.target.value }));\n            nameHelper.setValue(event.target.value);\n          }}\n          required\n        />\n      </GridItem>\n\n      {contentTypes && (\n        <GridItem col={6}>\n          <MultiSelect\n            {...contentTypesField}\n            customizeContent={(value) =>\n              formatMessage(\n                {\n                  id: 'Settings.review-workflows.workflow.contentTypes.displayValue',\n                  defaultMessage:\n                    '{count} {count, plural, one {content type} other {content types}} selected',\n                },\n                { count: value?.length }\n              )\n            }\n            disabled={!canUpdate}\n            error={contentTypesMeta.error ?? false}\n            id={contentTypesField.name}\n            label={formatMessage({\n              id: 'Settings.review-workflows.workflow.contentTypes.label',\n              defaultMessage: 'Associated to',\n            })}\n            onChange={(values) => {\n              dispatch(updateWorkflow({ contentTypes: values }));\n              contentTypesHelper.setValue(values);\n            }}\n            placeholder={formatMessage({\n              id: 'Settings.review-workflows.workflow.contentTypes.placeholder',\n              defaultMessage: 'Select',\n            })}\n          >\n            {[\n              ...(contentTypes.collectionTypes.length > 0\n                ? [\n                    {\n                      label: formatMessage({\n                        id: 'Settings.review-workflows.workflow.contentTypes.collectionTypes.label',\n                        defaultMessage: 'Collection Types',\n                      }),\n                      children: [...contentTypes.collectionTypes]\n                        .sort((a, b) => formatter.compare(a.info.displayName, b.info.displayName))\n                        .map((contentType) => ({\n                          label: contentType.info.displayName,\n                          value: contentType.uid,\n                        })),\n                    },\n                  ]\n                : []),\n\n              ...(contentTypes.singleTypes.length > 0\n                ? [\n                    {\n                      label: formatMessage({\n                        id: 'Settings.review-workflows.workflow.contentTypes.singleTypes.label',\n                        defaultMessage: 'Single Types',\n                      }),\n                      children: [...contentTypes.singleTypes].map((contentType) => ({\n                        label: contentType.info.displayName,\n                        value: contentType.uid,\n                      })),\n                    },\n                  ]\n                : []),\n            ].map((opt) => {\n              if ('children' in opt) {\n                return (\n                  <MultiSelectGroup\n                    key={opt.label}\n                    label={opt.label}\n                    values={opt.children.map((child) => child.value.toString())}\n                  >\n                    {opt.children.map((child) => {\n                      const { name: assignedWorkflowName } =\n                        workflows?.find(\n                          (workflow) =>\n                            ((currentWorkflow && workflow.id !== currentWorkflow.id) ||\n                              !currentWorkflow) &&\n                            workflow.contentTypes.includes(child.value)\n                        ) ?? {};\n\n                      return (\n                        <NestedOption key={child.value} value={child.value}>\n                          <Typography>\n                            {\n                              // @ts-expect-error - formatMessage options doesn't expect to be a React component but that's what we need actually for the <i> and <em> components\n                              formatMessage(\n                                {\n                                  id: 'Settings.review-workflows.workflow.contentTypes.assigned.notice',\n                                  defaultMessage:\n                                    '{label} {name, select, undefined {} other {<i>(assigned to <em>{name}</em> workflow)</i>}}',\n                                },\n                                {\n                                  label: child.label,\n                                  name: assignedWorkflowName,\n                                  em: (...children) => (\n                                    <Typography as=\"em\" fontWeight=\"bold\">\n                                      {children}\n                                    </Typography>\n                                  ),\n                                  i: (...children) => (\n                                    <ContentTypeTakeNotice>{children}</ContentTypeTakeNotice>\n                                  ),\n                                }\n                              )\n                            }\n                          </Typography>\n                        </NestedOption>\n                      );\n                    })}\n                  </MultiSelectGroup>\n                );\n              }\n            })}\n          </MultiSelect>\n        </GridItem>\n      )}\n    </Grid>\n  );\n};\n","import set from 'lodash/set';\nimport { IntlFormatters } from 'react-intl';\nimport * as yup from 'yup';\n\nimport { Stage } from '../../../../../../../../shared/contracts/review-workflows';\nimport { PartialWorkflow } from '../reducer';\n\nexport async function validateWorkflow({\n  values,\n  formatMessage,\n}: { values: PartialWorkflow } & Pick<IntlFormatters, 'formatMessage'>) {\n  const schema = yup.object({\n    contentTypes: yup.array().of(yup.string()),\n    name: yup\n      .string()\n      .max(\n        255,\n        formatMessage({\n          id: 'Settings.review-workflows.validation.name.max-length',\n          defaultMessage: 'Name can not be longer than 255 characters',\n        })\n      )\n      .required(),\n\n    stages: yup\n      .array()\n      .of(\n        yup.object().shape({\n          name: yup\n            .string()\n            .required(\n              formatMessage({\n                id: 'Settings.review-workflows.validation.stage.name',\n                defaultMessage: 'Name is required',\n              })\n            )\n            .max(\n              255,\n              formatMessage({\n                id: 'Settings.review-workflows.validation.stage.max-length',\n                defaultMessage: 'Name can not be longer than 255 characters',\n              })\n            )\n            .test(\n              'unique-name',\n              formatMessage({\n                id: 'Settings.review-workflows.validation.stage.duplicate',\n                defaultMessage: 'Stage name must be unique',\n              }),\n              function (stageName) {\n                const {\n                  options: { context },\n                } = this;\n\n                return (\n                  context?.stages.filter((stage: Stage) => stage.name === stageName).length === 1\n                );\n              }\n            ),\n          color: yup\n            .string()\n            .required(\n              formatMessage({\n                id: 'Settings.review-workflows.validation.stage.color',\n                defaultMessage: 'Color is required',\n              })\n            )\n            .matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i),\n\n          permissions: yup\n            .array(\n              yup.object({\n                role: yup\n                  .number()\n                  .strict()\n                  .typeError(\n                    formatMessage({\n                      id: 'Settings.review-workflows.validation.stage.permissions.role.number',\n                      defaultMessage: 'Role must be of type number',\n                    })\n                  )\n                  .required(),\n                action: yup.string().required({\n                  id: 'Settings.review-workflows.validation.stage.permissions.action.required',\n                  defaultMessage: 'Action is a required argument',\n                }),\n              })\n            )\n            .strict(),\n        })\n      )\n      .min(1),\n  });\n\n  try {\n    await schema.validate(values, { abortEarly: false, context: values });\n\n    return true;\n  } catch (error) {\n    const errors = {};\n\n    if (error instanceof yup.ValidationError) {\n      error.inner.forEach((error) => {\n        if (error.path) set(errors, error.path, error.message);\n      });\n    }\n\n    return errors;\n  }\n}\n"],"names":["reducer","NestedOption","index","themeColorName","error"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAegB,SAAA,iBAAiB,WAAmBA,UAAkB;AACpE,QAAM,QAAQ;AAEd,YAAU,MAAM;AACR,UAAA,cAAc,WAAWA,QAAO;AAAA,EACrC,GAAA,CAAC,OAAO,WAAWA,QAAO,CAAC;AAChC;ACAO,SAAS,WAAW,IAAY;AAC9B,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAS,EAAE,GAAG;AAAA,EAAA;AAElB;AAEgB,SAAA,YAAY,EAAE,YAA2C;AAChE,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EAAA;AAEb;AAEgB,SAAA,aAAa,EAAE,aAAwC;AAC9D,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EAAA;AAEb;AAEO,SAAS,YAAY,SAAiB;AACpC,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,IACF;AAAA,EAAA;AAEJ;AAEO,SAAS,SAAS,OAAuB;AACvC,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EAAA;AAEb;AAMgB,SAAA,YAAY,SAAiB,SAAgC;AACpE,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,MACA,GAAG;AAAA,IACL;AAAA,EAAA;AAEJ;AAEO,SAAS,aAAa,SAAgC;AACpD,SAAA;AAAA,IACL,MAAM;AAAA,IACN;AAAA,EAAA;AAEJ;AAEgB,SAAA,oBAAoB,UAAkB,UAAkB;AAC/D,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,MACA;AAAA,IACF;AAAA,EAAA;AAEJ;AAEO,SAAS,eAAe,SAA4B;AAClD,SAAA;AAAA,IACL,MAAM;AAAA,IACN;AAAA,EAAA;AAEJ;AAEO,SAAS,gBAAgB;AACvB,SAAA;AAAA,IACL,MAAM;AAAA,EAAA;AAEV;AAEO,SAAS,gBAAgB,SAG7B;AACM,SAAA;AAAA,IACL,MAAM;AAAA,IACN;AAAA,EAAA;AAEJ;AAEO,SAAS,SAAS,SAAwE;AACxF,SAAA;AAAA,IACL,MAAM;AAAA,IACN;AAAA,EAAA;AAEJ;AAEO,SAAS,aAAa,WAAoB;AACxC,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EAAA;AAEb;ACrHA,MAAM,gBAAgB,OAAO,UAAU;AAAA;AAAA,YAE3B,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA;AAAA;AAAA,YAGtC,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA;AAAA;AAIlD,MAAM,eAAe,OAAO,GAAG;AAAA;AAAA;AAAA;AAAA,cAIjB,CAAC,EAAE,YAAY,MAAM,OAAO,CAAC,CAAC;AAAA,aAC/B,CAAC,EAAE,YAAY,MAAM,OAAO,CAAC,CAAC;AAAA;AAAA;AAAA,cAG7B,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,aAKvC,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA,MAC7C,UAAU;AAAA,eACD,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA;AAAA;AAAA,MAG/C,aAAa;AAAA;AAAA,gBAEH,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA;AAAA;AAAA,gBAGtC,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMhD,UAAU;AAAA,eACD,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA;AAAA;AAAA,MAG/C,aAAa;AAAA;AAAA,gBAEH,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA;AAAA;AAAA,gBAGtC,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA;AAAA;AAAA;AAAA;AAM/C,MAAM,WAAW,CAAC,EAAE,UAAU,GAAG,YAAyB;AAE7D,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAG;AAAA,MACH,YAAW;AAAA,MACX,QAAO;AAAA,MACP,eAAe;AAAA,MACf,aAAa;AAAA,MACb,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,QAAO;AAAA,MACN,GAAG;AAAA,MAEJ,UAAA,qBAAC,MAAK,EAAA,KAAK,GACT,UAAA;AAAA,QAAC,oBAAA,eAAA,EAAc,eAAW,KAAC,CAAA;AAAA,QAE3B,oBAAC,cAAW,SAAQ,MAAK,YAAW,QAAO,WAAU,cAClD,UACH;AAAA,MAAA,GACF;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,SAAS,YAAY;AAAA,EACnB,UAAU,UAAU,KAAK;AAC3B;AC1BO,MAAM,eAAsB;AAAA,EACjC,aAAa;AAAA,IACX,cAAc;AAAA,MACZ,iBAAiB,CAAC;AAAA,MAClB,aAAa,CAAC;AAAA,IAChB;AAAA,IACA,OAAO,CAAC;AAAA,IACR,UAAU;AAAA,IACV,WAAW,CAAC;AAAA,EACd;AAAA,EACA,aAAa;AAAA,IACX,iBAAiB;AAAA,MACf,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,cAAc,CAAC;AAAA,QACf,QAAQ,CAAC;AAAA,QACT,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAGgB,SAAA,QAAQ,QAAe,cAAc,QAAyC;AACrF,SAAA,QAAQ,OAAO,CAAC,UAAU;AACzB,UAAA,EAAE,QAAY,IAAA;AAEpB,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK,0BAA0B;AAC7B,cAAM,YAAY,eAAe;AACjC;AAAA,MACF;AAAA,MAEA,KAAK,uBAAuB;AAC1B,cAAM,YAAY,YAAY;AAC9B;AAAA,MACF;AAAA,MAEA,KAAK,kBAAkB;AACrB,cAAM,YAAY,QAAQ;AAC1B;AAAA,MACF;AAAA,MAEA,KAAK,qBAAqB;AACxB,cAAM,WAAqB;AAE3B,YAAI,UAAU;AACZ,gBAAM,YAAY,WAAW;AACvB,gBAAA,YAAY,gBAAgB,OAAO;AAAA,YACvC,GAAG;AAAA,YACH,QAAQ,SAAS,OAAO,IAAI,CAAC,WAAW;AAAA,cACtC,GAAG;AAAA;AAAA;AAAA,cAGH,OAAO,OAAO,SAAS;AAAA,YAAA,EACvB;AAAA,UAAA;AAAA,QAEN;AACA;AAAA,MACF;AAAA,MAEA,KAAK,sBAAsB;AACzB,cAAM,YAAY,YAAY;AAC9B;AAAA,MACF;AAAA,MAEA,KAAK,uBAAuB;AAC1B,cAAM,cAAc,aAAa;AAC3B,cAAA,cAAc,YAAY,aAAa,WAAW;AACxD;AAAA,MACF;AAAA,MAEA,KAAK,qBAAqB;AAClB,cAAA,EAAE,QAAY,IAAA;AACd,cAAA,EAAE,gBAAgB,IAAI,MAAM;AAElC,cAAM,YAAY,gBAAgB,KAAK,SAAS,gBAAgB,KAAK,QAAQ;AAAA,UAC3E,CAAC,WAAW,OAAO,MAAM,MAAM,kBAAkB;AAAA,QAAA;AAGnD;AAAA,MACF;AAAA,MAEA,KAAK,kBAAkB;AACf,cAAA,EAAE,gBAAgB,IAAI,MAAM;AAE9B,YAAA,CAAC,gBAAgB,MAAM;AACnB,gBAAA,YAAY,gBAAgB,OAAO;AAAA,YACvC,QAAQ,CAAC;AAAA,UAAA;AAAA,QAEb;AAEA,cAAM,aAAa,cAAc,MAAM,YAAY,gBAAgB,KAAK,MAAM;AAE9E,cAAM,YAAY,gBAAgB,KAAK,QAAQ,KAAK;AAAA,UAClD,GAAG;AAAA,UACH,OAAO,SAAS,SAAS;AAAA,UACzB,cAAc;AAAA,QAAA,CACf;AAED;AAAA,MACF;AAAA,MAEA,KAAK,oBAAoB;AACjB,cAAA,EAAE,gBAAgB,IAAI,MAAM;AAC5B,cAAA,EAAE,GAAO,IAAA;AAET,cAAA,mBAAmB,gBAAgB,KAAK,QAAQ;AAAA,UACpD,CAAC,WAAW,OAAO,MAAM,OAAO,kBAAkB;AAAA,QAAA;AAGhD,YAAA,qBAAqB,UAAa,qBAAqB,IAAI;AAC7D,gBAAM,cAAc,gBAAgB,KAAK,SAAS,gBAAgB;AAElE,gBAAM,YAAY,gBAAgB,KAAK,QAAQ,OAAO,mBAAmB,GAAG,GAAG;AAAA,YAC7E,GAAG;AAAA;AAAA,YAEH,IAAI;AAAA,YACJ,cAAc,cAAc,MAAM,YAAY,gBAAgB,KAAK,MAAM;AAAA,UAAA,CAC1E;AAAA,QACH;AAEA;AAAA,MACF;AAAA,MAEA,KAAK,qBAAqB;AAClB,cAAA,EAAE,gBAAgB,IAAI,MAAM;AAClC,cAAM,EAAE,SAAS,GAAG,SAAA,IAAa;AAEjC,cAAM,YAAY,gBAAgB,KAAK,SAAS,gBAAgB,KAAK,QAAQ;AAAA,UAAI,CAAC,WAC/E,MAAM,MAAM,MAAM,kBAAkB,UACjC;AAAA,YACE,GAAG;AAAA,YACH,GAAG;AAAA,UAAA,IAEL;AAAA,QAAA;AAGN;AAAA,MACF;AAAA,MAEA,KAAK,sBAAsB;AACnB,cAAA,EAAE,gBAAgB,IAAI,MAAM;AAElC,cAAM,YAAY,gBAAgB,KAAK,SAAS,gBAAgB,KAAK,QAAQ;AAAA,UAC3E,CAAC,WAAW;AAAA,YACV,GAAG;AAAA,YACH,GAAG;AAAA,UAAA;AAAA,QACL;AAGF;AAAA,MACF;AAAA,MAEA,KAAK,8BAA8B;AAC3B,cAAA;AAAA,UACJ,iBAAiB;AAAA,YACf,MAAM,EAAE,OAAO;AAAA,UACjB;AAAA,QAAA,IACE,MAAM;AACJ,cAAA,EAAE,UAAU,SAAa,IAAA;AAE/B,YAAI,UAAU,YAAY,KAAK,WAAW,OAAO,QAAQ;AACjD,gBAAA,QAAQ,OAAO,QAAQ;AACvB,gBAAA,YAAY,CAAC,GAAG,MAAM;AAElB,oBAAA,OAAO,UAAU,CAAC;AAClB,oBAAA,OAAO,UAAU,GAAG,KAAK;AAE7B,gBAAA,YAAY,gBAAgB,KAAK,SAAS;AAAA,QAClD;AAEA;AAAA,MACF;AAAA,MAEA,KAAK,wBAAwB;AACrB,cAAA,YAAY,gBAAgB,OAAO;AAAA,UACvC,GAAG,MAAM,YAAY,gBAAgB;AAAA,UACrC,GAAG;AAAA,QAAA;AAGL;AAAA,MACF;AAAA,IAIF;AAAA,EAAA,CACD;AACH;AAEA,MAAM,gBAAgB,CAAC,SAA6B,OAAe;AAC3D,QAAA,MAAM,OAAO,IAAI,CAAC,UAAU,OAAO,MAAM,MAAM,MAAM,YAAY,CAAC;AAMxE,SAAO,KAAK,IAAI,GAAG,KAAK,EAAE,IAAI;AAChC;ACtPO,MAAM,kBAAkB,CAAC,UAAiB,MAAM,eAAe,KAAK;AAEpE,MAAM,qBAAqB;AAAA,EAChC;AAAA,EACA,CAAC,EAAE,aAAa,EAAE,aAAA,EAAqB,MAAA;AACzC;AAEa,MAAA,cAAc,eAAe,iBAAiB,CAAC,EAAE,aAAa,EAAE,MAAA,EAAQ,MAAM,KAAK;AAEzF,MAAM,wBAAwB;AAAA,EACnC;AAAA,EACA,CAAC,EAAE,aAAa,EAAE,gBAAgB,QAAQ,gBAAgB;AAC5D;AAEO,MAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA,CAAC,EAAE,aAAa,EAAE,UAAA,EAAkB,MAAA;AACtC;AAEO,MAAM,wBAAwB;AAAA,EACnC;AAAA,EACA,CAAC,EAAE,aAAa,aAAa,EAAE,gBAAkB,EAAA,MAC/C,CAAC,QAAQ,YAAY,UAAU,gBAAgB,IAAI;AACvD;AAEO,MAAM,+BAA+B;AAAA,EAC1C;AAAA,EACA,CAAC,EAAE,aAAa,aAAa,EAAE,gBAAkB,EAAA,MAC/C,EAAE,YAAY,UAAU,UAAU,CAAI,GAAA;AAAA,IACpC,CAAC,UAA0B,CAAC,CAAC,gBAAgB,KAAK,QAAQ,KAAK,CAAC,EAAE,GAAS,MAAA,OAAO,MAAM,EAAE;AAAA,EAC5F;AACJ;AAEO,MAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA,CAAC,EAAE,aAAa,EAAE,UAAA,EAAkB,MAAA;AACtC;AAEO,MAAM,oBAAoB,eAAe,iBAAiB,CAAC,EAAE,kBAAkB,WAAW;ACHjG,MAAMC,iBAAe,OAAO,iBAAiB;AAAA,kBAC3B,CAAC,EAAE,YAAY,MAAM,OAAO,CAAC,CAAC;AAAA;AAIhD,MAAM,oBAAoB,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAMrC,MAAM,iBAAiB,OAAO,QAAQ;AAAA,WAC3B,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,SAAS;AAAA;AAKhD,MAAM,qBAAqB,OAAO,KAAK,OAAO;AAAA;AAAA;AAAA,wBAGtB,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAW9D,MAAM,iBAAiB,OAAO,UAAU;AAAA;AAAA,mBAErB,CAAC,EAAE,YAAY,MAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAM5B,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,aAKjD,CAAC,EAAE,YAAY,MAAM,OAAO,CAAC,CAAC;AAAA;AAAA;AAI3C,MAAM,mBAAmB,wBAAwB;AAEjD,MAAM,mBAAmB,MAAM;AAE3B,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,YAAW;AAAA,MACX,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,SAAQ;AAAA,MACR,WAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAO;AAAA,IAAA;AAAA,EAAA;AAGb;AAYO,MAAM,QAAQ,CAAC;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ,gBAAgB;AAAA,EACxB;AACF,MAAkB;AAChB,QAAM,aAAa,CAACC,WAAkB,GAAGA,SAAQ,CAAC,OAAO,WAAW;AAE9D,QAAA,kBAAkB,CAACA,WAAkB;AACzC;AAAA,MACE;AAAA,QACE;AAAA,UACE,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAM,UAAU;AAAA,UAChB,UAAU,WAAWA,MAAK;AAAA,QAC5B;AAAA,MACF;AAAA,IAAA;AAAA,EACF;AAGI,QAAA,kBAAkB,CAACA,WAAkB;AACzC;AAAA,MACE;AAAA,QACE;AAAA,UACE,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAM,UAAU;AAAA,UAChB,UAAU,WAAWA,MAAK;AAAA,QAC5B;AAAA,MACF;AAAA,IAAA;AAAA,EACF;AAGF,QAAM,wBAAwB,MAAM;AAClC;AAAA,MACE;AAAA,QACE;AAAA,UACE,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAM,UAAU;AAAA,QAClB;AAAA,MACF;AAAA,IAAA;AAAA,EACF;AAGI,QAAA,kBAAkB,CAAC,UAAkB,aAAqB;AAC9D;AAAA,MACE;AAAA,QACE;AAAA,UACE,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAM,UAAU;AAAA,UAChB,UAAU,WAAW,QAAQ;AAAA,QAC/B;AAAA,MACF;AAAA,IAAA;AAGO,aAAA,oBAAoB,UAAU,QAAQ,CAAC;AAAA,EAAA;AAGlD,QAAM,oCAAoC,MAAM;AAC9C,kCAA8B,IAAI;AAAA,EAAA;AAGpC,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAS,IAAI;AAC7C,QAAA,EAAE,kBAAkB;AACpB,QAAA,EAAE,eAAe;AACvB,QAAM,WAAW;AACjB,QAAM,qBAAqB;AAC3B,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,aAAa;AACxD,QAAM,CAAC,4BAA4B,6BAA6B,IAAI,MAAM,SAAS,KAAK;AAClF,QAAA,CAAC,WAAW,UAAU,UAAU,IAAI,SAAS,UAAU,KAAK,OAAO;AACnE,QAAA,CAAC,YAAY,WAAW,WAAW,IAAI,SAAS,UAAU,KAAK,QAAQ;AACvE,QAAA,CAAC,kBAAkB,iBAAiB,iBAAiB,IAAI,SAE7D,UAAU,KAAK,cAAc;AACzB,QAAA,QAAQ,YAAY,WAAW;AACrC,QAAM,CAAC,EAAE,WAAW,YAAY,cAAc,GAAG,UAAU,SAAS,SAAS,cAAc,IACzF,eAAe,YAAY;AAAA,IACzB;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,MACA,MAAM,UAAU;AAAA,IAClB;AAAA,IACA,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,MAAM,gBAAgB;AAAA,EAAA,CACvB;AAEG,QAAA,cAAc,YAAY,UAAU,OAAO;AAEjD,QAAM,eAAe,iBAAiB,IAAI,CAAC,EAAE,KAAK,YAAY;AAAA,IAC5D,OAAO;AAAA,IACP,OAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,gBAAgB;AAAA,MAClB;AAAA,MACA,EAAE,KAAK;AAAA,IACT;AAAA,IACA,OAAO;AAAA,EACP,EAAA;AAEF,QAAM,EAAE,eAAe,IAAI,mBAAmB,WAAW,KAAK,KAAK;AAEnE,QAAM,gBAAgB,OAGlB,OAAO,CAAC,SAAS,KAAK,SAAS,oBAAoB;AAEvD,QAAM,UAAU,MAAM;AACpB,mBAAe,cAAc,GAAG,EAAE,sBAAsB,MAAO,CAAA;AAAA,EAAA,GAC9D,CAAC,gBAAgB,KAAK,CAAC;AAE1B,8BACG,KAAI,EAAA,KAAK,CAAC,QAAQ,YAAY,GAAI,GAChC,UAAA;AAAA,IAAA,YAAa,oBAAA,gBAAA,EAAe,aAAU,aAAa,UAAS,UAAA;AAAA,IAE5D,aACE,oBAAA,kBAAA,CAAA,CAAiB,IAElB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,UAAU,MAAM;AACd,oBAAU,CAAC,MAAM;AAEjB,cAAI,CAAC,QAAQ;AACX,uBAAW,eAAe;AAAA,UAC5B;AAAA,QACF;AAAA,QACA,UAAU;AAAA,QACV,QAAO;AAAA,QACP,OAAO,SAAS,SAAS,WAAW,SAAS,iBAAiB;AAAA,QAC9D,iBAAiB;AAAA,QAEjB,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO,UAAU;AAAA,cACjB,gBAAe;AAAA,cACf,SACG,aAAa,cACZ,qBAAC,MACC,EAAA,UAAA;AAAA,gBAAC,qBAAA,KAAK,MAAL,EACC,UAAA;AAAA,kBAAC,qBAAA,oBAAA,EAAmB,MAAK,KAAI,SAAS,MAAM,aAAa,GAAG,cAAc,GACxE,UAAA;AAAA,oBAAA,oBAAC,MAAK,EAAA,eAAW,MAAC,WAAW,OAAO;AAAA,oBACnC,oBAAA,gBAAA,EAAe,IAAG,QAChB,UAAc,cAAA;AAAA,sBACb,IAAI;AAAA,sBACJ,gBAAgB;AAAA,oBACjB,CAAA,GACH;AAAA,kBAAA,GACF;AAAA,kBAIA,oBAAC,KAAK,SAAL,EAAa,kBAAiB,cAAa,QAAQ,GAClD,UAAA,qBAAC,KAAK,SAAL,EACE,UAAA;AAAA,oBACC,aAAA,oBAAC,YAAS,SAAS,MAAM,SAAS,WAAW,EAAE,CAAC,GAC7C,UAAc,cAAA;AAAA,sBACb,IAAI;AAAA,sBACJ,gBAAgB;AAAA,oBACjB,CAAA,GACH;AAAA,oBAGD,aACE,oBAAA,gBAAA,EAAe,SAAS,MAAM,SAAS,YAAY,EAAE,CAAC,GACpD,UAAc,cAAA;AAAA,sBACb,IAAI;AAAA,sBACJ,gBAAgB;AAAA,oBACjB,CAAA,GACH;AAAA,kBAAA,EAAA,CAEJ,EACF,CAAA;AAAA,gBAAA,GACF;AAAA,gBAEC,aACC;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,YAAW;AAAA,oBAEX,aAAY;AAAA,oBACZ,WAAS;AAAA,oBACT,MAAK;AAAA,oBACL,UAAQ;AAAA,oBACR,UAAU;AAAA,oBACV,mBAAiB;AAAA,oBACjB,KAAK;AAAA,oBACL,OAAO,cAAc;AAAA,sBACnB,IAAI;AAAA,sBACJ,gBAAgB;AAAA,oBAAA,CACjB;AAAA,oBACD,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,oBAClC,WAAW;AAAA,oBAEX,8BAAC,MAAK,EAAA;AAAA,kBAAA;AAAA,gBACR;AAAA,cAAA,GAEJ;AAAA,YAAA;AAAA,UAGN;AAAA,UACA,oBAAC,kBAAiB,EAAA,SAAS,GAAG,YAAW,YAAW,WAAS,MAC3D,UAAA,qBAAC,MAAK,EAAA,KAAK,GACT,UAAA;AAAA,YAAC,oBAAA,UAAA,EAAS,KAAK,GACb,UAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACE,GAAG;AAAA,gBACJ,IAAI,UAAU;AAAA,gBACd,UAAU,CAAC;AAAA,gBACX,OAAO,cAAc;AAAA,kBACnB,IAAI;AAAA,kBACJ,gBAAgB;AAAA,gBAAA,CACjB;AAAA,gBACD,OAAO,SAAS,SAAS;AAAA,gBACzB,UAAU,CAAC,UAAU;AACR,6BAAA,SAAS,MAAM,OAAO,KAAK;AAC7B,2BAAA,YAAY,IAAI,EAAE,MAAM,MAAM,OAAO,MAAO,CAAA,CAAC;AAAA,gBACxD;AAAA,gBACA,UAAQ;AAAA,cAAA;AAAA,YAAA,GAEZ;AAAA,YAEA,oBAAC,UAAS,EAAA,KAAK,GACb,UAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,UAAU,CAAC;AAAA,gBACX,OAAO,WAAW,SAAS;AAAA,gBAC3B,IAAI,WAAW;AAAA,gBACf,UAAQ;AAAA,gBACR,OAAO,cAAc;AAAA,kBACnB,IAAI;AAAA,kBACJ,gBAAgB;AAAA,gBAAA,CACjB;AAAA,gBACD,UAAU,CAAC,UAAU;AACnB,8BAAY,SAAS,KAAK;AACjB,2BAAA,YAAY,IAAI,EAAE,OAAO,OAAO,KAAK,EAAG,CAAA,CAAC;AAAA,gBACpD;AAAA,gBACA,OAAO,WAAW,MAAM,YAAY;AAAA,gBACpC,WACE;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,IAAG;AAAA,oBACH,QAAQ;AAAA,oBACR,YAAY,WAAW;AAAA,oBAEvB,aAAa,mBAAmB,aAAa,eAAe;AAAA,oBAC5D,WAAS;AAAA,oBACT,QAAQ;AAAA,oBACR,OAAO;AAAA,kBAAA;AAAA,gBACT;AAAA,gBAGD,uBAAa,IAAI,CAAC,EAAE,OAAO,OAAO,YAAY;AAC7C,wBAAM,EAAE,gBAAAC,gBAAAA,IAAmB,mBAAmB,KAAK,KAAK;AAGtD,yBAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC;AAAA,sBAEA,WACE;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,IAAG;AAAA,0BACH,QAAQ;AAAA,0BACR,YAAY;AAAA,0BAEZ,aACEA,oBAAmB,aAAa,eAAe;AAAA,0BAEjD,WAAS;AAAA,0BACT,QAAQ;AAAA,0BACR,OAAO;AAAA,wBAAA;AAAA,sBACT;AAAA,sBAGD,UAAA;AAAA,oBAAA;AAAA,oBAhBI;AAAA,kBAAA;AAAA,gBAiBP,CAEH;AAAA,cAAA;AAAA,YAAA,GAEL;AAAA,gCAEC,UAAS,EAAA,KAAK,GACZ,UAAA,eAAe,WAAW,IACzB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,aAAa;AAAA,kBACX,IAAI;AAAA,kBACJ,gBAAgB;AAAA,gBAClB;AAAA,gBACA,WAAW;AAAA,kBACT,IAAI;AAAA,kBACJ,gBAAgB;AAAA,gBAClB;AAAA,gBACA,MAAM,iBAAiB;AAAA,cAAA;AAAA,YAAA,IAGxB,qBAAA,MAAA,EAAK,YAAW,YAAW,KAAK,GAC/B,UAAA;AAAA,cAAC,oBAAA,mBAAA,EAAkB,MAAM,GACvB,UAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACE,GAAG;AAAA,kBACJ,UAAU,CAAC;AAAA,kBACX,OAAO,gBAAgB,SAAS;AAAA,kBAChC,IAAI,iBAAiB;AAAA,kBACrB,OAAO,cAAc;AAAA,oBACnB,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAAA,CACjB;AAAA,kBACD,UAAU,CAAC,WAAW;AAIpB,0BAAM,cAAc,OAAO,IAAI,CAAC,WAAW;AAAA,sBACzC,MAAM,SAAS,OAAO,EAAE;AAAA,sBACxB,QAAQ;AAAA,oBACR,EAAA;AAEF,sCAAkB,SAAS,WAAW;AACtC,6BAAS,YAAY,IAAI,EAAE,YAAA,CAAa,CAAC;AAAA,kBAC3C;AAAA,kBACA,aAAa,cAAc;AAAA,oBACzB,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAAA,CACjB;AAAA,kBACD,UAAQ;AAAA,kBAER,QAAQ,iBAAiB,SAAS,CAAI,GAAA;AAAA,oBACpC,CAAC,eAAe,GAAG,WAAW,IAAI;AAAA,kBACpC;AAAA,kBACA,UAAQ;AAAA,kBAER,UAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,OAAO,cAAc;AAAA,wBACnB,IAAI;AAAA,wBACJ,gBAAgB;AAAA,sBAAA,CACjB;AAAA,sBACD,QAAQ,eAAe,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,EAAE;AAAA,sBAE1C,UAAA,eAAe,IAAI,CAAC,SAAS;AAE1B,+BAAA,oBAACF,gBAA2B,EAAA,OAAO,GAAG,KAAK,EAAE,IAC1C,UAAA,KAAK,KADW,GAAA,KAAK,EAExB;AAAA,sBAAA,CAEH;AAAA,oBAAA;AAAA,kBACH;AAAA,gBAAA;AAAA,cAAA,GAEJ;AAAA,cAEA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,UAAU,CAAC;AAAA,kBACX,0BAAO,WAAU,EAAA;AAAA,kBACjB,OAAO,cAAc;AAAA,oBACnB,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAAA,CACjB;AAAA,kBACD,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,SAAS,MAAM,kCAAkC;AAAA,gBAAA;AAAA,cACnD;AAAA,YAAA,EAAA,CACF,EAEJ,CAAA;AAAA,UAAA,EAAA,CACF,EACF,CAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,IAGF;AAAA,MAAC,cAAc;AAAA,MAAd;AAAA,QACC,iBAAiB;AAAA,QACjB,QAAQ;AAAA,QACR,gBAAgB,MAAM,8BAA8B,KAAK;AAAA,QACzD,WAAW,MAAM;AACf,mBAAS,aAAa,EAAE,aAAa,iBAAiB,MAAO,CAAA,CAAC;AAC9D,wCAA8B,KAAK;AAChB,6BAAA;AAAA,YACjB,MAAM;AAAA,YACN,SAAS,cAAc;AAAA,cACrB,IAAI;AAAA,cACJ,gBAAgB;AAAA,YAAA,CACjB;AAAA,UAAA,CACF;AAAA,QACH;AAAA,QACA,oBAAmB;AAAA,QAEnB,UAAA,oBAAC,cAAc,MAAd,EACC,UAAA,oBAAC,cAAW,WAAU,UAAS,SAAQ,SACpC,UAAc,cAAA;AAAA,UACb,IAAI;AAAA,UACJ,gBACE;AAAA,QAAA,CACH,GACH,EACF,CAAA;AAAA,MAAA;AAAA,IACF;AAAA,EACF,EAAA,CAAA;AAEJ;ACrgBA,MAAM,aAAa,OAAO,GAAG;AAAA;AAAA;AAUhB,MAAA,SAAS,CAAC,EAAE,YAAY,MAAM,YAAY,MAAM,SAAS,CAAA,QAAsB;AACpF,QAAA,EAAE,kBAAkB;AAC1B,QAAM,WAAW;AACX,QAAA,EAAE,eAAe;AAEvB,8BACG,MAAK,EAAA,WAAU,UAAS,KAAK,GAAG,OAAM,QACrC,UAAA;AAAA,IAAA,qBAAC,KAAI,EAAA,UAAS,YAAW,OAAM,QAC7B,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,YAAW;AAAA,UACX,QAAO;AAAA,UACP,MAAK;AAAA,UACL,UAAS;AAAA,UACT,KAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,QAAA;AAAA,MACV;AAAA,MAEA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,YAAW;AAAA,UACX,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,UAAS;AAAA,UACT,IAAG;AAAA,UAEF,UAAO,OAAA,IAAI,CAAC,OAAO,UAAU;AAE5B,kBAAM,KAAK,OAAO,OAAO,MAAM,MAAM,YAAY;AAG/C,mBAAA,oBAAC,KAAwB,EAAA,IAAG,MAC1B,UAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA,QAAQ,CAAC,MAAM;AAAA,gBACf,WAAW,OAAO,SAAS,KAAK;AAAA,gBAChC,YAAY,OAAO,SAAS;AAAA,gBAC5B;AAAA,gBACA,aAAa,OAAO;AAAA,cAAA;AAAA,YACtB,EAAA,GATQ,SAAS,EAAE,EAUrB;AAAA,UAAA,CAEH;AAAA,QAAA;AAAA,MACH;AAAA,IAAA,GACF;AAAA,IAEC,aACC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM;AACb,mBAAS,SAAS,EAAE,MAAM,GAAA,CAAI,CAAC;AAC/B,qBAAW,iBAAiB;AAAA,QAC9B;AAAA,QAEC,UAAc,cAAA;AAAA,UACb,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,MAAA;AAAA,IACH;AAAA,EAEJ,EAAA,CAAA;AAEJ;ACnEA,MAAM,eAAe,OAAO,iBAAiB;AAAA,kBAC3B,CAAC,EAAE,YAAY,MAAM,OAAO,CAAC,CAAC;AAAA;AAGhD,MAAM,wBAAwB,OAAO,UAAU;AAAA;AAAA;AAQxC,MAAM,qBAAqB,CAAC,EAAE,YAAY,WAAoC;AACnF,QAAM,EAAE,eAAe,OAAO,IAAI,QAAQ;AAC1C,QAAM,WAAW;AACX,QAAA,eAAe,YAAY,kBAAkB;AAC7C,QAAA,kBAAkB,YAAY,qBAAqB;AACnD,QAAA,YAAY,YAAY,eAAe;AAC7C,QAAM,CAAC,WAAW,UAAU,UAAU,IAAI,SAAS,MAAM;AACzD,QAAM,CAAC,mBAAmB,kBAAkB,kBAAkB,IAAI,SAAS,cAAc;AACnF,QAAA,YAAY,YAAY,QAAQ;AAAA,IACpC,aAAa;AAAA,EAAA,CACd;AAGC,SAAA,qBAAC,MAAK,EAAA,YAAW,YAAW,WAAS,MAAC,KAAK,GAAG,SAAS,GAAG,QAAO,eAC/D,UAAA;AAAA,IAAC,oBAAA,UAAA,EAAS,KAAK,GACb,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACE,GAAG;AAAA,QACJ,IAAI,UAAU;AAAA,QACd,UAAU,CAAC;AAAA,QACX,OAAO,cAAc;AAAA,UACnB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,QACD,OAAO,SAAS,SAAS;AAAA,QACzB,UAAU,CAAC,UAAU;AACnB,mBAAS,eAAe,EAAE,MAAM,MAAM,OAAO,MAAO,CAAA,CAAC;AAC1C,qBAAA,SAAS,MAAM,OAAO,KAAK;AAAA,QACxC;AAAA,QACA,UAAQ;AAAA,MAAA;AAAA,IAAA,GAEZ;AAAA,IAEC,gBACC,oBAAC,UAAS,EAAA,KAAK,GACb,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACE,GAAG;AAAA,QACJ,kBAAkB,CAAC,UACjB;AAAA,UACE;AAAA,YACE,IAAI;AAAA,YACJ,gBACE;AAAA,UACJ;AAAA,UACA,EAAE,OAAO,OAAO,OAAO;AAAA,QACzB;AAAA,QAEF,UAAU,CAAC;AAAA,QACX,OAAO,iBAAiB,SAAS;AAAA,QACjC,IAAI,kBAAkB;AAAA,QACtB,OAAO,cAAc;AAAA,UACnB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,QACD,UAAU,CAAC,WAAW;AACpB,mBAAS,eAAe,EAAE,cAAc,OAAA,CAAQ,CAAC;AACjD,6BAAmB,SAAS,MAAM;AAAA,QACpC;AAAA,QACA,aAAa,cAAc;AAAA,UACzB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,QAEA,UAAA;AAAA,UACC,GAAI,aAAa,gBAAgB,SAAS,IACtC;AAAA,YACE;AAAA,cACE,OAAO,cAAc;AAAA,gBACnB,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAAA,CACjB;AAAA,cACD,UAAU,CAAC,GAAG,aAAa,eAAe,EACvC,KAAK,CAAC,GAAG,MAAM,UAAU,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,CAAC,EACxE,IAAI,CAAC,iBAAiB;AAAA,gBACrB,OAAO,YAAY,KAAK;AAAA,gBACxB,OAAO,YAAY;AAAA,cAAA,EACnB;AAAA,YACN;AAAA,UAAA,IAEF,CAAC;AAAA,UAEL,GAAI,aAAa,YAAY,SAAS,IAClC;AAAA,YACE;AAAA,cACE,OAAO,cAAc;AAAA,gBACnB,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAAA,CACjB;AAAA,cACD,UAAU,CAAC,GAAG,aAAa,WAAW,EAAE,IAAI,CAAC,iBAAiB;AAAA,gBAC5D,OAAO,YAAY,KAAK;AAAA,gBACxB,OAAO,YAAY;AAAA,cAAA,EACnB;AAAA,YACJ;AAAA,UAAA,IAEF,CAAC;AAAA,QAAA,EACL,IAAI,CAAC,QAAQ;AACb,cAAI,cAAc,KAAK;AAEnB,mBAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,OAAO,IAAI;AAAA,gBACX,QAAQ,IAAI,SAAS,IAAI,CAAC,UAAU,MAAM,MAAM,UAAU;AAAA,gBAEzD,UAAI,IAAA,SAAS,IAAI,CAAC,UAAU;AAC3B,wBAAM,EAAE,MAAM,qBAAqB,IACjC,WAAW;AAAA,oBACT,CAAC,cACG,mBAAmB,SAAS,OAAO,gBAAgB,MACnD,CAAC,oBACH,SAAS,aAAa,SAAS,MAAM,KAAK;AAAA,uBACzC;AAEP,yBACG,oBAAA,cAAA,EAA+B,OAAO,MAAM,OAC3C,UAAC,oBAAA,YAAA;AAAA;AAAA,oBAGG,UAAA;AAAA,sBACE;AAAA,wBACE,IAAI;AAAA,wBACJ,gBACE;AAAA,sBACJ;AAAA,sBACA;AAAA,wBACE,OAAO,MAAM;AAAA,wBACb,MAAM;AAAA,wBACN,IAAI,IAAI,aACN,oBAAC,cAAW,IAAG,MAAK,YAAW,QAC5B,SACH,CAAA;AAAA,wBAEF,GAAG,IAAI,aACL,oBAAC,yBAAuB,UAAS;AAAA,sBAErC;AAAA,oBACF;AAAA,kBAAA,CAEJ,EAAA,GAxBiB,MAAM,KAyBzB;AAAA,gBAAA,CAEH;AAAA,cAAA;AAAA,cAzCI,IAAI;AAAA,YAAA;AAAA,UA4Cf;AAAA,QAAA,CACD;AAAA,MAAA;AAAA,IAAA,GAEL;AAAA,EAEJ,EAAA,CAAA;AAEJ;AC9KA,eAAsB,iBAAiB;AAAA,EACrC;AAAA,EACA;AACF,GAAwE;AAChE,QAAA,SAAS,IAAI,OAAO;AAAA,IACxB,cAAc,IAAI,MAAA,EAAQ,GAAG,IAAI,QAAQ;AAAA,IACzC,MAAM,IACH,OAAA,EACA;AAAA,MACC;AAAA,MACA,cAAc;AAAA,QACZ,IAAI;AAAA,QACJ,gBAAgB;AAAA,MAAA,CACjB;AAAA,MAEF,SAAS;AAAA,IAEZ,QAAQ,IACL,MAAA,EACA;AAAA,MACC,IAAI,OAAO,EAAE,MAAM;AAAA,QACjB,MAAM,IACH,OAAA,EACA;AAAA,UACC,cAAc;AAAA,YACZ,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAAA,CACjB;AAAA,QAAA,EAEF;AAAA,UACC;AAAA,UACA,cAAc;AAAA,YACZ,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAAA,CACjB;AAAA,QAAA,EAEF;AAAA,UACC;AAAA,UACA,cAAc;AAAA,YACZ,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAAA,CACjB;AAAA,UACD,SAAU,WAAW;AACb,kBAAA;AAAA,cACJ,SAAS,EAAE,QAAQ;AAAA,YACjB,IAAA;AAGF,mBAAA,SAAS,OAAO,OAAO,CAAC,UAAiB,MAAM,SAAS,SAAS,EAAE,WAAW;AAAA,UAElF;AAAA,QACF;AAAA,QACF,OAAO,IACJ,OAAA,EACA;AAAA,UACC,cAAc;AAAA,YACZ,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAAA,CACjB;AAAA,QAAA,EAEF,QAAQ,6BAA6B;AAAA,QAExC,aAAa,IACV;AAAA,UACC,IAAI,OAAO;AAAA,YACT,MAAM,IACH,SACA,OACA,EAAA;AAAA,cACC,cAAc;AAAA,gBACZ,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAAA,CACjB;AAAA,cAEF,SAAS;AAAA,YACZ,QAAQ,IAAI,OAAO,EAAE,SAAS;AAAA,cAC5B,IAAI;AAAA,cACJ,gBAAgB;AAAA,YAAA,CACjB;AAAA,UAAA,CACF;AAAA,UAEF,OAAO;AAAA,MAAA,CACX;AAAA,IAAA,EAEF,IAAI,CAAC;AAAA,EAAA,CACT;AAEG,MAAA;AACI,UAAA,OAAO,SAAS,QAAQ,EAAE,YAAY,OAAO,SAAS,QAAQ;AAE7D,WAAA;AAAA,WACA,OAAO;AACd,UAAM,SAAS,CAAA;AAEX,QAAA,iBAAiB,IAAI,iBAAiB;AAClC,YAAA,MAAM,QAAQ,CAACG,WAAU;AAC7B,YAAIA,OAAM;AAAM,cAAI,QAAQA,OAAM,MAAMA,OAAM,OAAO;AAAA,MAAA,CACtD;AAAA,IACH;AAEO,WAAA;AAAA,EACT;AACF;"}