All Downloads are FREE. Search and download functionalities are using the official Maven repository.

theme.keycloak.v2.admin.resources.assets.AddRoleMappingModal-DW8o4W0z.js.map Maven / Gradle / Ivy

There is a newer version: 26.0.7
Show newest version
{"version":3,"file":"AddRoleMappingModal-DW8o4W0z.js","sources":["../../src/components/role-mapping/queries.ts","../../src/components/role-mapping/resource.ts","../../src/components/role-mapping/RoleMapping.tsx","../../src/components/role-mapping/AddRoleMappingModal.tsx"],"sourcesContent":["import type KeycloakAdminClient from \"@keycloak/keycloak-admin-client\";\nimport type MappingsRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/mappingsRepresentation\";\nimport type RoleRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/roleRepresentation\";\nimport type { ClientScopes } from \"@keycloak/keycloak-admin-client/lib/resources/clientScopes\";\nimport type { Clients } from \"@keycloak/keycloak-admin-client/lib/resources/clients\";\nimport type { Groups } from \"@keycloak/keycloak-admin-client/lib/resources/groups\";\nimport type { Roles } from \"@keycloak/keycloak-admin-client/lib/resources/roles\";\nimport type { Users } from \"@keycloak/keycloak-admin-client/lib/resources/users\";\nimport { Row } from \"./RoleMapping\";\n\nexport type ResourcesKey = keyof KeycloakAdminClient;\n\ntype DeleteFunctions =\n  | keyof Pick\n  | keyof Pick\n  | keyof Pick;\n\ntype ListEffectiveFunction =\n  | keyof Pick\n  | keyof Pick\n  | keyof Pick<\n      ClientScopes,\n      | \"listScopeMappings\"\n      | \"listAvailableRealmScopeMappings\"\n      | \"listCompositeClientScopeMappings\"\n    >\n  | keyof Pick\n  | keyof Pick<\n      Users,\n      \"listCompositeClientRoleMappings\" | \"listCompositeRealmRoleMappings\"\n    >;\n\ntype ListAvailableFunction =\n  | keyof Pick<\n      Groups,\n      \"listAvailableClientRoleMappings\" | \"listAvailableRealmRoleMappings\"\n    >\n  | keyof Pick<\n      ClientScopes,\n      \"listAvailableClientScopeMappings\" | \"listAvailableRealmScopeMappings\"\n    >\n  | keyof Pick\n  | keyof Pick;\n\ntype FunctionMapping = {\n  delete: DeleteFunctions[];\n  listAvailable: ListAvailableFunction[];\n  listEffective: ListEffectiveFunction[];\n};\n\ntype ResourceMapping = Partial>;\nconst groupFunctions: FunctionMapping = {\n  delete: [\"delClientRoleMappings\", \"delRealmRoleMappings\"],\n  listEffective: [\n    \"listRoleMappings\",\n    \"listCompositeRealmRoleMappings\",\n    \"listCompositeClientRoleMappings\",\n  ],\n  listAvailable: [\n    \"listAvailableClientRoleMappings\",\n    \"listAvailableRealmRoleMappings\",\n  ],\n};\n\nconst clientFunctions: FunctionMapping = {\n  delete: [\"delClientScopeMappings\", \"delRealmScopeMappings\"],\n  listEffective: [\n    \"listScopeMappings\",\n    \"listCompositeRealmScopeMappings\",\n    \"listCompositeClientScopeMappings\",\n  ],\n  listAvailable: [\n    \"listAvailableClientScopeMappings\",\n    \"listAvailableRealmScopeMappings\",\n  ],\n};\n\nconst mapping: ResourceMapping = {\n  groups: groupFunctions,\n  users: groupFunctions,\n  clientScopes: clientFunctions,\n  clients: clientFunctions,\n  roles: {\n    delete: [\"delCompositeRoles\", \"delCompositeRoles\"],\n    listEffective: [\n      \"getCompositeRoles\",\n      \"getCompositeRoles\",\n      \"getCompositeRolesForClient\",\n    ],\n    listAvailable: [\"listRoles\", \"find\"],\n  },\n};\n\ntype queryType =\n  | DeleteFunctions\n  | ListAvailableFunction\n  | ListEffectiveFunction;\n\nconst castAdminClient = (\n  adminClient: KeycloakAdminClient,\n  resource: ResourcesKey,\n) =>\n  adminClient[resource] as unknown as {\n    [index in queryType]: (...params: any) => Promise;\n  };\n\nconst applyQuery = (\n  adminClient: KeycloakAdminClient,\n  type: ResourcesKey,\n  query: queryType,\n  ...params: object[]\n): Promise =>\n  castAdminClient(adminClient, type)[query](...params);\n\nexport const deleteMapping = (\n  adminClient: KeycloakAdminClient,\n  type: ResourcesKey,\n  id: string,\n  rows: Row[],\n) =>\n  rows.map((row) => {\n    const role = { id: row.role.id!, name: row.role.name! };\n    const query = mapping[type]?.delete[row.client ? 0 : 1]!;\n\n    return applyQuery(\n      adminClient,\n      type,\n      query,\n      {\n        id,\n        clientUniqueId: row.client?.id,\n        client: row.client?.id,\n        roles: [role],\n      },\n      [role],\n    );\n  });\n\nexport const getMapping = async (\n  adminClient: KeycloakAdminClient,\n  type: ResourcesKey,\n  id: string,\n): Promise => {\n  const query = mapping[type]!.listEffective[0];\n  const result = applyQuery(adminClient, type, query, { id });\n  if (type !== \"roles\") {\n    return result as MappingsRepresentation;\n  }\n  const roles = await result;\n  const clientRoles = await Promise.all(\n    roles\n      .filter((r) => r.clientRole)\n      .map(async (role) => {\n        const client = await adminClient.clients.findOne({\n          id: role.containerId!,\n        });\n\n        role.containerId = client?.clientId;\n        return { ...client, mappings: [role] };\n      }),\n  );\n\n  return {\n    clientMappings: clientRoles,\n    realmMappings: roles.filter((r) => !r.clientRole),\n  };\n};\n\nexport const getEffectiveRoles = async (\n  adminClient: KeycloakAdminClient,\n  type: ResourcesKey,\n  id: string,\n): Promise => {\n  const query = mapping[type]!.listEffective[1];\n  if (type !== \"roles\") {\n    return (await applyQuery(adminClient, type, query, { id })).map((role) => ({\n      role,\n    }));\n  }\n  const roles = await applyQuery(adminClient, type, query, { id });\n  const parentRoles = await Promise.all(\n    roles\n      .filter((r) => r.composite)\n      .map((r) => applyQuery(adminClient, type, query, { id: r.id })),\n  );\n  return [...roles, ...parentRoles.flat()].map((role) => ({ role }));\n};\n\nexport const getAvailableRoles = async (\n  adminClient: KeycloakAdminClient,\n  type: ResourcesKey,\n  params: Record,\n): Promise => {\n  const query = mapping[type]!.listAvailable[1];\n  return (await applyQuery(adminClient, type, query, params)).map((role) => ({\n    role,\n  }));\n};\n","import type UserRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/userRepresentation\";\n\nimport { fetchAdminUI } from \"../../context/auth/admin-ui-endpoint\";\nimport KeycloakAdminClient from \"@keycloak/keycloak-admin-client\";\n\ntype IDQuery = {\n  id: string;\n  type: string;\n};\n\ntype PaginatingQuery = IDQuery & {\n  first: number;\n  max: number;\n  search?: string;\n};\n\ntype EffectiveClientRolesQuery = IDQuery;\n\ntype Query = Partial> & {\n  endpoint: string;\n};\n\ntype ClientRole = {\n  id: string;\n  role: string;\n  description?: string;\n  client: string;\n  clientId: string;\n};\n\nconst fetchEndpoint = async (\n  adminClient: KeycloakAdminClient,\n  { id, type, first, max, search, endpoint }: Query,\n): Promise =>\n  fetchAdminUI(adminClient, `/ui-ext/${endpoint}/${type}/${id}`, {\n    first: (first || 0).toString(),\n    max: (max || 10).toString(),\n    search: search || \"\",\n  });\n\nexport const getAvailableClientRoles = (\n  adminClient: KeycloakAdminClient,\n  query: PaginatingQuery,\n): Promise =>\n  fetchEndpoint(adminClient, { ...query, endpoint: \"available-roles\" });\n\nexport const getEffectiveClientRoles = (\n  adminClient: KeycloakAdminClient,\n  query: EffectiveClientRolesQuery,\n): Promise =>\n  fetchEndpoint(adminClient, { ...query, endpoint: \"effective-roles\" });\n\ntype UserQuery = {\n  lastName?: string;\n  firstName?: string;\n  email?: string;\n  username?: string;\n  emailVerified?: boolean;\n  idpAlias?: string;\n  idpUserId?: string;\n  enabled?: boolean;\n  briefRepresentation?: boolean;\n  exact?: boolean;\n  q?: string;\n};\n\nexport type BruteUser = UserRepresentation & {\n  bruteForceStatus?: Record;\n};\n\nexport const findUsers = (\n  adminClient: KeycloakAdminClient,\n  query: UserQuery,\n): Promise =>\n  fetchAdminUI(\n    adminClient,\n    \"ui-ext/brute-force-user\",\n    query as Record,\n  );\n\nexport const fetchUsedBy = (\n  adminClient: KeycloakAdminClient,\n  query: PaginatingQuery,\n): Promise =>\n  fetchEndpoint(adminClient, {\n    ...query,\n    endpoint: \"authentication-management\",\n  });\n","import type KeycloakAdminClient from \"@keycloak/keycloak-admin-client\";\nimport type ClientRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/clientRepresentation\";\nimport type RoleRepresentation from \"@keycloak/keycloak-admin-client/lib/defs/roleRepresentation\";\nimport {\n  AlertVariant,\n  Badge,\n  Button,\n  ButtonVariant,\n  Checkbox,\n  ToolbarItem,\n} from \"@patternfly/react-core\";\nimport { cellWidth } from \"@patternfly/react-table\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { emptyFormatter, upperCaseFormatter } from \"../../util\";\nimport { useAlerts } from \"../alert/Alerts\";\nimport { useConfirmDialog } from \"../confirm-dialog/ConfirmDialog\";\nimport { ListEmptyState } from \"../list-empty-state/ListEmptyState\";\nimport { Action, KeycloakDataTable } from \"../table-toolbar/KeycloakDataTable\";\nimport { AddRoleMappingModal } from \"./AddRoleMappingModal\";\nimport { deleteMapping, getEffectiveRoles, getMapping } from \"./queries\";\nimport { getEffectiveClientRoles } from \"./resource\";\n\nimport \"./role-mapping.css\";\n\nexport type CompositeRole = RoleRepresentation & {\n  parent: RoleRepresentation;\n  isInherited?: boolean;\n};\n\nexport type Row = {\n  client?: ClientRepresentation;\n  role: RoleRepresentation | CompositeRole;\n  id?: string; // KeycloakDataTable expects an id for the row\n};\n\nexport const mapRoles = (\n  assignedRoles: Row[],\n  effectiveRoles: Row[],\n  hide: boolean,\n) => [\n  ...(hide\n    ? assignedRoles.map((row) => ({\n        ...row,\n        role: {\n          ...row.role,\n          isInherited: false,\n        },\n      }))\n    : effectiveRoles.map((row) => ({\n        ...row,\n        role: {\n          ...row.role,\n          isInherited:\n            assignedRoles.find((r) => r.role.id === row.role.id) === undefined,\n        },\n      }))),\n];\n\nexport const ServiceRole = ({ role, client }: Row) => (\n  <>\n    {client?.clientId && (\n      \n        {client.clientId}\n      \n    )}\n    {role.name}\n  \n);\n\nexport type ResourcesKey = keyof KeycloakAdminClient;\n\ntype RoleMappingProps = {\n  name: string;\n  id: string;\n  type: ResourcesKey;\n  isManager?: boolean;\n  save: (rows: Row[]) => Promise;\n};\n\nexport const RoleMapping = ({\n  name,\n  id,\n  type,\n  isManager = true,\n  save,\n}: RoleMappingProps) => {\n  const { adminClient } = useAdminClient();\n\n  const { t } = useTranslation();\n  const { addAlert, addError } = useAlerts();\n\n  const [key, setKey] = useState(0);\n  const refresh = () => setKey(key + 1);\n\n  const [hide, setHide] = useState(true);\n  const [showAssign, setShowAssign] = useState(false);\n  const [selected, setSelected] = useState([]);\n\n  const assignRoles = async (rows: Row[]) => {\n    await save(rows);\n    refresh();\n  };\n\n  const loader = async () => {\n    let effectiveRoles: Row[] = [];\n    let effectiveClientRoles: Row[] = [];\n    if (!hide) {\n      effectiveRoles = await getEffectiveRoles(adminClient, type, id);\n\n      effectiveClientRoles = (\n        await getEffectiveClientRoles(adminClient, {\n          type,\n          id,\n        })\n      ).map((e) => ({\n        client: { clientId: e.client, id: e.clientId },\n        role: { id: e.id, name: e.role, description: e.description },\n      }));\n    }\n\n    const roles = await getMapping(adminClient, type, id);\n    const realmRolesMapping =\n      roles.realmMappings?.map((role) => ({ role })) || [];\n    const clientMapping = Object.values(roles.clientMappings || {})\n      .map((client) =>\n        client.mappings.map((role: RoleRepresentation) => ({\n          client: { clientId: client.client, ...client },\n          role,\n        })),\n      )\n      .flat();\n\n    return [\n      ...mapRoles(\n        [...realmRolesMapping, ...clientMapping],\n        [...effectiveClientRoles, ...effectiveRoles],\n        hide,\n      ),\n    ];\n  };\n\n  const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({\n    titleKey: \"removeMappingTitle\",\n    messageKey: t(\"removeMappingConfirm\", { count: selected.length }),\n    continueButtonLabel: \"remove\",\n    continueButtonVariant: ButtonVariant.danger,\n    onCancel: () => {\n      setSelected([]);\n      refresh();\n    },\n    onConfirm: async () => {\n      try {\n        await Promise.all(deleteMapping(adminClient, type, id, selected));\n        addAlert(t(\"clientScopeRemoveSuccess\"), AlertVariant.success);\n        setSelected([]);\n        refresh();\n      } catch (error) {\n        addError(\"clientScopeRemoveError\", error);\n      }\n    },\n  });\n\n  return (\n    <>\n      {showAssign && (\n         setShowAssign(false)}\n        />\n      )}\n      \n       setSelected(rows)}\n        searchPlaceholderKey=\"searchByName\"\n        ariaLabelKey=\"clientScopeList\"\n        isRowDisabled={(value) =>\n          (value.role as CompositeRole).isInherited || false\n        }\n        toolbarItem={\n          <>\n            \n               {\n                  setHide(check);\n                  refresh();\n                }}\n              />\n            \n            {isManager && (\n              <>\n                \n                   setShowAssign(true)}\n                  >\n                    {t(\"assignRole\")}\n                  \n                \n                \n                  \n                    {t(\"unAssignRole\")}\n                  \n                \n              \n            )}\n          \n        }\n        actions={\n          isManager\n            ? [\n                {\n                  title: t(\"unAssignRole\"),\n                  onRowClick: async (role) => {\n                    setSelected([role]);\n                    toggleDeleteDialog();\n                    return false;\n                  },\n                } as Action>[0]>,\n              ]\n            : []\n        }\n        columns={[\n          {\n            name: \"role.name\",\n            displayKey: t(\"name\"),\n            transforms: [cellWidth(30)],\n            cellRenderer: ServiceRole,\n          },\n          {\n            name: \"role.isInherited\",\n            displayKey: t(\"inherent\"),\n            cellFormatters: [upperCaseFormatter(), emptyFormatter()],\n          },\n          {\n            name: \"role.description\",\n            displayKey: t(\"description\"),\n            cellFormatters: [emptyFormatter()],\n          },\n        ]}\n        emptyState={\n           setShowAssign(true)}\n            secondaryActions={[\n              {\n                text: t(\"showInheritedRoles\"),\n                onClick: () => {\n                  setHide(false);\n                  refresh();\n                },\n              },\n            ]}\n          />\n        }\n      />\n    \n  );\n};\n","import {\n  Button,\n  Dropdown,\n  DropdownItem,\n  DropdownList,\n  MenuToggle,\n  Modal,\n  ModalVariant,\n  ToolbarItem,\n} from \"@patternfly/react-core\";\nimport { FilterIcon } from \"@patternfly/react-icons\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useAdminClient } from \"../../admin-client\";\nimport { useAccess } from \"../../context/access/Access\";\nimport useLocaleSort from \"../../utils/useLocaleSort\";\nimport { ListEmptyState } from \"../list-empty-state/ListEmptyState\";\nimport { KeycloakDataTable } from \"../table-toolbar/KeycloakDataTable\";\nimport { ResourcesKey, Row, ServiceRole } from \"./RoleMapping\";\nimport { getAvailableRoles } from \"./queries\";\nimport { getAvailableClientRoles } from \"./resource\";\n\ntype AddRoleMappingModalProps = {\n  id: string;\n  type: ResourcesKey;\n  name?: string;\n  isRadio?: boolean;\n  onAssign: (rows: Row[]) => void;\n  onClose: () => void;\n  isLDAPmapper?: boolean;\n};\n\ntype FilterType = \"roles\" | \"clients\";\n\nexport const AddRoleMappingModal = ({\n  id,\n  name,\n  type,\n  isRadio = false,\n  isLDAPmapper,\n  onAssign,\n  onClose,\n}: AddRoleMappingModalProps) => {\n  const { adminClient } = useAdminClient();\n\n  const { t } = useTranslation();\n  const { hasAccess } = useAccess();\n  const canViewRealmRoles = hasAccess(\"view-realm\") || hasAccess(\"query-users\");\n\n  const [searchToggle, setSearchToggle] = useState(false);\n\n  const [filterType, setFilterType] = useState(\"clients\");\n  const [selectedRows, setSelectedRows] = useState([]);\n  const [key, setKey] = useState(0);\n  const refresh = () => setKey(key + 1);\n\n  const localeSort = useLocaleSort();\n  const compareRow = ({ role: { name } }: Row) => name?.toUpperCase();\n\n  const loader = async (\n    first?: number,\n    max?: number,\n    search?: string,\n  ): Promise => {\n    const params: Record = {\n      first: first!,\n      max: max!,\n    };\n\n    if (search) {\n      params.search = search;\n    }\n\n    const roles = await getAvailableRoles(adminClient, type, { ...params, id });\n    const sorted = localeSort(roles, compareRow);\n    return sorted.map((row) => {\n      return {\n        role: row.role,\n        id: row.role.id,\n      };\n    });\n  };\n\n  const clientRolesLoader = async (\n    first?: number,\n    max?: number,\n    search?: string,\n  ): Promise => {\n    const roles = await getAvailableClientRoles(adminClient, {\n      id,\n      type,\n      first: first || 0,\n      max: max || 10,\n      search,\n    });\n\n    return localeSort(\n      roles.map((e) => ({\n        client: { clientId: e.client, id: e.clientId },\n        role: { id: e.id, name: e.role, description: e.description },\n        id: e.id,\n      })),\n      ({ client: { clientId }, role: { name } }) => `${clientId}${name}`,\n    );\n  };\n\n  return (\n     {\n            onAssign(selectedRows);\n            onClose();\n          }}\n        >\n          {t(\"assign\")}\n        ,\n        \n          {t(\"cancel\")}\n        ,\n      ]}\n    >\n       setSelectedRows([...rows])}\n        searchPlaceholderKey=\"searchByRoleName\"\n        isPaginated={!(filterType === \"roles\" && type !== \"roles\")}\n        searchTypeComponent={\n          canViewRealmRoles && (\n            \n               setSearchToggle(isOpen)}\n                onSelect={() => {\n                  setFilterType(filterType === \"roles\" ? \"clients\" : \"roles\");\n                  setSearchToggle(false);\n                  refresh();\n                }}\n                toggle={(ref) => (\n                   setSearchToggle(!searchToggle)}\n                    icon={}\n                  >\n                    {filterType === \"roles\"\n                      ? t(\"filterByRoles\")\n                      : t(\"filterByClients\")}\n                  \n                )}\n                isOpen={searchToggle}\n              >\n                \n                  \n                    {filterType === \"roles\"\n                      ? t(\"filterByClients\")\n                      : t(\"filterByRoles\")}\n                  \n                \n              \n            \n          )\n        }\n        canSelectAll\n        isRadio={isRadio}\n        loader={filterType === \"roles\" ? loader : clientRolesLoader}\n        ariaLabelKey=\"roles\"\n        columns={[\n          {\n            name: \"name\",\n            cellRenderer: ServiceRole,\n          },\n          {\n            name: \"role.description\",\n            displayKey: \"description\",\n          },\n        ]}\n        emptyState={\n           {\n                  setFilterType(\"clients\");\n                  refresh();\n                },\n              },\n            ]}\n          />\n        }\n      />\n    \n  );\n};\n"],"names":["groupFunctions","clientFunctions","mapping","castAdminClient","adminClient","resource","applyQuery","type","query","params","deleteMapping","id","rows","row","role","getMapping","result","roles","r","client","getEffectiveRoles","parentRoles","getAvailableRoles","fetchEndpoint","first","max","search","endpoint","fetchAdminUI","getAvailableClientRoles","getEffectiveClientRoles","findUsers","fetchUsedBy","mapRoles","assignedRoles","effectiveRoles","hide","ServiceRole","jsxs","Fragment","Badge","RoleMapping","name","isManager","save","useAdminClient","t","useTranslation","addAlert","addError","useAlerts","key","setKey","useState","refresh","setHide","showAssign","setShowAssign","selected","setSelected","assignRoles","loader","effectiveClientRoles","e","realmRolesMapping","clientMapping","toggleDeleteDialog","DeleteConfirm","useConfirmDialog","ButtonVariant","AlertVariant","error","jsx","AddRoleMappingModal","KeycloakDataTable","value","ToolbarItem","Checkbox","_event","check","Button","cellWidth","upperCaseFormatter","emptyFormatter","ListEmptyState","isRadio","isLDAPmapper","onAssign","onClose","hasAccess","useAccess","canViewRealmRoles","searchToggle","setSearchToggle","filterType","setFilterType","selectedRows","setSelectedRows","localeSort","useLocaleSort","compareRow","clientRolesLoader","clientId","Modal","ModalVariant","Dropdown","isOpen","ref","MenuToggle","FilterIcon","DropdownList","DropdownItem"],"mappings":"ghBAmDA,MAAMA,EAAkC,CACtC,OAAQ,CAAC,wBAAyB,sBAAsB,EACxD,cAAe,CACb,mBACA,iCACA,iCACF,EACA,cAAe,CACb,kCACA,gCACF,CACF,EAEMC,EAAmC,CACvC,OAAQ,CAAC,yBAA0B,uBAAuB,EAC1D,cAAe,CACb,oBACA,kCACA,kCACF,EACA,cAAe,CACb,mCACA,iCACF,CACF,EAEMC,EAA2B,CAC/B,OAAQF,EACR,MAAOA,EACP,aAAcC,EACd,QAASA,EACT,MAAO,CACL,OAAQ,CAAC,oBAAqB,mBAAmB,EACjD,cAAe,CACb,oBACA,oBACA,4BACF,EACA,cAAe,CAAC,YAAa,MAAM,CACrC,CACF,EAOME,GAAkB,CACtBC,EACAC,IAEAD,EAAYC,CAAQ,EAIhBC,EAAa,CACjBF,EACAG,EACAC,KACGC,IAEHN,GAAgBC,EAAaG,CAAI,EAAEC,CAAK,EAAE,GAAGC,CAAM,EAExCC,GAAgB,CAC3BN,EACAG,EACAI,EACAC,IAEAA,EAAK,IAAKC,GAAQ,CACV,MAAAC,EAAO,CAAE,GAAID,EAAI,KAAK,GAAK,KAAMA,EAAI,KAAK,MAC1CL,EAAQN,EAAQK,CAAI,GAAG,OAAOM,EAAI,OAAS,EAAI,CAAC,EAE/C,OAAAP,EACLF,EACAG,EACAC,EACA,CACE,GAAAG,EACA,eAAgBE,EAAI,QAAQ,GAC5B,OAAQA,EAAI,QAAQ,GACpB,MAAO,CAACC,CAAI,CACd,EACA,CAACA,CAAI,CAAA,CAET,CAAC,EAEUC,GAAa,MACxBX,EACAG,EACAI,IACoC,CACpC,MAAMH,EAAQN,EAAQK,CAAI,EAAG,cAAc,CAAC,EACtCS,EAASV,EAAWF,EAAaG,EAAMC,EAAO,CAAE,GAAAG,EAAI,EAC1D,GAAIJ,IAAS,QACJ,OAAAS,EAET,MAAMC,EAAQ,MAAMD,EAcb,MAAA,CACL,eAdkB,MAAM,QAAQ,IAChCC,EACG,OAAQC,GAAMA,EAAE,UAAU,EAC1B,IAAI,MAAOJ,GAAS,CACnB,MAAMK,EAAS,MAAMf,EAAY,QAAQ,QAAQ,CAC/C,GAAIU,EAAK,WAAA,CACV,EAED,OAAAA,EAAK,YAAcK,GAAQ,SACpB,CAAE,GAAGA,EAAQ,SAAU,CAACL,CAAI,CAAE,CAAA,CACtC,CAAA,EAKH,cAAeG,EAAM,OAAQC,GAAM,CAACA,EAAE,UAAU,CAAA,CAEpD,EAEaE,GAAoB,MAC/BhB,EACAG,EACAI,IACmB,CACnB,MAAMH,EAAQN,EAAQK,CAAI,EAAG,cAAc,CAAC,EAC5C,GAAIA,IAAS,QACH,OAAA,MAAMD,EAAWF,EAAaG,EAAMC,EAAO,CAAE,GAAAG,EAAI,GAAG,IAAKG,IAAU,CACzE,KAAAA,CACA,EAAA,EAEE,MAAAG,EAAQ,MAAMX,EAAWF,EAAaG,EAAMC,EAAO,CAAE,GAAAG,EAAI,EACzDU,EAAc,MAAM,QAAQ,IAChCJ,EACG,OAAQC,GAAMA,EAAE,SAAS,EACzB,IAAKA,GAAMZ,EAAWF,EAAaG,EAAMC,EAAO,CAAE,GAAIU,EAAE,EAAA,CAAI,CAAC,CAAA,EAElE,MAAO,CAAC,GAAGD,EAAO,GAAGI,EAAY,KAAM,CAAA,EAAE,IAAKP,IAAU,CAAE,KAAAA,GAAO,CACnE,EAEaQ,GAAoB,MAC/BlB,EACAG,EACAE,IACmB,CACnB,MAAMD,EAAQN,EAAQK,CAAI,EAAG,cAAc,CAAC,EACpC,OAAA,MAAMD,EAAWF,EAAaG,EAAMC,EAAOC,CAAM,GAAG,IAAKK,IAAU,CACzE,KAAAA,CACA,EAAA,CACJ,ECvKMS,EAAgB,MACpBnB,EACA,CAAE,GAAAO,EAAI,KAAAJ,EAAM,MAAAiB,EAAO,IAAAC,EAAK,OAAAC,EAAQ,SAAAC,KAEhCC,EAAaxB,EAAa,WAAWuB,CAAQ,IAAIpB,CAAI,IAAII,CAAE,GAAI,CAC7D,OAAQa,GAAS,GAAG,SAAS,EAC7B,KAAMC,GAAO,IAAI,SAAS,EAC1B,OAAQC,GAAU,EACpB,CAAC,EAEUG,GAA0B,CACrCzB,EACAI,IAEAe,EAAcnB,EAAa,CAAE,GAAGI,EAAO,SAAU,iBAAA,CAAmB,EAEzDsB,GAA0B,CACrC1B,EACAI,IAEAe,EAAcnB,EAAa,CAAE,GAAGI,EAAO,SAAU,iBAAA,CAAmB,EAoBzDuB,GAAY,CACvB3B,EACAI,IAEAoB,EACExB,EACA,0BACAI,CACF,EAEWwB,GAAc,CACzB5B,EACAI,IAEAe,EAAcnB,EAAa,CACzB,GAAGI,EACH,SAAU,2BACZ,CAAC,EClDUyB,GAAW,CACtBC,EACAC,EACAC,IACG,CACH,GAAIA,EACAF,EAAc,IAAKrB,IAAS,CAC1B,GAAGA,EACH,KAAM,CACJ,GAAGA,EAAI,KACP,YAAa,EACf,CACA,EAAA,EACFsB,EAAe,IAAKtB,IAAS,CAC3B,GAAGA,EACH,KAAM,CACJ,GAAGA,EAAI,KACP,YACEqB,EAAc,KAAMhB,GAAMA,EAAE,KAAK,KAAOL,EAAI,KAAK,EAAE,IAAM,MAC7D,CAAA,EACA,CACR,EAEawB,EAAc,CAAC,CAAE,KAAAvB,EAAM,OAAAK,KAE/BmB,EAAAC,EAAA,CAAA,SAAA,CAAQpB,GAAA,YACNqB,GAAM,CAAA,OAAM,GAAC,UAAU,4CACrB,WAAO,QACV,CAAA,EAED1B,EAAK,IAAA,EACR,EAaW2B,GAAc,CAAC,CAC1B,KAAAC,EACA,GAAA/B,EACA,KAAAJ,EACA,UAAAoC,EAAY,GACZ,KAAAC,CACF,IAAwB,CAChB,KAAA,CAAE,YAAAxC,GAAgByC,IAElB,CAAE,EAAAC,GAAMC,IACR,CAAE,SAAAC,EAAU,SAAAC,CAAS,EAAIC,EAAU,EAEnC,CAACC,EAAKC,CAAM,EAAIC,EAAS,CAAC,EAC1BC,EAAU,IAAMF,EAAOD,EAAM,CAAC,EAE9B,CAACf,EAAMmB,CAAO,EAAIF,EAAS,EAAI,EAC/B,CAACG,EAAYC,CAAa,EAAIJ,EAAS,EAAK,EAC5C,CAACK,EAAUC,CAAW,EAAIN,EAAgB,CAAE,CAAA,EAE5CO,EAAc,MAAOhD,GAAgB,CACzC,MAAMgC,EAAKhC,CAAI,EACP0C,GAAA,EAGJO,EAAS,SAAY,CACzB,IAAI1B,EAAwB,CAAA,EACxB2B,EAA8B,CAAA,EAC7B1B,IACHD,EAAiB,MAAMf,GAAkBhB,EAAaG,EAAMI,CAAE,EAG5DmD,GAAA,MAAMhC,GAAwB1B,EAAa,CACzC,KAAAG,EACA,GAAAI,CAAA,CACD,GACD,IAAKoD,IAAO,CACZ,OAAQ,CAAE,SAAUA,EAAE,OAAQ,GAAIA,EAAE,QAAS,EAC7C,KAAM,CAAE,GAAIA,EAAE,GAAI,KAAMA,EAAE,KAAM,YAAaA,EAAE,WAAY,CAC3D,EAAA,GAGJ,MAAM9C,EAAQ,MAAMF,GAAWX,EAAaG,EAAMI,CAAE,EAC9CqD,EACJ/C,EAAM,eAAe,IAAKH,IAAU,CAAE,KAAAA,CAAA,EAAO,GAAK,GAC9CmD,EAAgB,OAAO,OAAOhD,EAAM,gBAAkB,CAAE,CAAA,EAC3D,IAAKE,GACJA,EAAO,SAAS,IAAKL,IAA8B,CACjD,OAAQ,CAAE,SAAUK,EAAO,OAAQ,GAAGA,CAAO,EAC7C,KAAAL,CAAA,EACA,GAEH,KAAK,EAED,MAAA,CACL,GAAGmB,GACD,CAAC,GAAG+B,EAAmB,GAAGC,CAAa,EACvC,CAAC,GAAGH,EAAsB,GAAG3B,CAAc,EAC3CC,CACF,CAAA,CACF,EAGI,CAAC8B,EAAoBC,CAAa,EAAIC,GAAiB,CAC3D,SAAU,qBACV,WAAYtB,EAAE,uBAAwB,CAAE,MAAOY,EAAS,OAAQ,EAChE,oBAAqB,SACrB,sBAAuBW,EAAc,OACrC,SAAU,IAAM,CACdV,EAAY,CAAE,CAAA,EACNL,GACV,EACA,UAAW,SAAY,CACjB,GAAA,CACF,MAAM,QAAQ,IAAI5C,GAAcN,EAAaG,EAAMI,EAAI+C,CAAQ,CAAC,EAChEV,EAASF,EAAE,0BAA0B,EAAGwB,EAAa,OAAO,EAC5DX,EAAY,CAAE,CAAA,EACNL,UACDiB,EAAO,CACdtB,EAAS,yBAA0BsB,CAAK,CAC1C,CACF,CAAA,CACD,EAED,OAEKjC,EAAAC,EAAA,CAAA,SAAA,CACCiB,GAAAgB,EAACC,GAAA,CACC,GAAA9D,EACA,KAAAJ,EACA,KAAAmC,EACA,SAAUkB,EACV,QAAS,IAAMH,EAAc,EAAK,CAAA,CACpC,IAEDU,EAAc,EAAA,EACfK,EAACE,EAAA,CACC,cAAY,iBAEZ,OAAAb,EACA,aAAY,GACZ,SAAWjD,GAAS+C,EAAY/C,CAAI,EACpC,qBAAqB,eACrB,aAAa,kBACb,cAAgB+D,GACbA,EAAM,KAAuB,aAAe,GAE/C,YAEIrC,EAAAC,EAAA,CAAA,SAAA,CAAAiC,EAACI,EACC,CAAA,SAAAJ,EAACK,EAAA,CACC,MAAO/B,EAAE,oBAAoB,EAC7B,GAAG,qBACH,cAAY,qBACZ,UAAWV,EACX,SAAU,CAAC0C,EAAQC,IAAU,CAC3BxB,EAAQwB,CAAK,EACLzB,GACV,CAAA,CAAA,EAEJ,EACCX,GAEGL,EAAAC,EAAA,CAAA,SAAA,CAAAiC,EAACI,EACC,CAAA,SAAAJ,EAACQ,EAAA,CACC,cAAY,aACZ,QAAS,IAAMvB,EAAc,EAAI,EAEhC,WAAE,YAAY,CAAA,CAAA,EAEnB,IACCmB,EACC,CAAA,SAAAJ,EAACQ,EAAA,CACC,QAAQ,OACR,cAAY,eACZ,QAASd,EACT,WAAYR,EAAS,SAAW,EAE/B,WAAE,cAAc,CAAA,CAAA,EAErB,CAAA,EACF,CAAA,EAEJ,EAEF,QACEf,EACI,CACE,CACE,MAAOG,EAAE,cAAc,EACvB,WAAY,MAAOhC,IACL6C,EAAA,CAAC7C,CAAI,CAAC,EACCoD,IACZ,GAEX,CAAA,EAEF,CAAC,EAEP,QAAS,CACP,CACE,KAAM,YACN,WAAYpB,EAAE,MAAM,EACpB,WAAY,CAACmC,GAAU,EAAE,CAAC,EAC1B,aAAc5C,CAChB,EACA,CACE,KAAM,mBACN,WAAYS,EAAE,UAAU,EACxB,eAAgB,CAACoC,IAAsBC,GAAgB,CACzD,EACA,CACE,KAAM,mBACN,WAAYrC,EAAE,aAAa,EAC3B,eAAgB,CAACqC,GAAgB,CACnC,CACF,EACA,WACEX,EAACY,EAAA,CACC,QAAStC,EAAE,WAAWvC,CAAI,EAAE,EAC5B,aAAcuC,EAAE,uBAAuBvC,CAAI,EAAE,EAC7C,kBAAmBuC,EAAE,YAAY,EACjC,gBAAiB,IAAMW,EAAc,EAAI,EACzC,iBAAkB,CAChB,CACE,KAAMX,EAAE,oBAAoB,EAC5B,QAAS,IAAM,CACbS,EAAQ,EAAK,EACLD,GACV,CACF,CACF,CAAA,CACF,CAAA,EA9FG,GAAG3C,CAAE,GAAGwC,CAAG,EAgGlB,CACF,CAAA,CAAA,CAEJ,ECnPasB,GAAsB,CAAC,CAClC,GAAA9D,EACA,KAAA+B,EACA,KAAAnC,EACA,QAAA8E,EAAU,GACV,aAAAC,EACA,SAAAC,EACA,QAAAC,CACF,IAAgC,CACxB,KAAA,CAAE,YAAApF,GAAgByC,IAElB,CAAE,EAAAC,GAAMC,IACR,CAAE,UAAA0C,GAAcC,KAChBC,EAAoBF,EAAU,YAAY,GAAKA,EAAU,aAAa,EAEtE,CAACG,EAAcC,CAAe,EAAIxC,EAAS,EAAK,EAEhD,CAACyC,EAAYC,CAAa,EAAI1C,EAAqB,SAAS,EAC5D,CAAC2C,EAAcC,CAAe,EAAI5C,EAAgB,CAAE,CAAA,EACpD,CAACF,EAAKC,CAAM,EAAIC,EAAS,CAAC,EAC1BC,EAAU,IAAMF,EAAOD,EAAM,CAAC,EAE9B+C,EAAaC,KACbC,EAAa,CAAC,CAAE,KAAM,CAAE,KAAA1D,EAAkBA,IAAAA,GAAM,cAEhDmB,EAAS,MACbrC,EACAC,EACAC,IACmB,CACnB,MAAMjB,EAA0C,CAC9C,MAAAe,EACA,IAAAC,CAAA,EAGEC,IACFjB,EAAO,OAASiB,GAGZ,MAAAT,EAAQ,MAAMK,GAAkBlB,EAAaG,EAAM,CAAE,GAAGE,EAAQ,GAAAE,CAAA,CAAI,EAEnE,OADQuF,EAAWjF,EAAOmF,CAAU,EAC7B,IAAKvF,IACV,CACL,KAAMA,EAAI,KACV,GAAIA,EAAI,KAAK,EAAA,EAEhB,CAAA,EAGGwF,EAAoB,MACxB7E,EACAC,EACAC,IACmB,CACb,MAAAT,EAAQ,MAAMY,GAAwBzB,EAAa,CACvD,GAAAO,EACA,KAAAJ,EACA,MAAOiB,GAAS,EAChB,IAAKC,GAAO,GACZ,OAAAC,CAAA,CACD,EAEM,OAAAwE,EACLjF,EAAM,IAAK8C,IAAO,CAChB,OAAQ,CAAE,SAAUA,EAAE,OAAQ,GAAIA,EAAE,QAAS,EAC7C,KAAM,CAAE,GAAIA,EAAE,GAAI,KAAMA,EAAE,KAAM,YAAaA,EAAE,WAAY,EAC3D,GAAIA,EAAE,EAAA,EACN,EACF,CAAC,CAAE,OAAQ,CAAE,SAAAuC,CAAY,EAAA,KAAM,CAAE,KAAA5D,EAAO,IAAM,GAAG4D,CAAQ,GAAG5D,CAAI,EAAA,CAClE,EAIA,OAAA8B,EAAC+B,GAAA,CACC,QAASC,GAAa,MACtB,MACElB,EAAexC,EAAE,YAAY,EAAIA,EAAE,gBAAiB,CAAE,OAAQJ,EAAM,EAEtE,OAAM,GACN,QAAA8C,EACA,QAAS,CACPhB,EAACQ,EAAA,CACC,cAAY,SAEZ,WAAYgB,EAAa,SAAW,EACpC,QAAQ,UACR,QAAS,IAAM,CACbT,EAASS,CAAY,EACbR,GACV,EAEC,WAAE,QAAQ,CAAA,EARP,SASN,EACAhB,EAACQ,EAAA,CACC,cAAY,SAEZ,QAAQ,OACR,QAASQ,EAER,WAAE,QAAQ,CAAA,EAJP,QAKN,CACF,EAEA,SAAAhB,EAACE,EAAA,CAEC,SAAW9D,GAASqF,EAAgB,CAAC,GAAGrF,CAAI,CAAC,EAC7C,qBAAqB,mBACrB,YAAa,EAAEkF,IAAe,SAAWvF,IAAS,SAClD,oBACEoF,GACEnB,EAACI,EACC,CAAA,SAAAJ,EAACiC,GAAA,CACC,aAAeC,GAAWb,EAAgBa,CAAM,EAChD,SAAU,IAAM,CACAX,EAAAD,IAAe,QAAU,UAAY,OAAO,EAC1DD,EAAgB,EAAK,EACbvC,GACV,EACA,OAASqD,GACPnC,EAACoC,GAAA,CACC,cAAY,uBACZ,IAAAD,EACA,QAAS,IAAMd,EAAgB,CAACD,CAAY,EAC5C,OAAOiB,GAAW,EAAA,EAEjB,SACG/D,MADY,QACV,gBACA,iBADe,CACE,CACzB,EAEF,OAAQ8C,EAER,SAACpB,EAAAsC,GAAA,CACC,SAACtC,EAAAuC,GAAA,CAA+B,cAAajB,EAC1C,SACGhD,EADHgD,IAAe,QACV,kBACA,eADiB,CACF,EAHL,aAIlB,EACF,CAAA,CAAA,EAEJ,EAGJ,aAAY,GACZ,QAAAT,EACA,OAAQS,IAAe,QAAUjC,EAASwC,EAC1C,aAAa,QACb,QAAS,CACP,CACE,KAAM,OACN,aAAchE,CAChB,EACA,CACE,KAAM,mBACN,WAAY,aACd,CACF,EACA,WACEmC,EAACY,EAAA,CACC,QAAStC,EAAE,SAAS,EACpB,aAAcA,EAAE,sBAAsB,EACtC,iBAAkB,CAChB,CACE,KAAMA,EAAE,iBAAiB,EACzB,QAAS,IAAM,CACbiD,EAAc,SAAS,EACfzC,GACV,CACF,CACF,CAAA,CACF,CAAA,EAlEGH,CAoEP,CAAA,CAAA,CAGN"}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy