From 0ce553a7ddcdf3e69e2e1d1bf90ffd9d14ca03e3 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Sat, 24 Feb 2024 18:15:29 -0500 Subject: [PATCH 001/133] Update GraphExplorer.jsx --- .../tenant/administration/GraphExplorer.jsx | 32 ++++++++----------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/src/views/tenant/administration/GraphExplorer.jsx b/src/views/tenant/administration/GraphExplorer.jsx index 8f38821ec387..cf2612db05ac 100644 --- a/src/views/tenant/administration/GraphExplorer.jsx +++ b/src/views/tenant/administration/GraphExplorer.jsx @@ -40,7 +40,6 @@ const GraphExplorer = () => { const [alertVisible, setAlertVisible] = useState() const [random, setRandom] = useState('') const [random2, setRandom2] = useState('') - const [random3, setRandom3] = useState('') const [ocVisible, setOCVisible] = useState(false) const [searchNow, setSearchNow] = useState(false) const [visibleA, setVisibleA] = useState(true) @@ -59,21 +58,21 @@ const GraphExplorer = () => { } = useGenericGetRequestQuery({ path: '/api/ListGraphExplorerPresets', params: { random2 } }) const QueryColumns = { set: false, data: [] } - function endpointChange(value) { - execPropRequest({ - path: '/api/ListGraphRequest', - params: { - Endpoint: value, - ListProperties: true, - TenantFilter: tenant.defaultDomainName, - IgnoreErrors: true, - random: (Math.random() + 1).toString(36).substring(7), - }, - }) - } const debounceEndpointChange = useMemo(() => { + function endpointChange(value) { + execPropRequest({ + path: '/api/ListGraphRequest', + params: { + Endpoint: value, + ListProperties: true, + TenantFilter: tenant.defaultDomainName, + IgnoreErrors: true, + random: (Math.random() + 1).toString(36).substring(7), + }, + }) + } return debounce(endpointChange, 1000) - }, [endpointChange]) + }, []) if (graphrequest.isSuccess) { if (graphrequest.data?.Results?.length > 0) { @@ -529,9 +528,6 @@ const GraphExplorer = () => { : [] } allowCreate={true} - refreshFunction={() => - setRandom3((Math.random() + 1).toString(36).substring(7)) - } isLoading={availableProperties.isFetching} /> @@ -572,7 +568,7 @@ const GraphExplorer = () => {
{!searchNow && Execute a search to get started.} - {graphrequest.isFetching && ( + {graphrequest.isFetching && !QueryColumns.set && (
Loading Data
From 8c44073f68f736403e9c7ca550f4472f9ad10c42 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Sat, 24 Feb 2024 18:46:04 -0500 Subject: [PATCH 002/133] Update GraphExplorer.jsx --- src/views/tenant/administration/GraphExplorer.jsx | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/views/tenant/administration/GraphExplorer.jsx b/src/views/tenant/administration/GraphExplorer.jsx index cf2612db05ac..49a6e475f7b5 100644 --- a/src/views/tenant/administration/GraphExplorer.jsx +++ b/src/views/tenant/administration/GraphExplorer.jsx @@ -482,6 +482,7 @@ const GraphExplorer = () => { ) }} +
@@ -503,13 +504,6 @@ const GraphExplorer = () => { /> - -
{ isLoading={availableProperties.isFetching} />
+ + Date: Sun, 25 Feb 2024 10:55:06 -0500 Subject: [PATCH 003/133] Add refresh function --- src/views/tenant/administration/GraphExplorer.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/views/tenant/administration/GraphExplorer.jsx b/src/views/tenant/administration/GraphExplorer.jsx index 49a6e475f7b5..42cc4ac2ce8c 100644 --- a/src/views/tenant/administration/GraphExplorer.jsx +++ b/src/views/tenant/administration/GraphExplorer.jsx @@ -590,6 +590,7 @@ const GraphExplorer = () => { columns={QueryColumns.data} data={graphrequest?.data?.Results} isFetching={graphrequest.isFetching} + refreshFunction={() => setRandom((Math.random() + 1).toString(36).substring(7))} /> From 98b56a49ca7879cc0f6d9044fcb5f9d74e508430 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Sun, 25 Feb 2024 11:06:52 -0500 Subject: [PATCH 004/133] Update RFFComponents.jsx --- src/components/forms/RFFComponents.jsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/forms/RFFComponents.jsx b/src/components/forms/RFFComponents.jsx index 834c9688d2cc..fc98eec7af92 100644 --- a/src/components/forms/RFFComponents.jsx +++ b/src/components/forms/RFFComponents.jsx @@ -429,7 +429,12 @@ export const RFFSelectSearch = ({ {label} {refreshFunction && ( - + From 4f5d03ae0365c338360f57e2e815be30881b5100 Mon Sep 17 00:00:00 2001 From: BNWEIN Date: Tue, 27 Feb 2024 18:12:57 +0000 Subject: [PATCH 005/133] Update DomainsAnalyser.jsx Added DKIM Records to table and export. --- src/views/tenant/standards/DomainsAnalyser.jsx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/views/tenant/standards/DomainsAnalyser.jsx b/src/views/tenant/standards/DomainsAnalyser.jsx index e7cd129eaa14..30d830a0ad09 100644 --- a/src/views/tenant/standards/DomainsAnalyser.jsx +++ b/src/views/tenant/standards/DomainsAnalyser.jsx @@ -15,6 +15,7 @@ import { faTrash, } from '@fortawesome/free-solid-svg-icons' import { useLazyGenericGetRequestQuery } from 'src/store/api/app' +import { cellGenericFormatter } from 'src/components/tables/CellGenericFormat' const RefreshAction = () => { const [execDomainsAnalyser, { isLoading, isSuccess, error }] = useExecDomainsAnalyserMutation() @@ -257,6 +258,14 @@ const DomainsAnalyser = () => { return No Data }, }, + { + name: 'DKIM Records', + selector: (row) => row['DKIMRecords'], + exportSelector: 'DKIMRecords', + sortable: true, + cell: cellGenericFormatter(), + omit: true, + }, { name: 'More Info', dataField: 'moreInfo', From 3e0a1b56ac97884ed9763910e1dcf7af74c90c05 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Tue, 27 Feb 2024 21:50:00 +0100 Subject: [PATCH 006/133] remove old imports --- src/components/tables/CippTable.jsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/components/tables/CippTable.jsx b/src/components/tables/CippTable.jsx index 74dbf52ecd53..de094ed5afe1 100644 --- a/src/components/tables/CippTable.jsx +++ b/src/components/tables/CippTable.jsx @@ -10,9 +10,6 @@ import { CDropdownMenu, CDropdownItem, CButton, - CModal, - CModalBody, - CModalTitle, CCallout, CFormSelect, CAccordion, From bbe4231a8c85a8419a782f2d05d279f7150b64f8 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Wed, 28 Feb 2024 13:45:35 +0100 Subject: [PATCH 007/133] save columns when user changes them with option to reset --- src/components/tables/CippTable.jsx | 135 +++++++++++++++++++++------- src/store/features/app.js | 5 ++ 2 files changed, 107 insertions(+), 33 deletions(-) diff --git a/src/components/tables/CippTable.jsx b/src/components/tables/CippTable.jsx index de094ed5afe1..ddac4bbcb71a 100644 --- a/src/components/tables/CippTable.jsx +++ b/src/components/tables/CippTable.jsx @@ -1,5 +1,5 @@ import React, { useRef, useMemo, useState, useCallback, useEffect } from 'react' -import { useSelector } from 'react-redux' +import { useDispatch, useSelector } from 'react-redux' import { ExportCsvButton, ExportPDFButton } from 'src/components/buttons' import { CSpinner, @@ -29,15 +29,14 @@ import { faFilePdf, faSearch, faSync, - faTasks, } from '@fortawesome/free-solid-svg-icons' import { cellGenericFormatter } from './CellGenericFormat' import { ModalService } from '../utilities' import { useLazyGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app' -import { ConfirmModal } from '../utilities/SharedModal' -import { debounce } from 'lodash-es' +import { debounce, update } from 'lodash-es' import { useSearchParams } from 'react-router-dom' import CopyToClipboard from 'react-copy-to-clipboard' +import { setDefaultColumns } from 'src/store/features/app' const FilterComponent = ({ filterText, onFilter, onClear, filterlist, onFilterPreset }) => ( <> @@ -147,10 +146,43 @@ export default function CippTable({ }) { const inputRef = useRef('') const [loopRunning, setLoopRunning] = React.useState(false) + const defaultColumns = useSelector((state) => state.app.defaultColumns[reportName]) + const [defaultColumnsSet, setDefaultColumnsSet] = React.useState(false) const [massResults, setMassResults] = React.useState([]) const [filterText, setFilterText] = React.useState(defaultFilterText) const [filterviaURL, setFilterviaURL] = React.useState(false) + const [originalColumns, setOrginalColumns] = React.useState(columns) const [updatedColumns, setUpdatedColumns] = React.useState(columns) + if (defaultColumns && defaultColumnsSet === false) { + const defaultColumnsArray = defaultColumns.split(',').filter((item) => item) + + const actionsColumn = columns.length > 0 ? columns[columns.length - 1] : null + + let tempColumns = actionsColumn ? columns.slice(0, -1) : [...columns] + + defaultColumnsArray.forEach((columnName) => { + if (!tempColumns.find((c) => c.exportSelector === columnName)) { + tempColumns.push({ + name: columnName, + selector: (row) => row[columnName], + sortable: true, + exportSelector: columnName, + cell: cellGenericFormatter(), + }) + } + }) + + if (actionsColumn) { + tempColumns.push(actionsColumn) + } + let newColumns = tempColumns.filter( + (column) => defaultColumnsArray.includes(column.exportSelector) || column === actionsColumn, + ) + + setUpdatedColumns(newColumns) + setDefaultColumnsSet(true) + } + const [selectedRows, setSelectedRows] = React.useState(false) const [genericGetRequest, getResults] = useLazyGenericGetRequestQuery() const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery() @@ -168,6 +200,30 @@ export default function CippTable({ searchParams.delete('updateTableFilter') } + // eslint-disable-next-line react-hooks/exhaustive-deps + const addColumn = (columnname) => { + let alreadyInArray = updatedColumns.some((o) => o.exportSelector === columnname) + let newColumns = [...updatedColumns] + const actionsColumn = newColumns.length > 0 ? newColumns.pop() : null + + if (!alreadyInArray) { + const newColumn = { + name: columnname, + selector: (row) => row[columnname], + sortable: true, + exportSelector: columnname, + cell: cellGenericFormatter(), + } + newColumns.push(newColumn) + } else { + newColumns = newColumns.filter((o) => o.exportSelector !== columnname) + } + if (actionsColumn) { + newColumns.push(actionsColumn) + } + setUpdatedColumns(newColumns) + } + const handleSelectedChange = ({ selectedRows }) => { setSelectedRows(selectedRows) if (selectedRows.length < 1) { @@ -269,12 +325,34 @@ export default function CippTable({ const applyFilter = (e) => { setFilterText(e.target.value) } + // eslint-disable-next-line react-hooks/exhaustive-deps + const setColumnDefaultLayout = (endpoint, columns) => { + dispatch(setDefaultColumns({ endpoint, columns })) + } + const resetDropdown = () => { + setUpdatedColumns(originalColumns) + setColumnDefaultLayout(reportName, null) + } + const dispatch = useDispatch() useEffect(() => { - if (columns !== updatedColumns) { - setUpdatedColumns(columns) + if (columns.length !== updatedColumns.length) { + setUpdatedColumns(updatedColumns) + setColumnDefaultLayout( + reportName, + updatedColumns.map((column) => column.exportSelector).join(','), + ) } - }, [columns, updatedColumns]) + }, [ + columns, + defaultColumns, + dispatch, + dynamicColumns, + originalColumns, + reportName, + setColumnDefaultLayout, + updatedColumns, + ]) createTheme( 'cyberdrain', @@ -492,7 +570,7 @@ export default function CippTable({ } const executeselectedAction = (item) => { - console.log(item) + // console.log(item) setModalContent({ item, }) @@ -614,24 +692,6 @@ export default function CippTable({ if (!disablePDFExport) { if (dynamicColumns === true) { - const addColumn = (columnname) => { - var index = columns.length - 1 - let alreadyInArray = columns.find((o) => o.exportSelector === columnname) - if (!alreadyInArray) { - columns.splice(index, 0, { - name: columnname, - selector: (row) => row[columnname], - sortable: true, - exportSelector: columnname, - cell: cellGenericFormatter(), - }) - } else { - let indexOfExisting = columns.findIndex((o) => o.exportSelector === columnname) - columns = columns.splice(indexOfExisting, 1) - } - setUpdatedColumns(Date()) - } - defaultActions.push([ + resetDropdown()}>Reset to default {dataKeys() && dataKeys().map((item, idx) => { return ( addColumn(item)}> - {columns.find((o) => o.exportSelector === item) && ( + {updatedColumns.find((o) => o.exportSelector === item) && ( )}{' '} {item} @@ -775,18 +836,26 @@ export default function CippTable({ ) }, [ + refreshFunction, actions, - selectedRows, disablePDFExport, disableCSVExport, + selectedRows, + actionsList, + showFilter, filterText, filterlist, resetPaginationToggle, - data, + handleModal, + getDrowndownInfo, + filteredItems, columns, + data, + dynamicColumns, reportName, - selectedRows, - filteredItems, + originalColumns, + addColumn, + setGraphFilter, ]) const tablePageSize = useSelector((state) => state.app.tablePageSize) const [codeCopied, setCodeCopied] = useState(false) @@ -800,7 +869,7 @@ export default function CippTable({
{!isFetching && error && Error loading data}
- {(columns.length === updatedColumns.length || !dynamicColumns) && ( + {(updatedColumns || !dynamicColumns) && ( <> {(massResults.length >= 1 || loopRunning) && ( @@ -897,7 +966,7 @@ export default function CippTable({ responsive={responsive} dense={dense} striped={striped} - columns={columns} + columns={updatedColumns} data={filteredItems} expandableRows={expandableRows} expandableRowsComponent={expandableRowsComponent} diff --git a/src/store/features/app.js b/src/store/features/app.js index 285ef9623269..994c58314128 100644 --- a/src/store/features/app.js +++ b/src/store/features/app.js @@ -11,6 +11,7 @@ const initialState = { tablePageSize: 25, pageSizes: [25, 50, 100, 200, 500], TenantListSelector: false, + defaultColumns: {}, } export const appSlice = createSlice({ @@ -47,6 +48,9 @@ export const appSlice = createSlice({ setOffboardingDefaults: (state, action) => { state.offboardingDefaults = action.payload?.offboardingDefaults }, + setDefaultColumns: (state, action) => { + state.defaultColumns[action.payload.endpoint] = action.payload?.columns + }, setUserSettings: (state, action) => { //foreach key in the userSettings, set the state key to the value of that setting Object.keys(action.payload?.userSettings).forEach((key) => { @@ -68,6 +72,7 @@ export const { setReportImage, setOffboardingDefaults, setUserSettings, + setDefaultColumns, } = appSlice.actions export default persistReducer( From 250cf4d86835f17d710647e137c0b20cc3b7be7f Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Wed, 28 Feb 2024 14:04:28 +0100 Subject: [PATCH 008/133] add exportselector where required --- src/views/cipp/CIPPSettings.jsx | 2 ++ src/views/email-exchange/administration/ContactsList.jsx | 1 + src/views/email-exchange/transport/TransportRules.jsx | 2 ++ src/views/endpoint/intune/MEMListPolicies.jsx | 1 + src/views/identity/administration/Deleted.jsx | 1 + src/views/identity/administration/Users.jsx | 1 + src/views/teams-share/teams/TeamsListTeam.jsx | 1 + src/views/tenant/conditional/ConditionalAccess.jsx | 1 + 8 files changed, 10 insertions(+) diff --git a/src/views/cipp/CIPPSettings.jsx b/src/views/cipp/CIPPSettings.jsx index 4c74b28bbcc9..89ff710941f1 100644 --- a/src/views/cipp/CIPPSettings.jsx +++ b/src/views/cipp/CIPPSettings.jsx @@ -230,12 +230,14 @@ const GeneralSettings = () => { selector: (row) => row?.GDAPRoles, cell: cellTableFormatter('GDAPRoles', false, true), omit: showExtendedInfo, + exportSelector: 'GDAPRoles', }, { name: 'SAM User Roles', selector: (row) => row?.SAMUserRoles, cell: cellTableFormatter('SAMUserRoles', false, true), omit: showExtendedInfo, + exportSelector: 'SAMUserRoles', }, ] diff --git a/src/views/email-exchange/administration/ContactsList.jsx b/src/views/email-exchange/administration/ContactsList.jsx index 094f3c6930f3..f0709de26be3 100644 --- a/src/views/email-exchange/administration/ContactsList.jsx +++ b/src/views/email-exchange/administration/ContactsList.jsx @@ -80,6 +80,7 @@ const columns = [ selector: (row) => row['id'], name: 'id', omit: true, + exportSelector: 'id', }, { selector: (row) => row['onPremisesSyncEnabled'], diff --git a/src/views/email-exchange/transport/TransportRules.jsx b/src/views/email-exchange/transport/TransportRules.jsx index 1a32de02b5e3..4e6f3f68a35d 100644 --- a/src/views/email-exchange/transport/TransportRules.jsx +++ b/src/views/email-exchange/transport/TransportRules.jsx @@ -100,11 +100,13 @@ const columns = [ name: 'description', selector: (row) => row['Description'], omit: true, + exportSelector: 'Description', }, { name: 'GUID', selector: (row) => row['Guid'], omit: true, + exportSelector: 'Guid', }, { name: 'Actions', diff --git a/src/views/endpoint/intune/MEMListPolicies.jsx b/src/views/endpoint/intune/MEMListPolicies.jsx index ad45fc5485fe..c07216317afc 100644 --- a/src/views/endpoint/intune/MEMListPolicies.jsx +++ b/src/views/endpoint/intune/MEMListPolicies.jsx @@ -101,6 +101,7 @@ const columns = [ selector: (row) => row['id'], name: 'id', omit: true, + exportSelector: 'id', }, { name: 'Actions', diff --git a/src/views/identity/administration/Deleted.jsx b/src/views/identity/administration/Deleted.jsx index 1c7e35c72987..2e925eed5bb6 100644 --- a/src/views/identity/administration/Deleted.jsx +++ b/src/views/identity/administration/Deleted.jsx @@ -93,6 +93,7 @@ const columns = [ name: 'id', selector: (row) => row['id'], omit: true, + exportSelector: 'id', }, { name: 'Actions', diff --git a/src/views/identity/administration/Users.jsx b/src/views/identity/administration/Users.jsx index 774f25a29c2d..ef2ce6722b7a 100644 --- a/src/views/identity/administration/Users.jsx +++ b/src/views/identity/administration/Users.jsx @@ -399,6 +399,7 @@ const Users = (row) => { name: 'id', selector: (row) => row['id'], omit: true, + exportSelector: 'id', }, { name: 'Actions', diff --git a/src/views/teams-share/teams/TeamsListTeam.jsx b/src/views/teams-share/teams/TeamsListTeam.jsx index cbbf0a818d9e..c4d59d7dd9a3 100644 --- a/src/views/teams-share/teams/TeamsListTeam.jsx +++ b/src/views/teams-share/teams/TeamsListTeam.jsx @@ -62,6 +62,7 @@ const TeamsList = () => { name: 'ID', selector: (row) => row['id'], omit: true, + exportSelector: 'id', }, { name: 'Actions', diff --git a/src/views/tenant/conditional/ConditionalAccess.jsx b/src/views/tenant/conditional/ConditionalAccess.jsx index 0684781a6928..650daa4e4fa4 100644 --- a/src/views/tenant/conditional/ConditionalAccess.jsx +++ b/src/views/tenant/conditional/ConditionalAccess.jsx @@ -206,6 +206,7 @@ const columns = [ name: 'rawjson', selector: (row) => row['rawjson'], omit: true, + exportSelector: 'rawjson', }, { name: 'Actions', From c7eb44a90b808d6a5a69016b990d75f61e04f979 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Wed, 28 Feb 2024 14:41:11 +0100 Subject: [PATCH 009/133] fixes missing postal code --- src/views/identity/administration/UserDetails.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/identity/administration/UserDetails.jsx b/src/views/identity/administration/UserDetails.jsx index bcf1ab9f0760..51d5837052ae 100644 --- a/src/views/identity/administration/UserDetails.jsx +++ b/src/views/identity/administration/UserDetails.jsx @@ -58,7 +58,7 @@ export default function UserDetails({ tenantDomain, userId, className = null }) }, { heading: 'Postcode', - dataField: user.postalCode, + body: user.postalCode, }, { heading: 'Country', From ced6cd1e062c3c0bbc4a598075f4e4e61daec96d Mon Sep 17 00:00:00 2001 From: BNWEIN Date: Wed, 28 Feb 2024 14:30:14 +0000 Subject: [PATCH 010/133] Added custom thresholds for SharePoint and Mailbox Quota alerts Added custom thresholds for SharePoint and Mailbox Quota alerts --- .../tenant/administration/ListAlertsQueue.jsx | 45 +++++++++++++++---- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/src/views/tenant/administration/ListAlertsQueue.jsx b/src/views/tenant/administration/ListAlertsQueue.jsx index 23513f50a28d..ec5c4b5ca269 100644 --- a/src/views/tenant/administration/ListAlertsQueue.jsx +++ b/src/views/tenant/administration/ListAlertsQueue.jsx @@ -1,7 +1,7 @@ import React, { useState } from 'react' import { CButton, CCallout, CCol, CForm, CRow, CSpinner, CTooltip } from '@coreui/react' import { useSelector } from 'react-redux' -import { Field, Form } from 'react-final-form' +import { Field, Form, FormSpy } from 'react-final-form' import { RFFCFormSwitch } from 'src/components/forms' import { useGenericGetRequestQuery, @@ -25,8 +25,19 @@ const alertsList = [ 'Alert on tenants without a Conditional Access policy, while having Conditional Access licensing available.', }, { name: 'AdminPassword', label: 'Alert on changed admin Passwords' }, - { name: 'QuotaUsed', label: 'Alert on 90% mailbox quota used' }, - { name: 'SharePointQuota', label: 'Alert on 90% SharePoint quota used' }, + { + name: 'QuotaUsed', + label: 'Alert on % mailbox quota used', + requiresInput: true, + inputLabel: 'Enter quota percentage', + defaultValue: 90, + }, + { + name: 'SharePointQuota', + label: 'Alert on % SharePoint quota used', + requiresInput: true, + inputLabel: 'Enter quota percentage', + }, { name: 'ExpiringLicenses', label: 'Alert on licenses expiring in 30 days' }, { name: 'SecDefaultsUpsell', label: 'Alert on Security Defaults automatic enablement' }, { @@ -121,7 +132,7 @@ const ListClassicAlerts = () => { const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery() const onSubmit = (values) => { Object.keys(values).filter(function (x) { - if (values[x] === null) { + if (values[x] === null || values[x] === 0) { delete values[x] } return null @@ -201,11 +212,27 @@ const ListClassicAlerts = () => {
{alertsList.map((alert, index) => ( - + + {alert.requiresInput && ( + + {({ values }) => { + // Check if the switch for this alert is turned on before showing the input + if (values[alert.name]) { + return ( + Number(value)} // Ensure value is a number + /> + ) + } + return null + }} + + )} ))} From 9fd38bf33df31f959589ee81f6eec31696e822e9 Mon Sep 17 00:00:00 2001 From: BNWEIN Date: Wed, 28 Feb 2024 14:45:27 +0000 Subject: [PATCH 011/133] removed default value removed default value --- src/views/tenant/administration/ListAlertsQueue.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/views/tenant/administration/ListAlertsQueue.jsx b/src/views/tenant/administration/ListAlertsQueue.jsx index ec5c4b5ca269..a952a7e414d0 100644 --- a/src/views/tenant/administration/ListAlertsQueue.jsx +++ b/src/views/tenant/administration/ListAlertsQueue.jsx @@ -30,7 +30,6 @@ const alertsList = [ label: 'Alert on % mailbox quota used', requiresInput: true, inputLabel: 'Enter quota percentage', - defaultValue: 90, }, { name: 'SharePointQuota', From a02aa52e7be6cff00bd86d53d18a4c3ec6720e34 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Wed, 28 Feb 2024 20:18:19 +0100 Subject: [PATCH 012/133] use endpointname instead of report name. --- src/components/tables/CippDatatable.jsx | 1 + src/components/tables/CippTable.jsx | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/components/tables/CippDatatable.jsx b/src/components/tables/CippDatatable.jsx index 188c44542c82..3eedbb752de0 100644 --- a/src/components/tables/CippDatatable.jsx +++ b/src/components/tables/CippDatatable.jsx @@ -23,6 +23,7 @@ export default function CippDatatable({ path, params, ...rest }) { {data?.Metadata?.Queued && {data?.Metadata?.QueueMessage}} ( <> @@ -122,6 +123,7 @@ export default function CippTable({ exportFiltered = false, filterlist, showFilter = true, + endpointName, tableProps: { keyField = 'id', theme = 'cyberdrain', @@ -146,7 +148,7 @@ export default function CippTable({ }) { const inputRef = useRef('') const [loopRunning, setLoopRunning] = React.useState(false) - const defaultColumns = useSelector((state) => state.app.defaultColumns[reportName]) + const defaultColumns = useSelector((state) => state.app.defaultColumns[endpointName]) const [defaultColumnsSet, setDefaultColumnsSet] = React.useState(false) const [massResults, setMassResults] = React.useState([]) const [filterText, setFilterText] = React.useState(defaultFilterText) @@ -332,14 +334,14 @@ export default function CippTable({ const resetDropdown = () => { setUpdatedColumns(originalColumns) - setColumnDefaultLayout(reportName, null) + setColumnDefaultLayout(endpointName, null) } const dispatch = useDispatch() useEffect(() => { if (columns.length !== updatedColumns.length) { setUpdatedColumns(updatedColumns) setColumnDefaultLayout( - reportName, + endpointName, updatedColumns.map((column) => column.exportSelector).join(','), ) } @@ -349,7 +351,7 @@ export default function CippTable({ dispatch, dynamicColumns, originalColumns, - reportName, + endpointName, setColumnDefaultLayout, updatedColumns, ]) @@ -853,7 +855,8 @@ export default function CippTable({ data, dynamicColumns, reportName, - originalColumns, + resetDropdown, + updatedColumns, addColumn, setGraphFilter, ]) From b1e63d46b23103cfbaab72e6d0abac839cd9222b Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 28 Feb 2024 16:51:49 -0500 Subject: [PATCH 013/133] CippDatatable - refetch --- src/components/tables/CippDatatable.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/tables/CippDatatable.jsx b/src/components/tables/CippDatatable.jsx index 188c44542c82..ab0bf372f76c 100644 --- a/src/components/tables/CippDatatable.jsx +++ b/src/components/tables/CippDatatable.jsx @@ -6,13 +6,13 @@ import { CippTablePropTypes } from 'src/components/tables/CippTable' import { CCallout } from '@coreui/react' export default function CippDatatable({ path, params, ...rest }) { - const [refreshGuid, setRefreshGuid] = React.useState('') const [graphFilter, setGraphFilter] = React.useState(params?.Parameters?.$filter) const { data = [], isFetching, error, - } = useListDatatableQuery({ path, params: { refreshGuid, $filter: graphFilter, ...params } }) + refetch, + } = useListDatatableQuery({ path, params: { $filter: graphFilter, ...params } }) var defaultFilterText = '' if (params?.Parameters?.$filter) { @@ -27,7 +27,7 @@ export default function CippDatatable({ path, params, ...rest }) { isFetching={isFetching} error={error} defaultFilterText={defaultFilterText} - refreshFunction={setRefreshGuid} + refreshFunction={() => refetch()} graphFilterFunction={setGraphFilter} /> From 9489fbbbac3c3c6991cc3134c7217ba3f027a294 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Wed, 28 Feb 2024 23:02:18 +0100 Subject: [PATCH 014/133] for now, this'll do. --- .../tenant/administration/ListAlertsQueue.jsx | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/views/tenant/administration/ListAlertsQueue.jsx b/src/views/tenant/administration/ListAlertsQueue.jsx index a952a7e414d0..1c155771a9bd 100644 --- a/src/views/tenant/administration/ListAlertsQueue.jsx +++ b/src/views/tenant/administration/ListAlertsQueue.jsx @@ -2,7 +2,7 @@ import React, { useState } from 'react' import { CButton, CCallout, CCol, CForm, CRow, CSpinner, CTooltip } from '@coreui/react' import { useSelector } from 'react-redux' import { Field, Form, FormSpy } from 'react-final-form' -import { RFFCFormSwitch } from 'src/components/forms' +import { RFFCFormInput, RFFCFormSwitch } from 'src/components/forms' import { useGenericGetRequestQuery, useLazyGenericGetRequestQuery, @@ -14,7 +14,6 @@ import { CippContentCard, CippPage, CippPageList } from 'src/components/layout' import { CellTip } from 'src/components/tables/CellGenericFormat' import 'react-datepicker/dist/react-datepicker.css' import { CippActionsOffcanvas, ModalService, TenantSelector } from 'src/components/utilities' -import CippCodeOffCanvas from 'src/components/utilities/CippCodeOffcanvas' import arrayMutators from 'final-form-arrays' const alertsList = [ { name: 'MFAAlertUsers', label: 'Alert on users without any form of MFA' }, @@ -30,12 +29,14 @@ const alertsList = [ label: 'Alert on % mailbox quota used', requiresInput: true, inputLabel: 'Enter quota percentage', + inputName: 'QuotaUsedQuota', }, { name: 'SharePointQuota', label: 'Alert on % SharePoint quota used', requiresInput: true, inputLabel: 'Enter quota percentage', + inputName: 'SharePointQuotaQuota', }, { name: 'ExpiringLicenses', label: 'Alert on licenses expiring in 30 days' }, { name: 'SecDefaultsUpsell', label: 'Alert on Security Defaults automatic enablement' }, @@ -215,16 +216,13 @@ const ListClassicAlerts = () => { {alert.requiresInput && ( {({ values }) => { - // Check if the switch for this alert is turned on before showing the input if (values[alert.name]) { return ( - Number(value)} // Ensure value is a number + type="number" /> ) } From ee6aa125426e3c733c46047b84aba2b9f77a59e2 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 28 Feb 2024 17:13:57 -0500 Subject: [PATCH 015/133] CippTable fix Fix addColumn for omitted cols --- src/components/tables/CippTable.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/tables/CippTable.jsx b/src/components/tables/CippTable.jsx index ddac4bbcb71a..1a8f020d150e 100644 --- a/src/components/tables/CippTable.jsx +++ b/src/components/tables/CippTable.jsx @@ -202,7 +202,9 @@ export default function CippTable({ // eslint-disable-next-line react-hooks/exhaustive-deps const addColumn = (columnname) => { - let alreadyInArray = updatedColumns.some((o) => o.exportSelector === columnname) + let alreadyInArray = updatedColumns.some( + (o) => o.exportSelector === columnname && o?.omit !== true, + ) let newColumns = [...updatedColumns] const actionsColumn = newColumns.length > 0 ? newColumns.pop() : null From 45bb37c8ee638b24d3527374d301226ce9156aa7 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 28 Feb 2024 17:34:47 -0500 Subject: [PATCH 016/133] More omit checks --- src/components/tables/CippTable.jsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/tables/CippTable.jsx b/src/components/tables/CippTable.jsx index 313668d00b6d..5ccbe59792e3 100644 --- a/src/components/tables/CippTable.jsx +++ b/src/components/tables/CippTable.jsx @@ -163,7 +163,7 @@ export default function CippTable({ let tempColumns = actionsColumn ? columns.slice(0, -1) : [...columns] defaultColumnsArray.forEach((columnName) => { - if (!tempColumns.find((c) => c.exportSelector === columnName)) { + if (!tempColumns.find((c) => c.exportSelector === columnName && c?.omit !== true)) { tempColumns.push({ name: columnName, selector: (row) => row[columnName], @@ -713,9 +713,9 @@ export default function CippTable({ dataKeys().map((item, idx) => { return ( addColumn(item)}> - {updatedColumns.find((o) => o.exportSelector === item) && ( - - )}{' '} + {updatedColumns.find( + (o) => o.exportSelector === item && o?.omit !== true, + ) && }{' '} {item} ) From 4a98832cc61102111b6528d0ba0d78280871983d Mon Sep 17 00:00:00 2001 From: BNWEIN Date: Thu, 29 Feb 2024 16:12:44 +0000 Subject: [PATCH 017/133] Made a start on adding "New User" attributes in "User Settings" one for @JohnDuprey / @KelvinTegelaar the superheroes to finish off! --- src/store/features/app.js | 4 ++ src/views/cipp/UserSettings.jsx | 122 +++++++++++++++++++++++++++++++- 2 files changed, 125 insertions(+), 1 deletion(-) diff --git a/src/store/features/app.js b/src/store/features/app.js index 285ef9623269..8325058bf3f0 100644 --- a/src/store/features/app.js +++ b/src/store/features/app.js @@ -47,6 +47,9 @@ export const appSlice = createSlice({ setOffboardingDefaults: (state, action) => { state.offboardingDefaults = action.payload?.offboardingDefaults }, + setNewUserDefaults: (state, action) => { + state.setNewUserDefaults = action.payload?.setNewUserDefaults + }, setUserSettings: (state, action) => { //foreach key in the userSettings, set the state key to the value of that setting Object.keys(action.payload?.userSettings).forEach((key) => { @@ -67,6 +70,7 @@ export const { setDefaultusageLocation, setReportImage, setOffboardingDefaults, + setNewUserDefaults, setUserSettings, } = appSlice.actions diff --git a/src/views/cipp/UserSettings.jsx b/src/views/cipp/UserSettings.jsx index bac284828d9f..9b1a42b690d1 100644 --- a/src/views/cipp/UserSettings.jsx +++ b/src/views/cipp/UserSettings.jsx @@ -65,7 +65,7 @@ import { import CippCodeOffCanvas from 'src/components/utilities/CippCodeOffcanvas' import ReportImage from 'src/components/utilities/ReportImage' import { useLoadClientPrincipalQuery } from 'src/store/api/auth' -import { setOffboardingDefaults } from 'src/store/features/app' +import { setOffboardingDefaults, setNewUserDefaults } from 'src/store/features/app' const Offcanvas = (row, rowIndex, formatExtraData) => { const [ExecuteGetRequest, getResults] = useLazyGenericGetRequestQuery() @@ -122,6 +122,80 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { } const UserSettings = () => { + const tenant = useSelector((state) => state.app.currentTenant) + const [addedAttributes, setAddedAttribute] = React.useState(0) + const [random3, setRandom3] = useState('') + const availableProperties = useGenericGetRequestQuery({ + path: '/api/ListGraphRequest', + params: { + Endpoint: 'users', + ListProperties: true, + TenantFilter: tenant.defaultDomainName, + IgnoreErrors: true, + }, + }) + const exclusionList = [ + 'id', + 'accountEnabled', + 'deletedDateTime', + 'ageGroup', + 'businessPhones', + 'city', + 'createdDateTime', + 'creationType', + 'companyName', + 'country', + 'department', + 'displayName', + 'givenName', + 'imAddresses', + 'infoCatalogs', + 'isLicenseReconciliationNeeded', + 'isManagementRestricted', + 'isResourceAccount', + 'jobTitle', + 'mail', + 'mailNickname', + 'mobilePhone', + 'onPremisesDistinguishedName', + 'onPremisesDomainName', + 'onPremisesImmutableId', + 'onPremisesLastSyncDateTime', + 'onPremisesObjectIdentifier', + 'onPremisesSecurityIdentifier', + 'onPremisesSamAccountName', + 'onPremisesSyncEnabled', + 'onPremisesUserPrincipalName', + 'passwordPolicies', + 'postalCode', + 'preferredDataLocation', + 'preferredLanguage', + 'proxyAddresses', + 'refreshTokensValidFromDateTime', + 'securityIdentifier', + 'signInSessionsValidFromDateTime', + 'streetAddress', + 'surname', + 'usageLocation', + 'userPrincipalName', + 'externalUserConvertedOn', + 'externalUserState', + 'externalUserStateChangeDateTime', + 'userType', + 'employeeOrgData', + 'assignedLicenses', + 'assignedPlans', + 'authorizationInfo', + 'cloudRealtimeCommunicationInfo', + 'deviceKeys', + 'identities', + 'onPremisesExtensionAttributes', + 'onPremisesProvisioningErrors', + 'onPremisesSipInfo', + 'passwordProfile', + 'provisionedPlans', + 'serviceProvisioningErrors', + ] const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery() const { data: profile, isFetching, isLoading } = useLoadClientPrincipalQuery() const dispatch = useDispatch() @@ -129,6 +203,7 @@ const UserSettings = () => { const onSubmit = (values) => { dispatch(setOffboardingDefaults({ offboardingDefaults: values })) + dispatch(setNewUserDefaults({ NewUserDefaults: values.name })) const shippedvalues = { user: values.user, currentSettings: currentSettings, @@ -201,6 +276,51 @@ const UserSettings = () => { /> + +

New User Attribute Defaults

+
+ !exclusionList.includes(prop), + )?.map((prop) => ({ + name: prop, + value: prop, + })) ?? [] + } + allowCreate={true} + refreshFunction={() => + setRandom3((Math.random() + 1).toString(36).substring(7)) + } + isLoading={availableProperties.isFetching} + /> +
+ + + {addedAttributes > 0 && ( + setAddedAttribute(addedAttributes - 1)} + className={`circular-button`} + title={'-'} + > + + + )} + setAddedAttribute(addedAttributes + 1)} + className={`circular-button`} + title={'+'} + > + + + + +
Date: Fri, 1 Mar 2024 13:35:17 -0500 Subject: [PATCH 018/133] Fix nav items property --- src/components/layout/AppSidebarNav.jsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/components/layout/AppSidebarNav.jsx b/src/components/layout/AppSidebarNav.jsx index 7a9082ac05e3..e76ac636d4f3 100644 --- a/src/components/layout/AppSidebarNav.jsx +++ b/src/components/layout/AppSidebarNav.jsx @@ -65,7 +65,7 @@ export const AppSidebarNav = ({ items }) => { ) } const navGroup = (item, index) => { - const { component, name, icon, to, ...rest } = item + const { component, name, icon, to, items, ...rest } = item const Component = component const navGroupKey = `${item.name.toLowerCase().replace(' ', '-')}_${index}` const navGroupIdx = `${item.section.toLowerCase().replace(' ', '-')}_${item.name @@ -79,9 +79,7 @@ export const AppSidebarNav = ({ items }) => { visible={location.pathname.startsWith(to)} {...rest} > - {item.items?.map((item, index) => - item.items ? navGroup(item, index) : navItem(item, index), - )} + {items?.map((item, index) => (item.items ? navGroup(item, index) : navItem(item, index)))} ) } From 0696ae114cfec26eef2f57db16132280e4df1480 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Fri, 1 Mar 2024 14:32:09 -0500 Subject: [PATCH 019/133] Devices Bulk Actions Add selectable rows to Devices page Add Enable/Disable/Delete actions Implements #2154 --- src/views/identity/administration/Devices.jsx | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/views/identity/administration/Devices.jsx b/src/views/identity/administration/Devices.jsx index aa608f343977..b67740e3136d 100644 --- a/src/views/identity/administration/Devices.jsx +++ b/src/views/identity/administration/Devices.jsx @@ -7,6 +7,7 @@ import { CButton } from '@coreui/react' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faEdit, faEllipsisV } from '@fortawesome/free-solid-svg-icons' import { CippActionsOffcanvas } from 'src/components/utilities' +import { cellGenericFormatter } from 'src/components/tables/CellGenericFormat' const DevicesList = () => { const [tenantColumnSet, setTenantColumn] = useState(true) @@ -28,6 +29,13 @@ const DevicesList = () => { { label: 'Unique ID', value: `${row.id ?? ' '}` }, ]} actions={[ + { + label: 'Enable Device', + color: 'info', + modal: true, + modalUrl: `/api/ExecDeviceDelete?TenantFilter=${tenant.defaultDomainName}&ID=${row.id}&Action=Enable`, + modalMessage: 'Are you sure you want to enable this device.', + }, { label: 'Disable Device', color: 'info', @@ -39,7 +47,7 @@ const DevicesList = () => { label: 'Delete Device', color: 'warning', modal: true, - modalUrl: `/api/ExecGroupsDelete?TenantFilter=${tenant.defaultDomainName}&ID=${row.id}&Action=Enable`, + modalUrl: `/api/ExecDeviceDelete?TenantFilter=${tenant.defaultDomainName}&ID=${row.id}&Action=Delete`, modalMessage: 'Are you sure you want to delete this device.', }, ]} @@ -75,6 +83,13 @@ const DevicesList = () => { cell: (row) => CellTip(row['displayName']), exportSelector: 'displayName', }, + { + selector: (row) => row['accountEnabled'], + name: 'Enabled', + sortable: true, + cell: cellGenericFormatter(), + exportSelector: 'accountEnabled', + }, { selector: (row) => row['deviceOwnership'], name: 'Device Ownership', @@ -146,6 +161,29 @@ const DevicesList = () => { $format: 'application/json', }, columns, + tableProps: { + selectableRows: true, + actionsList: [ + { + label: 'Enable Device', + modal: true, + modalUrl: `/api/ExecDeviceDelete?TenantFilter=!Tenant&ID=!id&Action=Enable`, + modalMessage: 'Are you sure you want to enable this device?', + }, + { + label: 'Disable Device', + modal: true, + modalUrl: `/api/ExecDeviceDelete?TenantFilter=!Tenant&ID=!id&Action=Disable`, + modalMessage: 'Are you sure you want to disable this device?', + }, + { + label: 'Delete Device', + modal: true, + modalUrl: `/api/ExecDeviceDelete?TenantFilter=!Tenant&ID=!id&Action=Delete`, + modalMessage: 'Are you sure you want to delete this device?', + }, + ], + }, }} /> ) From 789ef93e7c970084fe093fd50a9336957d1c8ddb Mon Sep 17 00:00:00 2001 From: Kevin Grube Date: Tue, 5 Mar 2024 13:20:51 -0800 Subject: [PATCH 020/133] Settings refactor, CippCallout wip --- src/adminRoutes.js | 27 +- src/components/utilities/CippCallout.jsx | 47 + src/components/utilities/CippLazy.jsx | 19 + src/components/utilities/index.js | 2 + src/views/cipp/CIPPSettings.jsx | 2157 ----------------- src/views/cipp/app-settings/CIPPSettings.jsx | 93 + .../cipp/app-settings/SettingsBackend.jsx | 251 ++ .../SettingsExtensionMappings.jsx | 279 +++ .../cipp/app-settings/SettingsExtensions.jsx | 203 ++ .../cipp/app-settings/SettingsGeneral.jsx | 453 ++++ .../cipp/app-settings/SettingsLicenses.jsx | 134 + .../cipp/app-settings/SettingsMaintenance.jsx | 161 ++ .../app-settings/SettingsNotifications.jsx | 178 ++ .../cipp/app-settings/SettingsTenants.jsx | 285 +++ .../app-settings/components/SettingsDNS.jsx | 217 ++ .../components/SettingsPassword.jsx | 66 + .../administration/EditMailboxPermissions.jsx | 45 +- 17 files changed, 2427 insertions(+), 2190 deletions(-) create mode 100644 src/components/utilities/CippCallout.jsx create mode 100644 src/components/utilities/CippLazy.jsx delete mode 100644 src/views/cipp/CIPPSettings.jsx create mode 100644 src/views/cipp/app-settings/CIPPSettings.jsx create mode 100644 src/views/cipp/app-settings/SettingsBackend.jsx create mode 100644 src/views/cipp/app-settings/SettingsExtensionMappings.jsx create mode 100644 src/views/cipp/app-settings/SettingsExtensions.jsx create mode 100644 src/views/cipp/app-settings/SettingsGeneral.jsx create mode 100644 src/views/cipp/app-settings/SettingsLicenses.jsx create mode 100644 src/views/cipp/app-settings/SettingsMaintenance.jsx create mode 100644 src/views/cipp/app-settings/SettingsNotifications.jsx create mode 100644 src/views/cipp/app-settings/SettingsTenants.jsx create mode 100644 src/views/cipp/app-settings/components/SettingsDNS.jsx create mode 100644 src/views/cipp/app-settings/components/SettingsPassword.jsx diff --git a/src/adminRoutes.js b/src/adminRoutes.js index ece783822eff..2f6f666ab905 100644 --- a/src/adminRoutes.js +++ b/src/adminRoutes.js @@ -1,5 +1,6 @@ import React from 'react' -const CIPPSettings = React.lazy(() => import('src/views/cipp/CIPPSettings')) + +const CIPPSettings = React.lazy(() => import('src/views/cipp/app-settings/CIPPSettings')) const Setup = React.lazy(() => import('src/views/cipp/Setup')) const ApplyStandard = React.lazy(() => import('src/views/tenant/standards/ListStandards')) const GDAPStatus = React.lazy(() => import('src/views/tenant/administration/ListGDAPQueue')) @@ -25,7 +26,11 @@ const adminRoutes = [ { path: '/cipp/setup', name: 'Setup', component: Setup }, { path: '/tenant/administration/gdap', name: 'GDAP Wizard', component: GDAP }, - { path: '/tenant/administration/gdap-invite', name: 'GDAP Invite Wizard', component: GDAPInvite }, + { + path: '/tenant/administration/gdap-invite', + name: 'GDAP Invite Wizard', + component: GDAPInvite, + }, { path: '/tenant/administration/gdap-role-wizard', name: 'GDAP Role Wizard', @@ -41,9 +46,21 @@ const adminRoutes = [ name: 'GDAP Relationships', component: GDAPRelationships, }, - { path: '/tenant/administration/appapproval', name: 'App Approval', component: appapproval }, - { path: '/tenant/administration/gdap-status', name: 'GDAP Status', component: GDAPStatus }, - { path: '/tenant/standards/list-standards', name: 'List Standard', component: ApplyStandard }, + { + path: '/tenant/administration/appapproval', + name: 'App Approval', + component: appapproval, + }, + { + path: '/tenant/administration/gdap-status', + name: 'GDAP Status', + component: GDAPStatus, + }, + { + path: '/tenant/standards/list-standards', + name: 'List Standard', + component: ApplyStandard, + }, { path: '/tenant/administration/tenant-offboarding-wizard', name: 'Tenant Offboarding', diff --git a/src/components/utilities/CippCallout.jsx b/src/components/utilities/CippCallout.jsx new file mode 100644 index 000000000000..341725151cfb --- /dev/null +++ b/src/components/utilities/CippCallout.jsx @@ -0,0 +1,47 @@ +import React, { useState } from 'react' +import { CAlert } from '@coreui/react' +import PropTypes from 'prop-types' +import classNames from 'classnames' + +export function CippCallout({ + children, + color = 'primary', + borderColor = 'primary', + dismissible = false, + ...rest +}) { + const [open, setOpen] = useState(true) + + const handleDismiss = () => setOpen(false) + + return open ? ( +
+ {children} + {dismissible && ( +
+ ) : null +} + +CippCallout.propTypes = { + children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]), + color: PropTypes.string, + borderColor: PropTypes.string, + dismissible: PropTypes.bool, +} + +export default CippCallout diff --git a/src/components/utilities/CippLazy.jsx b/src/components/utilities/CippLazy.jsx new file mode 100644 index 000000000000..0f376e722ee6 --- /dev/null +++ b/src/components/utilities/CippLazy.jsx @@ -0,0 +1,19 @@ +import { useRef } from 'react' +import PropTypes from 'prop-types' + +export function CippLazy({ visible, children }) { + const rendered = useRef(visible) + + if (visible && !rendered.current) { + rendered.current = true + } + + if (!rendered.current) return null + + return
{children}
+} + +CippLazy.propTypes = { + visible: PropTypes.bool, + children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]), +} diff --git a/src/components/utilities/index.js b/src/components/utilities/index.js index cf22133abbbc..5015ae24ad70 100644 --- a/src/components/utilities/index.js +++ b/src/components/utilities/index.js @@ -1,6 +1,7 @@ import CippActionsOffcanvas from 'src/components/utilities/CippActionsOffcanvas' import CippCodeOffCanvas from 'src/components/utilities/CippCodeOffcanvas.jsx' import CippCodeBlock from 'src/components/utilities/CippCodeBlock' +import { CippLazy } from 'src/components/utilities/CippLazy' import CippOffcanvas from 'src/components/utilities/CippOffcanvas' import CippProfile from 'src/components/utilities/CippProfile' import ErrorBoundary from 'src/components/utilities/ErrorBoundary' @@ -21,6 +22,7 @@ export { CippActionsOffcanvas, CippCodeBlock, CippCodeOffCanvas, + CippLazy, CippOffcanvas, CippProfile, ErrorBoundary, diff --git a/src/views/cipp/CIPPSettings.jsx b/src/views/cipp/CIPPSettings.jsx deleted file mode 100644 index 89ff710941f1..000000000000 --- a/src/views/cipp/CIPPSettings.jsx +++ /dev/null @@ -1,2157 +0,0 @@ -import React, { useEffect, useRef, useState } from 'react' -import { - CButton, - CButtonGroup, - CCallout, - CCard, - CCardBody, - CCardHeader, - CCardTitle, - CCol, - CFormLabel, - CNav, - CNavItem, - CRow, - CTabContent, - CTabPane, - CForm, - CListGroup, - CListGroupItem, - CLink, - CSpinner, - CCardText, - CTooltip, - CFormSwitch, -} from '@coreui/react' -import { - useGenericGetRequestQuery, - useLazyExecClearCacheQuery, - useLazyExecNotificationConfigQuery, - useLazyExecPermissionsAccessCheckQuery, - useLazyExecTenantsAccessCheckQuery, - useLazyGenericGetRequestQuery, - useLazyGenericPostRequestQuery, - useLazyListNotificationConfigQuery, - useLoadVersionsQuery, -} from 'src/store/api/app' -import { - useExecAddExcludeTenantMutation, - useExecRemoveExcludeTenantMutation, - useListTenantsQuery, -} from 'src/store/api/tenants' -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import { - faCheckCircle, - faCircleNotch, - faExclamationTriangle, - faEye, - faEyeSlash, - faLink, - faRecycle, - faScroll, - faTrash, -} from '@fortawesome/free-solid-svg-icons' -import { useLazyEditDnsConfigQuery, useLazyGetDnsConfigQuery } from 'src/store/api/domains' -import { useDispatch, useSelector } from 'react-redux' -import { - CellBadge, - cellBooleanFormatter, - CellTip, - CellTipIcon, - CippTable, -} from 'src/components/tables' -import { CippPage, CippPageList } from 'src/components/layout' -import { - RFFCFormSwitch, - RFFCFormInput, - RFFCFormSelect, - RFFSelectSearch, -} from 'src/components/forms' -import { Form } from 'react-final-form' -import useConfirmModal from 'src/hooks/useConfirmModal' -import { setCurrentTenant } from 'src/store/features/app' -import { - CippOffcanvas, - CippCodeBlock, - ModalService, - StatusIcon, - TenantSelectorMultiple, -} from 'src/components/utilities' -import CippListOffcanvas from 'src/components/utilities/CippListOffcanvas' -import { TitleButton, TableModalButton } from 'src/components/buttons' -import Skeleton from 'react-loading-skeleton' -import { Buffer } from 'buffer' -import Extensions from 'src/data/Extensions.json' -import { CellDelegatedPrivilege } from 'src/components/tables/CellDelegatedPrivilege' -import { cellTableFormatter } from 'src/components/tables/CellTable' -import { cellGenericFormatter } from 'src/components/tables/CellGenericFormat' -import PropTypes from 'prop-types' - -function Lazy({ visible, children }) { - const rendered = useRef(visible) - - if (visible && !rendered.current) { - rendered.current = true - } - - if (!rendered.current) return null - - return
{children}
-} - -Lazy.propTypes = { - visible: PropTypes.bool, - children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]), -} - -const CIPPSettings = () => { - const [active, setActive] = useState(1) - return ( - - - setActive(1)} href="#"> - General - - setActive(2)} href="#"> - Tenants - - setActive(3)} href="#"> - Backend - - setActive(4)} href="#"> - Notifications - - setActive(5)} href="#"> - Licenses - - setActive(6)} href="#"> - Maintenance - - setActive(7)} href="#"> - Extensions - - setActive(8)} href="#"> - Extension Mappings - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ) -} - -export default CIPPSettings - -const GeneralSettings = () => { - const { data: tenants = [] } = useListTenantsQuery({ AllTenantSelector: false }) - const [checkPermissions, permissionsResult] = useLazyExecPermissionsAccessCheckQuery() - const [checkGDAP, GDAPResult] = useLazyGenericGetRequestQuery() - - const [clearCache, clearCacheResult] = useLazyExecClearCacheQuery() - const [checkAccess, accessCheckResult] = useLazyExecTenantsAccessCheckQuery() - const [selectedTenants, setSelectedTenants] = useState([]) - const [showMaxSelected, setShowMaxSelected] = useState(false) - const [tokenOffcanvasVisible, setTokenOffcanvasVisible] = useState(false) - const [showExtendedInfo, setShowExtendedInfo] = useState(true) - - const maxSelected = 2 - const tenantSelectorRef = useRef(null) - - const handleSetSelectedTenants = (value) => { - if (value.length <= maxSelected) { - setSelectedTenants(value) - setShowMaxSelected(false) - } else { - setSelectedTenants(value) - setShowMaxSelected(true) - } - } - - const checkAccessColumns = [ - { - name: 'Tenant Domain', - selector: (row) => row['TenantName'], - grow: 0, - cell: cellGenericFormatter(), - }, - { - name: 'Result', - selector: (row) => row['Status'], - minWidth: '380px', - maxWidth: '380px', - cell: cellGenericFormatter(), - }, - { - name: 'Missing GDAP Roles', - selector: (row) => row?.MissingRoles, - cell: cellTableFormatter('MissingRoles', true, false, true), - }, - { - name: 'Roles available', - selector: (row) => row?.GDAPRoles, - cell: cellTableFormatter('GDAPRoles', false, true), - omit: showExtendedInfo, - exportSelector: 'GDAPRoles', - }, - { - name: 'SAM User Roles', - selector: (row) => row?.SAMUserRoles, - cell: cellTableFormatter('SAMUserRoles', false, true), - omit: showExtendedInfo, - exportSelector: 'SAMUserRoles', - }, - ] - - const checkGDAPColumns = [ - { - name: 'Tenant', - selector: (row) => row['Tenant'], - sortable: true, - cell: cellGenericFormatter(), - minWidth: '200px', - maxWidth: '200px', - }, - { - name: 'Error Type', - selector: (row) => row['Type'], - sortable: true, - cell: cellGenericFormatter(), - minWidth: '100px', - maxWidth: '100px', - }, - { - name: 'Issue', - selector: (row) => row?.Issue, - sortable: true, - cell: cellGenericFormatter(), - }, - { - name: 'Resolution Link', - sortable: true, - selector: (row) => row?.Link, - cell: cellGenericFormatter(), - }, - { - name: 'Relationship ID', - sortable: true, - selector: (row) => row?.Relationship, - cell: cellGenericFormatter(), - }, - ] - - const handleCheckAccess = () => { - const mapped = tenants.reduce( - (current, { customerId, ...rest }) => ({ - ...current, - [customerId]: { ...rest }, - }), - {}, - ) - const AllTenantSelector = selectedTenants.map( - (customerId) => mapped[customerId].defaultDomainName, - ) - checkAccess({ tenantDomains: AllTenantSelector }) - } - - function getTokenOffcanvasProps({ tokenResults }) { - let tokenDetails = tokenResults.AccessTokenDetails - let helpLinks = tokenResults.Links - let tokenOffcanvasGroups = [] - if (tokenDetails?.Name !== '') { - let tokenItems = [] - let tokenOffcanvasGroup = {} - tokenItems.push({ - heading: 'User', - content: tokenDetails?.Name, - }) - tokenItems.push({ - heading: 'UPN', - content: tokenDetails?.UserPrincipalName, - }) - tokenItems.push({ - heading: 'App Registration', - content: ( - - {tokenDetails?.AppName} - - ), - }) - tokenItems.push({ - heading: 'IP Address', - content: tokenDetails?.IPAddress, - }) - tokenItems.push({ - heading: 'Auth Methods', - content: tokenDetails?.AuthMethods.join(', '), - }) - tokenItems.push({ - heading: 'Tenant ID', - content: tokenDetails?.TenantId, - }) - tokenOffcanvasGroup.items = tokenItems - tokenOffcanvasGroup.title = 'Claims' - tokenOffcanvasGroups.push(tokenOffcanvasGroup) - } - - if (helpLinks.length > 0) { - let linkItems = [] - let linkItemGroup = {} - helpLinks.map((link, idx) => - linkItems.push({ - heading: '', - content: ( - - {link.Text} - - ), - }), - ) - linkItemGroup.title = 'Help Links' - linkItemGroup.items = linkItems - if (linkItemGroup.items.length > 0) { - tokenOffcanvasGroups.push(linkItemGroup) - } - } - - return tokenOffcanvasGroups - } - - const tableProps = { - pagination: false, - actions: [ - { - console.log(e) - setShowExtendedInfo(!e.target.checked) - }} - key={'Show Extended Info'} - />, - ], - } - - return ( -
- - - - - - - - - - -

Permissions Check

-

Click the button below to start a permissions check.

- checkPermissions()} - disabled={permissionsResult.isFetching} - className="mb-3 me-2" - > - {permissionsResult.isFetching && ( - - )} - Run Permissions Check - - {permissionsResult.isSuccess && ( - <> - {permissionsResult.data.Results?.AccessTokenDetails?.Name !== '' && ( - <> - setTokenOffcanvasVisible(true)}> - Details - - setTokenOffcanvasVisible(false)} - /> - - )} - - {permissionsResult.data.Results?.Messages && ( - <> - {permissionsResult.data.Results?.Messages?.map((m, idx) => ( -
{m}
- ))} - - )} - {permissionsResult.data.Results?.MissingPermissions.length > 0 && ( - <> - Your Secure Application Model is missing the following permissions. See the - documentation on how to add permissions{' '} - - here - - . - - {permissionsResult.data.Results?.MissingPermissions?.map((r, index) => ( - {r} - ))} - - - )} -
- - )} -
-
-
- - - - -

GDAP Check

-

Click the button below to start a check for general GDAP settings.

- checkGDAP({ path: '/api/ExecAccessChecks?GDAP=true' })} - disabled={GDAPResult.isFetching} - className="mb-3 me-2" - > - {GDAPResult.isFetching && ( - - )} - Run GDAP Check - - {GDAPResult.isSuccess && ( - <> - p['@odata.type'] == '#microsoft.graph.group', - )} - title="Groups" - /> - p['@odata.type'] == '#microsoft.graph.directoryRole', - )} - title="Roles" - /> - - )} - - - {GDAPResult.isSuccess && GDAPResult.data.Results.GDAPIssues?.length > 0 && ( - <> - {GDAPResult.data.Results.GDAPIssues?.filter((e) => e.Type === 'Error') - .length > 0 && ( - - Relationship errors detected. Review the table below for more details. - - )} - {GDAPResult.data.Results.GDAPIssues?.filter((e) => e.Type === 'Warning') - .length > 0 && ( - - Relationship warnings detected. Review the table below for more details. - - )} - - - )} - {GDAPResult.isSuccess && GDAPResult.data.Results.GDAPIssues?.length === 0 && ( - - No relationships with issues found. Please perform a Permissions Check or - Tenant Access Check if you are experiencing issues. - - )} - - -
-
-
-
- - - - - -

Tenant Access Check

- - -
- Click the button below to start a tenant access check. You can select multiple, - but a maximum of {maxSelected + 1} tenants is recommended. -
- - - handleSetSelectedTenants( - value.map((val) => { - return val.value - }), - ) - } - /> - {showMaxSelected && ( - - A maximum of {maxSelected + 1} tenants is recommended. - - )} -
-
- - - - handleCheckAccess()} - disabled={accessCheckResult.isFetching || selectedTenants.length < 1} - > - {accessCheckResult.isFetching && ( - - )} - Run access check - - - - - - {accessCheckResult.isSuccess && ( - - )} - - -
-
-
-
-
- ) -} - -const ExcludedTenantsSettings = () => { - const dispatch = useDispatch() - const currentTenant = useSelector((state) => state.app.currentTenant) - const [removeExcludeTenant, removeExcludeTenantResult] = useExecRemoveExcludeTenantMutation() - const [addExcludeTenant, addExcludeTenantResult] = useExecAddExcludeTenantMutation() - const [refreshPermissions, refreshPermissionsResults] = useLazyGenericGetRequestQuery() - - // const [selectedTenant, setSelectedTenant] = useState() - const selectedTenant = useRef() - - useEffect(() => { - // if a tenant is already selected and that's the tenant the - // user wants to exclude, we need to set that to the current state - selectedTenant.current = currentTenant - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []) - - const handleRemoveExclusion = (domain) => - ModalService.confirm({ - title: 'Remove Exclusion', - body:
Are you sure you want to remove the exclusion for {domain}?
, - onConfirm: () => removeExcludeTenant(domain), - }) - - const handleCPVPermissions = (domain, resetsp = false) => - ModalService.confirm({ - title: 'Refresh Permissions', - body:
Are you sure you want to refresh permissions for {domain.defaultDomainName}?
, - onConfirm: () => - refreshPermissions({ - path: `/api/ExecCPVPermissions?TenantFilter=${domain.customerId}&ResetSP=${resetsp}`, - }), - }) - const handleConfirmExcludeTenant = (tenant) => { - ModalService.confirm({ - title: 'Exclude Tenant', - body:
Are you sure you want to exclude this tenant?
, - onConfirm: () => addExcludeTenant(tenant), - }) - .unwrap() - .then(() => { - dispatch(setCurrentTenant({})) - }) - } - - const handleExcludeTenant = (selected) => { - ModalService.confirm({ - body: ( -
-
Select a tenant to exclude
- (selected = tenant)} /> -
- ), - title: 'Add Exclusion', - onConfirm: () => handleConfirmExcludeTenant(selected), - }) - } - const titleButton = ( - handleExcludeTenant(selectedTenant)} - > - Add Excluded Tenant - - ) - - function StatusIcon(graphErrorCount) { - if (graphErrorCount > 0) { - return - } else { - return - } - } - - function StatusText(graphErrorCount, lastGraphError) { - if (graphErrorCount > 0) { - return 'Error Count: ' + graphErrorCount + ' - Last Error: ' + lastGraphError - } else { - return 'No errors detected with this tenant' - } - } - - const Offcanvas = (row, rowIndex, formatExtraData) => { - return ( - <> - {row.Excluded && ( - - handleRemoveExclusion(row.defaultDomainName)} - > - - - - )} - {!row.Excluded && ( - - handleConfirmExcludeTenant({ value: row.customerId })} - > - - - - )} - - handleCPVPermissions(row, false)} - > - - - - - ) - } - const columns = [ - { - name: 'Name', - selector: (row) => row['displayName'], - sortable: true, - cell: (row) => CellTip(row['displayName']), - exportSelector: 'displayName', - }, - { - name: 'Default Domain', - selector: (row) => row['defaultDomainName'], - sortable: true, - cell: (row) => CellTip(row['defaultDomainName']), - exportSelector: 'defaultDomainName', - }, - { - name: 'Excluded', - selector: (row) => row['Excluded'], - sortable: true, - cell: cellBooleanFormatter({ colourless: true }), - exportSelector: 'Excluded', - maxWidth: '100px', - minWidth: '100px', - }, - { - name: 'Exclude Date', - selector: (row) => row['ExcludeDate'], - sortable: true, - exportSelector: 'ExcludeDate', - maxWidth: '150px', - minWidth: '150px', - }, - { - name: 'Exclude User', - selector: (row) => row['ExcludeUser'], - sortable: true, - exportSelector: 'ExcludeUser', - maxWidth: '130px', - minWidth: '130px', - }, - { - name: 'Actions', - cell: Offcanvas, - maxWidth: '80px', - }, - ] - return ( - <> - {(refreshPermissionsResults.isFetching || removeExcludeTenantResult.isFetching) && ( - - - - )} - {removeExcludeTenantResult.isSuccess && ( - - {removeExcludeTenantResult.data?.Results} - - )} - {refreshPermissionsResults.isSuccess && - refreshPermissionsResults.data?.Results && - Array.isArray(refreshPermissionsResults.data.Results) ? ( - - {refreshPermissionsResults.data.Results.map((result, idx) => ( -
  • {result}
  • - ))} -
    - ) : null} - {addExcludeTenantResult.isSuccess && ( - - {addExcludeTenantResult.data?.Results} - - )} - - - ) -} -const SecuritySettings = () => { - const [listBackend, listBackendResult] = useLazyGenericGetRequestQuery() - const [visible, setVisible] = useState(false) - return ( -
    - {listBackendResult.isUninitialized && listBackend({ path: 'api/ExecBackendURLs' })} - <> - - - - - Resource Group - - -

    - The Resource group contains all the CIPP resources in your tenant, except the SAM - Application -

    - - Go to Resource Group - -
    -
    -
    - - - - Key Vault - - -

    - The keyvault allows you to check token information. By default you do not have - access. -

    - - Go to Keyvault - -
    -
    -
    - - - - Static Web App (Role Management) - - -

    - The Static Web App role management allows you to invite other users to the - application. -

    - - Go to Role Management - -
    -
    -
    -
    - - - - - Function App (Deployment Center) - - -

    The Function App Deployment Center allows you to run updates on the API

    - - Go to Function App Deployment Center - -
    -
    -
    - - - - Function App (Configuration) - - -

    - At the Function App Configuration you can check the status of the API access to - your keyvault -

    - - Go to Function App Configuration - -
    -
    -
    - - - - Function App (Overview) - - -

    At the function App Overview, you can stop and start the backend API

    - - Go to Function App Overview - -
    -
    -
    -
    - - - - - Cloud Shell - - -

    Launch an Azure Cloud Shell Window

    - - window.open( - 'https://shell.azure.com/powershell', - '_blank', - 'toolbar=no,scrollbars=yes,resizable=yes,menubar=no,location=no,status=no', - ) - } - rel="noreferrer" - > - Cloud Shell - - setVisible(true)} className="mb-3"> - Command Reference - -
    -
    -
    -
    - setVisible(false)} - title="Command Reference" - > -
    Function App Config
    - -
    Function App Deployment
    - -
    Watch Function Logs
    - -
    Static Web App Config
    - -
    List CIPP Users
    - -
    - -
    - ) -} - -const NotificationsSettings = () => { - const [configNotifications, notificationConfigResult] = useLazyExecNotificationConfigQuery() - const [listNotification, notificationListResult] = useLazyListNotificationConfigQuery() - const onSubmit = (values) => { - configNotifications(values) - } - return ( - <> - {notificationListResult.isUninitialized && listNotification()} - {notificationListResult.isFetching && ( - - )} - {!notificationListResult.isFetching && notificationListResult.error && ( - Error loading data - )} - {notificationListResult.isSuccess && ( - - - Notifications - - -
    true} - initialValues={{ - ...notificationListResult.data, - logsToInclude: notificationListResult.data?.logsToInclude?.map((m) => ({ - label: m, - value: m, - })), - Severity: notificationListResult.data?.Severity?.map((s) => ({ - label: s, - value: s, - })), - }} - onSubmit={onSubmit} - render={({ handleSubmit, submitting, values }) => { - return ( - - {notificationConfigResult.isFetching && ( - - Loading - - )} - {notificationConfigResult.isSuccess && ( - {notificationConfigResult.data?.Results} - )} - {notificationConfigResult.isError && ( - - Could not connect to API: {notificationConfigResult.error.message} - - )} - - - - - - - - - - - - - - - - - - - - - - - - Set Notification Settings - - - - ) - }} - /> - - - )} - - ) -} - -const LicenseSettings = () => { - const [setExclusion, setExclusionResults] = useLazyGenericPostRequestQuery() - const formRef = useRef(null) - - const handleAddLicense = (selected) => { - ModalService.confirm({ - body: ( -
    - { - formRef.current = values - return ( - <> -
    Add a license to exclude
    - - - - ) - }} - /> -
    - ), - title: 'Add Exclusion', - onConfirm: () => - setExclusion({ - path: '/api/ExecExcludeLicenses?AddExclusion=true', - values: { ...formRef.current }, - }), - }) - } - - const titleButton = - const [ExecuteGetRequest, getResults] = useLazyGenericGetRequestQuery() - - const Offcanvas = (row, rowIndex, formatExtraData) => { - const handleDeleteIntuneTemplate = (apiurl, message) => { - ModalService.confirm({ - title: 'Confirm', - body:
    {message}
    , - onConfirm: () => ExecuteGetRequest({ path: apiurl }), - confirmLabel: 'Continue', - cancelLabel: 'Cancel', - }) - } - return ( - <> - - handleDeleteIntuneTemplate( - `/api/ExecExcludeLicenses?RemoveExclusion=true&GUID=${row.GUID}`, - 'Do you want to delete this exclusion?', - ) - } - > - - - - ) - } - - const columns = [ - { - name: 'Display Name', - selector: (row) => row['Product_Display_Name'], - exportSelector: 'Product_Display_Name', - sortable: true, - minWidth: '300px', - }, - { - name: 'License ID', - selector: (row) => row['GUID'], - exportSelector: 'GUID', - sortable: true, - minWidth: '350px', - }, - { - name: 'Actions', - cell: Offcanvas, - }, - ] - return ( - <> - {setExclusionResults.isFetching || - (getResults.isFetching && ( - - Loading - - ))} - {setExclusionResults.isSuccess && ( - {setExclusionResults.data?.Results} - )} - {setExclusionResults.isError && ( - - Could not connect to API: {setExclusionResults.error.message} - - )} - {getResults.isError && ( - Could not connect to API: {getResults.error.message} - )} - {getResults.isSuccess && {getResults.data?.Results}} - - - ) -} -const PasswordSettings = () => { - const [getPasswordConfig, getPasswordConfigResult] = useLazyGenericGetRequestQuery() - const [editPasswordConfig, editPasswordConfigResult] = useLazyGenericPostRequestQuery() - - const [passAlertVisible, setPassAlertVisible] = useState(false) - - const switchResolver = (resolver) => { - editPasswordConfig({ path: '/api/ExecPasswordconfig', values: { passwordType: resolver } }) - getPasswordConfig() - setPassAlertVisible(true) - } - - const resolvers = ['Classic', 'Correct-Battery-Horse'] - - return ( - <> - {getPasswordConfigResult.isUninitialized && - getPasswordConfig({ path: '/api/ExecPasswordConfig?list=true' })} -

    Password Style

    - - {resolvers.map((r, index) => ( - switchResolver(r)} - color={ - r === getPasswordConfigResult.data?.Results?.passwordType ? 'primary' : 'secondary' - } - key={index} - > - {r} - - ))} - - {(editPasswordConfigResult.isSuccess || editPasswordConfigResult.isError) && ( - - {editPasswordConfigResult.isSuccess - ? editPasswordConfigResult.data.Results - : 'Error setting password style'} - - )} - - ) -} - -const DNSSettings = () => { - const [runBackup, RunBackupResult] = useLazyGenericGetRequestQuery() - const [restoreBackup, restoreBackupResult] = useLazyGenericPostRequestQuery() - const [getDnsConfig, getDnsConfigResult] = useLazyGetDnsConfigQuery() - const [editDnsConfig, editDnsConfigResult] = useLazyEditDnsConfigQuery() - const inputRef = useRef(null) - const [clearCache, clearCacheResult] = useLazyExecClearCacheQuery() - const { data: versions, isSuccess: isSuccessVersion } = useLoadVersionsQuery() - - const [alertVisible, setAlertVisible] = useState(false) - const downloadTxtFile = (data) => { - const txtdata = [JSON.stringify(RunBackupResult.data.backup)] - const file = new Blob(txtdata, { type: 'text/plain' }) - const element = document.createElement('a') - element.href = URL.createObjectURL(file) - element.download = 'CIPP-Backup' + Date.now() + '.json' - document.body.appendChild(element) - element.click() - } - const handleChange = (e) => { - const fileReader = new FileReader() - fileReader.readAsText(e.target.files[0], 'UTF-8') - fileReader.onload = (e) => { - restoreBackup({ path: '/api/ExecRestoreBackup', values: e.target.result }) - } - } - const switchResolver = (resolver) => { - editDnsConfig({ resolver }) - getDnsConfig() - setAlertVisible(true) - setTimeout(() => { - setAlertVisible(false) - }, 2000) - } - const handleClearCache = useConfirmModal({ - body:
    Are you sure you want to clear the cache?
    , - onConfirm: () => { - clearCache({ tenantsOnly: false }) - localStorage.clear() - }, - }) - - const handleClearCacheTenant = useConfirmModal({ - body:
    Are you sure you want to clear the cache?
    , - onConfirm: () => { - clearCache({ tenantsOnly: true }) - }, - }) - const resolvers = ['Google', 'Cloudflare', 'Quad9'] - - return ( - <> - {getDnsConfigResult.isUninitialized && getDnsConfig()} - {getDnsConfigResult.isSuccess && ( - - - - - - - - -

    DNS Resolver

    - - {resolvers.map((r, index) => ( - switchResolver(r)} - color={r === getDnsConfigResult.data.Resolver ? 'primary' : 'secondary'} - key={index} - > - {r} - - ))} - - {(editDnsConfigResult.isSuccess || editDnsConfigResult.isError) && ( - - {editDnsConfigResult.isSuccess - ? editDnsConfigResult.data.Results - : 'Error setting resolver'} - - )} -
    - -

    Frontend Version

    - -
    Latest: {isSuccessVersion ? versions.RemoteCIPPVersion : }
    -
    - Current: {isSuccessVersion ? versions.LocalCIPPVersion : } -
    -
    - -

    Clear Caches

    - handleClearCache()} - disabled={clearCacheResult.isFetching} - > - {clearCacheResult.isFetching && ( - - )} - Clear All Cache - - handleClearCacheTenant()} - disabled={clearCacheResult.isFetching} - > - {clearCacheResult.isFetching && ( - - )} - Clear Tenant Cache - - {clearCacheResult.isSuccess && ( -
    {clearCacheResult.data?.Results}
    - )} -
    - -

    Settings Backup

    - runBackup({ path: '/api/ExecRunBackup' })} - disabled={RunBackupResult.isFetching} - > - {RunBackupResult.isFetching && ( - - )} - Run backup - - handleChange(e)} - /> - inputRef.current.click()} - disabled={restoreBackupResult.isFetching} - > - {restoreBackupResult.isFetching && ( - - )} - Restore backup - - {restoreBackupResult.isSuccess && ( - <> - {restoreBackupResult.data.Results} - - )} - {RunBackupResult.isSuccess && ( - <> - - downloadTxtFile(RunBackupResult.data.backup)}> - Download Backup - - - - )} -
    - -

    Backend API Version

    - -
    Latest: {isSuccessVersion ? versions.RemoteCIPPAPIVersion : }
    -
    - Current: {isSuccessVersion ? versions.LocalCIPPAPIVersion : } -
    -
    -
    -
    -
    - )} - - ) -} -const ExtensionsTab = () => { - const [listBackend, listBackendResult] = useLazyGenericGetRequestQuery() - const inputRef = useRef(null) - const [setExtensionconfig, extensionConfigResult] = useLazyGenericPostRequestQuery() - const [execTestExtension, listExtensionTestResult] = useLazyGenericGetRequestQuery() - const [execSyncExtension, listSyncExtensionResult] = useLazyGenericGetRequestQuery() - - const onSubmitTest = (integrationName) => { - execTestExtension({ - path: 'api/ExecExtensionTest?extensionName=' + integrationName, - }) - } - const onSubmit = (values) => { - setExtensionconfig({ - path: 'api/ExecExtensionsConfig', - values: values, - }) - } - return ( -
    - {listBackendResult.isUninitialized && listBackend({ path: 'api/ListExtensionsConfig' })} - <> - {(listBackendResult.isFetching || - extensionConfigResult.isFetching || - listExtensionTestResult.isFetching || - listSyncExtensionResult.isFetching) && } - {listSyncExtensionResult.isSuccess && ( - - - Results - - - {listSyncExtensionResult.data.Results} - - - )} - - {listExtensionTestResult.isSuccess && ( - - - Results - - - <> - {listExtensionTestResult.data.Results} - - - - )} - {extensionConfigResult.isSuccess && ( - - - Results - - - <> - {extensionConfigResult.data.Results} - - - - )} - - {Extensions.map((integration, idx) => ( - - - - {integration.name} - - -

    {integration.helpText}

    - { - return ( - - - - {integration.SettingOptions.map( - (integrationOptions, idx) => - integrationOptions.type === 'input' && ( - - - - ), - )} - {integration.SettingOptions.map( - (integrationOptions, idx) => - integrationOptions.type === 'checkbox' && ( - - - - ), - )} - - - - - - {extensionConfigResult.isFetching && ( - - )} - Set Extension Settings - - onSubmitTest(integration.type)} - className="me-2" - > - {listExtensionTestResult.isFetching && ( - - )} - Test Extension - - {integration.forceSyncButton && ( - - execSyncExtension({ - path: 'api/ExecExtensionSync?Extension=' + integration.type, - }) - } - className="me-2" - > - {listSyncExtensionResult.isFetching && ( - - )} - Force Sync - - )} - - - ) - }} - /> -
    -
    -
    - ))} -
    - -
    - ) -} - -const MappingsTab = () => { - const [listHaloBackend, listBackendHaloResult = []] = useLazyGenericGetRequestQuery() - const [listNinjaOrgsBackend, listBackendNinjaOrgsResult] = useLazyGenericGetRequestQuery() - const [listNinjaFieldsBackend, listBackendNinjaFieldsResult] = useLazyGenericGetRequestQuery() - const [setHaloExtensionconfig, extensionHaloConfigResult = []] = useLazyGenericPostRequestQuery() - const [setNinjaOrgsExtensionconfig, extensionNinjaOrgsConfigResult] = - useLazyGenericPostRequestQuery() - const [setNinjaOrgsExtensionAutomap, extensionNinjaOrgsAutomapResult] = - useLazyGenericPostRequestQuery() - const [setNinjaFieldsExtensionconfig, extensionNinjaFieldsConfigResult] = - useLazyGenericPostRequestQuery() - - const onHaloSubmit = (values) => { - setHaloExtensionconfig({ - path: 'api/ExecExtensionMapping?AddMapping=Halo', - values: { mappings: values }, - }) - } - const onNinjaOrgsSubmit = (values) => { - setNinjaOrgsExtensionconfig({ - path: 'api/ExecExtensionMapping?AddMapping=NinjaOrgs', - values: { mappings: values }, - }) - } - - const onNinjaOrgsAutomap = async (values) => { - await setNinjaOrgsExtensionAutomap({ - path: 'api/ExecExtensionMapping?AutoMapping=NinjaOrgs', - values: { mappings: values }, - }) - await listNinjaOrgsBackend({ - path: 'api/ExecExtensionMapping?List=NinjaOrgs', - }) - } - - const onNinjaFieldsSubmit = (values) => { - setNinjaFieldsExtensionconfig({ - path: 'api/ExecExtensionMapping?AddMapping=NinjaFields', - - values: { mappings: values }, - }) - } - return ( -
    - {listBackendHaloResult.isUninitialized && - listHaloBackend({ path: 'api/ExecExtensionMapping?List=Halo' })} - {listBackendNinjaOrgsResult.isUninitialized && - listNinjaOrgsBackend({ path: 'api/ExecExtensionMapping?List=NinjaOrgs' })} - {listBackendNinjaFieldsResult.isUninitialized && - listNinjaFieldsBackend({ path: 'api/ExecExtensionMapping?List=NinjaFields' })} - <> - - - HaloPSA Mapping Table - - - {listBackendHaloResult.isFetching ? ( - - ) : ( - { - return ( - - - Use the table below to map your client to the correct PSA client - {listBackendHaloResult.isSuccess && - listBackendHaloResult.data.Tenants?.map((tenant) => ( - - ))} - - - - {extensionHaloConfigResult.isFetching && ( - - )} - Set Mappings - - {(extensionHaloConfigResult.isSuccess || - extensionHaloConfigResult.isError) && ( - - {extensionHaloConfigResult.isSuccess - ? extensionHaloConfigResult.data.Results - : 'Error'} - - )} - - - ) - }} - /> - )} - - - - - NinjaOne Field Mapping Table - - - {listBackendNinjaFieldsResult.isFetching ? ( - - ) : ( - { - return ( - - -
    Organization Global Custom Field Mapping
    -

    - Use the table below to map your Organization Field to the correct NinjaOne - Field -

    - {listBackendNinjaFieldsResult.isSuccess && - listBackendNinjaFieldsResult.data.CIPPOrgFields.map((CIPPOrgFields) => ( - item.type === CIPPOrgFields.Type || item.type === 'unset', - )} - placeholder="Select a Field" - /> - ))} -
    - -
    Device Custom Field Mapping
    -

    - Use the table below to map your Device field to the correct NinjaOne - WYSIWYG Field -

    - {listBackendNinjaFieldsResult.isSuccess && - listBackendNinjaFieldsResult.data.CIPPNodeFields.map((CIPPNodeFields) => ( - - item.type === CIPPNodeFields.Type || item.type === 'unset', - )} - placeholder="Select a Field" - /> - ))} -
    - - - {extensionNinjaFieldsConfigResult.isFetching && ( - - )} - Set Mappings - - {(extensionNinjaFieldsConfigResult.isSuccess || - extensionNinjaFieldsConfigResult.isError) && ( - - {extensionNinjaFieldsConfigResult.isSuccess - ? extensionNinjaFieldsConfigResult.data.Results - : 'Error'} - - )} - -
    - ) - }} - /> - )} -
    -
    - - - NinjaOne Organization Mapping Table - - - {listBackendNinjaOrgsResult.isFetching ? ( - - ) : ( - { - return ( - - - Use the table below to map your client to the correct NinjaOne Organization - {listBackendNinjaOrgsResult.isSuccess && - listBackendNinjaOrgsResult.data.Tenants.map((tenant) => ( - - ))} - - - - {extensionNinjaOrgsConfigResult.isFetching && ( - - )} - Set Mappings - - onNinjaOrgsAutomap()} className="me-2"> - {extensionNinjaOrgsAutomapResult.isFetching && ( - - )} - Automap NinjaOne Organizations - - {(extensionNinjaOrgsConfigResult.isSuccess || - extensionNinjaOrgsConfigResult.isError) && ( - - {extensionNinjaOrgsConfigResult.isSuccess - ? extensionNinjaOrgsConfigResult.data.Results - : 'Error'} - - )} - {(extensionNinjaOrgsAutomapResult.isSuccess || - extensionNinjaOrgsAutomapResult.isError) && ( - - {extensionNinjaOrgsAutomapResult.isSuccess - ? extensionNinjaOrgsAutomapResult.data.Results - : 'Error'} - - )} - - - ) - }} - /> - )} - - - -
    - ) -} - -const Maintenance = () => { - const [selectedScript, setSelectedScript] = useState() - const [listBackend, listBackendResult] = useLazyGenericGetRequestQuery() - const [listScript, listScriptResult] = useLazyGenericGetRequestQuery() - const [listScriptLink, listScriptLinkResult] = useLazyGenericGetRequestQuery() - - const handleSubmit = async (values) => { - listScript({ path: 'api/ExecMaintenanceScripts', params: values }) - setSelectedScript(values.ScriptFile) - } - - const handleGetLink = () => { - listScriptLink({ - path: 'api/ExecMaintenanceScripts', - params: { ScriptFile: selectedScript, MakeLink: 'True' }, - }) - } - return ( - <> - {listBackendResult.isUninitialized && listBackend({ path: 'api/ExecMaintenanceScripts' })} - - - - - Maintenance - - - { - return ( - - {listBackendResult.isFetching && ( - <> - - - - - - - )} - {!listBackendResult.isFetching && listBackendResult.isSuccess && ( - <> - - - - - - - - - - Load Script - - - - - )} - - ) - }} - /> - - - - - - - {listScriptResult.isFetching && ( - - - - - - )} - {!listScriptResult.isFetching && listScriptResult.isSuccess && ( - - - Script Details - - -

    - - - Create Link - -

    - {listScriptLinkResult.isSuccess && ( -

    - {listScriptLinkResult.data.Link !== undefined && ( - <> -

    - Copy this text into a PowerShell terminal, we recommend Azure Cloud Shell. - Azure modules and the az command line utilties are required for these - scripts to work. The link is valid for 5 minutes. -

    - - - )} -

    - )} - {listScriptResult.data.ScriptContent !== undefined && ( -

    -

    Maintenance Script Contents
    - -

    - )} -
    -
    - )} -
    -
    - - ) -} diff --git a/src/views/cipp/app-settings/CIPPSettings.jsx b/src/views/cipp/app-settings/CIPPSettings.jsx new file mode 100644 index 000000000000..ff43ad2a5a94 --- /dev/null +++ b/src/views/cipp/app-settings/CIPPSettings.jsx @@ -0,0 +1,93 @@ +import React, { useState } from 'react' +import { CNav, CNavItem, CTabContent, CTabPane } from '@coreui/react' +import { CippPage } from 'src/components/layout' +import { CippLazy } from 'src/components/utilities' + +import { SettingsGeneral } from './SettingsGeneral.jsx' +import { SettingsTenants } from 'src/views/cipp/app-settings/SettingsTenants.jsx' +import { SettingsBackend } from 'src/views/cipp/app-settings/SettingsBackend.jsx' +import { SettingsNotifications } from 'src/views/cipp/app-settings/SettingsNotifications.jsx' +import { SettingsLicenses } from 'src/views/cipp/app-settings/SettingsLicenses.jsx' +import { SettingsExtensions } from 'src/views/cipp/app-settings/SettingsExtensions.jsx' +import { SettingsMaintenance } from 'src/views/cipp/app-settings/SettingsMaintenance.jsx' +import { SettingsExtensionMappings } from 'src/views/cipp/app-settings/SettingsExtensionMappings.jsx' + +/** + * This function returns the settings page content for CIPP. + * + * @returns {JSX.Element} The settings page content. + */ +export default function CIPPSettings() { + const [active, setActive] = useState(1) + return ( + + + setActive(1)} href="#"> + General + + setActive(2)} href="#"> + Tenants + + setActive(3)} href="#"> + Backend + + setActive(4)} href="#"> + Notifications + + setActive(5)} href="#"> + Licenses + + setActive(6)} href="#"> + Maintenance + + setActive(7)} href="#"> + Extensions + + setActive(8)} href="#"> + Extension Mappings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} diff --git a/src/views/cipp/app-settings/SettingsBackend.jsx b/src/views/cipp/app-settings/SettingsBackend.jsx new file mode 100644 index 000000000000..58e3bc2b594b --- /dev/null +++ b/src/views/cipp/app-settings/SettingsBackend.jsx @@ -0,0 +1,251 @@ +import { useLazyGenericGetRequestQuery } from 'src/store/api/app.js' +import React, { useState } from 'react' +import { + CButton, + CCard, + CCardBody, + CCardHeader, + CCardTitle, + CCol, + CLink, + CRow, +} from '@coreui/react' +import { CippCodeBlock, CippOffcanvas } from 'src/components/utilities/index.js' + +/** + * The SettingsBackend method is responsible for rendering a settings panel that contains several resource + * groups and corresponding links to access them. + * The panel displays information about Resource Group, Key Vault, Static Web App (Role Management), + * Function App (Deployment Center), Function App (Configuration), Function App (Overview), and Cloud Shell. + * + * @returns {JSX.Element} The settings panel component. + */ +export function SettingsBackend() { + const [listBackend, listBackendResult] = useLazyGenericGetRequestQuery() + const [visible, setVisible] = useState(false) + return ( +
    + {listBackendResult.isUninitialized && listBackend({ path: 'api/ExecBackendURLs' })} + <> + + + + + Resource Group + + +

    + The Resource group contains all the CIPP resources in your tenant, except the SAM + Application +

    + + Go to Resource Group + +
    +
    +
    + + + + Key Vault + + +

    + The keyvault allows you to check token information. By default you do not have + access. +

    + + Go to Keyvault + +
    +
    +
    + + + + Static Web App (Role Management) + + +

    + The Static Web App role management allows you to invite other users to the + application. +

    + + Go to Role Management + +
    +
    +
    +
    + + + + + Function App (Deployment Center) + + +

    The Function App Deployment Center allows you to run updates on the API

    + + Go to Function App Deployment Center + +
    +
    +
    + + + + Function App (Configuration) + + +

    + At the Function App Configuration you can check the status of the API access to + your keyvault +

    + + Go to Function App Configuration + +
    +
    +
    + + + + Function App (Overview) + + +

    At the function App Overview, you can stop and start the backend API

    + + Go to Function App Overview + +
    +
    +
    +
    + + + + + Cloud Shell + + +

    Launch an Azure Cloud Shell Window

    + + window.open( + 'https://shell.azure.com/powershell', + '_blank', + 'toolbar=no,scrollbars=yes,resizable=yes,menubar=no,location=no,status=no', + ) + } + rel="noreferrer" + > + Cloud Shell + + setVisible(true)} className="mb-3"> + Command Reference + +
    +
    +
    +
    + setVisible(false)} + title="Command Reference" + > +
    Function App Config
    + +
    Function App Deployment
    + +
    Watch Function Logs
    + +
    Static Web App Config
    + +
    List CIPP Users
    + +
    + +
    + ) +} diff --git a/src/views/cipp/app-settings/SettingsExtensionMappings.jsx b/src/views/cipp/app-settings/SettingsExtensionMappings.jsx new file mode 100644 index 000000000000..aefa536ac876 --- /dev/null +++ b/src/views/cipp/app-settings/SettingsExtensionMappings.jsx @@ -0,0 +1,279 @@ +import { useLazyGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app.js' +import { + CButton, + CCallout, + CCard, + CCardBody, + CCardHeader, + CCardText, + CCardTitle, + CCol, + CForm, + CSpinner, +} from '@coreui/react' +import { Form } from 'react-final-form' +import { RFFSelectSearch } from 'src/components/forms/index.js' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' +import React from 'react' + +/** + * Retrieves and sets the extension mappings for HaloPSA and NinjaOne. + * + * @returns {JSX.Element} - JSX component representing the settings extension mappings. + */ +export function SettingsExtensionMappings() { + const [listHaloBackend, listBackendHaloResult = []] = useLazyGenericGetRequestQuery() + const [listNinjaOrgsBackend, listBackendNinjaOrgsResult] = useLazyGenericGetRequestQuery() + const [listNinjaFieldsBackend, listBackendNinjaFieldsResult] = useLazyGenericGetRequestQuery() + const [setHaloExtensionconfig, extensionHaloConfigResult = []] = useLazyGenericPostRequestQuery() + const [setNinjaOrgsExtensionconfig, extensionNinjaOrgsConfigResult] = + useLazyGenericPostRequestQuery() + const [setNinjaOrgsExtensionAutomap, extensionNinjaOrgsAutomapResult] = + useLazyGenericPostRequestQuery() + const [setNinjaFieldsExtensionconfig, extensionNinjaFieldsConfigResult] = + useLazyGenericPostRequestQuery() + + const onHaloSubmit = (values) => { + setHaloExtensionconfig({ + path: 'api/ExecExtensionMapping?AddMapping=Halo', + values: { mappings: values }, + }) + } + const onNinjaOrgsSubmit = (values) => { + setNinjaOrgsExtensionconfig({ + path: 'api/ExecExtensionMapping?AddMapping=NinjaOrgs', + values: { mappings: values }, + }) + } + + const onNinjaOrgsAutomap = async (values) => { + await setNinjaOrgsExtensionAutomap({ + path: 'api/ExecExtensionMapping?AutoMapping=NinjaOrgs', + values: { mappings: values }, + }) + await listNinjaOrgsBackend({ + path: 'api/ExecExtensionMapping?List=NinjaOrgs', + }) + } + + const onNinjaFieldsSubmit = (values) => { + setNinjaFieldsExtensionconfig({ + path: 'api/ExecExtensionMapping?AddMapping=NinjaFields', + + values: { mappings: values }, + }) + } + return ( +
    + {listBackendHaloResult.isUninitialized && + listHaloBackend({ path: 'api/ExecExtensionMapping?List=Halo' })} + {listBackendNinjaOrgsResult.isUninitialized && + listNinjaOrgsBackend({ path: 'api/ExecExtensionMapping?List=NinjaOrgs' })} + {listBackendNinjaFieldsResult.isUninitialized && + listNinjaFieldsBackend({ path: 'api/ExecExtensionMapping?List=NinjaFields' })} + <> + + + HaloPSA Mapping Table + + + {listBackendHaloResult.isFetching ? ( + + ) : ( + { + return ( + + + Use the table below to map your client to the correct PSA client + {listBackendHaloResult.isSuccess && + listBackendHaloResult.data.Tenants?.map((tenant) => ( + + ))} + + + + {extensionHaloConfigResult.isFetching && ( + + )} + Set Mappings + + {(extensionHaloConfigResult.isSuccess || + extensionHaloConfigResult.isError) && ( + + {extensionHaloConfigResult.isSuccess + ? extensionHaloConfigResult.data.Results + : 'Error'} + + )} + + + ) + }} + /> + )} + + + + + NinjaOne Field Mapping Table + + + {listBackendNinjaFieldsResult.isFetching ? ( + + ) : ( + { + return ( + + +
    Organization Global Custom Field Mapping
    +

    + Use the table below to map your Organization Field to the correct NinjaOne + Field +

    + {listBackendNinjaFieldsResult.isSuccess && + listBackendNinjaFieldsResult.data.CIPPOrgFields.map((CIPPOrgFields) => ( + item.type === CIPPOrgFields.Type || item.type === 'unset', + )} + placeholder="Select a Field" + /> + ))} +
    + +
    Device Custom Field Mapping
    +

    + Use the table below to map your Device field to the correct NinjaOne + WYSIWYG Field +

    + {listBackendNinjaFieldsResult.isSuccess && + listBackendNinjaFieldsResult.data.CIPPNodeFields.map((CIPPNodeFields) => ( + + item.type === CIPPNodeFields.Type || item.type === 'unset', + )} + placeholder="Select a Field" + /> + ))} +
    + + + {extensionNinjaFieldsConfigResult.isFetching && ( + + )} + Set Mappings + + {(extensionNinjaFieldsConfigResult.isSuccess || + extensionNinjaFieldsConfigResult.isError) && ( + + {extensionNinjaFieldsConfigResult.isSuccess + ? extensionNinjaFieldsConfigResult.data.Results + : 'Error'} + + )} + +
    + ) + }} + /> + )} +
    +
    + + + NinjaOne Organization Mapping Table + + + {listBackendNinjaOrgsResult.isFetching ? ( + + ) : ( + { + return ( + + + Use the table below to map your client to the correct NinjaOne Organization + {listBackendNinjaOrgsResult.isSuccess && + listBackendNinjaOrgsResult.data.Tenants.map((tenant) => ( + + ))} + + + + {extensionNinjaOrgsConfigResult.isFetching && ( + + )} + Set Mappings + + onNinjaOrgsAutomap()} className="me-2"> + {extensionNinjaOrgsAutomapResult.isFetching && ( + + )} + Automap NinjaOne Organizations + + {(extensionNinjaOrgsConfigResult.isSuccess || + extensionNinjaOrgsConfigResult.isError) && ( + + {extensionNinjaOrgsConfigResult.isSuccess + ? extensionNinjaOrgsConfigResult.data.Results + : 'Error'} + + )} + {(extensionNinjaOrgsAutomapResult.isSuccess || + extensionNinjaOrgsAutomapResult.isError) && ( + + {extensionNinjaOrgsAutomapResult.isSuccess + ? extensionNinjaOrgsAutomapResult.data.Results + : 'Error'} + + )} + + + ) + }} + /> + )} + + + +
    + ) +} diff --git a/src/views/cipp/app-settings/SettingsExtensions.jsx b/src/views/cipp/app-settings/SettingsExtensions.jsx new file mode 100644 index 000000000000..788e10f7f8b6 --- /dev/null +++ b/src/views/cipp/app-settings/SettingsExtensions.jsx @@ -0,0 +1,203 @@ +import { useLazyGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app.js' +import React, { useRef } from 'react' +import { + CButton, + CCallout, + CCard, + CCardBody, + CCardHeader, + CCardText, + CCardTitle, + CCol, + CForm, + CRow, + CSpinner, +} from '@coreui/react' +import Extensions from 'src/data/Extensions.json' +import { Form } from 'react-final-form' +import { RFFCFormInput, RFFCFormSwitch } from 'src/components/forms/index.js' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' +import CippCallout from 'src/components/utilities/CippCallout.jsx' + +/** + * Executes various operations related to settings and extensions. + * + * @returns {JSX.Element} - The rendered component. + */ +export function SettingsExtensions() { + const [listBackend, listBackendResult] = useLazyGenericGetRequestQuery() + const inputRef = useRef(null) + const [setExtensionconfig, extensionConfigResult] = useLazyGenericPostRequestQuery() + const [execTestExtension, listExtensionTestResult] = useLazyGenericGetRequestQuery() + const [execSyncExtension, listSyncExtensionResult] = useLazyGenericGetRequestQuery() + + const onSubmitTest = (integrationName) => { + execTestExtension({ + path: 'api/ExecExtensionTest?extensionName=' + integrationName, + }) + } + const onSubmit = (values) => { + setExtensionconfig({ + path: 'api/ExecExtensionsConfig', + values: values, + }) + } + return ( +
    + {listBackendResult.isUninitialized && listBackend({ path: 'api/ListExtensionsConfig' })} + <> + {(listBackendResult.isFetching || + extensionConfigResult.isFetching || + listExtensionTestResult.isFetching || + listSyncExtensionResult.isFetching) && ( + + + + )} + {listSyncExtensionResult.isSuccess && ( + + + Results + + + + {listSyncExtensionResult.data.Results} + + + + )} + {listExtensionTestResult.isSuccess && ( + + + Results + + + + {listExtensionTestResult.data.Results} + + + + )} + {extensionConfigResult.isSuccess && ( + + + Results + + + + {extensionConfigResult.data.Results} + + + + )} + + {Extensions.map((integration, idx) => ( + + + + {integration.name} + + +

    {integration.helpText}

    + { + return ( + + + + {integration.SettingOptions.map( + (integrationOptions, idx) => + integrationOptions.type === 'input' && ( + + + + ), + )} + {integration.SettingOptions.map( + (integrationOptions, idx) => + integrationOptions.type === 'checkbox' && ( + + + + ), + )} + + + + + + {extensionConfigResult.isFetching && ( + + )} + Set Extension Settings + + onSubmitTest(integration.type)} + className="me-2" + > + {listExtensionTestResult.isFetching && ( + + )} + Test Extension + + {integration.forceSyncButton && ( + + execSyncExtension({ + path: 'api/ExecExtensionSync?Extension=' + integration.type, + }) + } + className="me-2" + > + {listSyncExtensionResult.isFetching && ( + + )} + Force Sync + + )} + + + ) + }} + /> +
    +
    +
    + ))} +
    + +
    + ) +} diff --git a/src/views/cipp/app-settings/SettingsGeneral.jsx b/src/views/cipp/app-settings/SettingsGeneral.jsx new file mode 100644 index 000000000000..1e3f82677585 --- /dev/null +++ b/src/views/cipp/app-settings/SettingsGeneral.jsx @@ -0,0 +1,453 @@ +import { useListTenantsQuery } from 'src/store/api/tenants.js' +import { + useLazyExecClearCacheQuery, + useLazyExecPermissionsAccessCheckQuery, + useLazyExecTenantsAccessCheckQuery, + useLazyGenericGetRequestQuery, +} from 'src/store/api/app.js' +import React, { useRef, useState } from 'react' +import { cellGenericFormatter } from 'src/components/tables/CellGenericFormat.jsx' +import { cellTableFormatter } from 'src/components/tables/CellTable.jsx' +import { + CButton, + CCallout, + CCard, + CCardBody, + CCardHeader, + CCol, + CFormSwitch, + CLink, + CListGroup, + CListGroupItem, + CRow, +} from '@coreui/react' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' +import CippListOffcanvas from 'src/components/utilities/CippListOffcanvas.jsx' +import { TableModalButton } from 'src/components/buttons/index.js' +import { CippTable } from 'src/components/tables/index.js' +import { TenantSelectorMultiple } from 'src/components/utilities/index.js' +import { SettingsDNS } from 'src/views/cipp/app-settings/components/SettingsDNS.jsx' + +/** + * SettingsGeneral method. + * This method is responsible for managing general settings. + * @returns {JSX.Element} + */ +export function SettingsGeneral() { + const { data: tenants = [] } = useListTenantsQuery({ AllTenantSelector: false }) + const [checkPermissions, permissionsResult] = useLazyExecPermissionsAccessCheckQuery() + const [checkGDAP, GDAPResult] = useLazyGenericGetRequestQuery() + + const [clearCache, clearCacheResult] = useLazyExecClearCacheQuery() + const [checkAccess, accessCheckResult] = useLazyExecTenantsAccessCheckQuery() + const [selectedTenants, setSelectedTenants] = useState([]) + const [showMaxSelected, setShowMaxSelected] = useState(false) + const [tokenOffcanvasVisible, setTokenOffcanvasVisible] = useState(false) + const [showExtendedInfo, setShowExtendedInfo] = useState(true) + + const maxSelected = 2 + const tenantSelectorRef = useRef(null) + + const handleSetSelectedTenants = (value) => { + if (value.length <= maxSelected) { + setSelectedTenants(value) + setShowMaxSelected(false) + } else { + setSelectedTenants(value) + setShowMaxSelected(true) + } + } + + const checkAccessColumns = [ + { + name: 'Tenant Domain', + selector: (row) => row['TenantName'], + grow: 0, + cell: cellGenericFormatter(), + }, + { + name: 'Result', + selector: (row) => row['Status'], + minWidth: '380px', + maxWidth: '380px', + cell: cellGenericFormatter(), + }, + { + name: 'Missing GDAP Roles', + selector: (row) => row?.MissingRoles, + cell: cellTableFormatter('MissingRoles', true, false, true), + }, + { + name: 'Roles available', + selector: (row) => row?.GDAPRoles, + cell: cellTableFormatter('GDAPRoles', false, true), + omit: showExtendedInfo, + exportSelector: 'GDAPRoles', + }, + { + name: 'SAM User Roles', + selector: (row) => row?.SAMUserRoles, + cell: cellTableFormatter('SAMUserRoles', false, true), + omit: showExtendedInfo, + exportSelector: 'SAMUserRoles', + }, + ] + + const checkGDAPColumns = [ + { + name: 'Tenant', + selector: (row) => row['Tenant'], + sortable: true, + cell: cellGenericFormatter(), + minWidth: '200px', + maxWidth: '200px', + }, + { + name: 'Error Type', + selector: (row) => row['Type'], + sortable: true, + cell: cellGenericFormatter(), + minWidth: '100px', + maxWidth: '100px', + }, + { + name: 'Issue', + selector: (row) => row?.Issue, + sortable: true, + cell: cellGenericFormatter(), + }, + { + name: 'Resolution Link', + sortable: true, + selector: (row) => row?.Link, + cell: cellGenericFormatter(), + }, + { + name: 'Relationship ID', + sortable: true, + selector: (row) => row?.Relationship, + cell: cellGenericFormatter(), + }, + ] + + const handleCheckAccess = () => { + const mapped = tenants.reduce( + (current, { customerId, ...rest }) => ({ + ...current, + [customerId]: { ...rest }, + }), + {}, + ) + const AllTenantSelector = selectedTenants.map( + (customerId) => mapped[customerId].defaultDomainName, + ) + checkAccess({ tenantDomains: AllTenantSelector }) + } + + function getTokenOffcanvasProps({ tokenResults }) { + let tokenDetails = tokenResults.AccessTokenDetails + let helpLinks = tokenResults.Links + let tokenOffcanvasGroups = [] + if (tokenDetails?.Name !== '') { + let tokenItems = [] + let tokenOffcanvasGroup = {} + tokenItems.push({ + heading: 'User', + content: tokenDetails?.Name, + }) + tokenItems.push({ + heading: 'UPN', + content: tokenDetails?.UserPrincipalName, + }) + tokenItems.push({ + heading: 'App Registration', + content: ( + + {tokenDetails?.AppName} + + ), + }) + tokenItems.push({ + heading: 'IP Address', + content: tokenDetails?.IPAddress, + }) + tokenItems.push({ + heading: 'Auth Methods', + content: tokenDetails?.AuthMethods.join(', '), + }) + tokenItems.push({ + heading: 'Tenant ID', + content: tokenDetails?.TenantId, + }) + tokenOffcanvasGroup.items = tokenItems + tokenOffcanvasGroup.title = 'Claims' + tokenOffcanvasGroups.push(tokenOffcanvasGroup) + } + + if (helpLinks.length > 0) { + let linkItems = [] + let linkItemGroup = {} + helpLinks.map((link, idx) => + linkItems.push({ + heading: '', + content: ( + + {link.Text} + + ), + }), + ) + linkItemGroup.title = 'Help Links' + linkItemGroup.items = linkItems + if (linkItemGroup.items.length > 0) { + tokenOffcanvasGroups.push(linkItemGroup) + } + } + + return tokenOffcanvasGroups + } + + const tableProps = { + pagination: false, + actions: [ + { + console.log(e) + setShowExtendedInfo(!e.target.checked) + }} + key={'Show Extended Info'} + />, + ], + } + + return ( +
    + + + + + + + + + + +

    Permissions Check

    +

    Click the button below to start a permissions check.

    + checkPermissions()} + disabled={permissionsResult.isFetching} + className="mb-3 me-2" + > + {permissionsResult.isFetching && ( + + )} + Run Permissions Check + + {permissionsResult.isSuccess && ( + <> + {permissionsResult.data.Results?.AccessTokenDetails?.Name !== '' && ( + <> + setTokenOffcanvasVisible(true)}> + Details + + setTokenOffcanvasVisible(false)} + /> + + )} + + {permissionsResult.data.Results?.Messages && ( + <> + {permissionsResult.data.Results?.Messages?.map((m, idx) => ( +
    {m}
    + ))} + + )} + {permissionsResult.data.Results?.MissingPermissions.length > 0 && ( + <> + Your Secure Application Model is missing the following permissions. See the + documentation on how to add permissions{' '} + + here + + . + + {permissionsResult.data.Results?.MissingPermissions?.map((r, index) => ( + {r} + ))} + + + )} +
    + + )} +
    +
    +
    + + + + +

    GDAP Check

    +

    Click the button below to start a check for general GDAP settings.

    + checkGDAP({ path: '/api/ExecAccessChecks?GDAP=true' })} + disabled={GDAPResult.isFetching} + className="mb-3 me-2" + > + {GDAPResult.isFetching && ( + + )} + Run GDAP Check + + {GDAPResult.isSuccess && ( + <> + p['@odata.type'] == '#microsoft.graph.group', + )} + title="Groups" + /> + p['@odata.type'] == '#microsoft.graph.directoryRole', + )} + title="Roles" + /> + + )} + + + {GDAPResult.isSuccess && GDAPResult.data.Results.GDAPIssues?.length > 0 && ( + <> + {GDAPResult.data.Results.GDAPIssues?.filter((e) => e.Type === 'Error') + .length > 0 && ( + + Relationship errors detected. Review the table below for more details. + + )} + {GDAPResult.data.Results.GDAPIssues?.filter((e) => e.Type === 'Warning') + .length > 0 && ( + + Relationship warnings detected. Review the table below for more details. + + )} + + + )} + {GDAPResult.isSuccess && GDAPResult.data.Results.GDAPIssues?.length === 0 && ( + + No relationships with issues found. Please perform a Permissions Check or + Tenant Access Check if you are experiencing issues. + + )} + + +
    +
    +
    +
    + + + + + +

    Tenant Access Check

    + + +
    + Click the button below to start a tenant access check. You can select multiple, + but a maximum of {maxSelected + 1} tenants is recommended. +
    + + + handleSetSelectedTenants( + value.map((val) => { + return val.value + }), + ) + } + /> + {showMaxSelected && ( + + A maximum of {maxSelected + 1} tenants is recommended. + + )} +
    +
    + + + + handleCheckAccess()} + disabled={accessCheckResult.isFetching || selectedTenants.length < 1} + > + {accessCheckResult.isFetching && ( + + )} + Run access check + + + + + + {accessCheckResult.isSuccess && ( + + )} + + +
    +
    +
    +
    +
    + ) +} diff --git a/src/views/cipp/app-settings/SettingsLicenses.jsx b/src/views/cipp/app-settings/SettingsLicenses.jsx new file mode 100644 index 000000000000..b1e7e49fa919 --- /dev/null +++ b/src/views/cipp/app-settings/SettingsLicenses.jsx @@ -0,0 +1,134 @@ +import { useLazyGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app.js' +import React, { useRef } from 'react' +import { ModalService } from 'src/components/utilities/index.js' +import { Form } from 'react-final-form' +import { RFFCFormInput } from 'src/components/forms/index.js' +import { TitleButton } from 'src/components/buttons/index.js' +import { CButton, CCallout, CSpinner } from '@coreui/react' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { faTrash } from '@fortawesome/free-solid-svg-icons' +import { CippPageList } from 'src/components/layout/index.js' + +/** + * SettingsLicenses component is used to manage excluded licenses in a settings page. + * + * @returns {JSX.Element} The generated settings page component. + */ +export function SettingsLicenses() { + const [setExclusion, setExclusionResults] = useLazyGenericPostRequestQuery() + const formRef = useRef(null) + + const handleAddLicense = (selected) => { + ModalService.confirm({ + body: ( +
    + { + formRef.current = values + return ( + <> +
    Add a license to exclude
    + + + + ) + }} + /> +
    + ), + title: 'Add Exclusion', + onConfirm: () => + setExclusion({ + path: '/api/ExecExcludeLicenses?AddExclusion=true', + values: { ...formRef.current }, + }), + }) + } + + const titleButton = + const [ExecuteGetRequest, getResults] = useLazyGenericGetRequestQuery() + + const Offcanvas = (row, rowIndex, formatExtraData) => { + const handleDeleteIntuneTemplate = (apiurl, message) => { + ModalService.confirm({ + title: 'Confirm', + body:
    {message}
    , + onConfirm: () => ExecuteGetRequest({ path: apiurl }), + confirmLabel: 'Continue', + cancelLabel: 'Cancel', + }) + } + return ( + <> + + handleDeleteIntuneTemplate( + `/api/ExecExcludeLicenses?RemoveExclusion=true&GUID=${row.GUID}`, + 'Do you want to delete this exclusion?', + ) + } + > + + + + ) + } + + const columns = [ + { + name: 'Display Name', + selector: (row) => row['Product_Display_Name'], + exportSelector: 'Product_Display_Name', + sortable: true, + minWidth: '300px', + }, + { + name: 'License ID', + selector: (row) => row['GUID'], + exportSelector: 'GUID', + sortable: true, + minWidth: '350px', + }, + { + name: 'Actions', + cell: Offcanvas, + }, + ] + return ( + <> + {setExclusionResults.isFetching || + (getResults.isFetching && ( + + Loading + + ))} + {setExclusionResults.isSuccess && ( + {setExclusionResults.data?.Results} + )} + {setExclusionResults.isError && ( + + Could not connect to API: {setExclusionResults.error.message} + + )} + {getResults.isError && ( + Could not connect to API: {getResults.error.message} + )} + {getResults.isSuccess && {getResults.data?.Results}} + + + ) +} diff --git a/src/views/cipp/app-settings/SettingsMaintenance.jsx b/src/views/cipp/app-settings/SettingsMaintenance.jsx new file mode 100644 index 000000000000..d7387f849400 --- /dev/null +++ b/src/views/cipp/app-settings/SettingsMaintenance.jsx @@ -0,0 +1,161 @@ +import React, { useState } from 'react' +import { useLazyGenericGetRequestQuery } from 'src/store/api/app.js' +import { + CButton, + CCard, + CCardBody, + CCardHeader, + CCardTitle, + CCol, + CForm, + CRow, +} from '@coreui/react' +import { Form } from 'react-final-form' +import Skeleton from 'react-loading-skeleton' +import { RFFCFormSelect } from 'src/components/forms/index.js' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { faLink, faScroll } from '@fortawesome/free-solid-svg-icons' +import { CippCodeBlock } from 'src/components/utilities/index.js' +import { Buffer } from 'buffer' + +/** + * Performs maintenance operations on settings. + * + * @returns {JSX.Element} The JSX element representing the settings maintenance component. + */ +export function SettingsMaintenance() { + const [selectedScript, setSelectedScript] = useState() + const [listBackend, listBackendResult] = useLazyGenericGetRequestQuery() + const [listScript, listScriptResult] = useLazyGenericGetRequestQuery() + const [listScriptLink, listScriptLinkResult] = useLazyGenericGetRequestQuery() + + const handleSubmit = async (values) => { + listScript({ path: 'api/ExecMaintenanceScripts', params: values }) + setSelectedScript(values.ScriptFile) + } + + const handleGetLink = () => { + listScriptLink({ + path: 'api/ExecMaintenanceScripts', + params: { ScriptFile: selectedScript, MakeLink: 'True' }, + }) + } + return ( + <> + {listBackendResult.isUninitialized && listBackend({ path: 'api/ExecMaintenanceScripts' })} + + + + + Maintenance + + + { + return ( + + {listBackendResult.isFetching && ( + <> + + + + + + + )} + {!listBackendResult.isFetching && listBackendResult.isSuccess && ( + <> + + + + + + + + + + Load Script + + + + + )} + + ) + }} + /> + + + + + + + {listScriptResult.isFetching && ( + + + + + + )} + {!listScriptResult.isFetching && listScriptResult.isSuccess && ( + + + Script Details + + +

    + + + Create Link + +

    + {listScriptLinkResult.isSuccess && ( +

    + {listScriptLinkResult.data.Link !== undefined && ( + <> +

    + Copy this text into a PowerShell terminal, we recommend Azure Cloud Shell. + Azure modules and the az command line utilties are required for these + scripts to work. The link is valid for 5 minutes. +

    + + + )} +

    + )} + {listScriptResult.data.ScriptContent !== undefined && ( +

    +

    Maintenance Script Contents
    + +

    + )} +
    +
    + )} +
    +
    + + ) +} diff --git a/src/views/cipp/app-settings/SettingsNotifications.jsx b/src/views/cipp/app-settings/SettingsNotifications.jsx new file mode 100644 index 000000000000..da11c8b35d48 --- /dev/null +++ b/src/views/cipp/app-settings/SettingsNotifications.jsx @@ -0,0 +1,178 @@ +import { + useLazyExecNotificationConfigQuery, + useLazyListNotificationConfigQuery, +} from 'src/store/api/app.js' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' +import { + CButton, + CCallout, + CCard, + CCardBody, + CCardHeader, + CCardTitle, + CCol, + CForm, + CSpinner, +} from '@coreui/react' +import { Form } from 'react-final-form' +import { RFFCFormInput, RFFCFormSwitch, RFFSelectSearch } from 'src/components/forms/index.js' +import React from 'react' + +/** + * Sets the notification settings. + * @returns {JSX.Element} The notification settings component. + */ +export function SettingsNotifications() { + const [configNotifications, notificationConfigResult] = useLazyExecNotificationConfigQuery() + const [listNotification, notificationListResult] = useLazyListNotificationConfigQuery() + const onSubmit = (values) => { + configNotifications(values) + } + return ( + <> + {notificationListResult.isUninitialized && listNotification()} + {notificationListResult.isFetching && ( + + )} + {!notificationListResult.isFetching && notificationListResult.error && ( + Error loading data + )} + {notificationListResult.isSuccess && ( + + + Notifications + + + true} + initialValues={{ + ...notificationListResult.data, + logsToInclude: notificationListResult.data?.logsToInclude?.map((m) => ({ + label: m, + value: m, + })), + Severity: notificationListResult.data?.Severity?.map((s) => ({ + label: s, + value: s, + })), + }} + onSubmit={onSubmit} + render={({ handleSubmit, submitting, values }) => { + return ( + + {notificationConfigResult.isFetching && ( + + Loading + + )} + {notificationConfigResult.isSuccess && ( + {notificationConfigResult.data?.Results} + )} + {notificationConfigResult.isError && ( + + Could not connect to API: {notificationConfigResult.error.message} + + )} + + + + + + + + + + + + + + + + + + + + + + + + Set Notification Settings + + + + ) + }} + /> + + + )} + + ) +} diff --git a/src/views/cipp/app-settings/SettingsTenants.jsx b/src/views/cipp/app-settings/SettingsTenants.jsx new file mode 100644 index 000000000000..14850a7182d9 --- /dev/null +++ b/src/views/cipp/app-settings/SettingsTenants.jsx @@ -0,0 +1,285 @@ +import { useDispatch, useSelector } from 'react-redux' +import { + useExecAddExcludeTenantMutation, + useExecRemoveExcludeTenantMutation, +} from 'src/store/api/tenants.js' +import { useLazyGenericGetRequestQuery } from 'src/store/api/app.js' +import React, { useEffect, useRef } from 'react' +import { ModalService, TenantSelectorMultiple } from 'src/components/utilities/index.js' +import { setCurrentTenant } from 'src/store/features/app.js' +import { CAlert, CButton, CCallout, CSpinner, CTooltip } from '@coreui/react' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { + faCheckCircle, + faExclamationTriangle, + faEye, + faEyeSlash, + faRecycle, +} from '@fortawesome/free-solid-svg-icons' +import { cellBooleanFormatter, CellTip } from 'src/components/tables/index.js' +import { CippPageList } from 'src/components/layout/index.js' +import CippCallout from 'src/components/utilities/CippCallout.jsx' + +/** + * The SettingsTenants method is used to manage the tenants in the application. It allows the user to add or + * remove exclusions, refresh permissions for a tenant, and view the list of excluded tenants. + * + * @return {ReactElement} The rendered component for managing the excluded tenants. + */ +export function SettingsTenants() { + const dispatch = useDispatch() + const currentTenant = useSelector((state) => state.app.currentTenant) + const [removeExcludeTenant, removeExcludeTenantResult] = useExecRemoveExcludeTenantMutation() + const [addExcludeTenant, addExcludeTenantResult] = useExecAddExcludeTenantMutation() + const [refreshPermissions, refreshPermissionsResults] = useLazyGenericGetRequestQuery() + + // const [selectedTenant, setSelectedTenant] = useState() + const selectedTenant = useRef() + + useEffect(() => { + // if a tenant is already selected and that's the tenant the + // user wants to exclude, we need to set that to the current state + selectedTenant.current = currentTenant + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) + + const handleRemoveExclusion = (domain) => + ModalService.confirm({ + title: 'Remove Exclusion', + body:
    Are you sure you want to remove the exclusion for {domain}?
    , + onConfirm: () => removeExcludeTenant(domain), + }) + + const handleCPVPermissions = (domain, resetsp = false) => + ModalService.confirm({ + title: 'Refresh Permissions', + body:
    Are you sure you want to refresh permissions for {domain.defaultDomainName}?
    , + onConfirm: () => + refreshPermissions({ + path: `/api/ExecCPVPermissions?TenantFilter=${domain.customerId}&ResetSP=${resetsp}`, + }), + }) + const handleConfirmExcludeTenant = (tenant) => { + ModalService.confirm({ + title: 'Exclude Tenant', + body:
    Are you sure you want to exclude this tenant?
    , + onConfirm: () => addExcludeTenant(tenant), + }) + .unwrap() + .then(() => { + dispatch(setCurrentTenant({})) + }) + } + + const handleExcludeTenant = (selected) => { + ModalService.confirm({ + body: ( +
    +
    Select a tenant to exclude
    + (selected = tenant)} /> +
    + ), + title: 'Add Exclusion', + onConfirm: () => handleConfirmExcludeTenant(selected), + }) + } + const titleButton = ( + handleExcludeTenant(selectedTenant)} + > + Add Excluded Tenant + + ) + + function StatusIcon(graphErrorCount) { + if (graphErrorCount > 0) { + return + } else { + return + } + } + + function StatusText(graphErrorCount, lastGraphError) { + if (graphErrorCount > 0) { + return 'Error Count: ' + graphErrorCount + ' - Last Error: ' + lastGraphError + } else { + return 'No errors detected with this tenant' + } + } + + const Offcanvas = (row, rowIndex, formatExtraData) => { + return ( + <> + {row.Excluded && ( + + handleRemoveExclusion(row.defaultDomainName)} + > + + + + )} + {!row.Excluded && ( + + handleConfirmExcludeTenant({ value: row.customerId })} + > + + + + )} + + handleCPVPermissions(row, false)} + > + + + + + ) + } + const columns = [ + { + name: 'Name', + selector: (row) => row['displayName'], + sortable: true, + cell: (row) => CellTip(row['displayName']), + exportSelector: 'displayName', + }, + { + name: 'Default Domain', + selector: (row) => row['defaultDomainName'], + sortable: true, + cell: (row) => CellTip(row['defaultDomainName']), + exportSelector: 'defaultDomainName', + }, + { + name: 'Excluded', + selector: (row) => row['Excluded'], + sortable: true, + cell: cellBooleanFormatter({ colourless: true }), + exportSelector: 'Excluded', + maxWidth: '100px', + minWidth: '100px', + }, + { + name: 'Exclude Date', + selector: (row) => row['ExcludeDate'], + sortable: true, + exportSelector: 'ExcludeDate', + maxWidth: '150px', + minWidth: '150px', + }, + { + name: 'Exclude User', + selector: (row) => row['ExcludeUser'], + sortable: true, + exportSelector: 'ExcludeUser', + maxWidth: '130px', + minWidth: '130px', + }, + { + name: 'Actions', + cell: Offcanvas, + maxWidth: '80px', + }, + ] + return ( + <> + {(refreshPermissionsResults.isFetching || removeExcludeTenantResult.isFetching) && ( + + + + )} + {removeExcludeTenantResult.isSuccess && ( + + {removeExcludeTenantResult.data?.Results} + + )} + {refreshPermissionsResults.isSuccess && + refreshPermissionsResults.data?.Results && + Array.isArray(refreshPermissionsResults.data.Results) ? ( + + {refreshPermissionsResults.data.Results.map((result, idx) => ( +
  • {result}
  • + ))} +
    + ) : null} + {addExcludeTenantResult.isSuccess && ( + + {addExcludeTenantResult.data?.Results} + + )} + + + ) +} diff --git a/src/views/cipp/app-settings/components/SettingsDNS.jsx b/src/views/cipp/app-settings/components/SettingsDNS.jsx new file mode 100644 index 000000000000..5a76aa119cad --- /dev/null +++ b/src/views/cipp/app-settings/components/SettingsDNS.jsx @@ -0,0 +1,217 @@ +import { + useLazyExecClearCacheQuery, + useLazyGenericGetRequestQuery, + useLazyGenericPostRequestQuery, + useLoadVersionsQuery, +} from 'src/store/api/app.js' +import { useLazyEditDnsConfigQuery, useLazyGetDnsConfigQuery } from 'src/store/api/domains.js' +import React, { useRef, useState } from 'react' +import useConfirmModal from 'src/hooks/useConfirmModal.jsx' +import { + CButton, + CButtonGroup, + CCallout, + CCard, + CCardBody, + CCardHeader, + CCol, + CRow, +} from '@coreui/react' +import { StatusIcon } from 'src/components/utilities/index.js' +import Skeleton from 'react-loading-skeleton' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' +import { SettingsPassword } from 'src/views/cipp/app-settings/components/SettingsPassword.jsx' + +/** + * Fetches and maintains DNS configuration settings for the application. + * + * @return {JSX.Element | void} The settings DNS component or nothing if data not ready. + */ +export function SettingsDNS() { + const [runBackup, RunBackupResult] = useLazyGenericGetRequestQuery() + const [restoreBackup, restoreBackupResult] = useLazyGenericPostRequestQuery() + const [getDnsConfig, getDnsConfigResult] = useLazyGetDnsConfigQuery() + const [editDnsConfig, editDnsConfigResult] = useLazyEditDnsConfigQuery() + const inputRef = useRef(null) + const [clearCache, clearCacheResult] = useLazyExecClearCacheQuery() + const { data: versions, isSuccess: isSuccessVersion } = useLoadVersionsQuery() + + const [alertVisible, setAlertVisible] = useState(false) + const downloadTxtFile = (data) => { + const txtdata = [JSON.stringify(RunBackupResult.data.backup)] + const file = new Blob(txtdata, { type: 'text/plain' }) + const element = document.createElement('a') + element.href = URL.createObjectURL(file) + element.download = 'CIPP-Backup' + Date.now() + '.json' + document.body.appendChild(element) + element.click() + } + const handleChange = (e) => { + const fileReader = new FileReader() + fileReader.readAsText(e.target.files[0], 'UTF-8') + fileReader.onload = (e) => { + restoreBackup({ path: '/api/ExecRestoreBackup', values: e.target.result }) + } + } + const switchResolver = (resolver) => { + editDnsConfig({ resolver }) + getDnsConfig() + setAlertVisible(true) + setTimeout(() => { + setAlertVisible(false) + }, 2000) + } + const handleClearCache = useConfirmModal({ + body:
    Are you sure you want to clear the cache?
    , + onConfirm: () => { + clearCache({ tenantsOnly: false }) + localStorage.clear() + }, + }) + + const handleClearCacheTenant = useConfirmModal({ + body:
    Are you sure you want to clear the cache?
    , + onConfirm: () => { + clearCache({ tenantsOnly: true }) + }, + }) + const resolvers = ['Google', 'Cloudflare', 'Quad9'] + + return ( + <> + {getDnsConfigResult.isUninitialized && getDnsConfig()} + {getDnsConfigResult.isSuccess && ( + + + + + + + + +

    DNS Resolver

    + + {resolvers.map((r, index) => ( + switchResolver(r)} + color={r === getDnsConfigResult.data.Resolver ? 'primary' : 'secondary'} + key={index} + > + {r} + + ))} + + {(editDnsConfigResult.isSuccess || editDnsConfigResult.isError) && ( + + {editDnsConfigResult.isSuccess + ? editDnsConfigResult.data.Results + : 'Error setting resolver'} + + )} +
    + +

    Frontend Version

    + +
    Latest: {isSuccessVersion ? versions.RemoteCIPPVersion : }
    +
    + Current: {isSuccessVersion ? versions.LocalCIPPVersion : } +
    +
    + +

    Clear Caches

    + handleClearCache()} + disabled={clearCacheResult.isFetching} + > + {clearCacheResult.isFetching && ( + + )} + Clear All Cache + + handleClearCacheTenant()} + disabled={clearCacheResult.isFetching} + > + {clearCacheResult.isFetching && ( + + )} + Clear Tenant Cache + + {clearCacheResult.isSuccess && ( +
    {clearCacheResult.data?.Results}
    + )} +
    + +

    Settings Backup

    + runBackup({ path: '/api/ExecRunBackup' })} + disabled={RunBackupResult.isFetching} + > + {RunBackupResult.isFetching && ( + + )} + Run backup + + handleChange(e)} + /> + inputRef.current.click()} + disabled={restoreBackupResult.isFetching} + > + {restoreBackupResult.isFetching && ( + + )} + Restore backup + + {restoreBackupResult.isSuccess && ( + <> + {restoreBackupResult.data.Results} + + )} + {RunBackupResult.isSuccess && ( + <> + + downloadTxtFile(RunBackupResult.data.backup)}> + Download Backup + + + + )} +
    + +

    Backend API Version

    + +
    Latest: {isSuccessVersion ? versions.RemoteCIPPAPIVersion : }
    +
    + Current: {isSuccessVersion ? versions.LocalCIPPAPIVersion : } +
    +
    +
    +
    +
    + )} + + ) +} diff --git a/src/views/cipp/app-settings/components/SettingsPassword.jsx b/src/views/cipp/app-settings/components/SettingsPassword.jsx new file mode 100644 index 000000000000..958fcdd0aa32 --- /dev/null +++ b/src/views/cipp/app-settings/components/SettingsPassword.jsx @@ -0,0 +1,66 @@ +import { useLazyGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app.js' +import React, { useState } from 'react' +import { CButton, CButtonGroup, CCallout } from '@coreui/react' + +/** + * This method is responsible for handling password settings in the application. + * It uses two custom hooks, `useLazyGenericGetRequestQuery()` and `useLazyGenericPostRequestQuery()`, + * to fetch and update password configuration data respectively. + * + * The method maintains the state of a password alert visibility using the `useState()` hook. + * + * It also provides a switchResolver function that updates the password configuration using the editPasswordConfig function. + * After updating the configuration, it fetches the updated configuration using getPasswordConfig to reflect the changes. + * Finally, it sets the password alert visibility to true. + * + * The method renders a password style section in the UI which displays a list of resolvers. + * The resolver that matches the current password configuration is highlighted with a primary color button. + * By clicking on a resolver button, the switchResolver function is called to update the password configuration and show the password alert. + * + * @returns {React.Element} The rendered password settings component with the password style section and password alert section. + */ +export function SettingsPassword() { + const [getPasswordConfig, getPasswordConfigResult] = useLazyGenericGetRequestQuery() + const [editPasswordConfig, editPasswordConfigResult] = useLazyGenericPostRequestQuery() + + const [passAlertVisible, setPassAlertVisible] = useState(false) + + const switchResolver = (resolver) => { + editPasswordConfig({ path: '/api/ExecPasswordconfig', values: { passwordType: resolver } }) + getPasswordConfig() + setPassAlertVisible(true) + } + + const resolvers = ['Classic', 'Correct-Battery-Horse'] + + return ( + <> + {getPasswordConfigResult.isUninitialized && + getPasswordConfig({ path: '/api/ExecPasswordConfig?list=true' })} +

    Password Style

    + + {resolvers.map((r, index) => ( + switchResolver(r)} + color={ + r === getPasswordConfigResult.data?.Results?.passwordType ? 'primary' : 'secondary' + } + key={index} + > + {r} + + ))} + + {(editPasswordConfigResult.isSuccess || editPasswordConfigResult.isError) && ( + + {editPasswordConfigResult.isSuccess + ? editPasswordConfigResult.data.Results + : 'Error setting password style'} + + )} + + ) +} diff --git a/src/views/email-exchange/administration/EditMailboxPermissions.jsx b/src/views/email-exchange/administration/EditMailboxPermissions.jsx index 945129569e61..3f16a1e389d9 100644 --- a/src/views/email-exchange/administration/EditMailboxPermissions.jsx +++ b/src/views/email-exchange/administration/EditMailboxPermissions.jsx @@ -19,7 +19,7 @@ import useQuery from 'src/hooks/useQuery' import { useDispatch } from 'react-redux' import { Form, Field } from 'react-final-form' import { RFFSelectSearch, RFFCFormCheck, RFFCFormInput, RFFCFormSwitch } from 'src/components/forms' -import { ModalService } from 'src/components/utilities' +import { CippLazy, ModalService } from 'src/components/utilities' import { useLazyGenericPostRequestQuery, useLazyGenericGetRequestQuery, @@ -36,23 +36,6 @@ import PropTypes from 'prop-types' const formatter = (cell, warning = false, reverse = false, colourless = false) => CellBoolean({ cell, warning, reverse, colourless }) -function Lazy({ visible, children }) { - const rendered = useRef(visible) - - if (visible && !rendered.current) { - rendered.current = true - } - - if (!rendered.current) return null - - return
    {children}
    -} - -Lazy.propTypes = { - visible: PropTypes.bool, - children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]), -} - const MailboxSettings = () => { const dispatch = useDispatch() let query = useQuery() @@ -128,24 +111,24 @@ const MailboxSettings = () => { - + - + - + - + - + - + - + - + @@ -531,8 +514,14 @@ const CalendarPermissions = () => { name: 'Publishing Editor', }, { value: 'Reviewer', name: 'Reviewer' }, - { value: 'LimitedDetails', name: 'Limited Details' }, - { value: 'AvailabilityOnly', name: 'Availability Only' }, + { + value: 'LimitedDetails', + name: 'Limited Details', + }, + { + value: 'AvailabilityOnly', + name: 'Availability Only', + }, ]} placeholder="Select a permission level" name="Permissions" From 0c04ed8c8fe35c842c385bfcdc40587d8234492a Mon Sep 17 00:00:00 2001 From: Kevin Grube Date: Mon, 11 Mar 2024 22:46:52 -0700 Subject: [PATCH 021/133] Bump version, update font awesome icons --- package-lock.json | 104 +++++++++++++++++++++++----------------------- package.json | 12 +++--- 2 files changed, 58 insertions(+), 58 deletions(-) diff --git a/package-lock.json b/package-lock.json index b5803ad11042..d2279b2b7eec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cipp", - "version": "4.5.5", + "version": "5.2.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cipp", - "version": "4.5.5", + "version": "5.2.1", "license": "AGPL-3.0", "dependencies": { "@coreui/chartjs": "^3.0.0", @@ -14,11 +14,11 @@ "@coreui/react": "^4.11.0", "@coreui/react-chartjs": "^2.1.3", "@coreui/utils": "^1.3.1", - "@fortawesome/fontawesome-svg-core": "^1.2.36", - "@fortawesome/free-brands-svg-icons": "^5.15.4", - "@fortawesome/free-regular-svg-icons": "^5.15.4", - "@fortawesome/free-solid-svg-icons": "^5.15.4", - "@fortawesome/react-fontawesome": "^0.1.16", + "@fortawesome/fontawesome-svg-core": "^6.5.1", + "@fortawesome/free-brands-svg-icons": "^6.5.1", + "@fortawesome/free-regular-svg-icons": "^6.5.1", + "@fortawesome/free-solid-svg-icons": "^6.5.1", + "@fortawesome/react-fontawesome": "^0.2.0", "@monaco-editor/react": "^4.5.2", "@popperjs/core": "^2.10.2", "@reduxjs/toolkit": "^1.9.7", @@ -1166,72 +1166,72 @@ "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "0.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", - "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz", + "integrity": "sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "1.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", - "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.1.tgz", + "integrity": "sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.5.1" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-brands-svg-icons": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.15.4.tgz", - "integrity": "sha512-f1witbwycL9cTENJegcmcZRYyawAFbm8+c6IirLmwbbpqz46wyjbQYLuxOc7weXFXfB7QR8/Vd2u5R3q6JYD9g==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.5.1.tgz", + "integrity": "sha512-093l7DAkx0aEtBq66Sf19MgoZewv1zeY9/4C7vSKPO4qMwEsW/2VYTUTpBtLwfb9T2R73tXaRDPmE4UqLCYHfg==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.5.1" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-regular-svg-icons": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.4.tgz", - "integrity": "sha512-9VNNnU3CXHy9XednJ3wzQp6SwNwT3XaM26oS4Rp391GsxVYA+0oDR2J194YCIWf7jNRCYKjUCOduxdceLrx+xw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.1.tgz", + "integrity": "sha512-m6ShXn+wvqEU69wSP84coxLbNl7sGVZb+Ca+XZq6k30SzuP3X4TfPqtycgUh9ASwlNh5OfQCd8pDIWxl+O+LlQ==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.5.1" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", - "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.1.tgz", + "integrity": "sha512-S1PPfU3mIJa59biTtXJz1oI0+KAXW6bkAb31XKhxdxtuXDiUIFsih4JR1v5BbxY7hVHsD1RKq+jRkVRaf773NQ==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.5.1" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/react-fontawesome": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", - "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", "dependencies": { "prop-types": "^15.8.1" }, "peerDependencies": { "@fortawesome/fontawesome-svg-core": "~1 || ~6", - "react": ">=16.x" + "react": ">=16.3" } }, "node_modules/@humanwhocodes/config-array": { @@ -9749,46 +9749,46 @@ "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", - "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==" + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz", + "integrity": "sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==" }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", - "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.1.tgz", + "integrity": "sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.5.1" } }, "@fortawesome/free-brands-svg-icons": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.15.4.tgz", - "integrity": "sha512-f1witbwycL9cTENJegcmcZRYyawAFbm8+c6IirLmwbbpqz46wyjbQYLuxOc7weXFXfB7QR8/Vd2u5R3q6JYD9g==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.5.1.tgz", + "integrity": "sha512-093l7DAkx0aEtBq66Sf19MgoZewv1zeY9/4C7vSKPO4qMwEsW/2VYTUTpBtLwfb9T2R73tXaRDPmE4UqLCYHfg==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.5.1" } }, "@fortawesome/free-regular-svg-icons": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.4.tgz", - "integrity": "sha512-9VNNnU3CXHy9XednJ3wzQp6SwNwT3XaM26oS4Rp391GsxVYA+0oDR2J194YCIWf7jNRCYKjUCOduxdceLrx+xw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.1.tgz", + "integrity": "sha512-m6ShXn+wvqEU69wSP84coxLbNl7sGVZb+Ca+XZq6k30SzuP3X4TfPqtycgUh9ASwlNh5OfQCd8pDIWxl+O+LlQ==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.5.1" } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", - "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.1.tgz", + "integrity": "sha512-S1PPfU3mIJa59biTtXJz1oI0+KAXW6bkAb31XKhxdxtuXDiUIFsih4JR1v5BbxY7hVHsD1RKq+jRkVRaf773NQ==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.5.1" } }, "@fortawesome/react-fontawesome": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", - "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", "requires": { "prop-types": "^15.8.1" } diff --git a/package.json b/package.json index bdff861cc3bf..176e2b10ec85 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cipp", - "version": "4.5.5", + "version": "5.2.1", "description": "The CyberDrain Improved Partner Portal is a portal to help manage administration for Microsoft Partners.", "homepage": "https://cipp.app/", "bugs": { @@ -31,11 +31,11 @@ "@coreui/react": "^4.11.0", "@coreui/react-chartjs": "^2.1.3", "@coreui/utils": "^1.3.1", - "@fortawesome/fontawesome-svg-core": "^1.2.36", - "@fortawesome/free-brands-svg-icons": "^5.15.4", - "@fortawesome/free-regular-svg-icons": "^5.15.4", - "@fortawesome/free-solid-svg-icons": "^5.15.4", - "@fortawesome/react-fontawesome": "^0.1.16", + "@fortawesome/fontawesome-svg-core": "^6.5.1", + "@fortawesome/free-brands-svg-icons": "^6.5.1", + "@fortawesome/free-regular-svg-icons": "^6.5.1", + "@fortawesome/free-solid-svg-icons": "^6.5.1", + "@fortawesome/react-fontawesome": "^0.2.0", "@monaco-editor/react": "^4.5.2", "@popperjs/core": "^2.10.2", "@reduxjs/toolkit": "^1.9.7", From 5d2f33e0e792ba4aa2b41943482f7b5c52ac6388 Mon Sep 17 00:00:00 2001 From: Kevin Grube Date: Mon, 11 Mar 2024 22:49:25 -0700 Subject: [PATCH 022/133] Unify all results notifications to use new component CippCallout which combines CCallout and CAlert but is dismissible. Fix issues with notification not appearing when running a second time. Fix issue with password config not working. --- src/components/layout/CippCallout.css | 28 +++ src/components/layout/CippCallout.jsx | 70 ++++++ src/components/layout/index.js | 2 + src/components/utilities/CippCallout.jsx | 47 ---- .../SettingsExtensionMappings.jsx | 70 +++--- .../cipp/app-settings/SettingsExtensions.jsx | 52 ++--- .../cipp/app-settings/SettingsGeneral.jsx | 7 +- .../cipp/app-settings/SettingsLicenses.jsx | 34 +-- .../app-settings/SettingsNotifications.jsx | 22 +- .../cipp/app-settings/SettingsTenants.jsx | 10 +- .../app-settings/components/SettingsDNS.jsx | 217 ------------------ .../components/SettingsDNSResolver.jsx | 50 ++++ .../components/SettingsGeneralRow.jsx | 178 ++++++++++++++ .../components/SettingsPassword.jsx | 36 +-- 14 files changed, 446 insertions(+), 377 deletions(-) create mode 100644 src/components/layout/CippCallout.css create mode 100644 src/components/layout/CippCallout.jsx delete mode 100644 src/components/utilities/CippCallout.jsx delete mode 100644 src/views/cipp/app-settings/components/SettingsDNS.jsx create mode 100644 src/views/cipp/app-settings/components/SettingsDNSResolver.jsx create mode 100644 src/views/cipp/app-settings/components/SettingsGeneralRow.jsx diff --git a/src/components/layout/CippCallout.css b/src/components/layout/CippCallout.css new file mode 100644 index 000000000000..f9b358d18f70 --- /dev/null +++ b/src/components/layout/CippCallout.css @@ -0,0 +1,28 @@ +.cipp-callout { + --cui-callout-padding-x: 1rem; + --cui-callout-padding-y: 1rem; + --cui-callout-border-width: var(--cui-border-width); + --cui-callout-border-color: var(--cui-border-color); + --cui-callout-border-left-width: calc(var(--cui-border-width) * 4); + --cui-callout-border-radius: var(--cui-border-radius); + border: var(--cui-callout-border-width) solid var(--cui-callout-border-color); + border-radius: var(--cui-callout-border-radius); + margin-bottom: 16px; + padding: var(--cui-callout-padding-y) var(--cui-callout-padding-x); +} + +html:not([dir=rtl]) .cipp-callout { + border-left-color: var(--cui-callout-border-left-color); +} + +html:not([dir=rtl]) .cipp-callout { + border-left-width: var(--cui-callout-border-left-width); +} + +html:not([dir=rtl]) .cipp-callout-dismissible .btn { + right: 0; +} + +.cipp-callout-dismissible .btn { + cursor: pointer; +} diff --git a/src/components/layout/CippCallout.jsx b/src/components/layout/CippCallout.jsx new file mode 100644 index 000000000000..f771c0c085bc --- /dev/null +++ b/src/components/layout/CippCallout.jsx @@ -0,0 +1,70 @@ +import React, { useState } from 'react' +import { CAlert, CCallout } from '@coreui/react' +import PropTypes from 'prop-types' +import './CippCallout.css' +import classNames from 'classnames' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { faXmark } from '@fortawesome/free-solid-svg-icons' + +export function CippCallout({ + dismissible = false, + color = 'primary', + children = null, + className = '', + style = {}, + ...rest +}) { + const [open, setOpen] = useState(true) + + if (!open) { + return null + } + + return ( +
    +
    {children}
    + {dismissible && ( + + )} +
    + ) +} + +CippCallout.propTypes = { + dismissible: PropTypes.bool, + color: PropTypes.oneOf([ + 'primary', + 'secondary', + 'success', + 'warning', + 'danger', + 'info', + 'light', + 'dark', + ]), + children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]), + className: PropTypes.string, + style: PropTypes.object, +} diff --git a/src/components/layout/index.js b/src/components/layout/index.js index 715c29a52e64..fd10309efc93 100644 --- a/src/components/layout/index.js +++ b/src/components/layout/index.js @@ -7,6 +7,7 @@ import CippContentCard from 'src/components/layout/CippContentCard' import { CippMasonry, CippMasonryItem } from 'src/components/layout/CippMasonry' import { CippPage, CippPageList } from 'src/components/layout/CippPage' import CippWizard from 'src/components/layout/CippWizard' +import { CippCallout } from 'src/components/layout/CippCallout.jsx' export { AppBreadcrumb, @@ -19,5 +20,6 @@ export { CippMasonryItem, CippPage, CippPageList, + CippCallout, CippWizard, } diff --git a/src/components/utilities/CippCallout.jsx b/src/components/utilities/CippCallout.jsx deleted file mode 100644 index 341725151cfb..000000000000 --- a/src/components/utilities/CippCallout.jsx +++ /dev/null @@ -1,47 +0,0 @@ -import React, { useState } from 'react' -import { CAlert } from '@coreui/react' -import PropTypes from 'prop-types' -import classNames from 'classnames' - -export function CippCallout({ - children, - color = 'primary', - borderColor = 'primary', - dismissible = false, - ...rest -}) { - const [open, setOpen] = useState(true) - - const handleDismiss = () => setOpen(false) - - return open ? ( -
    - {children} - {dismissible && ( -
    - ) : null -} - -CippCallout.propTypes = { - children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]), - color: PropTypes.string, - borderColor: PropTypes.string, - dismissible: PropTypes.bool, -} - -export default CippCallout diff --git a/src/views/cipp/app-settings/SettingsExtensionMappings.jsx b/src/views/cipp/app-settings/SettingsExtensionMappings.jsx index aefa536ac876..5386afbf1fbd 100644 --- a/src/views/cipp/app-settings/SettingsExtensionMappings.jsx +++ b/src/views/cipp/app-settings/SettingsExtensionMappings.jsx @@ -16,6 +16,7 @@ import { RFFSelectSearch } from 'src/components/forms/index.js' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' import React from 'react' +import { CippCallout } from 'src/components/layout/index.js' /** * Retrieves and sets the extension mappings for HaloPSA and NinjaOne. @@ -108,15 +109,18 @@ export function SettingsExtensionMappings() { Set Mappings {(extensionHaloConfigResult.isSuccess || - extensionHaloConfigResult.isError) && ( - - {extensionHaloConfigResult.isSuccess - ? extensionHaloConfigResult.data.Results - : 'Error'} - - )} + extensionHaloConfigResult.isError) && + !extensionHaloConfigResult.isFetching && ( + + {extensionHaloConfigResult.isSuccess + ? extensionHaloConfigResult.data.Results + : 'Error'} + + )} ) @@ -186,17 +190,20 @@ export function SettingsExtensionMappings() { Set Mappings {(extensionNinjaFieldsConfigResult.isSuccess || - extensionNinjaFieldsConfigResult.isError) && ( - - {extensionNinjaFieldsConfigResult.isSuccess - ? extensionNinjaFieldsConfigResult.data.Results - : 'Error'} - - )} + extensionNinjaFieldsConfigResult.isError) && + !extensionNinjaFieldsConfigResult.isFetching && ( + + {extensionNinjaFieldsConfigResult.isSuccess + ? extensionNinjaFieldsConfigResult.data.Results + : 'Error'} + + )} ) @@ -246,15 +253,20 @@ export function SettingsExtensionMappings() { Automap NinjaOne Organizations {(extensionNinjaOrgsConfigResult.isSuccess || - extensionNinjaOrgsConfigResult.isError) && ( - - {extensionNinjaOrgsConfigResult.isSuccess - ? extensionNinjaOrgsConfigResult.data.Results - : 'Error'} - - )} + extensionNinjaOrgsConfigResult.isError) && + !extensionNinjaFieldsConfigResult.isFetching && ( + + {extensionNinjaOrgsConfigResult.isSuccess + ? extensionNinjaOrgsConfigResult.data.Results + : 'Error'} + + )} {(extensionNinjaOrgsAutomapResult.isSuccess || extensionNinjaOrgsAutomapResult.isError) && ( - + + )} - {listSyncExtensionResult.isSuccess && ( - - - Results - - - - {listSyncExtensionResult.data.Results} - - - + {listSyncExtensionResult.isSuccess && !listSyncExtensionResult.isFetching && ( + + {listSyncExtensionResult.data.Results} + )} - {listExtensionTestResult.isSuccess && ( - - - Results - - - - {listExtensionTestResult.data.Results} - - - + {listExtensionTestResult.isSuccess && !listExtensionTestResult.isFetching && ( + + {listExtensionTestResult.data.Results} + )} - {extensionConfigResult.isSuccess && ( - - - Results - - - - {extensionConfigResult.data.Results} - - - + {extensionConfigResult.isSuccess && !extensionConfigResult.isFetching && ( + + {extensionConfigResult.data.Results} + )} {Extensions.map((integration, idx) => ( diff --git a/src/views/cipp/app-settings/SettingsGeneral.jsx b/src/views/cipp/app-settings/SettingsGeneral.jsx index 1e3f82677585..887758f30abb 100644 --- a/src/views/cipp/app-settings/SettingsGeneral.jsx +++ b/src/views/cipp/app-settings/SettingsGeneral.jsx @@ -27,10 +27,10 @@ import CippListOffcanvas from 'src/components/utilities/CippListOffcanvas.jsx' import { TableModalButton } from 'src/components/buttons/index.js' import { CippTable } from 'src/components/tables/index.js' import { TenantSelectorMultiple } from 'src/components/utilities/index.js' -import { SettingsDNS } from 'src/views/cipp/app-settings/components/SettingsDNS.jsx' +import { SettingsGeneralRow } from 'src/views/cipp/app-settings/components/SettingsGeneralRow.jsx' /** - * SettingsGeneral method. + * SettingsGeneral component. * This method is responsible for managing general settings. * @returns {JSX.Element} */ @@ -215,7 +215,6 @@ export function SettingsGeneral() { pagination: false, actions: [ { console.log(e) @@ -230,7 +229,7 @@ export function SettingsGeneral() {
    - + diff --git a/src/views/cipp/app-settings/SettingsLicenses.jsx b/src/views/cipp/app-settings/SettingsLicenses.jsx index b1e7e49fa919..dd9695b6ca6c 100644 --- a/src/views/cipp/app-settings/SettingsLicenses.jsx +++ b/src/views/cipp/app-settings/SettingsLicenses.jsx @@ -7,7 +7,7 @@ import { TitleButton } from 'src/components/buttons/index.js' import { CButton, CCallout, CSpinner } from '@coreui/react' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faTrash } from '@fortawesome/free-solid-svg-icons' -import { CippPageList } from 'src/components/layout/index.js' +import { CippCallout, CippPageList } from 'src/components/layout/index.js' /** * SettingsLicenses component is used to manage excluded licenses in a settings page. @@ -47,14 +47,14 @@ export function SettingsLicenses() { } const titleButton = - const [ExecuteGetRequest, getResults] = useLazyGenericGetRequestQuery() + const [executeGetRequest, getResults] = useLazyGenericGetRequestQuery() const Offcanvas = (row, rowIndex, formatExtraData) => { const handleDeleteIntuneTemplate = (apiurl, message) => { ModalService.confirm({ title: 'Confirm', body:
    {message}
    , - onConfirm: () => ExecuteGetRequest({ path: apiurl }), + onConfirm: () => executeGetRequest({ path: apiurl }), confirmLabel: 'Continue', cancelLabel: 'Cancel', }) @@ -102,22 +102,30 @@ export function SettingsLicenses() { <> {setExclusionResults.isFetching || (getResults.isFetching && ( - + Loading - + ))} - {setExclusionResults.isSuccess && ( - {setExclusionResults.data?.Results} + {setExclusionResults.isSuccess && !setExclusionResults.isFetching && ( + + {setExclusionResults.data?.Results} + )} - {setExclusionResults.isError && ( - + {setExclusionResults.isError && !setExclusionResults.isFetching && ( + Could not connect to API: {setExclusionResults.error.message} - + )} - {getResults.isError && ( - Could not connect to API: {getResults.error.message} + {getResults.isError && !getResults.isFetching && ( + + Could not connect to API: {getResults.error.message} + + )} + {getResults.isSuccess && !getResults.isFetching && ( + + {getResults.data?.Results} + )} - {getResults.isSuccess && {getResults.data?.Results}} { configNotifications(values) } @@ -36,7 +38,7 @@ export function SettingsNotifications() { )} {!notificationListResult.isFetching && notificationListResult.error && ( - Error loading data + Error loading data )} {notificationListResult.isSuccess && ( @@ -62,17 +64,19 @@ export function SettingsNotifications() { return ( {notificationConfigResult.isFetching && ( - + Loading - + )} - {notificationConfigResult.isSuccess && ( - {notificationConfigResult.data?.Results} + {notificationConfigResult.isSuccess && !notificationConfigResult.isFetching && ( + + {notificationConfigResult.data?.Results} + )} - {notificationConfigResult.isError && ( - + {notificationConfigResult.isError && !notificationConfigResult.isFetching && ( + Could not connect to API: {notificationConfigResult.error.message} - + )} diff --git a/src/views/cipp/app-settings/SettingsTenants.jsx b/src/views/cipp/app-settings/SettingsTenants.jsx index 14850a7182d9..c425f3c1ae97 100644 --- a/src/views/cipp/app-settings/SettingsTenants.jsx +++ b/src/views/cipp/app-settings/SettingsTenants.jsx @@ -17,14 +17,13 @@ import { faRecycle, } from '@fortawesome/free-solid-svg-icons' import { cellBooleanFormatter, CellTip } from 'src/components/tables/index.js' -import { CippPageList } from 'src/components/layout/index.js' -import CippCallout from 'src/components/utilities/CippCallout.jsx' +import { CippCallout, CippPageList } from 'src/components/layout/index.js' /** * The SettingsTenants method is used to manage the tenants in the application. It allows the user to add or * remove exclusions, refresh permissions for a tenant, and view the list of excluded tenants. * - * @return {ReactElement} The rendered component for managing the excluded tenants. + * @return {JSXElement} The rendered component for managing the excluded tenants. */ export function SettingsTenants() { const dispatch = useDispatch() @@ -203,13 +202,14 @@ export function SettingsTenants() { )} - {removeExcludeTenantResult.isSuccess && ( + {removeExcludeTenantResult.isSuccess && !removeExcludeTenantResult.isFetching && ( {removeExcludeTenantResult.data?.Results} )} {refreshPermissionsResults.isSuccess && refreshPermissionsResults.data?.Results && + !refreshPermissionsResults.isFetching && Array.isArray(refreshPermissionsResults.data.Results) ? ( {refreshPermissionsResults.data.Results.map((result, idx) => ( @@ -217,7 +217,7 @@ export function SettingsTenants() { ))} ) : null} - {addExcludeTenantResult.isSuccess && ( + {addExcludeTenantResult.isSuccess && !addExcludeTenantResult.isFetching && ( {addExcludeTenantResult.data?.Results} diff --git a/src/views/cipp/app-settings/components/SettingsDNS.jsx b/src/views/cipp/app-settings/components/SettingsDNS.jsx deleted file mode 100644 index 5a76aa119cad..000000000000 --- a/src/views/cipp/app-settings/components/SettingsDNS.jsx +++ /dev/null @@ -1,217 +0,0 @@ -import { - useLazyExecClearCacheQuery, - useLazyGenericGetRequestQuery, - useLazyGenericPostRequestQuery, - useLoadVersionsQuery, -} from 'src/store/api/app.js' -import { useLazyEditDnsConfigQuery, useLazyGetDnsConfigQuery } from 'src/store/api/domains.js' -import React, { useRef, useState } from 'react' -import useConfirmModal from 'src/hooks/useConfirmModal.jsx' -import { - CButton, - CButtonGroup, - CCallout, - CCard, - CCardBody, - CCardHeader, - CCol, - CRow, -} from '@coreui/react' -import { StatusIcon } from 'src/components/utilities/index.js' -import Skeleton from 'react-loading-skeleton' -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' -import { SettingsPassword } from 'src/views/cipp/app-settings/components/SettingsPassword.jsx' - -/** - * Fetches and maintains DNS configuration settings for the application. - * - * @return {JSX.Element | void} The settings DNS component or nothing if data not ready. - */ -export function SettingsDNS() { - const [runBackup, RunBackupResult] = useLazyGenericGetRequestQuery() - const [restoreBackup, restoreBackupResult] = useLazyGenericPostRequestQuery() - const [getDnsConfig, getDnsConfigResult] = useLazyGetDnsConfigQuery() - const [editDnsConfig, editDnsConfigResult] = useLazyEditDnsConfigQuery() - const inputRef = useRef(null) - const [clearCache, clearCacheResult] = useLazyExecClearCacheQuery() - const { data: versions, isSuccess: isSuccessVersion } = useLoadVersionsQuery() - - const [alertVisible, setAlertVisible] = useState(false) - const downloadTxtFile = (data) => { - const txtdata = [JSON.stringify(RunBackupResult.data.backup)] - const file = new Blob(txtdata, { type: 'text/plain' }) - const element = document.createElement('a') - element.href = URL.createObjectURL(file) - element.download = 'CIPP-Backup' + Date.now() + '.json' - document.body.appendChild(element) - element.click() - } - const handleChange = (e) => { - const fileReader = new FileReader() - fileReader.readAsText(e.target.files[0], 'UTF-8') - fileReader.onload = (e) => { - restoreBackup({ path: '/api/ExecRestoreBackup', values: e.target.result }) - } - } - const switchResolver = (resolver) => { - editDnsConfig({ resolver }) - getDnsConfig() - setAlertVisible(true) - setTimeout(() => { - setAlertVisible(false) - }, 2000) - } - const handleClearCache = useConfirmModal({ - body:
    Are you sure you want to clear the cache?
    , - onConfirm: () => { - clearCache({ tenantsOnly: false }) - localStorage.clear() - }, - }) - - const handleClearCacheTenant = useConfirmModal({ - body:
    Are you sure you want to clear the cache?
    , - onConfirm: () => { - clearCache({ tenantsOnly: true }) - }, - }) - const resolvers = ['Google', 'Cloudflare', 'Quad9'] - - return ( - <> - {getDnsConfigResult.isUninitialized && getDnsConfig()} - {getDnsConfigResult.isSuccess && ( - - - - - - - - -

    DNS Resolver

    - - {resolvers.map((r, index) => ( - switchResolver(r)} - color={r === getDnsConfigResult.data.Resolver ? 'primary' : 'secondary'} - key={index} - > - {r} - - ))} - - {(editDnsConfigResult.isSuccess || editDnsConfigResult.isError) && ( - - {editDnsConfigResult.isSuccess - ? editDnsConfigResult.data.Results - : 'Error setting resolver'} - - )} -
    - -

    Frontend Version

    - -
    Latest: {isSuccessVersion ? versions.RemoteCIPPVersion : }
    -
    - Current: {isSuccessVersion ? versions.LocalCIPPVersion : } -
    -
    - -

    Clear Caches

    - handleClearCache()} - disabled={clearCacheResult.isFetching} - > - {clearCacheResult.isFetching && ( - - )} - Clear All Cache - - handleClearCacheTenant()} - disabled={clearCacheResult.isFetching} - > - {clearCacheResult.isFetching && ( - - )} - Clear Tenant Cache - - {clearCacheResult.isSuccess && ( -
    {clearCacheResult.data?.Results}
    - )} -
    - -

    Settings Backup

    - runBackup({ path: '/api/ExecRunBackup' })} - disabled={RunBackupResult.isFetching} - > - {RunBackupResult.isFetching && ( - - )} - Run backup - - handleChange(e)} - /> - inputRef.current.click()} - disabled={restoreBackupResult.isFetching} - > - {restoreBackupResult.isFetching && ( - - )} - Restore backup - - {restoreBackupResult.isSuccess && ( - <> - {restoreBackupResult.data.Results} - - )} - {RunBackupResult.isSuccess && ( - <> - - downloadTxtFile(RunBackupResult.data.backup)}> - Download Backup - - - - )} -
    - -

    Backend API Version

    - -
    Latest: {isSuccessVersion ? versions.RemoteCIPPAPIVersion : }
    -
    - Current: {isSuccessVersion ? versions.LocalCIPPAPIVersion : } -
    -
    -
    -
    -
    - )} - - ) -} diff --git a/src/views/cipp/app-settings/components/SettingsDNSResolver.jsx b/src/views/cipp/app-settings/components/SettingsDNSResolver.jsx new file mode 100644 index 000000000000..a656578a185a --- /dev/null +++ b/src/views/cipp/app-settings/components/SettingsDNSResolver.jsx @@ -0,0 +1,50 @@ +import { CAlert, CButton, CButtonGroup } from '@coreui/react' +import React, { useState } from 'react' +import { useLazyEditDnsConfigQuery, useLazyGetDnsConfigQuery } from 'src/store/api/domains.js' +import { CippCallout } from 'src/components/layout/index.js' + +/** + * Sets the DNS resolver based on user selection. + * + * @return {JSX.Element} - The component that renders the DNS resolver settings. + */ +export function SettingsDNSResolver() { + const resolvers = ['Google', 'Cloudflare', 'Quad9'] + const [getDnsConfig, getDnsConfigResult] = useLazyGetDnsConfigQuery() + const [editDnsConfig, editDnsConfigResult] = useLazyEditDnsConfigQuery() + + const switchResolver = async (resolver) => { + await editDnsConfig({ resolver }) + await getDnsConfig() + } + + return ( + <> + {getDnsConfigResult.isUninitialized && getDnsConfig()} + {getDnsConfigResult.isSuccess && ( + <> +

    DNS Resolver

    + + {resolvers.map((resolver, index) => ( + switchResolver(resolver)} + color={resolver === getDnsConfigResult.data.Resolver ? 'primary' : 'secondary'} + key={index} + > + {resolver} + + ))} + + {(editDnsConfigResult.isSuccess || editDnsConfigResult.isError) && + !editDnsConfigResult.isFetching && ( + + {editDnsConfigResult.isSuccess + ? editDnsConfigResult.data.Results + : 'Error setting resolver'} + + )} + + )} + + ) +} diff --git a/src/views/cipp/app-settings/components/SettingsGeneralRow.jsx b/src/views/cipp/app-settings/components/SettingsGeneralRow.jsx new file mode 100644 index 000000000000..5e1f01f91e39 --- /dev/null +++ b/src/views/cipp/app-settings/components/SettingsGeneralRow.jsx @@ -0,0 +1,178 @@ +import { + useLazyExecClearCacheQuery, + useLazyGenericGetRequestQuery, + useLazyGenericPostRequestQuery, + useLoadVersionsQuery, +} from 'src/store/api/app.js' +import React, { useRef } from 'react' +import useConfirmModal from 'src/hooks/useConfirmModal.jsx' +import { CButton, CCard, CCardBody, CCardHeader, CCol, CRow } from '@coreui/react' +import { StatusIcon } from 'src/components/utilities/index.js' +import { CippCallout } from 'src/components/layout/index.js' +import Skeleton from 'react-loading-skeleton' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' +import { SettingsPassword } from 'src/views/cipp/app-settings/components/SettingsPassword.jsx' +import { SettingsDNSResolver } from 'src/views/cipp/app-settings/components/SettingsDNSResolver.jsx' + +/** + * Fetches and maintains DNS configuration settings for the application. + * + * @return {JSX.Element | void} The settings DNS component or nothing if data not ready. + */ +export function SettingsGeneralRow() { + const [runBackup, RunBackupResult] = useLazyGenericGetRequestQuery() + const [restoreBackup, restoreBackupResult] = useLazyGenericPostRequestQuery() + + const inputRef = useRef(null) + const [clearCache, clearCacheResult] = useLazyExecClearCacheQuery() + const { data: versions, isSuccess: isSuccessVersion } = useLoadVersionsQuery() + + const downloadTxtFile = (data) => { + const txtdata = [JSON.stringify(RunBackupResult.data.backup)] + const file = new Blob(txtdata, { type: 'text/plain' }) + const element = document.createElement('a') + element.href = URL.createObjectURL(file) + element.download = 'CIPP-Backup' + Date.now() + '.json' + document.body.appendChild(element) + element.click() + } + const handleChange = (e) => { + const fileReader = new FileReader() + fileReader.readAsText(e.target.files[0], 'UTF-8') + fileReader.onload = (e) => { + restoreBackup({ path: '/api/ExecRestoreBackup', values: e.target.result }) + } + } + + const handleClearCache = useConfirmModal({ + body:
    Are you sure you want to clear the cache?
    , + onConfirm: () => { + clearCache({ tenantsOnly: false }) + localStorage.clear() + }, + }) + + const handleClearCacheTenant = useConfirmModal({ + body:
    Are you sure you want to clear the cache?
    , + onConfirm: () => { + clearCache({ tenantsOnly: true }) + }, + }) + + return ( + <> + + + + + + + + + + + +

    Frontend Version

    + +
    Latest: {isSuccessVersion ? versions.RemoteCIPPVersion : }
    +
    + Current: {isSuccessVersion ? versions.LocalCIPPVersion : } +
    +
    + +

    Clear Caches

    + handleClearCache()} + disabled={clearCacheResult.isFetching} + > + {clearCacheResult.isFetching && ( + + )} + Clear All Cache + + handleClearCacheTenant()} + disabled={clearCacheResult.isFetching} + > + {clearCacheResult.isFetching && ( + + )} + Clear Tenant Cache + + {clearCacheResult.isSuccess && !clearCacheResult.isFetching && ( + + {clearCacheResult.data?.Results} + + )} +
    + +

    Settings Backup

    + runBackup({ path: '/api/ExecRunBackup' })} + disabled={RunBackupResult.isFetching} + > + {RunBackupResult.isFetching && ( + + )} + Run backup + + handleChange(e)} + /> + inputRef.current.click()} + disabled={restoreBackupResult.isFetching} + > + {restoreBackupResult.isFetching && ( + + )} + Restore backup + + {restoreBackupResult.isSuccess && !restoreBackupResult.isFetching && ( + + {restoreBackupResult.data.Results} + + )} + {RunBackupResult.isSuccess && !restoreBackupResult.isFetching && ( + + downloadTxtFile(RunBackupResult.data.backup)}> + Download Backup + + + )} +
    + +

    Backend API Version

    + +
    Latest: {isSuccessVersion ? versions.RemoteCIPPAPIVersion : }
    +
    + Current: {isSuccessVersion ? versions.LocalCIPPAPIVersion : } +
    +
    +
    +
    +
    + + ) +} diff --git a/src/views/cipp/app-settings/components/SettingsPassword.jsx b/src/views/cipp/app-settings/components/SettingsPassword.jsx index 958fcdd0aa32..aa8ed046d2b5 100644 --- a/src/views/cipp/app-settings/components/SettingsPassword.jsx +++ b/src/views/cipp/app-settings/components/SettingsPassword.jsx @@ -1,6 +1,7 @@ import { useLazyGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app.js' import React, { useState } from 'react' import { CButton, CButtonGroup, CCallout } from '@coreui/react' +import { CippCallout } from 'src/components/layout/index.js' /** * This method is responsible for handling password settings in the application. @@ -17,18 +18,18 @@ import { CButton, CButtonGroup, CCallout } from '@coreui/react' * The resolver that matches the current password configuration is highlighted with a primary color button. * By clicking on a resolver button, the switchResolver function is called to update the password configuration and show the password alert. * - * @returns {React.Element} The rendered password settings component with the password style section and password alert section. + * @returns {JSXElement} The rendered password settings component with the password style section and password alert section. */ export function SettingsPassword() { const [getPasswordConfig, getPasswordConfigResult] = useLazyGenericGetRequestQuery() const [editPasswordConfig, editPasswordConfigResult] = useLazyGenericPostRequestQuery() - const [passAlertVisible, setPassAlertVisible] = useState(false) - - const switchResolver = (resolver) => { - editPasswordConfig({ path: '/api/ExecPasswordconfig', values: { passwordType: resolver } }) - getPasswordConfig() - setPassAlertVisible(true) + const switchResolver = async (resolver) => { + await editPasswordConfig({ + path: '/api/ExecPasswordConfig', + values: { passwordType: resolver }, + }) + await getPasswordConfig({ path: '/api/ExecPasswordConfig', params: { list: true } }) } const resolvers = ['Classic', 'Correct-Battery-Horse'] @@ -51,16 +52,17 @@ export function SettingsPassword() { ))} - {(editPasswordConfigResult.isSuccess || editPasswordConfigResult.isError) && ( - - {editPasswordConfigResult.isSuccess - ? editPasswordConfigResult.data.Results - : 'Error setting password style'} - - )} + {(editPasswordConfigResult.isSuccess || editPasswordConfigResult.isError) && + !editPasswordConfigResult.isFetching && ( + + {editPasswordConfigResult.isSuccess + ? editPasswordConfigResult.data.Results + : 'Error setting password style'} + + )} ) } From b60e58100987be70d6a3c164c4f0254e092010d6 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Tue, 12 Mar 2024 12:32:35 +0100 Subject: [PATCH 023/133] add saving of user settings --- package-lock.json | 2638 +++++++++-------- src/store/features/app.js | 8 +- src/views/cipp/UserSettings.jsx | 64 +- .../administration/OffboardingWizard.jsx | 4 +- .../TenantOffboardingWizard.jsx | 4 +- 5 files changed, 1443 insertions(+), 1275 deletions(-) diff --git a/package-lock.json b/package-lock.json index d2279b2b7eec..8f8302ab3d25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -110,12 +110,12 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -142,20 +142,20 @@ } }, "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -271,9 +271,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "engines": { "node": ">=6.9.0" } @@ -325,13 +325,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -351,9 +351,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -406,9 +406,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", - "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -417,22 +417,22 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", @@ -440,8 +440,8 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -450,9 +450,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -590,9 +590,9 @@ "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" }, "node_modules/@emotion/is-prop-valid": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", - "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", "dependencies": { "@emotion/memoize": "^0.8.1" } @@ -603,9 +603,9 @@ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/react": { - "version": "11.11.3", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.3.tgz", - "integrity": "sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==", + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", @@ -671,9 +671,9 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", - "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", "cpu": [ "ppc64" ], @@ -687,9 +687,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", - "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", "cpu": [ "arm" ], @@ -703,9 +703,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", - "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", "cpu": [ "arm64" ], @@ -719,9 +719,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", - "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", "cpu": [ "x64" ], @@ -735,9 +735,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", - "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", "cpu": [ "arm64" ], @@ -751,9 +751,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", - "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", "cpu": [ "x64" ], @@ -767,9 +767,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", - "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", "cpu": [ "arm64" ], @@ -783,9 +783,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", - "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", "cpu": [ "x64" ], @@ -799,9 +799,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", - "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", "cpu": [ "arm" ], @@ -815,9 +815,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", - "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", "cpu": [ "arm64" ], @@ -831,9 +831,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", - "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", "cpu": [ "ia32" ], @@ -847,9 +847,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", - "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", "cpu": [ "loong64" ], @@ -863,9 +863,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", - "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", "cpu": [ "mips64el" ], @@ -879,9 +879,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", - "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", "cpu": [ "ppc64" ], @@ -895,9 +895,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", - "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", "cpu": [ "riscv64" ], @@ -911,9 +911,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", - "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", "cpu": [ "s390x" ], @@ -927,9 +927,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", - "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", "cpu": [ "x64" ], @@ -943,9 +943,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", - "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", "cpu": [ "x64" ], @@ -959,9 +959,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", - "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", "cpu": [ "x64" ], @@ -975,9 +975,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", - "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", "cpu": [ "x64" ], @@ -991,9 +991,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", - "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", "cpu": [ "arm64" ], @@ -1007,9 +1007,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", - "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", "cpu": [ "ia32" ], @@ -1023,9 +1023,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", - "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", "cpu": [ "x64" ], @@ -1135,28 +1135,28 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@floating-ui/core": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.3.tgz", - "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", "dependencies": { - "@floating-ui/utils": "^0.2.0" + "@floating-ui/utils": "^0.2.1" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.4.tgz", - "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", "dependencies": { - "@floating-ui/core": "^1.5.3", + "@floating-ui/core": "^1.0.0", "@floating-ui/utils": "^0.2.0" } }, @@ -1268,42 +1268,42 @@ "dev": true }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "peer": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { @@ -1312,9 +1312,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1433,9 +1433,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.2.tgz", - "integrity": "sha512-ACXpdMM9hmKZww21yEqWwiLws/UPLhNKvimN8RrYSqPSvB3ov7sLvAcfvaxePeLvccTQKGdkDIhLYApZVDFuKg==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", + "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", "engines": { "node": ">=14.0.0" } @@ -1449,9 +1449,9 @@ } }, "node_modules/@restart/hooks": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.15.tgz", - "integrity": "sha512-cZFXYTxbpzYcieq/mBwSyXgqnGMHoBVh3J7MU0CCoIB4NRZxV9/TuwTBAaLMqpNhC3zTPMCgkQ5Ey07L02Xmcw==", + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", + "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", "dependencies": { "dequal": "^2.0.3" }, @@ -1460,9 +1460,9 @@ } }, "node_modules/@rjsf/bootstrap-4": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/@rjsf/bootstrap-4/-/bootstrap-4-5.16.1.tgz", - "integrity": "sha512-YskiNpIAYJD9Ahr3piJHeg/9ElqOOe4Bef9t+QnEPvIlfU54JJ/wA7PmuS4KvxhKwB+aNQr5LUmWiQ7Xiy9+tA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@rjsf/bootstrap-4/-/bootstrap-4-5.17.1.tgz", + "integrity": "sha512-23NZ5qB0eYmJRY1UgI66mTAp4lyGXSgduyr7UX35fsBFy91CzP/FozL1P/muRcEslRqBJhDgrWbMdw99eLSO1w==", "dependencies": { "@react-icons/all-files": "^4.1.0" }, @@ -1477,13 +1477,13 @@ } }, "node_modules/@rjsf/core": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/@rjsf/core/-/core-5.16.1.tgz", - "integrity": "sha512-zIqm5aJ0CfpqsJXcJvIEoYZMfPa6hLqKSeOwwifuHSjznC6fbXPdmqnifBCPVy0GgMaDDWekZLfndk5W3ZO1YA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@rjsf/core/-/core-5.17.1.tgz", + "integrity": "sha512-COZSuumwHskWN8Pz3RxdxvuQUP6M/qBMXAkIi+TSWLFLaF6SUugpLiceMT1jGemDCr7fOSTiPxjkToSsgpvueQ==", "dependencies": { "lodash": "^4.17.21", "lodash-es": "^4.17.21", - "markdown-to-jsx": "^7.4.0", + "markdown-to-jsx": "^7.4.1", "nanoid": "^3.3.7", "prop-types": "^15.8.1" }, @@ -1496,9 +1496,9 @@ } }, "node_modules/@rjsf/utils": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/@rjsf/utils/-/utils-5.16.1.tgz", - "integrity": "sha512-zJ8WopscMl46QBjlIalIoPERs7kgSfUwIZ5zx4OMBRp0O+m7Scx0F+4iHqLnRuHEfaCNA5D7IKxmx1whOG/x1Q==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@rjsf/utils/-/utils-5.17.1.tgz", + "integrity": "sha512-q1Igz/cuM2hi+jiXFkoaXqdRTUFB+a0jfVKNmZlHmvPmfYeeJfcfyOTzO8dQ41fHNHUFb15ryxa/TblDQimwkA==", "dependencies": { "json-schema-merge-allof": "^0.8.1", "jsonpointer": "^5.0.1", @@ -1514,9 +1514,9 @@ } }, "node_modules/@rjsf/validator-ajv8": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/@rjsf/validator-ajv8/-/validator-ajv8-5.16.1.tgz", - "integrity": "sha512-4aYZU5+7q/9eFVzaUFTjsfVwlM0ku/BmHse9a1F87skiVRV6pv30z3B3fEUJ7zZMOGFwviYF60Tb3mr2KQ5GSg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@rjsf/validator-ajv8/-/validator-ajv8-5.17.1.tgz", + "integrity": "sha512-KdvHsjDQ60b04fqnoqhfkiCv7E4n4NIHli8QU8dtpuUAVS/TOqDuOtDJVz6bv/rd/QNROGpxlO/OCccE0rmxLQ==", "dependencies": { "ajv": "^8.12.0", "ajv-formats": "^2.1.1", @@ -1544,9 +1544,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.5.tgz", - "integrity": "sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", + "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==", "cpu": [ "arm" ], @@ -1557,9 +1557,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.5.tgz", - "integrity": "sha512-f14d7uhAMtsCGjAYwZGv6TwuS3IFaM4ZnGMUn3aCBgkcHAYErhV1Ad97WzBvS2o0aaDv4mVz+syiN0ElMyfBPg==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz", + "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==", "cpu": [ "arm64" ], @@ -1570,9 +1570,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.5.tgz", - "integrity": "sha512-ndoXeLx455FffL68OIUrVr89Xu1WLzAG4n65R8roDlCoYiQcGGg6MALvs2Ap9zs7AHg8mpHtMpwC8jBBjZrT/w==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz", + "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==", "cpu": [ "arm64" ], @@ -1583,9 +1583,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.5.tgz", - "integrity": "sha512-UmElV1OY2m/1KEEqTlIjieKfVwRg0Zwg4PLgNf0s3glAHXBN99KLpw5A5lrSYCa1Kp63czTpVll2MAqbZYIHoA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz", + "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==", "cpu": [ "x64" ], @@ -1596,9 +1596,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.5.tgz", - "integrity": "sha512-Q0LcU61v92tQB6ae+udZvOyZ0wfpGojtAKrrpAaIqmJ7+psq4cMIhT/9lfV6UQIpeItnq/2QDROhNLo00lOD1g==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz", + "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==", "cpu": [ "arm" ], @@ -1609,9 +1609,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.5.tgz", - "integrity": "sha512-dkRscpM+RrR2Ee3eOQmRWFjmV/payHEOrjyq1VZegRUa5OrZJ2MAxBNs05bZuY0YCtpqETDy1Ix4i/hRqX98cA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz", + "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==", "cpu": [ "arm64" ], @@ -1622,9 +1622,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.5.tgz", - "integrity": "sha512-QaKFVOzzST2xzY4MAmiDmURagWLFh+zZtttuEnuNn19AiZ0T3fhPyjPPGwLNdiDT82ZE91hnfJsUiDwF9DClIQ==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz", + "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==", "cpu": [ "arm64" ], @@ -1635,9 +1635,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.5.tgz", - "integrity": "sha512-HeGqmRJuyVg6/X6MpE2ur7GbymBPS8Np0S/vQFHDmocfORT+Zt76qu+69NUoxXzGqVP1pzaY6QIi0FJWLC3OPA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz", + "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==", "cpu": [ "riscv64" ], @@ -1648,9 +1648,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz", - "integrity": "sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz", + "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==", "cpu": [ "x64" ], @@ -1661,9 +1661,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.5.tgz", - "integrity": "sha512-ezyFUOwldYpj7AbkwyW9AJ203peub81CaAIVvckdkyH8EvhEIoKzaMFJj0G4qYJ5sw3BpqhFrsCc30t54HV8vg==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz", + "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==", "cpu": [ "x64" ], @@ -1674,9 +1674,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.5.tgz", - "integrity": "sha512-aHSsMnUw+0UETB0Hlv7B/ZHOGY5bQdwMKJSzGfDfvyhnpmVxLMGnQPGNE9wgqkLUs3+gbG1Qx02S2LLfJ5GaRQ==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz", + "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==", "cpu": [ "arm64" ], @@ -1687,9 +1687,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.5.tgz", - "integrity": "sha512-AiqiLkb9KSf7Lj/o1U3SEP9Zn+5NuVKgFdRIZkvd4N0+bYrTOovVd0+LmYCPQGbocT4kvFyK+LXCDiXPBF3fyA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz", + "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==", "cpu": [ "ia32" ], @@ -1700,9 +1700,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.5.tgz", - "integrity": "sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz", + "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==", "cpu": [ "x64" ], @@ -1754,9 +1754,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", - "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", + "version": "8.56.5", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", + "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -1778,9 +1778,9 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/hast": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.9.tgz", - "integrity": "sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==", + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", "dependencies": { "@types/unist": "^2" } @@ -1817,9 +1817,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", - "integrity": "sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==", + "version": "20.11.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.26.tgz", + "integrity": "sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==", "dependencies": { "undici-types": "~5.26.4" } @@ -1855,9 +1855,9 @@ "optional": true }, "node_modules/@types/react": { - "version": "18.2.48", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz", - "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", + "version": "18.2.65", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.65.tgz", + "integrity": "sha512-98TsY0aW4jqx/3RqsUXwMDZSWR1Z4CUlJNue8ueS2/wcxZOsz4xmW1X8ieaWVRHcmmQM3R8xVA4XWB3dJnWwDQ==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2196,12 +2196,15 @@ "dev": true }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2253,17 +2256,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.findlast": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", + "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2307,30 +2329,43 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.tosorted": { + "node_modules/array.prototype.toreversed": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "es-shim-unscopables": "^1.0.0" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -2408,9 +2443,12 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -2419,9 +2457,9 @@ } }, "node_modules/axios": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", - "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", "dependencies": { "follow-redirects": "^1.15.4", "form-data": "^4.0.0", @@ -2533,9 +2571,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "funding": [ { "type": "opencollective", @@ -2551,8 +2589,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -2616,13 +2654,18 @@ "peer": true }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2676,9 +2719,9 @@ "integrity": "sha512-ceOhN1DL7Y4O6M0j9ICgmTYziV89WMd96SvSl0REd8PMgrY0B/WBOPoed5S1KUmJqXgUXh8gzSe6E3ae27upsQ==" }, "node_modules/caniuse-lite": { - "version": "1.0.30001579", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz", - "integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==", + "version": "1.0.30001597", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", + "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", "funding": [ { "type": "opencollective", @@ -2801,16 +2844,10 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -2823,6 +2860,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -2942,9 +2982,9 @@ } }, "node_modules/core-js": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.0.tgz", - "integrity": "sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.0.tgz", + "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -3147,16 +3187,19 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -3292,9 +3335,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.640", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.640.tgz", - "integrity": "sha512-z/6oZ/Muqk4BaE7P69bXhUhpJbUM9ZJeka43ZwxsDshKtePns4mhBlh8bU5+yrnOnz3fhG82XLzGUXazOmsWnA==" + "version": "1.4.701", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.701.tgz", + "integrity": "sha512-K3WPQ36bUOtXg/1+69bFlFOvdSm0/0bGqmsfPDLRXLanoKXdA+pIWuf/VbA9b+2CwBFuONgl4NEz4OEm+OJOKA==" }, "node_modules/element-resize-detector": { "version": "1.2.4", @@ -3311,9 +3354,9 @@ "dev": true }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", "peer": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -3367,11 +3410,11 @@ } }, "node_modules/enzyme-shallow-equal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.5.tgz", - "integrity": "sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.7.tgz", + "integrity": "sha512-/um0GFqUXnpM9SvKtje+9Tjoz3f1fpBC3eXRFrNs8kpYn69JljciYP7KZTqM/YQbUY9KUjvKB4jo/q+L6WGGvg==", "dependencies": { - "has": "^1.0.3", + "hasown": "^2.0.0", "object-is": "^1.1.5" }, "funding": { @@ -3387,49 +3430,51 @@ } }, "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", + "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.8", "string.prototype.trimend": "^1.0.7", "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -3443,26 +3488,49 @@ "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", + "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", "dev": true, "dependencies": { "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", + "es-abstract": "^1.22.4", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", + "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", + "internal-slot": "^1.0.7", "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" + "safe-array-concat": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-module-lexer": { @@ -3472,13 +3540,13 @@ "peer": true }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -3509,9 +3577,9 @@ } }, "node_modules/esbuild": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", - "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", "dev": true, "hasInstallScript": true, "bin": { @@ -3521,35 +3589,35 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.11", - "@esbuild/android-arm": "0.19.11", - "@esbuild/android-arm64": "0.19.11", - "@esbuild/android-x64": "0.19.11", - "@esbuild/darwin-arm64": "0.19.11", - "@esbuild/darwin-x64": "0.19.11", - "@esbuild/freebsd-arm64": "0.19.11", - "@esbuild/freebsd-x64": "0.19.11", - "@esbuild/linux-arm": "0.19.11", - "@esbuild/linux-arm64": "0.19.11", - "@esbuild/linux-ia32": "0.19.11", - "@esbuild/linux-loong64": "0.19.11", - "@esbuild/linux-mips64el": "0.19.11", - "@esbuild/linux-ppc64": "0.19.11", - "@esbuild/linux-riscv64": "0.19.11", - "@esbuild/linux-s390x": "0.19.11", - "@esbuild/linux-x64": "0.19.11", - "@esbuild/netbsd-x64": "0.19.11", - "@esbuild/openbsd-x64": "0.19.11", - "@esbuild/sunos-x64": "0.19.11", - "@esbuild/win32-arm64": "0.19.11", - "@esbuild/win32-ia32": "0.19.11", - "@esbuild/win32-x64": "0.19.11" + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -3563,16 +3631,16 @@ } }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -3663,9 +3731,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -3762,27 +3830,29 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "version": "7.34.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz", + "integrity": "sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", + "es-iterator-helpers": "^1.0.17", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", + "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" + "string.prototype.matchall": "^4.0.10" }, "engines": { "node": ">=4" @@ -4137,9 +4207,9 @@ } }, "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -4253,9 +4323,9 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/follow-redirects": { @@ -4381,15 +4451,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4400,12 +4474,13 @@ "integrity": "sha512-lXNzT/h/dTjTxRbm9BXb+SGxxzkm97h/PCIKtlN/CBCxxmkkIVV21udumMS93MuVTDX583gqc94v3RjuHmI+2Q==" }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -4616,20 +4691,20 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { "node": ">= 0.4" }, @@ -4649,11 +4724,11 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -4663,9 +4738,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -4855,9 +4930,9 @@ ] }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -4881,9 +4956,9 @@ } }, "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", "dev": true }, "node_modules/import-fresh": { @@ -4951,11 +5026,11 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -4994,13 +5069,15 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5176,18 +5253,21 @@ } }, "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "engines": { "node": ">= 0.4" }, @@ -5261,20 +5341,26 @@ } }, "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5314,11 +5400,11 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -5328,10 +5414,13 @@ } }, "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5348,13 +5437,16 @@ } }, "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5544,9 +5636,9 @@ } }, "node_modules/jspdf-autotable": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-3.8.1.tgz", - "integrity": "sha512-UjJqo80Z3/WUzDi4JipTGp0pAvNvR3Gsm38inJ5ZnwsJH0Lw4pEbssRSH6zMWAhR1ZkTrsDpQo5p6rZk987/AQ==", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-3.8.2.tgz", + "integrity": "sha512-zW1ix99/mtR4MbIni7IqvrpfHmuTaICl6iv6wqjRN86Nxtwaw/QtOeDbpXqYSzHIJK9JvgtLM283sc5x+ipkJg==", "peerDependencies": { "jspdf": "^2.5.1" } @@ -5729,9 +5821,9 @@ } }, "node_modules/markdown-to-jsx": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.0.tgz", - "integrity": "sha512-zilc+MIkVVXPyTb4iIUTIz9yyqfcWjszGXnwF9K/aiBWcHXFcmdEMTkG01/oQhwSCH7SY1BnG6+ev5BzWmbPrg==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.1.tgz", + "integrity": "sha512-GbrbkTnHp9u6+HqbPRFJbObi369AgJNXi/sGqq5HRsoZW063xR1XDCaConqq+whfEIAlzB1YPnOgsPc7B7bc/A==", "engines": { "node": ">= 10" }, @@ -5889,9 +5981,9 @@ } }, "node_modules/monaco-editor": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.45.0.tgz", - "integrity": "sha512-mjv1G1ZzfEE3k9HZN0dQ2olMdwIfaeAAjFiwNprLfYNRSz7ctv9XuCT7gPtBGrMUeV1/iZzYKj17Khu1hxoHOA==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.47.0.tgz", + "integrity": "sha512-VabVvHvQ9QmMwXu4du008ZDuyLnHs9j7ThVFsiJoXSOQk18+LF89N4ADzPbFenm0W4V2bGHnFBztIRQTgBfxzw==", "peer": true }, "node_modules/moo": { @@ -6011,9 +6103,9 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -6068,12 +6160,12 @@ } }, "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -6138,15 +6230,16 @@ } }, "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" } }, "node_modules/object.hasown": { @@ -6399,10 +6492,18 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "funding": [ { "type": "opencollective", @@ -6895,9 +6996,9 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "node_modules/react-loading-skeleton": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.3.1.tgz", - "integrity": "sha512-NilqqwMh2v9omN7LteiDloEVpFyMIa0VGqF+ukqp0ncVlYu1sKYbYGX9JEl+GtOT9TKsh04zCHAbavnQ2USldA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.4.0.tgz", + "integrity": "sha512-1oJEBc9+wn7BbkQQk7YodlYEIjgeR+GrRjD+QXkVjwZN7LGIcAFHrx4NhT7UHGBxNY1+zax3c+Fo6XQM4R7CgA==", "peerDependencies": { "react": ">=16.8.0" } @@ -7024,11 +7125,11 @@ } }, "node_modules/react-router": { - "version": "6.21.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.3.tgz", - "integrity": "sha512-a0H638ZXULv1OdkmiK6s6itNhoy33ywxmUFT/xtSoVyf9VnC7n7+VT4LjVzdIHSaF5TIh9ylUgxMXksHTgGrKg==", + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", + "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", "dependencies": { - "@remix-run/router": "1.14.2" + "@remix-run/router": "1.15.3" }, "engines": { "node": ">=14.0.0" @@ -7038,12 +7139,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.21.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.3.tgz", - "integrity": "sha512-kNzubk7n4YHSrErzjLK72j0B5i969GsuCGazRl3G6j1zqZBLjuSlYBdVdkDOgzGdPIffUOc9nmgiadTEVoq91g==", + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", + "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", "dependencies": { - "@remix-run/router": "1.14.2", - "react-router": "6.21.3" + "@remix-run/router": "1.15.3", + "react-router": "6.22.3" }, "engines": { "node": ">=14.0.0" @@ -7111,9 +7212,9 @@ } }, "node_modules/react-time-ago": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/react-time-ago/-/react-time-ago-7.2.1.tgz", - "integrity": "sha512-X5zwJDZHa1fsMwMvh8mrHN31g85s84zMCp+d7YL6IX50kNnr6YMAS2wpt1BmO9OxBV2Ue5J1ptD6JI8Zjd35HA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/react-time-ago/-/react-time-ago-7.3.1.tgz", + "integrity": "sha512-c6QKSRrnIhZiEbOa2PXdh1InNYpqX3wwXA0fuOFX4r/C2hdt5hNvjvKXbKbGWXAeumMi9DoS3oGPboEpgccnOQ==", "dependencies": { "memoize-one": "^6.0.0", "prop-types": "^15.8.1", @@ -7329,15 +7430,16 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -7376,13 +7478,14 @@ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -7476,9 +7579,9 @@ } }, "node_modules/rollup": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.5.tgz", - "integrity": "sha512-E4vQW0H/mbNMw2yLSqJyjtkHY9dslf/p0zuT1xehNRqUTBOFMqEjguDvqhXr7N7r/4ttb2jr4T41d3dncmIgbQ==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz", + "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -7491,19 +7594,19 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.5", - "@rollup/rollup-android-arm64": "4.9.5", - "@rollup/rollup-darwin-arm64": "4.9.5", - "@rollup/rollup-darwin-x64": "4.9.5", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.5", - "@rollup/rollup-linux-arm64-gnu": "4.9.5", - "@rollup/rollup-linux-arm64-musl": "4.9.5", - "@rollup/rollup-linux-riscv64-gnu": "4.9.5", - "@rollup/rollup-linux-x64-gnu": "4.9.5", - "@rollup/rollup-linux-x64-musl": "4.9.5", - "@rollup/rollup-win32-arm64-msvc": "4.9.5", - "@rollup/rollup-win32-ia32-msvc": "4.9.5", - "@rollup/rollup-win32-x64-msvc": "4.9.5", + "@rollup/rollup-android-arm-eabi": "4.13.0", + "@rollup/rollup-android-arm64": "4.13.0", + "@rollup/rollup-darwin-arm64": "4.13.0", + "@rollup/rollup-darwin-x64": "4.13.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.0", + "@rollup/rollup-linux-arm64-gnu": "4.13.0", + "@rollup/rollup-linux-arm64-musl": "4.13.0", + "@rollup/rollup-linux-riscv64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-musl": "4.13.0", + "@rollup/rollup-win32-arm64-msvc": "4.13.0", + "@rollup/rollup-win32-ia32-msvc": "4.13.0", + "@rollup/rollup-win32-x64-msvc": "4.13.0", "fsevents": "~2.3.2" } }, @@ -7540,12 +7643,12 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -7577,12 +7680,12 @@ "peer": true }, "node_modules/safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, "engines": { @@ -7598,9 +7701,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.70.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz", - "integrity": "sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==", + "version": "1.71.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz", + "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -7689,28 +7792,30 @@ } }, "node_modules/set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dependencies": { - "define-data-property": "^1.1.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7743,13 +7848,17 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7912,9 +8021,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true }, "node_modules/spdx-expression-parse": { @@ -7928,15 +8037,15 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", "dev": true }, "node_modules/stackblur-canvas": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.6.0.tgz", - "integrity": "sha512-8S1aIA+UoF6erJYnglGPug6MaHYGo1Ot7h5fuXx4fUPvcvQfcdw2o/ppCse63+eZf8PPidSu4v1JnmEVtEDnpg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz", + "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==", "optional": true, "engines": { "node": ">=0.1.14" @@ -8327,9 +8436,9 @@ } }, "node_modules/terser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", - "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "version": "5.29.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", + "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -8488,27 +8597,28 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -8518,15 +8628,16 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -8536,13 +8647,19 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8707,13 +8824,13 @@ "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==" }, "node_modules/vite": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", - "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz", + "integrity": "sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==", "dev": true, "dependencies": { "esbuild": "^0.19.3", - "postcss": "^8.4.32", + "postcss": "^8.4.35", "rollup": "^4.2.0" }, "bin": { @@ -8819,19 +8936,19 @@ "dev": true }, "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.90.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", + "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", + "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.11.5", "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", @@ -8845,7 +8962,7 @@ "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", + "terser-webpack-plugin": "^5.3.10", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -8968,30 +9085,33 @@ } }, "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9076,12 +9196,12 @@ "dev": true }, "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, "@babel/code-frame": { @@ -9099,20 +9219,20 @@ "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==" }, "@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -9194,9 +9314,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==" }, "@babel/helper-simple-access": { "version": "7.22.5", @@ -9230,13 +9350,13 @@ "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==" }, "@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", "requires": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" } }, "@babel/highlight": { @@ -9250,9 +9370,9 @@ } }, "@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==" + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==" }, "@babel/plugin-syntax-jsx": { "version": "7.23.3", @@ -9281,27 +9401,27 @@ } }, "@babel/runtime": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", - "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", "requires": { "regenerator-runtime": "^0.14.0" } }, "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" } }, "@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", "requires": { "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", @@ -9309,16 +9429,16 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "requires": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -9422,9 +9542,9 @@ "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" }, "@emotion/is-prop-valid": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", - "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", "requires": { "@emotion/memoize": "^0.8.1" } @@ -9435,9 +9555,9 @@ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "@emotion/react": { - "version": "11.11.3", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.3.tgz", - "integrity": "sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==", + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", "requires": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", @@ -9493,163 +9613,163 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "@esbuild/aix-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", - "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", "dev": true, "optional": true }, "@esbuild/android-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", - "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", - "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", - "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", - "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", - "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", - "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", - "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", - "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", - "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", - "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", - "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", - "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", - "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", - "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", - "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", - "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", - "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", - "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", - "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", - "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", - "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", - "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", "dev": true, "optional": true }, @@ -9721,25 +9841,25 @@ } }, "@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true }, "@floating-ui/core": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.3.tgz", - "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", "requires": { - "@floating-ui/utils": "^0.2.0" + "@floating-ui/utils": "^0.2.1" } }, "@floating-ui/dom": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.4.tgz", - "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", "requires": { - "@floating-ui/core": "^1.5.3", + "@floating-ui/core": "^1.0.0", "@floating-ui/utils": "^0.2.0" } }, @@ -9817,33 +9937,33 @@ "dev": true }, "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "requires": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" }, "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" }, "@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "peer": true, "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "@jridgewell/sourcemap-codec": { @@ -9852,9 +9972,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "requires": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -9940,9 +10060,9 @@ } }, "@remix-run/router": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.2.tgz", - "integrity": "sha512-ACXpdMM9hmKZww21yEqWwiLws/UPLhNKvimN8RrYSqPSvB3ov7sLvAcfvaxePeLvccTQKGdkDIhLYApZVDFuKg==" + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", + "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==" }, "@restart/context": { "version": "2.1.4", @@ -9951,37 +10071,37 @@ "requires": {} }, "@restart/hooks": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.15.tgz", - "integrity": "sha512-cZFXYTxbpzYcieq/mBwSyXgqnGMHoBVh3J7MU0CCoIB4NRZxV9/TuwTBAaLMqpNhC3zTPMCgkQ5Ey07L02Xmcw==", + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", + "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", "requires": { "dequal": "^2.0.3" } }, "@rjsf/bootstrap-4": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/@rjsf/bootstrap-4/-/bootstrap-4-5.16.1.tgz", - "integrity": "sha512-YskiNpIAYJD9Ahr3piJHeg/9ElqOOe4Bef9t+QnEPvIlfU54JJ/wA7PmuS4KvxhKwB+aNQr5LUmWiQ7Xiy9+tA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@rjsf/bootstrap-4/-/bootstrap-4-5.17.1.tgz", + "integrity": "sha512-23NZ5qB0eYmJRY1UgI66mTAp4lyGXSgduyr7UX35fsBFy91CzP/FozL1P/muRcEslRqBJhDgrWbMdw99eLSO1w==", "requires": { "@react-icons/all-files": "^4.1.0" } }, "@rjsf/core": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/@rjsf/core/-/core-5.16.1.tgz", - "integrity": "sha512-zIqm5aJ0CfpqsJXcJvIEoYZMfPa6hLqKSeOwwifuHSjznC6fbXPdmqnifBCPVy0GgMaDDWekZLfndk5W3ZO1YA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@rjsf/core/-/core-5.17.1.tgz", + "integrity": "sha512-COZSuumwHskWN8Pz3RxdxvuQUP6M/qBMXAkIi+TSWLFLaF6SUugpLiceMT1jGemDCr7fOSTiPxjkToSsgpvueQ==", "requires": { "lodash": "^4.17.21", "lodash-es": "^4.17.21", - "markdown-to-jsx": "^7.4.0", + "markdown-to-jsx": "^7.4.1", "nanoid": "^3.3.7", "prop-types": "^15.8.1" } }, "@rjsf/utils": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/@rjsf/utils/-/utils-5.16.1.tgz", - "integrity": "sha512-zJ8WopscMl46QBjlIalIoPERs7kgSfUwIZ5zx4OMBRp0O+m7Scx0F+4iHqLnRuHEfaCNA5D7IKxmx1whOG/x1Q==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@rjsf/utils/-/utils-5.17.1.tgz", + "integrity": "sha512-q1Igz/cuM2hi+jiXFkoaXqdRTUFB+a0jfVKNmZlHmvPmfYeeJfcfyOTzO8dQ41fHNHUFb15ryxa/TblDQimwkA==", "requires": { "json-schema-merge-allof": "^0.8.1", "jsonpointer": "^5.0.1", @@ -9991,9 +10111,9 @@ } }, "@rjsf/validator-ajv8": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/@rjsf/validator-ajv8/-/validator-ajv8-5.16.1.tgz", - "integrity": "sha512-4aYZU5+7q/9eFVzaUFTjsfVwlM0ku/BmHse9a1F87skiVRV6pv30z3B3fEUJ7zZMOGFwviYF60Tb3mr2KQ5GSg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@rjsf/validator-ajv8/-/validator-ajv8-5.17.1.tgz", + "integrity": "sha512-KdvHsjDQ60b04fqnoqhfkiCv7E4n4NIHli8QU8dtpuUAVS/TOqDuOtDJVz6bv/rd/QNROGpxlO/OCccE0rmxLQ==", "requires": { "ajv": "^8.12.0", "ajv-formats": "^2.1.1", @@ -10012,93 +10132,93 @@ } }, "@rollup/rollup-android-arm-eabi": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.5.tgz", - "integrity": "sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", + "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==", "dev": true, "optional": true }, "@rollup/rollup-android-arm64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.5.tgz", - "integrity": "sha512-f14d7uhAMtsCGjAYwZGv6TwuS3IFaM4ZnGMUn3aCBgkcHAYErhV1Ad97WzBvS2o0aaDv4mVz+syiN0ElMyfBPg==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz", + "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==", "dev": true, "optional": true }, "@rollup/rollup-darwin-arm64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.5.tgz", - "integrity": "sha512-ndoXeLx455FffL68OIUrVr89Xu1WLzAG4n65R8roDlCoYiQcGGg6MALvs2Ap9zs7AHg8mpHtMpwC8jBBjZrT/w==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz", + "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==", "dev": true, "optional": true }, "@rollup/rollup-darwin-x64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.5.tgz", - "integrity": "sha512-UmElV1OY2m/1KEEqTlIjieKfVwRg0Zwg4PLgNf0s3glAHXBN99KLpw5A5lrSYCa1Kp63czTpVll2MAqbZYIHoA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz", + "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.5.tgz", - "integrity": "sha512-Q0LcU61v92tQB6ae+udZvOyZ0wfpGojtAKrrpAaIqmJ7+psq4cMIhT/9lfV6UQIpeItnq/2QDROhNLo00lOD1g==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz", + "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.5.tgz", - "integrity": "sha512-dkRscpM+RrR2Ee3eOQmRWFjmV/payHEOrjyq1VZegRUa5OrZJ2MAxBNs05bZuY0YCtpqETDy1Ix4i/hRqX98cA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz", + "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-musl": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.5.tgz", - "integrity": "sha512-QaKFVOzzST2xzY4MAmiDmURagWLFh+zZtttuEnuNn19AiZ0T3fhPyjPPGwLNdiDT82ZE91hnfJsUiDwF9DClIQ==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz", + "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==", "dev": true, "optional": true }, "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.5.tgz", - "integrity": "sha512-HeGqmRJuyVg6/X6MpE2ur7GbymBPS8Np0S/vQFHDmocfORT+Zt76qu+69NUoxXzGqVP1pzaY6QIi0FJWLC3OPA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz", + "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==", "dev": true, "optional": true }, "@rollup/rollup-linux-x64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz", - "integrity": "sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz", + "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==", "dev": true, "optional": true }, "@rollup/rollup-linux-x64-musl": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.5.tgz", - "integrity": "sha512-ezyFUOwldYpj7AbkwyW9AJ203peub81CaAIVvckdkyH8EvhEIoKzaMFJj0G4qYJ5sw3BpqhFrsCc30t54HV8vg==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz", + "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==", "dev": true, "optional": true }, "@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.5.tgz", - "integrity": "sha512-aHSsMnUw+0UETB0Hlv7B/ZHOGY5bQdwMKJSzGfDfvyhnpmVxLMGnQPGNE9wgqkLUs3+gbG1Qx02S2LLfJ5GaRQ==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz", + "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==", "dev": true, "optional": true }, "@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.5.tgz", - "integrity": "sha512-AiqiLkb9KSf7Lj/o1U3SEP9Zn+5NuVKgFdRIZkvd4N0+bYrTOovVd0+LmYCPQGbocT4kvFyK+LXCDiXPBF3fyA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz", + "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==", "dev": true, "optional": true }, "@rollup/rollup-win32-x64-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.5.tgz", - "integrity": "sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz", + "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==", "dev": true, "optional": true }, @@ -10144,9 +10264,9 @@ } }, "@types/eslint": { - "version": "8.56.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", - "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", + "version": "8.56.5", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", + "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", "requires": { "@types/estree": "*", "@types/json-schema": "*" @@ -10168,9 +10288,9 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "@types/hast": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.9.tgz", - "integrity": "sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==", + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", "requires": { "@types/unist": "^2" } @@ -10207,9 +10327,9 @@ "dev": true }, "@types/node": { - "version": "20.11.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", - "integrity": "sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==", + "version": "20.11.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.26.tgz", + "integrity": "sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==", "requires": { "undici-types": "~5.26.4" } @@ -10245,9 +10365,9 @@ "optional": true }, "@types/react": { - "version": "18.2.48", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz", - "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", + "version": "18.2.65", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.65.tgz", + "integrity": "sha512-98TsY0aW4jqx/3RqsUXwMDZSWR1Z4CUlJNue8ueS2/wcxZOsz4xmW1X8ieaWVRHcmmQM3R8xVA4XWB3dJnWwDQ==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -10548,12 +10668,12 @@ "dev": true }, "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" } }, "array-includes": { @@ -10587,17 +10707,30 @@ "is-string": "^1.0.7" } }, + "array.prototype.findlast": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", + "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + } + }, "array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" } }, "array.prototype.flat": { @@ -10623,30 +10756,43 @@ "es-shim-unscopables": "^1.0.0" } }, - "array.prototype.tosorted": { + "array.prototype.toreversed": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" } }, "arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" } }, @@ -10700,14 +10846,17 @@ } }, "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "requires": { + "possible-typed-array-names": "^1.0.0" + } }, "axios": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", - "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", "requires": { "follow-redirects": "^1.15.4", "form-data": "^4.0.0", @@ -10789,12 +10938,12 @@ } }, "browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "requires": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" } @@ -10829,13 +10978,15 @@ "peer": true }, "call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "callsites": { @@ -10871,9 +11022,9 @@ "integrity": "sha512-ceOhN1DL7Y4O6M0j9ICgmTYziV89WMd96SvSl0REd8PMgrY0B/WBOPoed5S1KUmJqXgUXh8gzSe6E3ae27upsQ==" }, "caniuse-lite": { - "version": "1.0.30001579", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz", - "integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==" + "version": "1.0.30001597", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", + "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==" }, "canvg": { "version": "3.0.10", @@ -10957,9 +11108,9 @@ } }, "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "requires": { "anymatch": "~3.1.2", @@ -11073,9 +11224,9 @@ } }, "core-js": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.0.tgz", - "integrity": "sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==" + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.0.tgz", + "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==" }, "cosmiconfig": { "version": "7.1.0", @@ -11218,13 +11369,13 @@ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" }, "define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "requires": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" } }, "define-properties": { @@ -11324,9 +11475,9 @@ } }, "electron-to-chromium": { - "version": "1.4.640", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.640.tgz", - "integrity": "sha512-z/6oZ/Muqk4BaE7P69bXhUhpJbUM9ZJeka43ZwxsDshKtePns4mhBlh8bU5+yrnOnz3fhG82XLzGUXazOmsWnA==" + "version": "1.4.701", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.701.tgz", + "integrity": "sha512-K3WPQ36bUOtXg/1+69bFlFOvdSm0/0bGqmsfPDLRXLanoKXdA+pIWuf/VbA9b+2CwBFuONgl4NEz4OEm+OJOKA==" }, "element-resize-detector": { "version": "1.2.4", @@ -11343,9 +11494,9 @@ "dev": true }, "enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", "peer": true, "requires": { "graceful-fs": "^4.2.4", @@ -11387,11 +11538,11 @@ } }, "enzyme-shallow-equal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.5.tgz", - "integrity": "sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.7.tgz", + "integrity": "sha512-/um0GFqUXnpM9SvKtje+9Tjoz3f1fpBC3eXRFrNs8kpYn69JljciYP7KZTqM/YQbUY9KUjvKB4jo/q+L6WGGvg==", "requires": { - "has": "^1.0.3", + "hasown": "^2.0.0", "object-is": "^1.1.5" } }, @@ -11404,49 +11555,51 @@ } }, "es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "requires": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", + "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.8", "string.prototype.trimend": "^1.0.7", "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.14" } }, "es-array-method-boxes-properly": { @@ -11454,26 +11607,40 @@ "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, "es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", + "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", "dev": true, "requires": { "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", + "es-abstract": "^1.22.4", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", + "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", + "internal-slot": "^1.0.7", "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" + "safe-array-concat": "^1.1.0" } }, "es-module-lexer": { @@ -11483,13 +11650,13 @@ "peer": true }, "es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "requires": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" } }, "es-shim-unscopables": { @@ -11511,40 +11678,40 @@ } }, "esbuild": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", - "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", - "dev": true, - "requires": { - "@esbuild/aix-ppc64": "0.19.11", - "@esbuild/android-arm": "0.19.11", - "@esbuild/android-arm64": "0.19.11", - "@esbuild/android-x64": "0.19.11", - "@esbuild/darwin-arm64": "0.19.11", - "@esbuild/darwin-x64": "0.19.11", - "@esbuild/freebsd-arm64": "0.19.11", - "@esbuild/freebsd-x64": "0.19.11", - "@esbuild/linux-arm": "0.19.11", - "@esbuild/linux-arm64": "0.19.11", - "@esbuild/linux-ia32": "0.19.11", - "@esbuild/linux-loong64": "0.19.11", - "@esbuild/linux-mips64el": "0.19.11", - "@esbuild/linux-ppc64": "0.19.11", - "@esbuild/linux-riscv64": "0.19.11", - "@esbuild/linux-s390x": "0.19.11", - "@esbuild/linux-x64": "0.19.11", - "@esbuild/netbsd-x64": "0.19.11", - "@esbuild/openbsd-x64": "0.19.11", - "@esbuild/sunos-x64": "0.19.11", - "@esbuild/win32-arm64": "0.19.11", - "@esbuild/win32-ia32": "0.19.11", - "@esbuild/win32-x64": "0.19.11" + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" } }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==" }, "escape-string-regexp": { "version": "1.0.5", @@ -11552,16 +11719,16 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -11727,9 +11894,9 @@ } }, "eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "requires": { "debug": "^3.2.7" @@ -11801,27 +11968,29 @@ } }, "eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "version": "7.34.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz", + "integrity": "sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==", "dev": true, "requires": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", + "es-iterator-helpers": "^1.0.17", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", + "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" + "string.prototype.matchall": "^4.0.10" }, "dependencies": { "doctrine": { @@ -11985,9 +12154,9 @@ "dev": true }, "fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -12073,9 +12242,9 @@ } }, "flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "follow-redirects": { @@ -12156,10 +12325,11 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "requires": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", @@ -12172,12 +12342,13 @@ "integrity": "sha512-lXNzT/h/dTjTxRbm9BXb+SGxxzkm97h/PCIKtlN/CBCxxmkkIVV21udumMS93MuVTDX583gqc94v3RjuHmI+2Q==" }, "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" } }, "glob": { @@ -12328,17 +12499,17 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "requires": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" } }, "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" }, "has-symbols": { "version": "1.0.3", @@ -12346,17 +12517,17 @@ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" } }, "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "requires": { "function-bind": "^1.1.2" } @@ -12485,9 +12656,9 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true }, "imagesloaded": { @@ -12504,9 +12675,9 @@ "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" }, "immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", "dev": true }, "import-fresh": { @@ -12559,11 +12730,11 @@ "dev": true }, "internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "requires": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" } @@ -12591,13 +12762,12 @@ } }, "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "requires": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" } }, "is-arrayish": { @@ -12711,15 +12881,15 @@ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" }, "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true }, "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==" }, "is-number": { "version": "7.0.0", @@ -12763,17 +12933,17 @@ } }, "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true }, "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "requires": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" } }, "is-string": { @@ -12798,17 +12968,17 @@ } }, "is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "requires": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" } }, "is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true }, "is-weakref": { @@ -12820,13 +12990,13 @@ } }, "is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" } }, "isarray": { @@ -12980,9 +13150,9 @@ } }, "jspdf-autotable": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-3.8.1.tgz", - "integrity": "sha512-UjJqo80Z3/WUzDi4JipTGp0pAvNvR3Gsm38inJ5ZnwsJH0Lw4pEbssRSH6zMWAhR1ZkTrsDpQo5p6rZk987/AQ==", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-3.8.2.tgz", + "integrity": "sha512-zW1ix99/mtR4MbIni7IqvrpfHmuTaICl6iv6wqjRN86Nxtwaw/QtOeDbpXqYSzHIJK9JvgtLM283sc5x+ipkJg==", "requires": {} }, "jsx-ast-utils": { @@ -13132,9 +13302,9 @@ "dev": true }, "markdown-to-jsx": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.0.tgz", - "integrity": "sha512-zilc+MIkVVXPyTb4iIUTIz9yyqfcWjszGXnwF9K/aiBWcHXFcmdEMTkG01/oQhwSCH7SY1BnG6+ev5BzWmbPrg==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.1.tgz", + "integrity": "sha512-GbrbkTnHp9u6+HqbPRFJbObi369AgJNXi/sGqq5HRsoZW063xR1XDCaConqq+whfEIAlzB1YPnOgsPc7B7bc/A==", "requires": {} }, "masonry-layout": { @@ -13250,9 +13420,9 @@ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" }, "monaco-editor": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.45.0.tgz", - "integrity": "sha512-mjv1G1ZzfEE3k9HZN0dQ2olMdwIfaeAAjFiwNprLfYNRSz7ctv9XuCT7gPtBGrMUeV1/iZzYKj17Khu1hxoHOA==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.47.0.tgz", + "integrity": "sha512-VabVvHvQ9QmMwXu4du008ZDuyLnHs9j7ThVFsiJoXSOQk18+LF89N4ADzPbFenm0W4V2bGHnFBztIRQTgBfxzw==", "peer": true }, "moo": { @@ -13335,9 +13505,9 @@ } }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -13376,12 +13546,12 @@ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" }, "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" } }, "object-keys": { @@ -13422,15 +13592,16 @@ } }, "object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" } }, "object.hasown": { @@ -13613,10 +13784,15 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==" + }, "postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "requires": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", @@ -13957,9 +14133,9 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "react-loading-skeleton": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.3.1.tgz", - "integrity": "sha512-NilqqwMh2v9omN7LteiDloEVpFyMIa0VGqF+ukqp0ncVlYu1sKYbYGX9JEl+GtOT9TKsh04zCHAbavnQ2USldA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.4.0.tgz", + "integrity": "sha512-1oJEBc9+wn7BbkQQk7YodlYEIjgeR+GrRjD+QXkVjwZN7LGIcAFHrx4NhT7UHGBxNY1+zax3c+Fo6XQM4R7CgA==", "requires": {} }, "react-masonry-component": { @@ -14047,20 +14223,20 @@ "dev": true }, "react-router": { - "version": "6.21.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.3.tgz", - "integrity": "sha512-a0H638ZXULv1OdkmiK6s6itNhoy33ywxmUFT/xtSoVyf9VnC7n7+VT4LjVzdIHSaF5TIh9ylUgxMXksHTgGrKg==", + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", + "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", "requires": { - "@remix-run/router": "1.14.2" + "@remix-run/router": "1.15.3" } }, "react-router-dom": { - "version": "6.21.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.3.tgz", - "integrity": "sha512-kNzubk7n4YHSrErzjLK72j0B5i969GsuCGazRl3G6j1zqZBLjuSlYBdVdkDOgzGdPIffUOc9nmgiadTEVoq91g==", + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", + "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", "requires": { - "@remix-run/router": "1.14.2", - "react-router": "6.21.3" + "@remix-run/router": "1.15.3", + "react-router": "6.22.3" } }, "react-select": { @@ -14108,9 +14284,9 @@ } }, "react-time-ago": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/react-time-ago/-/react-time-ago-7.2.1.tgz", - "integrity": "sha512-X5zwJDZHa1fsMwMvh8mrHN31g85s84zMCp+d7YL6IX50kNnr6YMAS2wpt1BmO9OxBV2Ue5J1ptD6JI8Zjd35HA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/react-time-ago/-/react-time-ago-7.3.1.tgz", + "integrity": "sha512-c6QKSRrnIhZiEbOa2PXdh1InNYpqX3wwXA0fuOFX4r/C2hdt5hNvjvKXbKbGWXAeumMi9DoS3oGPboEpgccnOQ==", "requires": { "memoize-one": "^6.0.0", "prop-types": "^15.8.1", @@ -14278,15 +14454,16 @@ "requires": {} }, "reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" } @@ -14314,13 +14491,14 @@ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" } }, "relative-time-format": { @@ -14380,24 +14558,24 @@ } }, "rollup": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.5.tgz", - "integrity": "sha512-E4vQW0H/mbNMw2yLSqJyjtkHY9dslf/p0zuT1xehNRqUTBOFMqEjguDvqhXr7N7r/4ttb2jr4T41d3dncmIgbQ==", - "dev": true, - "requires": { - "@rollup/rollup-android-arm-eabi": "4.9.5", - "@rollup/rollup-android-arm64": "4.9.5", - "@rollup/rollup-darwin-arm64": "4.9.5", - "@rollup/rollup-darwin-x64": "4.9.5", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.5", - "@rollup/rollup-linux-arm64-gnu": "4.9.5", - "@rollup/rollup-linux-arm64-musl": "4.9.5", - "@rollup/rollup-linux-riscv64-gnu": "4.9.5", - "@rollup/rollup-linux-x64-gnu": "4.9.5", - "@rollup/rollup-linux-x64-musl": "4.9.5", - "@rollup/rollup-win32-arm64-msvc": "4.9.5", - "@rollup/rollup-win32-ia32-msvc": "4.9.5", - "@rollup/rollup-win32-x64-msvc": "4.9.5", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz", + "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.13.0", + "@rollup/rollup-android-arm64": "4.13.0", + "@rollup/rollup-darwin-arm64": "4.13.0", + "@rollup/rollup-darwin-x64": "4.13.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.0", + "@rollup/rollup-linux-arm64-gnu": "4.13.0", + "@rollup/rollup-linux-arm64-musl": "4.13.0", + "@rollup/rollup-linux-riscv64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-musl": "4.13.0", + "@rollup/rollup-win32-arm64-msvc": "4.13.0", + "@rollup/rollup-win32-ia32-msvc": "4.13.0", + "@rollup/rollup-win32-x64-msvc": "4.13.0", "@types/estree": "1.0.5", "fsevents": "~2.3.2" } @@ -14421,12 +14599,12 @@ } }, "safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "requires": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" } @@ -14438,12 +14616,12 @@ "peer": true }, "safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "requires": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" } }, @@ -14453,9 +14631,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { - "version": "1.70.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz", - "integrity": "sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==", + "version": "1.71.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz", + "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", @@ -14524,25 +14702,27 @@ } }, "set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "requires": { - "define-data-property": "^1.1.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" } }, "set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "requires": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" } }, "shallowequal": { @@ -14566,13 +14746,14 @@ "dev": true }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, "signal-exit": { @@ -14692,9 +14873,9 @@ } }, "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true }, "spdx-expression-parse": { @@ -14708,15 +14889,15 @@ } }, "spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", "dev": true }, "stackblur-canvas": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.6.0.tgz", - "integrity": "sha512-8S1aIA+UoF6erJYnglGPug6MaHYGo1Ot7h5fuXx4fUPvcvQfcdw2o/ppCse63+eZf8PPidSu4v1JnmEVtEDnpg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz", + "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==", "optional": true }, "state-local": { @@ -15012,9 +15193,9 @@ "peer": true }, "terser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", - "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "version": "5.29.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", + "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", "peer": true, "requires": { "@jridgewell/source-map": "^0.3.3", @@ -15129,46 +15310,51 @@ "dev": true }, "typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" } }, "typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "requires": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" } }, "typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" } }, "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", "requires": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" } }, "uglify-js": { @@ -15291,14 +15477,14 @@ "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==" }, "vite": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", - "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz", + "integrity": "sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==", "dev": true, "requires": { "esbuild": "^0.19.3", "fsevents": "~2.3.3", - "postcss": "^8.4.32", + "postcss": "^8.4.35", "rollup": "^4.2.0" } }, @@ -15349,19 +15535,19 @@ "dev": true }, "webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.90.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", + "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", "peer": true, "requires": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", + "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.11.5", "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", @@ -15375,7 +15561,7 @@ "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", + "terser-webpack-plugin": "^5.3.10", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -15461,27 +15647,27 @@ } }, "which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "requires": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" } }, "which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" } }, "wordwrap": { diff --git a/src/store/features/app.js b/src/store/features/app.js index 994c58314128..ae6a6422a13e 100644 --- a/src/store/features/app.js +++ b/src/store/features/app.js @@ -12,6 +12,7 @@ const initialState = { pageSizes: [25, 50, 100, 200, 500], TenantListSelector: false, defaultColumns: {}, + newUserDefaults: {}, } export const appSlice = createSlice({ @@ -45,8 +46,8 @@ export const appSlice = createSlice({ setTenantList: (state, action) => { state.TenantListSelector = action.payload?.TenantListSelector }, - setOffboardingDefaults: (state, action) => { - state.offboardingDefaults = action.payload?.offboardingDefaults + setUserSettingsDefaults: (state, action) => { + state.userSettingsDefaults = action.payload?.userSettingsDefaults }, setDefaultColumns: (state, action) => { state.defaultColumns[action.payload.endpoint] = action.payload?.columns @@ -70,9 +71,10 @@ export const { setSidebarVisible, setDefaultusageLocation, setReportImage, - setOffboardingDefaults, + setUserSettingsDefaults, setUserSettings, setDefaultColumns, + setNewUserDefaults, } = appSlice.actions export default persistReducer( diff --git a/src/views/cipp/UserSettings.jsx b/src/views/cipp/UserSettings.jsx index 9b1a42b690d1..d56b6f6f3eed 100644 --- a/src/views/cipp/UserSettings.jsx +++ b/src/views/cipp/UserSettings.jsx @@ -8,32 +8,14 @@ import { CCardHeader, CCardTitle, CCol, - CDropdown, - CDropdownItem, - CDropdownMenu, - CDropdownToggle, CForm, - CFormLabel, - CListGroup, - CListGroupItem, - CProgress, CRow, CSpinner, CTooltip, } from '@coreui/react' -import useQuery from 'src/hooks/useQuery' import { useDispatch, useSelector } from 'react-redux' -import { Field, Form, FormSpy } from 'react-final-form' -import { - Condition, - RFFCFormCheck, - RFFCFormInput, - RFFCFormRadio, - RFFCFormSwitch, - RFFCFormTextarea, - RFFSelectSearch, -} from 'src/components/forms' -import countryList from 'src/data/countryList' +import { Form } from 'react-final-form' +import { RFFCFormSwitch, RFFSelectSearch } from 'src/components/forms' import { useGenericGetRequestQuery, @@ -41,31 +23,20 @@ import { useLazyGenericPostRequestQuery, } from 'src/store/api/app' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import { faCircleNotch, faEdit, faEye } from '@fortawesome/free-solid-svg-icons' -import { CippContentCard, CippPage, CippPageList } from 'src/components/layout' -import { password } from 'src/validators' -import { - CellDate, - CellDelegatedPrivilege, - cellBadgeFormatter, - cellBooleanFormatter, - cellDateFormatter, -} from 'src/components/tables' -import { CellTip, cellGenericFormatter } from 'src/components/tables/CellGenericFormat' -import DatePicker from 'react-datepicker' + import 'react-datepicker/dist/react-datepicker.css' import TenantListSelector from 'src/components/utilities/TenantListSelector' import { ModalService, PageSizeSwitcher, - TenantSelector, ThemeSwitcher, UsageLocation, } from 'src/components/utilities' import CippCodeOffCanvas from 'src/components/utilities/CippCodeOffcanvas' import ReportImage from 'src/components/utilities/ReportImage' import { useLoadClientPrincipalQuery } from 'src/store/api/auth' -import { setOffboardingDefaults, setNewUserDefaults } from 'src/store/features/app' +import { setUserSettingsDefaults } from 'src/store/features/app' +import { CippCallout } from 'src/components/layout' const Offcanvas = (row, rowIndex, formatExtraData) => { const [ExecuteGetRequest, getResults] = useLazyGenericGetRequestQuery() @@ -202,8 +173,7 @@ const UserSettings = () => { const currentSettings = useSelector((state) => state.app) const onSubmit = (values) => { - dispatch(setOffboardingDefaults({ offboardingDefaults: values })) - dispatch(setNewUserDefaults({ NewUserDefaults: values.name })) + dispatch(setUserSettingsDefaults({ userSettingsDefaults: values })) const shippedvalues = { user: values.user, currentSettings: currentSettings, @@ -227,7 +197,7 @@ const UserSettings = () => { { return ( @@ -280,9 +250,9 @@ const UserSettings = () => {

    New User Attribute Defaults

    { name="singleuser" type="submit" > - Save Settings {submitting && } + Save Settings + {postResults.isFetching && } { //if the role contains admin, show the all user button. // @@ -345,12 +316,21 @@ const UserSettings = () => { type="submit" > Save for all users - {submitting && } + {postResults.isFetching && } ) } + {postResults.isError && ( + +

    Error

    +

    {postResults.error.message}

    +
    + )} + {postResults.isSuccess && ( + {postResults.data[0]?.Results} + )} ) }} diff --git a/src/views/identity/administration/OffboardingWizard.jsx b/src/views/identity/administration/OffboardingWizard.jsx index 644bbc6c3a4b..a59258d50143 100644 --- a/src/views/identity/administration/OffboardingWizard.jsx +++ b/src/views/identity/administration/OffboardingWizard.jsx @@ -92,7 +92,7 @@ const OffboardingWizard = () => { return ( @@ -132,7 +132,7 @@ const OffboardingWizard = () => {
    diff --git a/src/views/tenant/administration/TenantOffboardingWizard.jsx b/src/views/tenant/administration/TenantOffboardingWizard.jsx index 81749ba3221b..f3532788d8c4 100644 --- a/src/views/tenant/administration/TenantOffboardingWizard.jsx +++ b/src/views/tenant/administration/TenantOffboardingWizard.jsx @@ -74,7 +74,7 @@ const TenantOffboardingWizard = () => { return ( @@ -88,7 +88,7 @@ const TenantOffboardingWizard = () => {
    From 2e99c74e3af71b0c0222047695403f2f12460565 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Tue, 12 Mar 2024 13:34:50 +0100 Subject: [PATCH 024/133] added defaultAttributes --- src/components/forms/RFFComponents.jsx | 3 +- src/views/cipp/UserSettings.jsx | 72 +------------------ src/views/identity/administration/AddUser.jsx | 22 ++++++ .../identity/administration/EditUser.jsx | 27 ++++++- 4 files changed, 53 insertions(+), 71 deletions(-) diff --git a/src/components/forms/RFFComponents.jsx b/src/components/forms/RFFComponents.jsx index fc98eec7af92..fef24a7cb418 100644 --- a/src/components/forms/RFFComponents.jsx +++ b/src/components/forms/RFFComponents.jsx @@ -138,10 +138,11 @@ export const RFFCFormInput = ({ disabled = false, spellCheck = true, autoFocus = false, + hiddenValue, onChange, }) => { return ( - + {({ input, meta }) => { const handleChange = onChange ? (e) => { diff --git a/src/views/cipp/UserSettings.jsx b/src/views/cipp/UserSettings.jsx index d56b6f6f3eed..953d94df0d7c 100644 --- a/src/views/cipp/UserSettings.jsx +++ b/src/views/cipp/UserSettings.jsx @@ -1,6 +1,5 @@ -import React, { useEffect, useState } from 'react' +import React, { useState } from 'react' import { - CBadge, CButton, CCallout, CCard, @@ -11,87 +10,22 @@ import { CForm, CRow, CSpinner, - CTooltip, } from '@coreui/react' import { useDispatch, useSelector } from 'react-redux' import { Form } from 'react-final-form' import { RFFCFormSwitch, RFFSelectSearch } from 'src/components/forms' -import { - useGenericGetRequestQuery, - useLazyGenericGetRequestQuery, - useLazyGenericPostRequestQuery, -} from 'src/store/api/app' +import { useGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import 'react-datepicker/dist/react-datepicker.css' import TenantListSelector from 'src/components/utilities/TenantListSelector' -import { - ModalService, - PageSizeSwitcher, - ThemeSwitcher, - UsageLocation, -} from 'src/components/utilities' -import CippCodeOffCanvas from 'src/components/utilities/CippCodeOffcanvas' +import { PageSizeSwitcher, ThemeSwitcher, UsageLocation } from 'src/components/utilities' import ReportImage from 'src/components/utilities/ReportImage' import { useLoadClientPrincipalQuery } from 'src/store/api/auth' import { setUserSettingsDefaults } from 'src/store/features/app' import { CippCallout } from 'src/components/layout' -const Offcanvas = (row, rowIndex, formatExtraData) => { - const [ExecuteGetRequest, getResults] = useLazyGenericGetRequestQuery() - const [ocVisible, setOCVisible] = useState(false) - - const handleDeleteSchedule = (apiurl, message) => { - ModalService.confirm({ - title: 'Confirm', - body:
    {message}
    , - onConfirm: () => ExecuteGetRequest({ path: apiurl }), - confirmLabel: 'Continue', - cancelLabel: 'Cancel', - }) - } - let jsonResults - try { - jsonResults = JSON.parse(row.Results) - } catch (error) { - jsonResults = row.Results - } - - return ( - <> - - setOCVisible(true)}> - - - - - - handleDeleteSchedule( - `/api/RemoveScheduledItem?&ID=${row.RowKey}`, - 'Do you want to delete this job?', - ) - } - size="sm" - variant="ghost" - color="danger" - > - - - - setOCVisible(false)} - /> - - ) -} - const UserSettings = () => { const tenant = useSelector((state) => state.app.currentTenant) const [addedAttributes, setAddedAttribute] = React.useState(0) diff --git a/src/views/identity/administration/AddUser.jsx b/src/views/identity/administration/AddUser.jsx index 8fe8b2969021..b1e249fa90df 100644 --- a/src/views/identity/administration/AddUser.jsx +++ b/src/views/identity/administration/AddUser.jsx @@ -74,6 +74,13 @@ const AddUser = () => { const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery() const onSubmit = (values) => { + if (values.defaultAttributes) { + //map default attributes to the addedAttributes array. If addedAttributes is not present, create it. + values.addedAttributes = values.addedAttributes ? values.addedAttributes : [] + Object.keys(values.defaultAttributes).forEach((key) => { + values.addedAttributes.push({ Key: key, Value: values.defaultAttributes[key].Value }) + }) + } const shippedValues = { AddedAliases: values.addedAliases ? values.addedAliases : '', BusinessPhone: values.businessPhones, @@ -124,6 +131,8 @@ const AddUser = () => { usageLocation: usagelocation, ...allQueryObj, } + const currentSettings = useSelector((state) => state.app) + // Effect to update display name when first or last name changes useEffect(() => { setDisplayName(`${firstName} ${lastName}`) @@ -321,6 +330,19 @@ const AddUser = () => { <> + {currentSettings.userSettingsDefaults.defaultAttributes.map( + (attribute, idx) => ( + + + + + + ), + )} {addedAttributes > 0 && [...Array(addedAttributes)].map((e, i) => ( diff --git a/src/views/identity/administration/EditUser.jsx b/src/views/identity/administration/EditUser.jsx index cf2efdc67d66..365da4c5af1f 100644 --- a/src/views/identity/administration/EditUser.jsx +++ b/src/views/identity/administration/EditUser.jsx @@ -77,7 +77,13 @@ const EditUser = () => { }, [userId, tenantDomain, dispatch]) const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery() const onSubmit = (values) => { - console.log(values.AddToGroups) + if (values.defaultAttributes) { + //map default attributes to the addedAttributes array. If addedAttributes is not present, create it. + values.addedAttributes = values.addedAttributes ? values.addedAttributes : [] + Object.keys(values.defaultAttributes).forEach((key) => { + values.addedAttributes.push({ Key: key, Value: values.defaultAttributes[key].Value }) + }) + } const shippedValues = { AddedAliases: values.addedAliases, AddToGroups: Array.isArray(values.AddToGroups) ? values.AddToGroups : [], @@ -114,6 +120,7 @@ const EditUser = () => { } const usageLocation = useSelector((state) => state.app.usageLocation) const [addedAttributes, setAddedAttribute] = React.useState(0) + const currentSettings = useSelector((state) => state.app) const precheckedLicenses = user.assignedLicenses ? user.assignedLicenses.reduce( @@ -129,6 +136,11 @@ const EditUser = () => { label: user.usageLocation ? user.usageLocation : usageLocation?.label, }, license: precheckedLicenses, + //if currentSettings.defaultAttributes exists. Set each of the keys inside of currentSettings.defaultAttributes.label to the value of the user attribute found in the user object. + defaultAttributes: currentSettings.userSettingsDefaults.defaultAttributes.reduce( + (o, key) => Object.assign(o, { [key.label]: { Value: user[key.label] } }), + {}, + ), } const formDisabled = queryError === true || !!userError || !user || Object.keys(user).length === 0 @@ -385,6 +397,19 @@ const EditUser = () => { <> + {currentSettings.userSettingsDefaults.defaultAttributes.map( + (attribute, idx) => ( + + + + + + ), + )} {addedAttributes > 0 && [...Array(addedAttributes)].map((e, i) => ( From c00851b505190f43e3feed9965681800487661f8 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Tue, 12 Mar 2024 16:52:23 +0100 Subject: [PATCH 025/133] update license overview --- src/components/tables/CellTable.jsx | 11 +++--- .../tenant/administration/ListLicences.jsx | 36 +++---------------- 2 files changed, 10 insertions(+), 37 deletions(-) diff --git a/src/components/tables/CellTable.jsx b/src/components/tables/CellTable.jsx index 6da1d1339b93..e03cd95059bd 100644 --- a/src/components/tables/CellTable.jsx +++ b/src/components/tables/CellTable.jsx @@ -11,7 +11,7 @@ export default function cellTable( propertyName, checkWhenZero = false, crossWhenZero = false, - dangerButton = false, // Added 4th parameter for btn-danger class + dangerButton = false, ) { var columnProp = '' if (propertyName) { @@ -21,10 +21,10 @@ export default function cellTable( } if (!Array.isArray(columnProp) && typeof columnProp === 'object') { - columnProp = Object.entries(columnProp).map((row) => { - return { Name: row[0], Value: row[1] } - }) - } else if (Array.isArray(columnProp) && typeof Object.entries(columnProp)[0][1] !== 'object') { + columnProp = [columnProp] + } + + if (Array.isArray(columnProp) && typeof columnProp[0] !== 'object') { columnProp = columnProp.map((row) => { return { Value: row, @@ -77,7 +77,6 @@ export default function cellTable( return } - // Use dangerButton to determine button class const buttonClassName = dangerButton ? 'btn-danger' : '' return ( row['EstTerm'], + name: 'Term Info', + selector: (row) => row.TermInfo, sortable: true, - cell: (row) => CellTip(row['EstTerm']), - exportSelector: 'EstTerm', - }, - { - name: 'Trial', - selector: (row) => row['Trial'], - sortable: true, - exportSelector: 'Trial', - cell: cellBooleanFormatter(), - }, - { - name: 'Days until renewal', - selector: (row) => row['TimeUntilRenew'], - sortable: true, - exportSelector: 'TimeUntilRenew', - }, - { - name: 'Date Created', - selector: (row) => row['dateCreated'], - sortable: true, - exportSelector: 'dateCreated', - cell: cellDateFormatter(), - }, - { - name: 'Renewal Date', - selector: (row) => row['dateExpires'], - sortable: true, - exportSelector: 'dateExpires', - cell: cellDateFormatter(), + exportSelector: 'TermInfo', + cell: cellTableFormatter('TermInfo'), }, ] From 7eadc374da37f8bfeba4dc2414be23e8db6138e5 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Tue, 12 Mar 2024 17:47:28 +0100 Subject: [PATCH 026/133] add anon data warning. --- src/components/tables/CippDatatable.jsx | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/components/tables/CippDatatable.jsx b/src/components/tables/CippDatatable.jsx index cdca6a185cbb..65fd11ab971b 100644 --- a/src/components/tables/CippDatatable.jsx +++ b/src/components/tables/CippDatatable.jsx @@ -14,12 +14,35 @@ export default function CippDatatable({ path, params, ...rest }) { refetch, } = useListDatatableQuery({ path, params: { $filter: graphFilter, ...params } }) + //Check if data[0].userPrincipalName OR data[0].UPN OR data.Results[0].upn OR data.Results[0].userPrincipalName + // follows this regex pattern ^[A-Z0-9]+$. If it does, set the let 'anonimized' to true. + let anonimized = false + if (Array.isArray(data?.Results)) { + anonimized = + data?.Results[0]?.userPrincipalName?.match(/^[A-Z0-9]+$/) || + data?.Results[0]?.UPN?.match(/^[A-Z0-9]+$/) + } else { + anonimized = data?.userPrincipalName?.match(/^[A-Z0-9]+$/) || data?.UPN?.match(/^[A-Z0-9]+$/) + } + var defaultFilterText = '' if (params?.Parameters?.$filter) { defaultFilterText = 'Graph: ' + params?.Parameters?.$filter } return ( <> + {anonimized && ( + + This table might contain anonymized data. Please check this + + documentation link + + to resolve this. + + )} {data?.Metadata?.Queued && {data?.Metadata?.QueueMessage}} Date: Tue, 12 Mar 2024 18:05:16 +0100 Subject: [PATCH 027/133] fixes anon --- src/components/tables/CippDatatable.jsx | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/components/tables/CippDatatable.jsx b/src/components/tables/CippDatatable.jsx index 65fd11ab971b..125eeda3e00a 100644 --- a/src/components/tables/CippDatatable.jsx +++ b/src/components/tables/CippDatatable.jsx @@ -14,15 +14,16 @@ export default function CippDatatable({ path, params, ...rest }) { refetch, } = useListDatatableQuery({ path, params: { $filter: graphFilter, ...params } }) - //Check if data[0].userPrincipalName OR data[0].UPN OR data.Results[0].upn OR data.Results[0].userPrincipalName - // follows this regex pattern ^[A-Z0-9]+$. If it does, set the let 'anonimized' to true. - let anonimized = false - if (Array.isArray(data?.Results)) { - anonimized = - data?.Results[0]?.userPrincipalName?.match(/^[A-Z0-9]+$/) || - data?.Results[0]?.UPN?.match(/^[A-Z0-9]+$/) - } else { - anonimized = data?.userPrincipalName?.match(/^[A-Z0-9]+$/) || data?.UPN?.match(/^[A-Z0-9]+$/) + let anonimized = false // Assuming default value is false + const regex = new RegExp('^[A-Z0-9]+$') + const principalNameOrUPN = + data[0]?.userPrincipalName ?? + data[0]?.UPN ?? + data.Results?.[0]?.upn ?? + data.Results?.[0]?.userPrincipalName + + if (principalNameOrUPN && regex.test(principalNameOrUPN)) { + anonimized = true } var defaultFilterText = '' @@ -32,7 +33,7 @@ export default function CippDatatable({ path, params, ...rest }) { return ( <> {anonimized && ( - + This table might contain anonymized data. Please check this Date: Tue, 12 Mar 2024 21:06:30 +0100 Subject: [PATCH 028/133] added #2189 --- src/views/identity/administration/EditUser.jsx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/views/identity/administration/EditUser.jsx b/src/views/identity/administration/EditUser.jsx index 365da4c5af1f..81e6dff04111 100644 --- a/src/views/identity/administration/EditUser.jsx +++ b/src/views/identity/administration/EditUser.jsx @@ -152,6 +152,19 @@ const EditUser = () => { > {!queryError && ( <> + {user?.userPrincipalName !== user?.mail && ( + + Warning: The userPrincipalName and mail property do not match. This is no longer + supported by Microsoft. See + + this + + link for more information. + + )} {postResults.isSuccess && ( {postResults.data?.Results} )} From 8cb3569300dc3412afa1f1f1238cfe5439d0b3f6 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 13 Mar 2024 13:05:31 -0400 Subject: [PATCH 029/133] Pending Webhooks - Add table offcanvas - Add pending webhooks action button with expandable json view --- .../utilities/CippTableOffcanvas.jsx | 40 ++++++++++++++++ src/components/utilities/index.js | 2 + .../tenant/administration/AlertRules.jsx | 46 ++++++++++++++++++- 3 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 src/components/utilities/CippTableOffcanvas.jsx diff --git a/src/components/utilities/CippTableOffcanvas.jsx b/src/components/utilities/CippTableOffcanvas.jsx new file mode 100644 index 000000000000..2cfbe76fcb31 --- /dev/null +++ b/src/components/utilities/CippTableOffcanvas.jsx @@ -0,0 +1,40 @@ +import React from 'react' +import { CippOffcanvas } from 'src/components/utilities' +import PropTypes from 'prop-types' +import { CippDatatable } from '../tables' + +function CippTableOffcanvas({ + state: visible, + hideFunction, + title = 'Table', + path, + params, + columns, + tableProps, +}) { + return ( + <> + + + + + ) +} + +CippTableOffcanvas.propTypes = { + state: PropTypes.bool, + hideFunction: PropTypes.func, + title: PropTypes.string, + path: PropTypes.string, + params: PropTypes.object, + columns: PropTypes.object, + tableProps: PropTypes.object, +} + +export default CippTableOffcanvas diff --git a/src/components/utilities/index.js b/src/components/utilities/index.js index 5015ae24ad70..11fc6a9581d5 100644 --- a/src/components/utilities/index.js +++ b/src/components/utilities/index.js @@ -17,11 +17,13 @@ import ThemeSwitcher from 'src/components/utilities/ThemeSwitcher' import PageSizeSwitcher from 'src/components/utilities/PageSizeSwitcher' import Toasts from 'src/components/utilities/Toasts' import UsageLocation from 'src/components/utilities/UsageLocation' +import CippTableOffcanvas from './CippTableOffcanvas' export { CippActionsOffcanvas, CippCodeBlock, CippCodeOffCanvas, + CippTableOffcanvas, CippLazy, CippOffcanvas, CippProfile, diff --git a/src/views/tenant/administration/AlertRules.jsx b/src/views/tenant/administration/AlertRules.jsx index 566cbe3c118d..1375792f4008 100644 --- a/src/views/tenant/administration/AlertRules.jsx +++ b/src/views/tenant/administration/AlertRules.jsx @@ -20,13 +20,15 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faCircleNotch, faEdit, faEye } from '@fortawesome/free-solid-svg-icons' import { CippContentCard, CippPage, CippPageList } from 'src/components/layout' import { cellBadgeFormatter, cellDateFormatter } from 'src/components/tables' -import { CellTip } from 'src/components/tables/CellGenericFormat' +import { CellTip, cellGenericFormatter } from 'src/components/tables/CellGenericFormat' import 'react-datepicker/dist/react-datepicker.css' import TenantListSelector from 'src/components/utilities/TenantListSelector' -import { ModalService, TenantSelector } from 'src/components/utilities' +import { CippCodeBlock, ModalService, TenantSelector } from 'src/components/utilities' import CippCodeOffCanvas from 'src/components/utilities/CippCodeOffcanvas' +import CippTableOffcanvas from 'src/components/utilities/CippTableOffcanvas' import arrayMutators from 'final-form-arrays' import countryList from 'src/data/countryList.json' +import { TitleButton } from 'src/components/buttons' const AlertRules = () => { const [ExecuteGetRequest, getResults] = useLazyGenericGetRequestQuery() @@ -88,6 +90,7 @@ const AlertRules = () => { const [startDate, setStartDate] = useState(currentDate) const tenantDomain = useSelector((state) => state.app.currentTenant.defaultDomainName) const [refreshState, setRefreshState] = useState(false) + const [showPending, setShowPending] = useState(false) const taskName = `Scheduled Task ${currentDate.toLocaleString()}` const { data: availableCommands = [], isLoading: isLoadingcmd } = useGenericGetRequestQuery({ path: 'api/ListFunctionParameters?Module=CIPPCore', @@ -293,6 +296,11 @@ const AlertRules = () => { return ifs } + const ExpandedComponent = ({ data }) => ( + // eslint-disable-next-line react/prop-types + + ) + const renderDos = () => { const dos = [] @@ -517,6 +525,13 @@ const AlertRules = () => { }} title="Alert Rules" tenantSelector={false} + titleButton={ + setShowPending(true)} + title="Pending Webhooks" + /> + } datatable={{ tableProps: { selectableRows: true, @@ -535,6 +550,33 @@ const AlertRules = () => { path: `/api/ListWebhookAlert?RefreshGuid=${refreshState}`, }} /> + setShowPending(false)} + columns={[ + { + name: 'Tenant', + selector: (row) => row?.TenantFilter, + sortable: true, + cell: cellGenericFormatter(), + exportSelector: 'TenantFilter', + }, + { + name: 'Type', + selector: (row) => row?.Type, + sortable: true, + cell: cellGenericFormatter(), + exportSelector: 'Type', + }, + ]} + tableProps={{ + expandableRows: true, + expandableRowsComponent: ExpandedComponent, + expandOnRowClicked: true, + }} + /> From 305514f7fb9457f7cf2630fbd6da63cb3d79b48d Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 13 Mar 2024 13:56:01 -0400 Subject: [PATCH 030/133] fix button text --- src/views/tenant/administration/AlertRules.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/tenant/administration/AlertRules.jsx b/src/views/tenant/administration/AlertRules.jsx index 1375792f4008..13d3636bab4e 100644 --- a/src/views/tenant/administration/AlertRules.jsx +++ b/src/views/tenant/administration/AlertRules.jsx @@ -375,7 +375,7 @@ const AlertRules = () => { } return ( - + <> @@ -480,7 +480,7 @@ const AlertRules = () => { - Add Schedule + Add Rule {postResults.isFetching && ( Date: Thu, 14 Mar 2024 12:25:09 +0100 Subject: [PATCH 031/133] fixes bug when endpoint name is null for modals --- src/components/tables/CippTable.jsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/tables/CippTable.jsx b/src/components/tables/CippTable.jsx index 5ccbe59792e3..8601bfd002ea 100644 --- a/src/components/tables/CippTable.jsx +++ b/src/components/tables/CippTable.jsx @@ -155,7 +155,7 @@ export default function CippTable({ const [filterviaURL, setFilterviaURL] = React.useState(false) const [originalColumns, setOrginalColumns] = React.useState(columns) const [updatedColumns, setUpdatedColumns] = React.useState(columns) - if (defaultColumns && defaultColumnsSet === false) { + if (defaultColumns && defaultColumnsSet === false && endpointName) { const defaultColumnsArray = defaultColumns.split(',').filter((item) => item) const actionsColumn = columns.length > 0 ? columns[columns.length - 1] : null @@ -180,11 +180,11 @@ export default function CippTable({ let newColumns = tempColumns.filter( (column) => defaultColumnsArray.includes(column.exportSelector) || column === actionsColumn, ) - - setUpdatedColumns(newColumns) + } + if (!endpointName && defaultColumnsSet === false) { + setUpdatedColumns(columns) setDefaultColumnsSet(true) } - const [selectedRows, setSelectedRows] = React.useState(false) const [genericGetRequest, getResults] = useLazyGenericGetRequestQuery() const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery() From d2d9fdc830b31810ee436a2ac0d7dd6c23eb2ca5 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 14 Mar 2024 12:37:09 +0100 Subject: [PATCH 032/133] fixed issue with graph explorer columns --- src/components/tables/CippTable.jsx | 12 +++++++----- src/views/tenant/administration/GraphExplorer.jsx | 3 --- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/components/tables/CippTable.jsx b/src/components/tables/CippTable.jsx index 8601bfd002ea..08d9139e21d7 100644 --- a/src/components/tables/CippTable.jsx +++ b/src/components/tables/CippTable.jsx @@ -342,10 +342,12 @@ export default function CippTable({ useEffect(() => { if (columns.length !== updatedColumns.length) { setUpdatedColumns(updatedColumns) - setColumnDefaultLayout( - endpointName, - updatedColumns.map((column) => column.exportSelector).join(','), - ) + if (endpointName) { + setColumnDefaultLayout( + endpointName, + updatedColumns.map((column) => column.exportSelector).join(','), + ) + } } }, [ columns, @@ -971,7 +973,7 @@ export default function CippTable({ responsive={responsive} dense={dense} striped={striped} - columns={updatedColumns} + columns={dynamicColumns ? updatedColumns : columns} data={filteredItems} expandableRows={expandableRows} expandableRowsComponent={expandableRowsComponent} diff --git a/src/views/tenant/administration/GraphExplorer.jsx b/src/views/tenant/administration/GraphExplorer.jsx index 42cc4ac2ce8c..767ee5e44418 100644 --- a/src/views/tenant/administration/GraphExplorer.jsx +++ b/src/views/tenant/administration/GraphExplorer.jsx @@ -307,7 +307,6 @@ const GraphExplorer = () => { function getPresetProps(values) { var newvals = Object.assign({}, values) - console.log(newvals) if (newvals?.$select !== undefined && Array.isArray(newvals?.$select)) { newvals.$select = newvals?.$select.map((p) => p.value).join(',') } @@ -317,8 +316,6 @@ const GraphExplorer = () => { return newvals } - console.log(graphrequest.data) - return ( <> From 890c8006020a3e22d3ac3b4d8fe0768652c168f5 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 14 Mar 2024 12:49:08 +0100 Subject: [PATCH 033/133] minor bug with new column setup --- src/components/tables/CippTable.jsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/tables/CippTable.jsx b/src/components/tables/CippTable.jsx index 08d9139e21d7..7b155136c17b 100644 --- a/src/components/tables/CippTable.jsx +++ b/src/components/tables/CippTable.jsx @@ -180,6 +180,8 @@ export default function CippTable({ let newColumns = tempColumns.filter( (column) => defaultColumnsArray.includes(column.exportSelector) || column === actionsColumn, ) + setUpdatedColumns(newColumns) + setDefaultColumnsSet(true) } if (!endpointName && defaultColumnsSet === false) { setUpdatedColumns(columns) From bef8ab33359e1a60ff41566648c250833022ae47 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Thu, 14 Mar 2024 15:33:48 -0400 Subject: [PATCH 034/133] Update AppHeader.jsx --- src/components/layout/AppHeader.jsx | 82 ++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 2 deletions(-) diff --git a/src/components/layout/AppHeader.jsx b/src/components/layout/AppHeader.jsx index f31d73a124e0..e3fd84295859 100644 --- a/src/components/layout/AppHeader.jsx +++ b/src/components/layout/AppHeader.jsx @@ -13,14 +13,19 @@ import { CSidebarBrand, CButton, CFormSwitch, + CLink, } from '@coreui/react' import { AppHeaderSearch } from 'src/components/header' -import { TenantSelector } from '../utilities' +import { CippActionsOffcanvas, TenantSelector } from '../utilities' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faBars } from '@fortawesome/free-solid-svg-icons' import { setCurrentTheme, setUserSettings, toggleSidebarShow } from 'src/store/features/app' import { useMediaPredicate } from 'react-media-hook' -import { useGenericGetRequestQuery, useLoadAlertsDashQuery } from 'src/store/api/app' +import { + useGenericGetRequestQuery, + useLazyGenericGetRequestQuery, + useLoadAlertsDashQuery, +} from 'src/store/api/app' import { useLocation } from 'react-router-dom' const AppHeader = () => { @@ -31,6 +36,11 @@ const AppHeader = () => { const sidebarShow = useSelector((state) => state.app.sidebarShow) const currentTheme = useSelector((state) => state.app.currentTheme) const preferredTheme = useMediaPredicate('(prefers-color-scheme: dark)') ? 'impact' : 'cyberdrain' + const [cippQueueExtendedInfo, setCippQueueExtendedInfo] = useState([]) + const [cippQueueVisible, setCippQueueVisible] = useState(false) + const [cippQueueRefresh, setCippQueueRefresh] = useState( + (Math.random() + 1).toString(36).substring(7), + ) const { data: dashboard } = useLoadAlertsDashQuery() const { data: userSettings, @@ -54,6 +64,49 @@ const AppHeader = () => { userSettings, ]) + const [getCippQueueList, cippQueueList] = useLazyGenericGetRequestQuery() + + function loadCippQueue() { + setCippQueueVisible(true) + getCippQueueList({ path: 'api/ListCippQueue', params: { refresh: cippQueueRefresh } }) + } + + function refreshCippQueue() { + setCippQueueRefresh((Math.random() + 1).toString(36).substring(7)) + loadCippQueue() + } + + useEffect(() => { + if (cippQueueList.isFetching || cippQueueList.isLoading) { + setCippQueueExtendedInfo([ + { + label: 'Fetching recent jobs', + value: 'Please wait', + timestamp: Date(), + link: '#', + }, + ]) + } + if ( + cippQueueList.isSuccess && + Array.isArray(cippQueueList.data) && + cippQueueList.data.length > 0 + ) { + setCippQueueExtendedInfo( + cippQueueList.data?.map((job) => ({ + label: `${job.Name}`, + value: job.Status, + link: job.Link, + timestamp: job.Timestamp, + })), + ) + } else { + setCippQueueExtendedInfo([ + { label: 'No jobs to display', value: '', timpestamp: Date(), link: '#' }, + ]) + } + }, [cippQueueList]) + const SwitchTheme = () => { let targetTheme = preferredTheme if (isDark) { @@ -97,6 +150,11 @@ const AppHeader = () => { + + loadCippQueue()}> + + +
    {
    ))}
    + , + }, + ]} + placement="end" + visible={cippQueueVisible} + id="cipp-queue" + hideFunction={() => setCippQueueVisible(false)} + /> ) } From f5c816ca528649be054fd2a86ab9c1effd4db53b Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 14 Mar 2024 20:57:32 +0100 Subject: [PATCH 035/133] fix card layout while bringing sexy back --- .../utilities/CippActionsOffcanvas.jsx | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/components/utilities/CippActionsOffcanvas.jsx b/src/components/utilities/CippActionsOffcanvas.jsx index 6ec39c31d6a7..6bc9d896d71c 100644 --- a/src/components/utilities/CippActionsOffcanvas.jsx +++ b/src/components/utilities/CippActionsOffcanvas.jsx @@ -215,8 +215,10 @@ export default function CippActionsOffcanvas(props) { cardContent = props.cards.map((action, index) => ( <> - + Report Name: {action.label} + + {action.value && Status: {action.value}} @@ -325,15 +327,16 @@ export default function CippActionsOffcanvas(props) { {getResults.isError && ( Could not connect to API: {getResults.error.message} )} - - - - - Extended Information - - - {extendedInfoContent} - + {!cardContent && ( + + + + Extended Information + + + {extendedInfoContent} + + )} {cardContent && cardContent} {Actions} From c348b7ce7a062ebfda1797f4fad7c51343278c99 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Thu, 14 Mar 2024 18:33:25 -0400 Subject: [PATCH 036/133] fix button --- src/components/layout/AppHeader.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/layout/AppHeader.jsx b/src/components/layout/AppHeader.jsx index e3fd84295859..2f203a5cb7ad 100644 --- a/src/components/layout/AppHeader.jsx +++ b/src/components/layout/AppHeader.jsx @@ -151,8 +151,8 @@ const AppHeader = () => { - loadCippQueue()}> - + loadCippQueue()} className="me-1"> + From b511e620d5684802672b6605255f58e94f6bb572 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Thu, 14 Mar 2024 18:35:53 -0400 Subject: [PATCH 037/133] cleanup imports --- src/components/layout/AppHeader.jsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/components/layout/AppHeader.jsx b/src/components/layout/AppHeader.jsx index 2f203a5cb7ad..09535ae9bd12 100644 --- a/src/components/layout/AppHeader.jsx +++ b/src/components/layout/AppHeader.jsx @@ -3,17 +3,12 @@ import { useSelector, useDispatch } from 'react-redux' import { CAlert, CAlertLink, - CContainer, - CCollapse, CHeader, CHeaderNav, CNavItem, CHeaderToggler, - CImage, - CSidebarBrand, CButton, CFormSwitch, - CLink, } from '@coreui/react' import { AppHeaderSearch } from 'src/components/header' import { CippActionsOffcanvas, TenantSelector } from '../utilities' From f53a3487185ee91e741a94795305c765a62a2d99 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Thu, 14 Mar 2024 18:38:37 -0400 Subject: [PATCH 038/133] Pretty MEM policy list json --- src/views/endpoint/intune/MEMListPolicies.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/endpoint/intune/MEMListPolicies.jsx b/src/views/endpoint/intune/MEMListPolicies.jsx index c07216317afc..980d68010132 100644 --- a/src/views/endpoint/intune/MEMListPolicies.jsx +++ b/src/views/endpoint/intune/MEMListPolicies.jsx @@ -13,7 +13,7 @@ import { import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { CippPageList } from 'src/components/layout' import { Link } from 'react-router-dom' -import { CippActionsOffcanvas } from 'src/components/utilities' +import { CippActionsOffcanvas, CippCodeBlock } from 'src/components/utilities' import { TitleButton } from 'src/components/buttons' const Actions = (row, rowIndex, formatExtraData) => { @@ -116,7 +116,7 @@ const IntuneList = () => { // eslint-disable-next-line react/prop-types const ExpandedComponent = ({ data }) => ( // eslint-disable-next-line react/prop-types -
    {JSON.stringify(data, null, 2)}
    + ) return ( From 377a6628b1b93b27cffa4d38956fbee1bf4b88a5 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Thu, 14 Mar 2024 19:28:20 -0400 Subject: [PATCH 039/133] Add tooltips --- src/components/header/AppHeaderSearch.jsx | 10 ++++++---- src/components/layout/AppHeader.jsx | 17 +++++++++++------ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/components/header/AppHeaderSearch.jsx b/src/components/header/AppHeaderSearch.jsx index 6b4ab4b50d9a..20f917470d10 100644 --- a/src/components/header/AppHeaderSearch.jsx +++ b/src/components/header/AppHeaderSearch.jsx @@ -2,7 +2,7 @@ import React, { useCallback } from 'react' import { faSearch } from '@fortawesome/free-solid-svg-icons' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { toggleSwitcher } from 'src/store/features/switcher' -import { CButton } from '@coreui/react' +import { CButton, CTooltip } from '@coreui/react' import { useDispatch } from 'react-redux' const AppHeaderSearch = () => { @@ -12,9 +12,11 @@ const AppHeaderSearch = () => { }, [dispatch]) return ( <> - - - + + + + + ) } diff --git a/src/components/layout/AppHeader.jsx b/src/components/layout/AppHeader.jsx index 09535ae9bd12..43ec9c476d35 100644 --- a/src/components/layout/AppHeader.jsx +++ b/src/components/layout/AppHeader.jsx @@ -9,6 +9,7 @@ import { CHeaderToggler, CButton, CFormSwitch, + CTooltip, } from '@coreui/react' import { AppHeaderSearch } from 'src/components/header' import { CippActionsOffcanvas, TenantSelector } from '../utilities' @@ -137,18 +138,22 @@ const AppHeader = () => { target="_blank" href={`https://docs.cipp.app/user-documentation${location.pathname}`} > - - - + + + + +
    - loadCippQueue()} className="me-1"> - - + + loadCippQueue()} className="me-1"> + + +
    From 1744088d8b478dceb3687a907fa528f56779f4f3 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Thu, 14 Mar 2024 20:51:07 -0400 Subject: [PATCH 040/133] Graph Explorer - Org Branding preset Implements #2160 --- src/views/tenant/administration/GraphExplorer.jsx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/views/tenant/administration/GraphExplorer.jsx b/src/views/tenant/administration/GraphExplorer.jsx index 767ee5e44418..42cfc7f0e2da 100644 --- a/src/views/tenant/administration/GraphExplorer.jsx +++ b/src/views/tenant/administration/GraphExplorer.jsx @@ -218,6 +218,15 @@ const GraphExplorer = () => { }, isBuiltin: true, }, + { + name: 'Organization Branding', + id: '2ed236e2-268e-461b-9d37-98b123010667', + params: { + endpoint: 'organization/%tenantid%/branding', + NoPagination: true, + }, + isBuiltin: true, + }, ] if (customPresets?.Results?.length > 0) { From e17aa3469c4804ecbc923d6c369acafbe09ca7ef Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Fri, 15 Mar 2024 14:04:30 +0100 Subject: [PATCH 041/133] upp version --- public/version_latest.txt | 2 +- version_latest.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/version_latest.txt b/public/version_latest.txt index 804440660c71..e230c8396d19 100644 --- a/public/version_latest.txt +++ b/public/version_latest.txt @@ -1 +1 @@ -5.2.1 \ No newline at end of file +5.3.0 \ No newline at end of file diff --git a/version_latest.txt b/version_latest.txt index 804440660c71..e230c8396d19 100644 --- a/version_latest.txt +++ b/version_latest.txt @@ -1 +1 @@ -5.2.1 \ No newline at end of file +5.3.0 \ No newline at end of file From b08a54c2318a1f40f3da4bd7ebf9d4b9bfbec0e7 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Fri, 15 Mar 2024 10:27:57 -0400 Subject: [PATCH 042/133] Add null safe operator to default settings --- src/views/identity/administration/AddUser.jsx | 2 +- src/views/identity/administration/EditUser.jsx | 4 ++-- src/views/identity/administration/OffboardingWizard.jsx | 4 ++-- src/views/tenant/administration/TenantOffboardingWizard.jsx | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/views/identity/administration/AddUser.jsx b/src/views/identity/administration/AddUser.jsx index b1e249fa90df..f35d42385b9d 100644 --- a/src/views/identity/administration/AddUser.jsx +++ b/src/views/identity/administration/AddUser.jsx @@ -330,7 +330,7 @@ const AddUser = () => { <> - {currentSettings.userSettingsDefaults.defaultAttributes.map( + {currentSettings?.userSettingsDefaults?.defaultAttributes.map( (attribute, idx) => ( diff --git a/src/views/identity/administration/EditUser.jsx b/src/views/identity/administration/EditUser.jsx index 81e6dff04111..f456f6f9c4fd 100644 --- a/src/views/identity/administration/EditUser.jsx +++ b/src/views/identity/administration/EditUser.jsx @@ -137,7 +137,7 @@ const EditUser = () => { }, license: precheckedLicenses, //if currentSettings.defaultAttributes exists. Set each of the keys inside of currentSettings.defaultAttributes.label to the value of the user attribute found in the user object. - defaultAttributes: currentSettings.userSettingsDefaults.defaultAttributes.reduce( + defaultAttributes: currentSettings?.userSettingsDefaults?.defaultAttributes.reduce( (o, key) => Object.assign(o, { [key.label]: { Value: user[key.label] } }), {}, ), @@ -410,7 +410,7 @@ const EditUser = () => { <> - {currentSettings.userSettingsDefaults.defaultAttributes.map( + {currentSettings?.userSettingsDefaults?.defaultAttributes.map( (attribute, idx) => ( diff --git a/src/views/identity/administration/OffboardingWizard.jsx b/src/views/identity/administration/OffboardingWizard.jsx index a59258d50143..86ec8293eff6 100644 --- a/src/views/identity/administration/OffboardingWizard.jsx +++ b/src/views/identity/administration/OffboardingWizard.jsx @@ -92,7 +92,7 @@ const OffboardingWizard = () => { return ( @@ -132,7 +132,7 @@ const OffboardingWizard = () => {
    diff --git a/src/views/tenant/administration/TenantOffboardingWizard.jsx b/src/views/tenant/administration/TenantOffboardingWizard.jsx index f3532788d8c4..62a242aeeadf 100644 --- a/src/views/tenant/administration/TenantOffboardingWizard.jsx +++ b/src/views/tenant/administration/TenantOffboardingWizard.jsx @@ -74,7 +74,7 @@ const TenantOffboardingWizard = () => { return ( @@ -88,7 +88,7 @@ const TenantOffboardingWizard = () => {
    From 8197a11c630acb31defaf59843917ec66626469a Mon Sep 17 00:00:00 2001 From: John Duprey Date: Fri, 15 Mar 2024 10:42:51 -0400 Subject: [PATCH 043/133] up version --- package.json | 2 +- public/version_latest.txt | 2 +- version_latest.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 176e2b10ec85..a7ddc9af6fc3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cipp", - "version": "5.2.1", + "version": "5.3.1", "description": "The CyberDrain Improved Partner Portal is a portal to help manage administration for Microsoft Partners.", "homepage": "https://cipp.app/", "bugs": { diff --git a/public/version_latest.txt b/public/version_latest.txt index e230c8396d19..c7cb1311a645 100644 --- a/public/version_latest.txt +++ b/public/version_latest.txt @@ -1 +1 @@ -5.3.0 \ No newline at end of file +5.3.1 diff --git a/version_latest.txt b/version_latest.txt index e230c8396d19..c7cb1311a645 100644 --- a/version_latest.txt +++ b/version_latest.txt @@ -1 +1 @@ -5.3.0 \ No newline at end of file +5.3.1 From 9258e957d88e86708eaaa2c5a46f5513404ab33c Mon Sep 17 00:00:00 2001 From: John Duprey Date: Sat, 16 Mar 2024 09:32:19 -0400 Subject: [PATCH 044/133] Update Statistics.jsx --- src/views/cipp/Statistics.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/cipp/Statistics.jsx b/src/views/cipp/Statistics.jsx index 6fba968ca726..abd239f5bab9 100644 --- a/src/views/cipp/Statistics.jsx +++ b/src/views/cipp/Statistics.jsx @@ -68,7 +68,7 @@ const Statistics = () => { const { data, isFetching, error, isSuccess } = useGenericGetRequestQuery({ path: '/api/ListFunctionStats', params: { - FunctionType: 'Queue', + FunctionType: 'Durable', Interval: interval, Time: time, TenantFilter: tenant?.defaultDomainName, From 94374881853b11cdc213ea5e7d330675cb134e7a Mon Sep 17 00:00:00 2001 From: John Duprey Date: Sat, 16 Mar 2024 09:33:12 -0400 Subject: [PATCH 045/133] update package-lock --- package-lock.json | 6544 +-------------------------------------------- 1 file changed, 6 insertions(+), 6538 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8f8302ab3d25..9cef69b03bd6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cipp", - "version": "5.2.1", - "lockfileVersion": 2, + "version": "5.3.1", + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cipp", - "version": "5.2.1", + "version": "5.3.1", "license": "AGPL-3.0", "dependencies": { "@coreui/chartjs": "^3.0.0", @@ -5821,9 +5821,9 @@ } }, "node_modules/markdown-to-jsx": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.1.tgz", - "integrity": "sha512-GbrbkTnHp9u6+HqbPRFJbObi369AgJNXi/sGqq5HRsoZW063xR1XDCaConqq+whfEIAlzB1YPnOgsPc7B7bc/A==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.2.tgz", + "integrity": "sha512-xgEwt13t+pM1kmE5vN0Ch64PX3tGDFt5Xa3e36sCknTnWiqPcnskWzIoaO/tGaPKOd0avCO0IwmBSmVxn/ZAcg==", "engines": { "node": ">= 10" }, @@ -9187,6537 +9187,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true - }, - "@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - } - }, - "@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==" - }, - "@babel/core": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", - "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.0", - "@babel/parser": "^7.24.0", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - } - }, - "@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "requires": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==" - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==" - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" - }, - "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==" - }, - "@babel/helpers": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", - "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", - "requires": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0" - } - }, - "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", - "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==" - }, - "@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", - "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", - "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/runtime": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", - "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" - } - }, - "@babel/traverse": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", - "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@coreui/chartjs": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@coreui/chartjs/-/chartjs-3.1.2.tgz", - "integrity": "sha512-d3MGk3KZNAt29VRKP/XYiGmT56KTqtuOhLEg5HNwb7P7ZmEgOJoHxFHVCVE4I36hfgQCjZZVknsuk2ZTfF/2fw==", - "requires": { - "@coreui/coreui": "^4.2.6", - "chart.js": "^3.9.1" - } - }, - "@coreui/coreui": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@coreui/coreui/-/coreui-4.3.0.tgz", - "integrity": "sha512-2bx5E9YT17td4K7hZapudypSPx7a5jYg8NpSCTLRStPTWOBlL5XVF7fz3yUn2S6DQE1VmnbrXQpuS5LzmptRLQ==", - "requires": { - "postcss-combine-duplicated-selectors": "^10.0.3" - } - }, - "@coreui/react": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@coreui/react/-/react-4.11.1.tgz", - "integrity": "sha512-2EYnV6kpyH8/648+iffRy/I/xCEnD2MnEOuo1LPiUSX7EqoHn5M3fI+sf4vM9Wrqz4Gv2gxCl8DNRpk2xcLANQ==", - "requires": {} - }, - "@coreui/react-chartjs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@coreui/react-chartjs/-/react-chartjs-2.1.3.tgz", - "integrity": "sha512-Boj2LhlGlAVIdPRDDIyF5nbupIg9ohhpdLXW28ch0A0ZMpJvf0AwBoibV4Uo6agcN7jSq2uvgudNC3aJTMg/8w==", - "requires": { - "@coreui/chartjs": "^3.1.1", - "chart.js": "3.9.1" - } - }, - "@coreui/utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@coreui/utils/-/utils-1.3.1.tgz", - "integrity": "sha512-WuWHX7bg89cJH34TWVsLe9RsxzBhTApj+X2Ja19xhjcpxt5Gv11Ozm+fwYt6DD7DgncTvpwYrMcnNlpp701UOg==" - }, - "@csstools/selector-specificity": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", - "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", - "dev": true, - "requires": {} - }, - "@emotion/babel-plugin": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", - "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", - "requires": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - }, - "dependencies": { - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" - } - } - }, - "@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", - "requires": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "stylis": "4.2.0" - } - }, - "@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" - }, - "@emotion/is-prop-valid": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", - "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", - "requires": { - "@emotion/memoize": "^0.8.1" - } - }, - "@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "@emotion/react": { - "version": "11.11.4", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", - "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", - "requires": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "hoist-non-react-statics": "^3.3.1" - } - }, - "@emotion/serialize": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", - "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", - "requires": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", - "csstype": "^3.0.2" - } - }, - "@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" - }, - "@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" - }, - "@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" - }, - "@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", - "requires": {} - }, - "@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" - }, - "@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" - }, - "@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", - "dev": true, - "optional": true - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true - }, - "@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", - "requires": { - "@floating-ui/utils": "^0.2.1" - } - }, - "@floating-ui/dom": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", - "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", - "requires": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" - } - }, - "@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" - }, - "@fortawesome/fontawesome-common-types": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz", - "integrity": "sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==" - }, - "@fortawesome/fontawesome-svg-core": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.1.tgz", - "integrity": "sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ==", - "requires": { - "@fortawesome/fontawesome-common-types": "6.5.1" - } - }, - "@fortawesome/free-brands-svg-icons": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.5.1.tgz", - "integrity": "sha512-093l7DAkx0aEtBq66Sf19MgoZewv1zeY9/4C7vSKPO4qMwEsW/2VYTUTpBtLwfb9T2R73tXaRDPmE4UqLCYHfg==", - "requires": { - "@fortawesome/fontawesome-common-types": "6.5.1" - } - }, - "@fortawesome/free-regular-svg-icons": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.1.tgz", - "integrity": "sha512-m6ShXn+wvqEU69wSP84coxLbNl7sGVZb+Ca+XZq6k30SzuP3X4TfPqtycgUh9ASwlNh5OfQCd8pDIWxl+O+LlQ==", - "requires": { - "@fortawesome/fontawesome-common-types": "6.5.1" - } - }, - "@fortawesome/free-solid-svg-icons": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.1.tgz", - "integrity": "sha512-S1PPfU3mIJa59biTtXJz1oI0+KAXW6bkAb31XKhxdxtuXDiUIFsih4JR1v5BbxY7hVHsD1RKq+jRkVRaf773NQ==", - "requires": { - "@fortawesome/fontawesome-common-types": "6.5.1" - } - }, - "@fortawesome/react-fontawesome": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", - "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", - "requires": { - "prop-types": "^15.8.1" - } - }, - "@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" - }, - "@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" - }, - "@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "peer": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@juggle/resize-observer": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", - "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" - }, - "@monaco-editor/loader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", - "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", - "requires": { - "state-local": "^1.0.6" - } - }, - "@monaco-editor/react": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz", - "integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==", - "requires": { - "@monaco-editor/loader": "^1.4.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" - }, - "@react-icons/all-files": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@react-icons/all-files/-/all-files-4.1.0.tgz", - "integrity": "sha512-hxBI2UOuVaI3O/BhQfhtb4kcGn9ft12RWAFVMUeNjqqhLsHvFtzIkFaptBJpFDANTKoDfdVoHTKZDlwKCACbMQ==", - "requires": {} - }, - "@reduxjs/toolkit": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", - "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", - "requires": { - "immer": "^9.0.21", - "redux": "^4.2.1", - "redux-thunk": "^2.4.2", - "reselect": "^4.1.8" - }, - "dependencies": { - "redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "requires": { - "@babel/runtime": "^7.9.2" - } - } - } - }, - "@remix-run/router": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", - "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==" - }, - "@restart/context": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", - "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==", - "requires": {} - }, - "@restart/hooks": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", - "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", - "requires": { - "dequal": "^2.0.3" - } - }, - "@rjsf/bootstrap-4": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/@rjsf/bootstrap-4/-/bootstrap-4-5.17.1.tgz", - "integrity": "sha512-23NZ5qB0eYmJRY1UgI66mTAp4lyGXSgduyr7UX35fsBFy91CzP/FozL1P/muRcEslRqBJhDgrWbMdw99eLSO1w==", - "requires": { - "@react-icons/all-files": "^4.1.0" - } - }, - "@rjsf/core": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/@rjsf/core/-/core-5.17.1.tgz", - "integrity": "sha512-COZSuumwHskWN8Pz3RxdxvuQUP6M/qBMXAkIi+TSWLFLaF6SUugpLiceMT1jGemDCr7fOSTiPxjkToSsgpvueQ==", - "requires": { - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "markdown-to-jsx": "^7.4.1", - "nanoid": "^3.3.7", - "prop-types": "^15.8.1" - } - }, - "@rjsf/utils": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/@rjsf/utils/-/utils-5.17.1.tgz", - "integrity": "sha512-q1Igz/cuM2hi+jiXFkoaXqdRTUFB+a0jfVKNmZlHmvPmfYeeJfcfyOTzO8dQ41fHNHUFb15ryxa/TblDQimwkA==", - "requires": { - "json-schema-merge-allof": "^0.8.1", - "jsonpointer": "^5.0.1", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "react-is": "^18.2.0" - } - }, - "@rjsf/validator-ajv8": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/@rjsf/validator-ajv8/-/validator-ajv8-5.17.1.tgz", - "integrity": "sha512-KdvHsjDQ60b04fqnoqhfkiCv7E4n4NIHli8QU8dtpuUAVS/TOqDuOtDJVz6bv/rd/QNROGpxlO/OCccE0rmxLQ==", - "requires": { - "ajv": "^8.12.0", - "ajv-formats": "^2.1.1", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21" - } - }, - "@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "requires": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - } - }, - "@rollup/rollup-android-arm-eabi": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", - "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-android-arm64": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz", - "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==", - "dev": true, - "optional": true - }, - "@rollup/rollup-darwin-arm64": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz", - "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==", - "dev": true, - "optional": true - }, - "@rollup/rollup-darwin-x64": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz", - "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz", - "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm64-gnu": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz", - "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm64-musl": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz", - "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz", - "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-x64-gnu": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz", - "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-x64-musl": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz", - "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-arm64-msvc": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz", - "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-ia32-msvc": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz", - "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-x64-msvc": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz", - "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==", - "dev": true, - "optional": true - }, - "@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@types/eslint": { - "version": "8.56.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", - "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "peer": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" - }, - "@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", - "requires": { - "@types/unist": "^2" - } - }, - "@types/hoist-non-react-statics": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", - "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", - "requires": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "@types/invariant": { - "version": "2.2.37", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.37.tgz", - "integrity": "sha512-IwpIMieE55oGWiXkQPSBY1nw1nFs6bsKXTFskNY8sdS17K24vyEBRQZEwlRS7ZmXCWnJcQtbxWzly+cODWGs2A==" - }, - "@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true - }, - "@types/node": { - "version": "20.11.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.26.tgz", - "integrity": "sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==", - "requires": { - "undici-types": "~5.26.4" - } - }, - "@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "@types/papaparse": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.3.14.tgz", - "integrity": "sha512-LxJ4iEFcpqc6METwp9f6BV6VVc43m6MfH0VqFosHvrUgfXiFe6ww7R3itkOQ+TCK6Y+Iv/+RnnvtRZnkc5Kc9g==", - "requires": { - "@types/node": "*" - } - }, - "@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" - }, - "@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" - }, - "@types/raf": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz", - "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==", - "optional": true - }, - "@types/react": { - "version": "18.2.65", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.65.tgz", - "integrity": "sha512-98TsY0aW4jqx/3RqsUXwMDZSWR1Z4CUlJNue8ueS2/wcxZOsz4xmW1X8ieaWVRHcmmQM3R8xVA4XWB3dJnWwDQ==", - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-helmet": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.11.tgz", - "integrity": "sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g==", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/react-redux": { - "version": "7.1.33", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz", - "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==", - "requires": { - "@types/hoist-non-react-statics": "^3.3.0", - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0", - "redux": "^4.0.0" - } - }, - "@types/react-transition-group": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", - "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", - "requires": { - "@types/react": "*" - } - }, - "@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" - }, - "@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" - }, - "@types/warning": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", - "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==" - }, - "@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "@vitejs/plugin-react": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", - "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", - "dev": true, - "requires": { - "@babel/core": "^7.23.5", - "@babel/plugin-transform-react-jsx-self": "^7.23.3", - "@babel/plugin-transform-react-jsx-source": "^7.23.3", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.0" - } - }, - "@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "peer": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "peer": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "peer": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "peer": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "peer": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "peer": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "peer": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "peer": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "peer": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "peer": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "peer": true - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" - }, - "acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==" - }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "peer": true, - "requires": {} - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "requires": { - "ajv": "^8.0.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "requires": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - } - }, - "array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.filter": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", - "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - } - }, - "array.prototype.findlast": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", - "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - } - }, - "array.prototype.findlastindex": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", - "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - } - }, - "array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", - "es-shim-unscopables": "^1.0.2" - } - }, - "arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "requires": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.3" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "auto-changelog": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.3.0.tgz", - "integrity": "sha512-S2B+RtTgytsa7l5iFGBoWT9W9ylITT5JJ8OaMJ7nrwvnlRm1dSS2tghaYueDeInZZafOE+1llH3tUQjMDRVS1g==", - "dev": true, - "requires": { - "commander": "^5.0.0", - "handlebars": "^4.7.3", - "node-fetch": "^2.6.0", - "parse-github-url": "^1.0.2", - "semver": "^6.3.0" - } - }, - "available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "requires": { - "possible-typed-array-names": "^1.0.0" - } - }, - "axios": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", - "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", - "requires": { - "follow-redirects": "^1.15.4", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "requires": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - } - }, - "babel-plugin-styled-components": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", - "integrity": "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "lodash": "^4.17.21", - "picomatch": "^2.3.1" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "optional": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "batch-processor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/batch-processor/-/batch-processor-1.0.0.tgz", - "integrity": "sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "requires": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - } - }, - "browserslist-to-esbuild": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserslist-to-esbuild/-/browserslist-to-esbuild-1.2.0.tgz", - "integrity": "sha512-ftrrbI/VHBgEnmnSyhkqvQVMp6jAKybfs0qMIlm7SLBrQTGMsdCIP4q3BoKeLsZTBQllIQtY9kbxgRYV2WU47g==", - "dev": true, - "requires": { - "browserslist": "^4.17.3" - } - }, - "btoa": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==" - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "peer": true - }, - "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==" - }, - "can-use-dom": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz", - "integrity": "sha512-ceOhN1DL7Y4O6M0j9ICgmTYziV89WMd96SvSl0REd8PMgrY0B/WBOPoed5S1KUmJqXgUXh8gzSe6E3ae27upsQ==" - }, - "caniuse-lite": { - "version": "1.0.30001597", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", - "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==" - }, - "canvg": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.10.tgz", - "integrity": "sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==", - "optional": true, - "requires": { - "@babel/runtime": "^7.12.5", - "@types/raf": "^3.4.0", - "core-js": "^3.8.3", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.7", - "rgbcolor": "^1.0.1", - "stackblur-canvas": "^2.0.0", - "svg-pathdata": "^6.0.3" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "optional": true - } - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" - }, - "character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" - }, - "character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" - }, - "chart.js": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz", - "integrity": "sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==" - }, - "cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "requires": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - } - }, - "cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "requires": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - } - }, - "chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "peer": true - }, - "classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" - }, - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true - }, - "compute-gcd": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", - "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==", - "requires": { - "validate.io-array": "^1.0.3", - "validate.io-function": "^1.0.2", - "validate.io-integer-array": "^1.0.0" - } - }, - "compute-lcm": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz", - "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==", - "requires": { - "compute-gcd": "^1.2.1", - "validate.io-array": "^1.0.3", - "validate.io-function": "^1.0.2", - "validate.io-integer-array": "^1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "copy-to-clipboard": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", - "requires": { - "toggle-selection": "^1.0.6" - } - }, - "core-js": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.0.tgz", - "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==" - }, - "cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "create-react-class": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", - "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", - "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==" - }, - "css-functions-list": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz", - "integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==", - "dev": true - }, - "css-line-break": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", - "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", - "optional": true, - "requires": { - "utrie": "^1.0.2" - } - }, - "css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - } - }, - "css-to-react-native": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "requires": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - }, - "csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "requires": { - "@babel/runtime": "^7.21.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true - } - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" - }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" - }, - "desandro-matches-selector": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/desandro-matches-selector/-/desandro-matches-selector-2.0.2.tgz", - "integrity": "sha512-+1q0nXhdzg1IpIJdMKalUwvvskeKnYyEe3shPRwedNcWtnhEKT3ZxvFjzywHDeGcKViIxTCAoOYQWP1qD7VNyg==" - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==" - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "requires": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "dompurify": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.7.tgz", - "integrity": "sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==", - "optional": true - }, - "domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - } - }, - "electron-to-chromium": { - "version": "1.4.701", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.701.tgz", - "integrity": "sha512-K3WPQ36bUOtXg/1+69bFlFOvdSm0/0bGqmsfPDLRXLanoKXdA+pIWuf/VbA9b+2CwBFuONgl4NEz4OEm+OJOKA==" - }, - "element-resize-detector": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.2.4.tgz", - "integrity": "sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==", - "requires": { - "batch-processor": "1.0.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "enhanced-resolve": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", - "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", - "peer": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" - }, - "enzyme": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz", - "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==", - "requires": { - "array.prototype.flat": "^1.2.3", - "cheerio": "^1.0.0-rc.3", - "enzyme-shallow-equal": "^1.0.1", - "function.prototype.name": "^1.1.2", - "has": "^1.0.3", - "html-element-map": "^1.2.0", - "is-boolean-object": "^1.0.1", - "is-callable": "^1.1.5", - "is-number-object": "^1.0.4", - "is-regex": "^1.0.5", - "is-string": "^1.0.5", - "is-subset": "^0.1.1", - "lodash.escape": "^4.0.1", - "lodash.isequal": "^4.5.0", - "object-inspect": "^1.7.0", - "object-is": "^1.0.2", - "object.assign": "^4.1.0", - "object.entries": "^1.1.1", - "object.values": "^1.1.1", - "raf": "^3.4.1", - "rst-selector-parser": "^2.2.3", - "string.prototype.trim": "^1.2.1" - } - }, - "enzyme-shallow-equal": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.7.tgz", - "integrity": "sha512-/um0GFqUXnpM9SvKtje+9Tjoz3f1fpBC3eXRFrNs8kpYn69JljciYP7KZTqM/YQbUY9KUjvKB4jo/q+L6WGGvg==", - "requires": { - "hasown": "^2.0.0", - "object-is": "^1.1.5" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.22.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", - "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", - "requires": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.1", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.0", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.5", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.14" - } - }, - "es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" - }, - "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "requires": { - "get-intrinsic": "^1.2.4" - } - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, - "es-iterator-helpers": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", - "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", - "dev": true, - "requires": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.4", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.0" - } - }, - "es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "peer": true - }, - "es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "requires": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - } - }, - "es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "requires": { - "hasown": "^2.0.0" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", - "dev": true, - "requires": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" - } - }, - "escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", - "dev": true, - "requires": {} - }, - "eslint-import-resolver-custom-alias": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-custom-alias/-/eslint-import-resolver-custom-alias-1.3.2.tgz", - "integrity": "sha512-wBPcZA2k6/IXaT8FsLMyiyVSG6WVEuaYIAbeKLXeGwr523BmeB9lKAAoLJWSqp3txsnU4gpkgD2x1q6K8k0uDQ==", - "dev": true, - "requires": { - "glob-parent": "^6.0.2", - "resolve": "^1.22.2" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "requires": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - } - } - }, - "eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-plugin-react": { - "version": "7.34.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz", - "integrity": "sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==", - "dev": true, - "requires": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - } - } - }, - "eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "requires": {} - }, - "eslint-plugin-react-refresh": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz", - "integrity": "sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==", - "dev": true, - "requires": {} - }, - "eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "ev-emitter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ev-emitter/-/ev-emitter-1.1.1.tgz", - "integrity": "sha512-ipiDYhdQSCZ4hSbX4rMW+XzNKMD1prg/sTvoVmSLkuQ1MVlwjJQQA+sW8tMYR3BLUr9KjodFV4pvzunvRhd33Q==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "peer": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true - }, - "fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fault": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", - "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", - "requires": { - "format": "^0.2.0" - } - }, - "fflate": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", - "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==" - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "final-form": { - "version": "4.20.10", - "resolved": "https://registry.npmjs.org/final-form/-/final-form-4.20.10.tgz", - "integrity": "sha512-TL48Pi1oNHeMOHrKv1bCJUrWZDcD3DIG6AGYVNOnyZPr7Bd/pStN0pL+lfzF5BNoj/FclaoiaLenk4XUIFVYng==", - "requires": { - "@babel/runtime": "^7.10.0" - } - }, - "final-form-arrays": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/final-form-arrays/-/final-form-arrays-3.1.0.tgz", - "integrity": "sha512-TWBvun+AopgBLw9zfTFHBllnKMVNEwCEyDawphPuBGGqNsuhGzhT7yewHys64KFFwzIs6KEteGLpKOwvTQEscQ==", - "requires": {} - }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "fizzy-ui-utils": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fizzy-ui-utils/-/fizzy-ui-utils-2.0.7.tgz", - "integrity": "sha512-CZXDVXQ1If3/r8s0T+v+qVeMshhfcuq0rqIFgJnrtd+Bu8GmDmqMjntjUePypVtjHXKJ6V4sw9zeyox34n9aCg==", - "requires": { - "desandro-matches-selector": "^2.0.0" - } - }, - "flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "requires": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==" - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" - } - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" - }, - "fuse.js": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.0.0.tgz", - "integrity": "sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q==" - }, - "fuzzysort": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/fuzzysort/-/fuzzysort-1.9.0.tgz", - "integrity": "sha512-MOxCT0qLTwLqmEwc7UtU045RKef7mc8Qz8eR4r2bLNEq9dy/c3ZKMEFp6IEst69otkQdFZ4FfgH2dmZD+ddX1g==" - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - } - }, - "get-size": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/get-size/-/get-size-2.0.3.tgz", - "integrity": "sha512-lXNzT/h/dTjTxRbm9BXb+SGxxzkm97h/PCIKtlN/CBCxxmkkIVV21udumMS93MuVTDX583gqc94v3RjuHmI+2Q==" - }, - "get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "requires": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "peer": true - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "requires": { - "define-properties": "^1.1.3" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", - "dev": true - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "peer": true - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==" - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "requires": { - "has-symbols": "^1.0.3" - } - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { - "function-bind": "^1.1.2" - } - }, - "hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" - }, - "hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", - "requires": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - } - }, - "highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "hotkeys-js": { - "version": "3.9.4", - "resolved": "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.9.4.tgz", - "integrity": "sha512-2zuLt85Ta+gIyvs4N88pCYskNrxf1TFv3LR9t5mdAZIX8BcgQQ48F2opUptvHa6m8zsy5v/a0i9mWzTrlNWU0Q==" - }, - "html-element-map": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz", - "integrity": "sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==", - "requires": { - "array.prototype.filter": "^1.0.0", - "call-bind": "^1.0.2" - } - }, - "html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "dev": true - }, - "html2canvas": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", - "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", - "optional": true, - "requires": { - "css-line-break": "^2.1.0", - "text-segmentation": "^1.0.3" - } - }, - "htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "husky": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", - "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", - "dev": true - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true - }, - "imagesloaded": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/imagesloaded/-/imagesloaded-4.1.4.tgz", - "integrity": "sha512-ltiBVcYpc/TYTF5nolkMNsnREHW+ICvfQ3Yla2Sgr71YFwQ86bDwV9hgpFhFtrGPuwEx5+LqOHIrdXBdoWwwsA==", - "requires": { - "ev-emitter": "^1.0.0" - } - }, - "immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" - }, - "immutable": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "requires": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" - }, - "is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" - }, - "is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "requires": { - "hasown": "^2.0.0" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" - }, - "is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "requires": { - "call-bind": "^1.0.7" - } - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==" - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "requires": { - "which-typed-array": "^1.1.14" - } - }, - "is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - } - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "requires": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "javascript-time-ago": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/javascript-time-ago/-/javascript-time-ago-2.5.9.tgz", - "integrity": "sha512-pQ8mNco/9g9TqWXWWjP0EWl6i/lAQScOyEeXy5AB+f7MfLSdgyV9BJhiOD1zrIac/lrxPYOWNbyl/IW8CW5n0A==", - "requires": { - "relative-time-format": "^1.1.6" - } - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "peer": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "json-schema-compare": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", - "integrity": "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==", - "requires": { - "lodash": "^4.17.4" - } - }, - "json-schema-merge-allof": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz", - "integrity": "sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==", - "requires": { - "compute-lcm": "^1.1.2", - "json-schema-compare": "^0.2.2", - "lodash": "^4.17.20" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - }, - "jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==" - }, - "jspdf": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz", - "integrity": "sha512-hXObxz7ZqoyhxET78+XR34Xu2qFGrJJ2I2bE5w4SM8eFaFEkW2xcGRVUss360fYelwRSid/jT078kbNvmoW0QA==", - "requires": { - "@babel/runtime": "^7.14.0", - "atob": "^2.1.2", - "btoa": "^1.2.1", - "canvg": "^3.0.6", - "core-js": "^3.6.0", - "dompurify": "^2.2.0", - "fflate": "^0.4.8", - "html2canvas": "^1.0.0-rc.5" - } - }, - "jspdf-autotable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-3.8.2.tgz", - "integrity": "sha512-zW1ix99/mtR4MbIni7IqvrpfHmuTaICl6iv6wqjRN86Nxtwaw/QtOeDbpXqYSzHIJK9JvgtLM283sc5x+ipkJg==", - "requires": {} - }, - "jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - } - }, - "keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "known-css-properties": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", - "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "peer": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "lodash.escape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", - "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==" - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==" - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lowlight": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", - "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", - "requires": { - "fault": "^1.0.0", - "highlight.js": "~10.7.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "markdown-to-jsx": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.1.tgz", - "integrity": "sha512-GbrbkTnHp9u6+HqbPRFJbObi369AgJNXi/sGqq5HRsoZW063xR1XDCaConqq+whfEIAlzB1YPnOgsPc7B7bc/A==", - "requires": {} - }, - "masonry-layout": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/masonry-layout/-/masonry-layout-4.2.2.tgz", - "integrity": "sha512-iGtAlrpHNyxaR19CvKC3npnEcAwszXoyJiI8ARV2ePi7fmYhIud25MHK8Zx4P0LCC4d3TNO9+rFa1KoK1OEOaA==", - "requires": { - "get-size": "^2.0.2", - "outlayer": "^2.1.0" - } - }, - "mathml-tag-names": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", - "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", - "dev": true - }, - "memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" - }, - "meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "peer": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" - }, - "monaco-editor": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.47.0.tgz", - "integrity": "sha512-VabVvHvQ9QmMwXu4du008ZDuyLnHs9j7ThVFsiJoXSOQk18+LF89N4ADzPbFenm0W4V2bGHnFBztIRQTgBfxzw==", - "peer": true - }, - "moo": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", - "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "nearley": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", - "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", - "requires": { - "commander": "^2.19.0", - "moo": "^0.5.0", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } - } - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "requires": { - "boolbase": "^1.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" - }, - "object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "object.groupby": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", - "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", - "dev": true, - "requires": { - "array.prototype.filter": "^1.0.3", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0" - } - }, - "object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dev": true, - "requires": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "requires": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - } - }, - "outlayer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/outlayer/-/outlayer-2.1.1.tgz", - "integrity": "sha512-+GplXsCQ3VrbGujAeHEzP9SXsBmJxzn/YdDSQZL0xqBmAWBmortu2Y9Gwdp9J0bgDQ8/YNIPMoBM13nTwZfAhw==", - "requires": { - "ev-emitter": "^1.0.0", - "fizzy-ui-utils": "^2.0.0", - "get-size": "^2.0.2" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "papaparse": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", - "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==" - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "parse-github-url": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "dev": true - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "requires": { - "entities": "^4.4.0" - } - }, - "parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "requires": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==" - }, - "postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", - "requires": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-combine-duplicated-selectors": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/postcss-combine-duplicated-selectors/-/postcss-combine-duplicated-selectors-10.0.3.tgz", - "integrity": "sha512-IP0BmwFloCskv7DV7xqvzDXqMHpwdczJa6ZvIW8abgHdcIHs9mCJX2ltFhu3EwA51ozp13DByng30+Ke+eIExA==", - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true - }, - "postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", - "dev": true - }, - "postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", - "dev": true, - "requires": {} - }, - "postcss-scss": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", - "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", - "dev": true, - "requires": {} - }, - "postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-sorting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-7.0.1.tgz", - "integrity": "sha512-iLBFYz6VRYyLJEJsBJ8M3TCqNcckVzz4wFounSc5Oez35ogE/X+aoC5fFu103Ot7NyvjU3/xqIXn93Gp3kJk4g==", - "dev": true, - "requires": {} - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" - }, - "promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "requires": { - "asap": "~2.0.6" - } - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "prop-types-extra": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", - "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", - "requires": { - "react-is": "^16.3.2", - "warning": "^4.0.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "requires": { - "xtend": "^4.0.0" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "requires": { - "performance-now": "^2.1.0" - } - }, - "railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==" - }, - "randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "requires": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "peer": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "react-app-polyfill": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz", - "integrity": "sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA==", - "requires": { - "core-js": "^3.6.5", - "object-assign": "^4.1.1", - "promise": "^8.1.0", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.7", - "whatwg-fetch": "^3.4.1" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - } - } - }, - "react-bootstrap": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.6.8.tgz", - "integrity": "sha512-yD6uN78XlFOkETQp6GRuVe0s5509x3XYx8PfPbirwFTYCj5/RfmSs9YZGCwkUrhZNFzj7tZPdpb+3k50mK1E4g==", - "requires": { - "@babel/runtime": "^7.14.0", - "@restart/context": "^2.1.4", - "@restart/hooks": "^0.4.7", - "@types/invariant": "^2.2.33", - "@types/prop-types": "^15.7.3", - "@types/react": ">=16.14.8", - "@types/react-transition-group": "^4.4.1", - "@types/warning": "^3.0.0", - "classnames": "^2.3.1", - "dom-helpers": "^5.2.1", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "prop-types-extra": "^1.1.0", - "react-overlays": "^5.1.2", - "react-transition-group": "^4.4.1", - "uncontrollable": "^7.2.1", - "warning": "^4.0.3" - } - }, - "react-copy-to-clipboard": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", - "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", - "requires": { - "copy-to-clipboard": "^3.3.1", - "prop-types": "^15.8.1" - } - }, - "react-data-table-component": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/react-data-table-component/-/react-data-table-component-7.6.2.tgz", - "integrity": "sha512-nHe7040fmtrJyQr/ieGrTfV0jBflYGK4sLokC6/AFOv3ThjmA9WzKz8Z8/2wMxzRqLU+Rn0CVFg+8+frKLepWQ==", - "requires": { - "deepmerge": "^4.3.1" - } - }, - "react-datepicker": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.25.0.tgz", - "integrity": "sha512-zB7CSi44SJ0sqo8hUQ3BF1saE/knn7u25qEMTO1CQGofY1VAKahO8k9drZtp0cfW1DMfoYLR3uSY1/uMvbEzbg==", - "requires": { - "@popperjs/core": "^2.11.8", - "classnames": "^2.2.6", - "date-fns": "^2.30.0", - "prop-types": "^15.7.2", - "react-onclickoutside": "^6.13.0", - "react-popper": "^2.3.0" - } - }, - "react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "requires": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - } - }, - "react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" - }, - "react-final-form": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/react-final-form/-/react-final-form-6.5.9.tgz", - "integrity": "sha512-x3XYvozolECp3nIjly+4QqxdjSSWfcnpGEL5K8OBT6xmGrq5kBqbA6+/tOqoom9NwqIPPbxPNsOViFlbKgowbA==", - "requires": { - "@babel/runtime": "^7.15.4" - } - }, - "react-final-form-arrays": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/react-final-form-arrays/-/react-final-form-arrays-3.1.4.tgz", - "integrity": "sha512-siVFAolUAe29rMR6u8VwepoysUcUdh6MLV2OWnCtKpsPRUdT9VUgECjAPaVMAH2GROZNiVB9On1H9MMrm9gdpg==", - "requires": { - "@babel/runtime": "^7.19.4" - } - }, - "react-final-form-listeners": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/react-final-form-listeners/-/react-final-form-listeners-1.0.3.tgz", - "integrity": "sha512-OrdCNxSS4JQS/EXD+R530kZKFqaPfa+WcXPgVro/h4BpaBDF/Ja+BtHyCzDezCIb5rWaGGdOJIj+tN2YdtvrXg==", - "requires": { - "@babel/runtime": "^7.12.5" - } - }, - "react-helmet-async": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", - "requires": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - } - }, - "react-hotkeys-hook": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/react-hotkeys-hook/-/react-hotkeys-hook-3.4.7.tgz", - "integrity": "sha512-+bbPmhPAl6ns9VkXkNNyxlmCAIyDAcWbB76O4I0ntr3uWCRuIQf/aRLartUahe9chVMPj+OEzzfk3CQSjclUEQ==", - "requires": { - "hotkeys-js": "3.9.4" - } - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "react-loading-skeleton": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.4.0.tgz", - "integrity": "sha512-1oJEBc9+wn7BbkQQk7YodlYEIjgeR+GrRjD+QXkVjwZN7LGIcAFHrx4NhT7UHGBxNY1+zax3c+Fo6XQM4R7CgA==", - "requires": {} - }, - "react-masonry-component": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/react-masonry-component/-/react-masonry-component-6.3.0.tgz", - "integrity": "sha512-4ZI78nxMfCpU5yQiS6Rup07Ju++YzcOGAyvbMcl2GfpZTw8GRwT548lkKr0PJarNicRV1qE2D/NiT26UPg1T7A==", - "requires": { - "create-react-class": "^15.6.2", - "element-resize-detector": "^1.1.9", - "imagesloaded": "^4.0.0", - "lodash": "^4.17.4", - "masonry-layout": "^4.2.0", - "prop-types": "^15.5.8" - } - }, - "react-media-hook": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/react-media-hook/-/react-media-hook-0.4.9.tgz", - "integrity": "sha512-FZr/2xA1+23vDJ1IZ794yLqMRRkBoCNOiJATdtTfB5GyVc5djf8FL2qEB/68pSkiNgHdHsmKknMSDr0sC4zBKQ==", - "requires": {} - }, - "react-onclickoutside": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.0.tgz", - "integrity": "sha512-ty8So6tcUpIb+ZE+1HAhbLROvAIJYyJe/1vRrrcmW+jLsaM+/powDRqxzo6hSh9CuRZGSL1Q8mvcF5WRD93a0A==", - "requires": {} - }, - "react-overlays": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.2.1.tgz", - "integrity": "sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA==", - "requires": { - "@babel/runtime": "^7.13.8", - "@popperjs/core": "^2.11.6", - "@restart/hooks": "^0.4.7", - "@types/warning": "^3.0.0", - "dom-helpers": "^5.2.0", - "prop-types": "^15.7.2", - "uncontrollable": "^7.2.1", - "warning": "^4.0.3" - } - }, - "react-papaparse": { - "version": "3.18.2", - "resolved": "https://registry.npmjs.org/react-papaparse/-/react-papaparse-3.18.2.tgz", - "integrity": "sha512-qDth1fWX198VQe7xpkSioK+7MqZc7TqLHCl7hGOz4KWL47AxrFhRjaZMphdX6z43TWCTUf+zhh7BYU2uSMVDkQ==", - "requires": { - "@types/papaparse": "^5.3.1", - "papaparse": "^5.3.1" - } - }, - "react-popper": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", - "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", - "requires": { - "react-fast-compare": "^3.0.1", - "warning": "^4.0.2" - } - }, - "react-redux": { - "version": "7.2.9", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", - "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", - "requires": { - "@babel/runtime": "^7.15.4", - "@types/react-redux": "^7.1.20", - "hoist-non-react-statics": "^3.3.2", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-is": "^17.0.2" - }, - "dependencies": { - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - } - } - }, - "react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true - }, - "react-router": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", - "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", - "requires": { - "@remix-run/router": "1.15.3" - } - }, - "react-router-dom": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", - "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", - "requires": { - "@remix-run/router": "1.15.3", - "react-router": "6.22.3" - } - }, - "react-select": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.8.0.tgz", - "integrity": "sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==", - "requires": { - "@babel/runtime": "^7.12.0", - "@emotion/cache": "^11.4.0", - "@emotion/react": "^11.8.1", - "@floating-ui/dom": "^1.0.1", - "@types/react-transition-group": "^4.4.0", - "memoize-one": "^6.0.0", - "prop-types": "^15.6.0", - "react-transition-group": "^4.3.0", - "use-isomorphic-layout-effect": "^1.1.2" - } - }, - "react-select-search": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/react-select-search/-/react-select-search-3.0.10.tgz", - "integrity": "sha512-K3Ww5HfOaoqgjNIZt++DMeSjWgu5T78d2xXt/hEa3ERLvEqfxBwXUML2E23goWGIUQBv2b+kGkb86YnOwH0hUw==", - "requires": { - "fuse.js": "^6.6.0" - }, - "dependencies": { - "fuse.js": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz", - "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==", - "optional": true - } - } - }, - "react-syntax-highlighter": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz", - "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==", - "requires": { - "@babel/runtime": "^7.3.1", - "highlight.js": "^10.4.1", - "lowlight": "^1.17.0", - "prismjs": "^1.27.0", - "refractor": "^3.6.0" - } - }, - "react-time-ago": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/react-time-ago/-/react-time-ago-7.3.1.tgz", - "integrity": "sha512-c6QKSRrnIhZiEbOa2PXdh1InNYpqX3wwXA0fuOFX4r/C2hdt5hNvjvKXbKbGWXAeumMi9DoS3oGPboEpgccnOQ==", - "requires": { - "memoize-one": "^6.0.0", - "prop-types": "^15.8.1", - "raf": "^3.4.1" - } - }, - "react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "requires": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "redux": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.1.tgz", - "integrity": "sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw==", - "requires": { - "@babel/runtime": "^7.9.2" - } - }, - "redux-immutable-state-invariant": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/redux-immutable-state-invariant/-/redux-immutable-state-invariant-2.1.0.tgz", - "integrity": "sha512-3czbDKs35FwiBRsx/3KabUk5zSOoTXC+cgVofGkpBNv3jQcqIe5JrHcF5AmVt7B/4hyJ8MijBIpCJ8cife6yJg==", - "dev": true, - "requires": { - "invariant": "^2.1.0", - "json-stringify-safe": "^5.0.1" - } - }, - "redux-persist": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz", - "integrity": "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==", - "requires": {} - }, - "redux-thunk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", - "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", - "requires": {} - }, - "reflect.getprototypeof": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", - "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0", - "get-intrinsic": "^1.2.3", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - } - }, - "refractor": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", - "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", - "requires": { - "hastscript": "^6.0.0", - "parse-entities": "^2.0.0", - "prismjs": "~1.27.0" - }, - "dependencies": { - "prismjs": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", - "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==" - } - } - }, - "regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "requires": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - } - }, - "relative-time-format": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/relative-time-format/-/relative-time-format-1.1.6.tgz", - "integrity": "sha512-aCv3juQw4hT1/P/OrVltKWLlp15eW1GRcwP1XdxHrPdZE9MtgqFpegjnTjLhi2m2WI9MT/hQQtE+tjEWG1hgkQ==" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "reselect": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", - "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" - }, - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rgbcolor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", - "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==", - "optional": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz", - "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==", - "dev": true, - "requires": { - "@rollup/rollup-android-arm-eabi": "4.13.0", - "@rollup/rollup-android-arm64": "4.13.0", - "@rollup/rollup-darwin-arm64": "4.13.0", - "@rollup/rollup-darwin-x64": "4.13.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.13.0", - "@rollup/rollup-linux-arm64-gnu": "4.13.0", - "@rollup/rollup-linux-arm64-musl": "4.13.0", - "@rollup/rollup-linux-riscv64-gnu": "4.13.0", - "@rollup/rollup-linux-x64-gnu": "4.13.0", - "@rollup/rollup-linux-x64-musl": "4.13.0", - "@rollup/rollup-win32-arm64-msvc": "4.13.0", - "@rollup/rollup-win32-ia32-msvc": "4.13.0", - "@rollup/rollup-win32-x64-msvc": "4.13.0", - "@types/estree": "1.0.5", - "fsevents": "~2.3.2" - } - }, - "rst-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", - "integrity": "sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==", - "requires": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "requires": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "peer": true - }, - "safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "requires": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sass": { - "version": "1.71.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz", - "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==", - "dev": true, - "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - } - }, - "scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "peer": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peer": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "peer": true - } - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - }, - "serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "peer": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, - "set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - } - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "simplebar": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/simplebar/-/simplebar-5.3.9.tgz", - "integrity": "sha512-1vIIpjDvY9sVH14e0LGeiCiTFU3ILqAghzO6OI9axeG+mvU/vMSrvXeAXkBolqFFz3XYaY8n5ahH9MeP3sp2Ag==", - "requires": { - "@juggle/resize-observer": "^3.3.1", - "can-use-dom": "^0.1.0", - "core-js": "^3.0.1", - "lodash.debounce": "^4.0.8", - "lodash.memoize": "^4.1.2", - "lodash.throttle": "^4.1.1" - } - }, - "simplebar-react": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/simplebar-react/-/simplebar-react-2.4.3.tgz", - "integrity": "sha512-Ep8gqAUZAS5IC2lT5RE4t1ZFUIVACqbrSRQvFV9a6NbVUzXzOMnc4P82Hl8Ak77AnPQvmgUwZS7aUKLyBoMAcg==", - "requires": { - "prop-types": "^15.6.1", - "simplebar": "^5.3.9" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" - }, - "source-map-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", - "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", - "requires": { - "abab": "^2.0.5", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.1" - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "peer": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" - }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", - "dev": true - }, - "stackblur-canvas": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz", - "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==", - "optional": true - }, - "state-local": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", - "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - } - }, - "string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true - }, - "styled-components": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz", - "integrity": "sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^1.1.0", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - }, - "dependencies": { - "@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - } - } - }, - "stylelint": { - "version": "14.16.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", - "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.2", - "balanced-match": "^2.0.0", - "colord": "^2.9.3", - "cosmiconfig": "^7.1.0", - "css-functions-list": "^3.1.0", - "debug": "^4.3.4", - "fast-glob": "^3.2.12", - "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^6.0.1", - "global-modules": "^2.0.0", - "globby": "^11.1.0", - "globjoin": "^0.1.4", - "html-tags": "^3.2.0", - "ignore": "^5.2.1", - "import-lazy": "^4.0.0", - "imurmurhash": "^0.1.4", - "is-plain-object": "^5.0.0", - "known-css-properties": "^0.26.0", - "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.19", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "resolve-from": "^5.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", - "supports-hyperlinks": "^2.3.0", - "svg-tags": "^1.0.0", - "table": "^6.8.1", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^4.0.2" - }, - "dependencies": { - "balanced-match": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", - "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "stylelint-config-sass-guidelines": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-9.0.1.tgz", - "integrity": "sha512-N06PsVsrgKijQ3YT5hqKA7x3NUkgELTRI1cbWMqcYiCGG6MjzvNk6Cb5YYA1PrvrksBV76BvY9P9bAswojVMqA==", - "dev": true, - "requires": { - "postcss-scss": "^4.0.2", - "stylelint-order": "^5.0.0", - "stylelint-scss": "^4.0.0" - } - }, - "stylelint-order": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-5.0.0.tgz", - "integrity": "sha512-OWQ7pmicXufDw5BlRqzdz3fkGKJPgLyDwD1rFY3AIEfIH/LQY38Vu/85v8/up0I+VPiuGRwbc2Hg3zLAsJaiyw==", - "dev": true, - "requires": { - "postcss": "^8.3.11", - "postcss-sorting": "^7.0.1" - } - }, - "stylelint-scss": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.7.0.tgz", - "integrity": "sha512-TSUgIeS0H3jqDZnby1UO1Qv3poi1N8wUYIJY6D1tuUq2MN3lwp/rITVo0wD+1SWTmRm0tNmGO0b7nKInnqF6Hg==", - "dev": true, - "requires": { - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0" - } - }, - "stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "svg-pathdata": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", - "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==", - "optional": true - }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", - "dev": true - }, - "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "peer": true - }, - "terser": { - "version": "5.29.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", - "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", - "peer": true, - "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "peer": true - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "peer": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - } - }, - "text-segmentation": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", - "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", - "optional": true, - "requires": { - "utrie": "^1.0.2" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - }, - "typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - } - }, - "typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "requires": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - } - }, - "typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - } - }, - "typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", - "requires": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - } - }, - "uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "uncontrollable": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", - "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", - "requires": { - "@babel/runtime": "^7.6.3", - "@types/react": ">=16.9.11", - "invariant": "^2.2.4", - "react-lifecycles-compat": "^3.0.4" - } - }, - "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "use-isomorphic-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "requires": {} - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "utrie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", - "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", - "optional": true, - "requires": { - "base64-arraybuffer": "^1.0.2" - } - }, - "v8-compile-cache": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", - "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate.io-array": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", - "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==" - }, - "validate.io-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz", - "integrity": "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==" - }, - "validate.io-integer": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", - "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==", - "requires": { - "validate.io-number": "^1.0.3" - } - }, - "validate.io-integer-array": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz", - "integrity": "sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==", - "requires": { - "validate.io-array": "^1.0.3", - "validate.io-integer": "^1.0.4" - } - }, - "validate.io-number": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", - "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==" - }, - "vite": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz", - "integrity": "sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==", - "dev": true, - "requires": { - "esbuild": "^0.19.3", - "fsevents": "~2.3.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" - } - }, - "vite-plugin-eslint": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/vite-plugin-eslint/-/vite-plugin-eslint-1.8.1.tgz", - "integrity": "sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^4.2.1", - "@types/eslint": "^8.4.5", - "rollup": "^2.77.2" - }, - "dependencies": { - "rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - } - } - }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "peer": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "webpack": { - "version": "5.90.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", - "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", - "peer": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "peer": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "peer": true - } - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "peer": true - }, - "whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, - "requires": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - } - }, - "which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "requires": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - } - }, - "which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } From 131df0fa9e0e6aadc0d7d541e8ddbd185ac6d81c Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Mon, 18 Mar 2024 14:10:27 +0100 Subject: [PATCH 046/133] fixes edit user bug --- src/views/identity/administration/Users.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/views/identity/administration/Users.jsx b/src/views/identity/administration/Users.jsx index ef2ce6722b7a..28d8da226e8b 100644 --- a/src/views/identity/administration/Users.jsx +++ b/src/views/identity/administration/Users.jsx @@ -16,8 +16,9 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { const tenant = useSelector((state) => state.app.currentTenant) const [ocVisible, setOCVisible] = useState(false) const viewLink = `/identity/administration/users/view?userId=${row.id}&tenantDomain=${tenant.defaultDomainName}&userEmail=${row.userPrincipalName}` - const editLink = `/identity/administration/users/edit?userId=${row.id}&tenantDomain=${tenant.defaultDomainName}` - const OffboardLink = `/identity/administration/offboarding-wizard?userId=${row.id}&tenantDomain=${tenant.defaultDomainName}` + const editLink = row?.tenant + ? `/identity/administration/users/edit?userId=${row.id}&tenantDomain=${row.Tenant}` + : `/identity/administration/users/edit?userId=${row.id}&tenantDomain=${tenant.defaultDomainName}` const entraLink = `https://entra.microsoft.com/${tenant.defaultDomainName}/#view/Microsoft_AAD_UsersAndTenants/UserProfileMenuBlade/~/UserAuthMethods/userId/${row.id}/hidePreviewBanner~/true` let licenses = [] @@ -31,7 +32,6 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { }) var licJoined = licenses.join(', ') - //console.log(row) return ( <> From 86137e5c5017651decf3e84a901617d168d95f4e Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Tue, 19 Mar 2024 11:03:53 +0100 Subject: [PATCH 047/133] users fix --- src/views/identity/administration/Users.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/views/identity/administration/Users.jsx b/src/views/identity/administration/Users.jsx index 28d8da226e8b..51cef1f0eede 100644 --- a/src/views/identity/administration/Users.jsx +++ b/src/views/identity/administration/Users.jsx @@ -15,7 +15,9 @@ import CippGraphUserFilter from 'src/components/utilities/CippGraphUserFilter' const Offcanvas = (row, rowIndex, formatExtraData) => { const tenant = useSelector((state) => state.app.currentTenant) const [ocVisible, setOCVisible] = useState(false) - const viewLink = `/identity/administration/users/view?userId=${row.id}&tenantDomain=${tenant.defaultDomainName}&userEmail=${row.userPrincipalName}` + const viewLink = row?.tenant + ? `/identity/administration/users/view?userId=${row.id}&tenantDomain=${row.Tenant}&userEmail=${row.userPrincipalName}` + : `/identity/administration/users/view?userId=${row.id}&tenantDomain=${tenant.defaultDomainName}&userEmail=${row.userPrincipalName}` const editLink = row?.tenant ? `/identity/administration/users/edit?userId=${row.id}&tenantDomain=${row.Tenant}` : `/identity/administration/users/edit?userId=${row.id}&tenantDomain=${tenant.defaultDomainName}` From ac12ae9e770a1682e374de758814b7c8d202a58d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Wed, 20 Mar 2024 18:48:58 +0100 Subject: [PATCH 048/133] DisableAppCreation standard --- src/data/standards.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/data/standards.json b/src/data/standards.json index 01394297cd34..95cc1a746259 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -299,6 +299,16 @@ "impact": "Low Impact", "impactColour": "info" }, + { + "name": "standards.DisableAppCreation", + "cat": "Entra (AAD) Standards", + "tag": ["lowimpact", "CIS"], + "helpText": "Disables the ability for users to create App registrations in the tenant.", + "addedComponent": [], + "label": "Disable App creation by users", + "impact": "Low Impact", + "impactColour": "info" + }, { "name": "standards.DisableSecurityGroupUsers", "cat": "Entra (AAD) Standards", From 0ce920a3e2efa71e1fc000b5039de9785aded4da Mon Sep 17 00:00:00 2001 From: John Duprey Date: Fri, 22 Mar 2024 08:52:03 -0400 Subject: [PATCH 049/133] Update formatters for alerts/scheduler --- src/views/cipp/Scheduler.jsx | 2 +- src/views/tenant/administration/AlertRules.jsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/views/cipp/Scheduler.jsx b/src/views/cipp/Scheduler.jsx index dc886acac1aa..55d3430d545d 100644 --- a/src/views/cipp/Scheduler.jsx +++ b/src/views/cipp/Scheduler.jsx @@ -149,7 +149,7 @@ const Scheduler = () => { name: 'Parameters', selector: (row) => row['Parameters'], sortable: true, - cell: (row) => CellTip(row['Parameters']), + cell: cellGenericFormatter(), exportSelector: 'Parameters', }, { diff --git a/src/views/tenant/administration/AlertRules.jsx b/src/views/tenant/administration/AlertRules.jsx index 13d3636bab4e..589acdb9909b 100644 --- a/src/views/tenant/administration/AlertRules.jsx +++ b/src/views/tenant/administration/AlertRules.jsx @@ -114,14 +114,14 @@ const AlertRules = () => { name: 'If', selector: (row) => row['if'], sortable: true, - cell: cellBadgeFormatter(), + cell: cellGenericFormatter(), exportSelector: 'if', }, { name: 'Execute', selector: (row) => row['execution'], sortable: true, - cell: (row) => CellTip(row['execution']), + cell: cellGenericFormatter(), exportSelector: 'execution', }, { From 393066fe3bbfd35ca7bbaffbd7e156b869d8a6f7 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Fri, 22 Mar 2024 09:43:55 -0400 Subject: [PATCH 050/133] up version --- package.json | 2 +- public/version_latest.txt | 2 +- version_latest.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index a7ddc9af6fc3..5103fa09b1bc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cipp", - "version": "5.3.1", + "version": "5.3.2", "description": "The CyberDrain Improved Partner Portal is a portal to help manage administration for Microsoft Partners.", "homepage": "https://cipp.app/", "bugs": { diff --git a/public/version_latest.txt b/public/version_latest.txt index c7cb1311a645..84197c89467d 100644 --- a/public/version_latest.txt +++ b/public/version_latest.txt @@ -1 +1 @@ -5.3.1 +5.3.2 diff --git a/version_latest.txt b/version_latest.txt index c7cb1311a645..84197c89467d 100644 --- a/version_latest.txt +++ b/version_latest.txt @@ -1 +1 @@ -5.3.1 +5.3.2 From 211f2de6dbd65916c7a0dcea3657b92b2c8ba6c5 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Fri, 22 Mar 2024 09:43:59 -0400 Subject: [PATCH 051/133] Update package-lock.json --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9cef69b03bd6..99f82d32aada 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cipp", - "version": "5.3.1", + "version": "5.3.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cipp", - "version": "5.3.1", + "version": "5.3.2", "license": "AGPL-3.0", "dependencies": { "@coreui/chartjs": "^3.0.0", From 8514b48d75bebb41cd7ba85bc072f7b004dfd62b Mon Sep 17 00:00:00 2001 From: Esco Date: Fri, 22 Mar 2024 15:02:22 +0100 Subject: [PATCH 052/133] Add boolean switch to standards list --- src/views/tenant/standards/ListAppliedStandards.jsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/views/tenant/standards/ListAppliedStandards.jsx b/src/views/tenant/standards/ListAppliedStandards.jsx index 61c50f1a0d99..ba5c10a14601 100644 --- a/src/views/tenant/standards/ListAppliedStandards.jsx +++ b/src/views/tenant/standards/ListAppliedStandards.jsx @@ -493,6 +493,13 @@ const ApplyNewStandard = () => { label={component.label} /> )} + {component.type === 'boolean' && ( + + )} {component.type === 'AdminRolesMultiSelect' && ( Date: Wed, 20 Mar 2024 14:09:47 +0100 Subject: [PATCH 053/133] SafeLinks Standard * Add SafeLinks Policy Standard * SafeLinks Policy Label fix * SafeLink Policy use boolean * Revert "SafeLink Policy use boolean" * boolean test * Added EnableOrganizationBranding to SafeLink option * Move SafeLinksPolicy to Defender Standard --- src/data/standards.json | 74 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/src/data/standards.json b/src/data/standards.json index 95cc1a746259..3216c32f5289 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -736,6 +736,80 @@ "impact": "Medium Impact", "impactColour": "warning" }, + { + "name": "standards.SafeLinksPolicy", + "cat": "Defender Standards", + "tag": ["lowimpact", "CIS"], + "helpText": "Creates a SafeLinks Policy", + "addedComponent": [ + { + "type": "input", + "name": "standards.SafeLinksPolicy.Name", + "label": "SafeLink Policy Name" + }, + { + "type": "boolean", + "label": "EnableSafeLinksForEmail", + "name": "standards.SafeLinksPolicy.EnableSafeLinksForEmail", + "default": true + }, + { + "type": "boolean", + "label": "EnableSafeLinksForTeams", + "name": "standards.SafeLinksPolicy.EnableSafeLinksForTeams", + "default": true + }, + { + "type": "boolean", + "label": "EnableSafeLinksForOffice", + "name": "standards.SafeLinksPolicy.EnableSafeLinksForOffice", + "default": true + }, + { + "type": "boolean", + "label": "TrackClicks", + "name": "standards.SafeLinksPolicy.TrackClicks", + "default": true + }, + { + "type": "boolean", + "label": "ScanUrls", + "name": "standards.SafeLinksPolicy.ScanUrls", + "default": true + }, + { + "type": "boolean", + "label": "EnableForInternalSenders", + "name": "standards.SafeLinksPolicy.EnableForInternalSenders", + "default": true + }, + { + "type": "boolean", + "label": "DeliverMessageAfterScan", + "name": "standards.SafeLinksPolicy.DeliverMessageAfterScan", + "default": true + }, + { + "type": "boolean", + "label": "AllowClickThrough", + "name": "standards.SafeLinksPolicy.AllowClickThrough", + "default": false + }, + { + "type": "boolean", + "label": "DisableUrlRewrite", + "name": "standards.SafeLinksPolicy.DisableUrlRewrite" + }, + { + "type": "boolean", + "label": "EnableOrganizationBranding", + "name": "standards.SafeLinksPolicy.EnableOrganizationBranding" + } + ], + "label": "SafeLinks Policy", + "impact": "Low Impact", + "impactColour": "info" + }, { "name": "standards.intuneDeviceRetirementDays", "cat": "Intune Standards", From 861bc9a8755ff042f0062ca4dfddee816410674a Mon Sep 17 00:00:00 2001 From: Esco Date: Fri, 22 Mar 2024 17:33:12 +0100 Subject: [PATCH 054/133] Updated Name label --- src/data/standards.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/standards.json b/src/data/standards.json index 3216c32f5289..983edbff3c13 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -745,7 +745,7 @@ { "type": "input", "name": "standards.SafeLinksPolicy.Name", - "label": "SafeLink Policy Name" + "label": "Policy Name" }, { "type": "boolean", From 78899c02a71e90ee7fa268ce7e9eda5d7a89b9d6 Mon Sep 17 00:00:00 2001 From: Esco Date: Mon, 25 Mar 2024 12:36:45 +0100 Subject: [PATCH 055/133] Changed according to feedback --- src/data/standards.json | 52 ++--------------------------------------- 1 file changed, 2 insertions(+), 50 deletions(-) diff --git a/src/data/standards.json b/src/data/standards.json index 983edbff3c13..7ae40c0bb1a9 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -740,60 +740,12 @@ "name": "standards.SafeLinksPolicy", "cat": "Defender Standards", "tag": ["lowimpact", "CIS"], - "helpText": "Creates a SafeLinks Policy", + "helpText": "This creates a safelink policy that automatically scans, tracks, and and enables safe links for Email, Office, and Teams for both external and internal senders", "addedComponent": [ - { - "type": "input", - "name": "standards.SafeLinksPolicy.Name", - "label": "Policy Name" - }, - { - "type": "boolean", - "label": "EnableSafeLinksForEmail", - "name": "standards.SafeLinksPolicy.EnableSafeLinksForEmail", - "default": true - }, - { - "type": "boolean", - "label": "EnableSafeLinksForTeams", - "name": "standards.SafeLinksPolicy.EnableSafeLinksForTeams", - "default": true - }, - { - "type": "boolean", - "label": "EnableSafeLinksForOffice", - "name": "standards.SafeLinksPolicy.EnableSafeLinksForOffice", - "default": true - }, - { - "type": "boolean", - "label": "TrackClicks", - "name": "standards.SafeLinksPolicy.TrackClicks", - "default": true - }, - { - "type": "boolean", - "label": "ScanUrls", - "name": "standards.SafeLinksPolicy.ScanUrls", - "default": true - }, - { - "type": "boolean", - "label": "EnableForInternalSenders", - "name": "standards.SafeLinksPolicy.EnableForInternalSenders", - "default": true - }, - { - "type": "boolean", - "label": "DeliverMessageAfterScan", - "name": "standards.SafeLinksPolicy.DeliverMessageAfterScan", - "default": true - }, { "type": "boolean", "label": "AllowClickThrough", - "name": "standards.SafeLinksPolicy.AllowClickThrough", - "default": false + "name": "standards.SafeLinksPolicy.AllowClickThrough" }, { "type": "boolean", From 6b557bfc9bf8c1e291f0a8e1dcc0618ae48d5b8a Mon Sep 17 00:00:00 2001 From: Esco Date: Mon, 25 Mar 2024 13:04:46 +0100 Subject: [PATCH 056/133] Updated label name --- src/data/standards.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/standards.json b/src/data/standards.json index 7ae40c0bb1a9..6d26445f6515 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -758,7 +758,7 @@ "name": "standards.SafeLinksPolicy.EnableOrganizationBranding" } ], - "label": "SafeLinks Policy", + "label": "Default SafeLinks Policy", "impact": "Low Impact", "impactColour": "info" }, From fcfeed9301d248dd3082262505659ca4f72c4b55 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Mon, 25 Mar 2024 17:16:46 +0100 Subject: [PATCH 057/133] bulk user adds --- src/routes.js | 8 + .../identity/administration/AddUserBulk.jsx | 256 ++++++++++++++++++ 2 files changed, 264 insertions(+) create mode 100644 src/views/identity/administration/AddUserBulk.jsx diff --git a/src/routes.js b/src/routes.js index 4f119b52d8c8..e5e5e35ebb9a 100644 --- a/src/routes.js +++ b/src/routes.js @@ -8,6 +8,8 @@ const Users = React.lazy(() => import('src/views/identity/administration/Users') const DeletedItems = React.lazy(() => import('src/views/identity/administration/Deleted')) const ViewBEC = React.lazy(() => import('src/views/identity/administration/ViewBEC')) const AddUser = React.lazy(() => import('src/views/identity/administration/AddUser')) +const AddUserBulk = React.lazy(() => import('src/views/identity/administration/AddUserBulk')) + const InviteGuest = React.lazy(() => import('src/views/identity/administration/InviteGuest')) const EditUser = React.lazy(() => import('src/views/identity/administration/EditUser')) const ViewUser = React.lazy(() => import('src/views/identity/administration/ViewUser')) @@ -251,6 +253,12 @@ const routes = [ { path: '/cipp/500', name: 'Error', component: Page500 }, { path: '/identity', name: 'Identity' }, { path: '/identity/administration/users/add', name: 'Add User', component: AddUser }, + { + path: '/identity/administration/users/addbulk', + name: 'Add User Bulk', + component: AddUserBulk, + }, + { path: '/identity/administration/users/edit', name: 'Edit User', component: EditUser }, { path: '/identity/administration/users/view', name: 'View User', component: ViewUser }, { diff --git a/src/views/identity/administration/AddUserBulk.jsx b/src/views/identity/administration/AddUserBulk.jsx new file mode 100644 index 000000000000..9b1e6dd3a507 --- /dev/null +++ b/src/views/identity/administration/AddUserBulk.jsx @@ -0,0 +1,256 @@ +import React, { useState } from 'react' +import { CButton, CCallout, CCol, CRow, CSpinner } from '@coreui/react' +import { Field, FormSpy } from 'react-final-form' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { faExclamationTriangle, faPlus, faTrash } from '@fortawesome/free-solid-svg-icons' +import { CippCallout, CippWizard } from 'src/components/layout' +import PropTypes from 'prop-types' +import { RFFCFormInput } from 'src/components/forms' +import { CippTable } from 'src/components/tables' +import { CippCodeBlock, TenantSelector } from 'src/components/utilities' +import { CSVReader } from 'react-papaparse' +import { useLazyGenericPostRequestQuery } from 'src/store/api/app' +import { useSelector } from 'react-redux' + +const Error = ({ name }) => ( + + touched && error ? ( + + + {error} + + ) : null + } + /> +) + +Error.propTypes = { + name: PropTypes.string.isRequired, +} + +const AddUserBulk = () => { + const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery() + const [BulkUser, setBulkUser] = useState([]) + const currentSettings = useSelector((state) => state.app) + const addedFields = currentSettings?.userSettingsDefaults?.defaultAttributes + ? //if we have default attributes, add the label object to the fields array + currentSettings.userSettingsDefaults.defaultAttributes.map((item) => item.label) + : [] + const fields = [ + 'givenName', + 'surName', + 'displayName', + 'mailNickName', + 'domain', + 'usageLocation', + 'JobTitle', + 'streetAddress', + 'PostalCode', + 'City', + 'State', + 'Department', + 'MobilePhone', + 'businessPhones', + ...addedFields, + ] + const columns = fields.map((field) => { + return { + name: field, + selector: (row) => row[field], + sortable: true, + } + }) + + const tableColumns = [ + ...columns, + { + name: 'Remove', + button: true, + cell: (row, index) => { + return ( + handleRemove(row)} size="sm" variant="ghost" color="danger"> + + + ) + }, + }, + ] + const valbutton = (value) => + BulkUser.length + ? undefined + : 'You must add at least one user. Did you forget to click add or upload the CSV?' + const handleOnDrop = (data) => { + const importdata = data.map((item) => { + //find any keys that have a null or blank string value, and remove them + Object.keys(item.data).forEach((key) => { + if (item.data[key] === null || item.data[key] === '') { + delete item.data[key] + } + }) + return item.data + }) + setBulkUser([...BulkUser, ...importdata]) + // console.log(importdata) + } + + const handleOnError = (err, file, inputElem, reason) => { + //set upload error + } + const tenantDomain = useSelector((state) => state.app.currentTenant.defaultDomainName) + + const handleSubmit = async (values) => { + const shippedValues = { + TenantFilter: tenantDomain, + BulkUser, + ...values, + } + //alert(JSON.stringify(values, null, 2)) + genericPostRequest({ path: '/api/AddUserBulk', values: shippedValues }) + } + const addRowtoData = (values) => { + setBulkUser((prevState) => { + if (prevState) { + return [values, ...prevState] + } else { + return [values] + } + }) + } + const handleRemove = async (itemindex) => { + let RemovedItems = BulkUser.filter((item) => item !== itemindex) + setBulkUser((prevState) => { + return RemovedItems + }) + } + return ( + + +
    +

    Step 1

    +
    Choose a tenant
    +
    +
    + {(props) => } + +
    +
    + +
    +

    Step 2

    +
    Enter user information
    +
    +
    + + + + Drop CSV file here or click to upload. + + +

    + + {fields.map((field, idx) => { + return ( + + + + ) + })} + + + {/* eslint-disable react/prop-types */} + {(props) => { + return ( + <> + addRowtoData(props.values)} + name="addButton" + className="mb-3" + > + + Add + + + ) + }} + + + + + + + + {BulkUser && ( + + )} + + + +
    +
    + +
    +

    Step 4

    +
    Confirm and apply
    +
    + {postResults.isFetching && ( + + Loading + + )} +

    + {postResults.isSuccess && ( + { + return

  • {item}
  • + })} + callout={true} + calloutCopyValue={postResults.data?.Results} + /> + )} +

    + {BulkUser && ( + + )} +
    +
    +
    +
    + ) +} + +export default AddUserBulk From df8e01138985ae50ae2d179bdeff11d61d330722 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Tue, 26 Mar 2024 12:30:46 +0100 Subject: [PATCH 058/133] create --- src/_nav.jsx | 7 +- src/routes.js | 16 ++- src/views/endpoint/intune/MEMAddPolicy.jsx | 1 + .../endpoint/intune/MEMListAppProtection.jsx | 131 ++++++++++++++++++ src/views/endpoint/intune/MEMListPolicies.jsx | 2 +- src/views/identity/administration/Users.jsx | 7 + 6 files changed, 161 insertions(+), 3 deletions(-) create mode 100644 src/views/endpoint/intune/MEMListAppProtection.jsx diff --git a/src/_nav.jsx b/src/_nav.jsx index d701c055f36d..77c84d57f31a 100644 --- a/src/_nav.jsx +++ b/src/_nav.jsx @@ -481,9 +481,14 @@ const _nav = [ }, { component: CNavItem, - name: 'MEM Policies', + name: 'Configuration Policies', to: '/endpoint/MEM/list-policies', }, + { + component: CNavItem, + name: 'Protection Policies', + to: '/endpoint/MEM/list-appprotection-policies', + }, { component: CNavItem, name: 'Apply Policy', diff --git a/src/routes.js b/src/routes.js index e5e5e35ebb9a..d5b459b465b9 100644 --- a/src/routes.js +++ b/src/routes.js @@ -130,6 +130,10 @@ const AutopilotListStatusPages = React.lazy(() => import('src/views/endpoint/autopilot/AutopilotListStatusPages'), ) const IntuneListPolicies = React.lazy(() => import('src/views/endpoint/intune/MEMListPolicies')) +const IntuneListAppProtection = React.lazy(() => + import('src/views/endpoint/intune/MEMListAppProtection'), +) + const MEMEditPolicy = React.lazy(() => import('src/views/endpoint/intune/MEMEditPolicy')) const IntuneCAPolicies = React.lazy(() => import('src/views/endpoint/intune/MEMCAPolicies')) @@ -481,7 +485,17 @@ const routes = [ component: AutopilotListStatusPages, }, { path: '/endpoint/MEM', name: 'MEM' }, - { path: '/endpoint/MEM/list-policies', name: 'List MEM Policies', component: IntuneListPolicies }, + { + path: '/endpoint/MEM/list-policies', + name: 'List Intune Policies', + component: IntuneListPolicies, + }, + { + path: '/endpoint/MEM/list-appprotection-policies', + name: 'List App Protection Policies', + component: IntuneListAppProtection, + }, + { path: '/endpoint/MEM/edit-policy', name: 'Edit MEM Policy', component: MEMEditPolicy }, { path: '/endpoint/MEM/ca-policies', name: 'List Status Pages', component: IntuneCAPolicies }, { path: '/endpoint/MEM/add-policy', name: 'Add Intune Policy', component: IntuneAddPolicy }, diff --git a/src/views/endpoint/intune/MEMAddPolicy.jsx b/src/views/endpoint/intune/MEMAddPolicy.jsx index 6c7efa88c689..00987200dc65 100644 --- a/src/views/endpoint/intune/MEMAddPolicy.jsx +++ b/src/views/endpoint/intune/MEMAddPolicy.jsx @@ -170,6 +170,7 @@ const AddPolicy = () => { { label: 'Administrative Template', value: 'Admin' }, { label: 'Settings Catalog', value: 'Catalog' }, { label: 'Custom Configuration', value: 'Device' }, + { label: 'App Protection or Configuration Policy', value: 'AppProtection' }, ]} />
    diff --git a/src/views/endpoint/intune/MEMListAppProtection.jsx b/src/views/endpoint/intune/MEMListAppProtection.jsx new file mode 100644 index 000000000000..9f63b4820fde --- /dev/null +++ b/src/views/endpoint/intune/MEMListAppProtection.jsx @@ -0,0 +1,131 @@ +import React, { useState } from 'react' +import { useSelector } from 'react-redux' +import { CButton } from '@coreui/react' +import { + faBook, + faEdit, + faEllipsisV, + faGlobeEurope, + faPager, + faTrashAlt, + faUser, +} from '@fortawesome/free-solid-svg-icons' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { CippPageList } from 'src/components/layout' +import { Link } from 'react-router-dom' +import { CippActionsOffcanvas, CippCodeBlock } from 'src/components/utilities' +import { TitleButton } from 'src/components/buttons' +import { cellBooleanFormatter, cellDateFormatter } from 'src/components/tables' + +const Actions = (row, rowIndex, formatExtraData) => { + const [ocVisible, setOCVisible] = useState(false) + console.log(row) + const tenant = useSelector((state) => state.app.currentTenant) + return ( + <> + setOCVisible(true)}> + + + , + modalUrl: `/api/AddIntuneTemplate?TenantFilter=${tenant.defaultDomainName}&ID=${row.id}&URLName=managedAppPolicies`, + modalMessage: 'Are you sure you want to create a template based on this policy?', + }, + { + label: 'Delete Policy', + color: 'danger', + modal: true, + icon: , + modalUrl: `/api/RemovePolicy?TenantFilter=${tenant.defaultDomainName}&ID=${row.id}&URLName=${row.URLName}`, + modalMessage: 'Are you sure you want to delete this policy?', + }, + ]} + placement="end" + visible={ocVisible} + id={row.id} + hideFunction={() => setOCVisible(false)} + /> + + ) +} + +const columns = [ + { + selector: (row) => row['displayName'], + name: 'Name', + sortable: true, + exportSelector: 'displayName', + }, + { + selector: (row) => row['isAssigned'], + name: 'Is Assigned', + sortable: true, + exportSelector: 'isAssigned', + cell: cellBooleanFormatter(), + }, + { + selector: (row) => row['lastModifiedDateTime'], + name: 'Last Modified', + exportSelector: 'lastModifiedDateTime', + cell: cellDateFormatter({ format: 'relative' }), + }, + { + name: 'Actions', + cell: Actions, + maxWidth: '80px', + }, +] + +const AppProtectionList = () => { + const tenant = useSelector((state) => state.app.currentTenant) + + // eslint-disable-next-line react/prop-types + const ExpandedComponent = ({ data }) => ( + // eslint-disable-next-line react/prop-types + + ) + + return ( + + + + } + tenantSelector={true} + datatable={{ + path: '/api/ListGraphRequest', + params: { + TenantFilter: tenant?.defaultDomainName, + Endpoint: 'deviceAppManagement/managedAppPolicies', + $orderby: 'displayName', + }, + columns, + reportName: `${tenant?.defaultDomainName}-MEMPolicies-List`, + tableProps: { + expandableRows: true, + expandableRowsComponent: ExpandedComponent, + expandOnRowClicked: true, + }, + }} + /> + ) +} + +export default AppProtectionList diff --git a/src/views/endpoint/intune/MEMListPolicies.jsx b/src/views/endpoint/intune/MEMListPolicies.jsx index 980d68010132..3f95f45d3f5e 100644 --- a/src/views/endpoint/intune/MEMListPolicies.jsx +++ b/src/views/endpoint/intune/MEMListPolicies.jsx @@ -121,7 +121,7 @@ const IntuneList = () => { return ( { title="Invite Guest" />
    +
    + +
    ) From d961d173e4fdcf23d50c401deecac122d52dece0 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Tue, 26 Mar 2024 14:54:27 +0100 Subject: [PATCH 059/133] Added Compliance Policies --- src/_nav.jsx | 5 + src/routes.js | 7 + src/views/endpoint/intune/MEMAddPolicy.jsx | 1 + .../endpoint/intune/MEMListCompliance.jsx | 155 ++++++++++++++++++ src/views/endpoint/intune/MEMListPolicies.jsx | 6 +- 5 files changed, 171 insertions(+), 3 deletions(-) create mode 100644 src/views/endpoint/intune/MEMListCompliance.jsx diff --git a/src/_nav.jsx b/src/_nav.jsx index 77c84d57f31a..d3f46a503c75 100644 --- a/src/_nav.jsx +++ b/src/_nav.jsx @@ -484,6 +484,11 @@ const _nav = [ name: 'Configuration Policies', to: '/endpoint/MEM/list-policies', }, + { + component: CNavItem, + name: 'Compliance Policies', + to: '/endpoint/MEM/list-compliance-policies', + }, { component: CNavItem, name: 'Protection Policies', diff --git a/src/routes.js b/src/routes.js index d5b459b465b9..9997cd58f515 100644 --- a/src/routes.js +++ b/src/routes.js @@ -130,6 +130,8 @@ const AutopilotListStatusPages = React.lazy(() => import('src/views/endpoint/autopilot/AutopilotListStatusPages'), ) const IntuneListPolicies = React.lazy(() => import('src/views/endpoint/intune/MEMListPolicies')) +const IntuneListCompliance = React.lazy(() => import('src/views/endpoint/intune/MEMListCompliance')) + const IntuneListAppProtection = React.lazy(() => import('src/views/endpoint/intune/MEMListAppProtection'), ) @@ -490,6 +492,11 @@ const routes = [ name: 'List Intune Policies', component: IntuneListPolicies, }, + { + path: '/endpoint/MEM/list-compliance-policies', + name: 'List Intune Compliance Policies', + component: IntuneListCompliance, + }, { path: '/endpoint/MEM/list-appprotection-policies', name: 'List App Protection Policies', diff --git a/src/views/endpoint/intune/MEMAddPolicy.jsx b/src/views/endpoint/intune/MEMAddPolicy.jsx index 00987200dc65..9ab14f4840ca 100644 --- a/src/views/endpoint/intune/MEMAddPolicy.jsx +++ b/src/views/endpoint/intune/MEMAddPolicy.jsx @@ -171,6 +171,7 @@ const AddPolicy = () => { { label: 'Settings Catalog', value: 'Catalog' }, { label: 'Custom Configuration', value: 'Device' }, { label: 'App Protection or Configuration Policy', value: 'AppProtection' }, + { label: 'Compliance Policy', value: 'deviceCompliancePolicies' }, ]} /> diff --git a/src/views/endpoint/intune/MEMListCompliance.jsx b/src/views/endpoint/intune/MEMListCompliance.jsx new file mode 100644 index 000000000000..fed996b957b3 --- /dev/null +++ b/src/views/endpoint/intune/MEMListCompliance.jsx @@ -0,0 +1,155 @@ +import React, { useState } from 'react' +import { useSelector } from 'react-redux' +import { CButton } from '@coreui/react' +import { + faBook, + faEdit, + faEllipsisV, + faGlobeEurope, + faPager, + faTrashAlt, + faUser, +} from '@fortawesome/free-solid-svg-icons' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { CippPageList } from 'src/components/layout' +import { Link } from 'react-router-dom' +import { CippActionsOffcanvas, CippCodeBlock } from 'src/components/utilities' +import { TitleButton } from 'src/components/buttons' +import { cellBooleanFormatter, cellDateFormatter } from 'src/components/tables' + +const Actions = (row, rowIndex, formatExtraData) => { + const [ocVisible, setOCVisible] = useState(false) + console.log(row) + const tenant = useSelector((state) => state.app.currentTenant) + return ( + <> + setOCVisible(true)}> + + + , + modalUrl: `/api/AddIntuneTemplate?TenantFilter=${tenant.defaultDomainName}&ID=${row.id}&URLName=deviceCompliancePolicies`, + modalMessage: 'Are you sure you want to create a template based on this policy?', + }, + { + icon: , + label: ' Assign to All Users', + color: 'info', + modal: true, + modalUrl: `/api/ExecAssignPolicy?AssignTo=allLicensedUsers&TenantFilter=${tenant.defaultDomainName}&ID=${row.id}&type=deviceCompliancePolicies`, + modalMessage: `Are you sure you want to assign ${row.displayName} to all users?`, + }, + { + icon: , + label: ' Assign to All Devices', + color: 'info', + modal: true, + modalUrl: `/api/ExecAssignPolicy?AssignTo=AllDevices&TenantFilter=${tenant.defaultDomainName}&ID=${row.id}&type=deviceCompliancePolicies`, + modalMessage: `Are you sure you want to assign ${row.displayName} to all devices?`, + }, + { + icon: , + label: ' Assign Globally (All Users / All Devices)', + color: 'info', + modal: true, + modalUrl: `/api/ExecAssignPolicy?AssignTo=AllDevicesAndUsers&TenantFilter=${tenant.defaultDomainName}&ID=${row.id}&type=deviceCompliancePolicies`, + modalMessage: `Are you sure you want to assign ${row.displayName} to all users and devices?`, + }, + { + label: 'Delete Policy', + color: 'danger', + modal: true, + icon: , + modalUrl: `/api/RemovePolicy?TenantFilter=${tenant.defaultDomainName}&ID=${row.id}&URLName=${row.URLName}`, + modalMessage: 'Are you sure you want to delete this policy?', + }, + ]} + placement="end" + visible={ocVisible} + id={row.id} + hideFunction={() => setOCVisible(false)} + /> + + ) +} + +const columns = [ + { + selector: (row) => row['displayName'], + name: 'Name', + sortable: true, + exportSelector: 'displayName', + }, + { + selector: (row) => row['description'], + name: 'Description', + sortable: true, + exportSelector: 'description', + }, + { + selector: (row) => row['lastModifiedDateTime'], + name: 'Last Modified', + exportSelector: 'lastModifiedDateTime', + cell: cellDateFormatter({ format: 'relative' }), + }, + { + name: 'Actions', + cell: Actions, + maxWidth: '80px', + }, +] + +const ComplianceList = () => { + const tenant = useSelector((state) => state.app.currentTenant) + + // eslint-disable-next-line react/prop-types + const ExpandedComponent = ({ data }) => ( + // eslint-disable-next-line react/prop-types + + ) + + return ( + + + + } + tenantSelector={true} + datatable={{ + path: '/api/ListGraphRequest', + params: { + TenantFilter: tenant?.defaultDomainName, + Endpoint: 'deviceManagement/deviceCompliancePolicies', + $orderby: 'displayName', + $count: true, + }, + columns, + reportName: `${tenant?.defaultDomainName}-MEMPolicies-List`, + tableProps: { + expandableRows: true, + expandableRowsComponent: ExpandedComponent, + expandOnRowClicked: true, + }, + }} + /> + ) +} + +export default ComplianceList diff --git a/src/views/endpoint/intune/MEMListPolicies.jsx b/src/views/endpoint/intune/MEMListPolicies.jsx index 3f95f45d3f5e..cd54f68eb9f6 100644 --- a/src/views/endpoint/intune/MEMListPolicies.jsx +++ b/src/views/endpoint/intune/MEMListPolicies.jsx @@ -47,7 +47,7 @@ const Actions = (row, rowIndex, formatExtraData) => { label: ' Assign to All Users', color: 'info', modal: true, - modalUrl: `/api/ExecAssignPolicy?AssignTo=allLicensedUsers&TenantFilter=${tenant.defaultDomainName}&ID=${row.id}`, + modalUrl: `/api/ExecAssignPolicy?AssignTo=allLicensedUsers&TenantFilter=${tenant.defaultDomainName}&ID=${row.id}&type=${row.URLName}`, modalMessage: `Are you sure you want to assign ${row.displayName} to all users?`, }, { @@ -55,7 +55,7 @@ const Actions = (row, rowIndex, formatExtraData) => { label: ' Assign to All Devices', color: 'info', modal: true, - modalUrl: `/api/ExecAssignPolicy?AssignTo=AllDevices&TenantFilter=${tenant.defaultDomainName}&ID=${row.id}`, + modalUrl: `/api/ExecAssignPolicy?AssignTo=AllDevices&TenantFilter=${tenant.defaultDomainName}&ID=${row.id}&type=${row.URLName}`, modalMessage: `Are you sure you want to assign ${row.displayName} to all devices?`, }, { @@ -63,7 +63,7 @@ const Actions = (row, rowIndex, formatExtraData) => { label: ' Assign Globally (All Users / All Devices)', color: 'info', modal: true, - modalUrl: `/api/ExecAssignPolicy?AssignTo=AllDevicesAndUsers&TenantFilter=${tenant.defaultDomainName}&ID=${row.id}`, + modalUrl: `/api/ExecAssignPolicy?AssignTo=AllDevicesAndUsers&TenantFilter=${tenant.defaultDomainName}&ID=${row.id}&type=${row.URLName}`, modalMessage: `Are you sure you want to assign ${row.displayName} to all users and devices?`, }, { From af12a3f906005bdad15c48ad644116a56f79a0a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Tue, 26 Mar 2024 20:50:00 +0100 Subject: [PATCH 060/133] Standard for trusting external MFA in Cross-tenant access setting --- src/data/standards.json | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/data/standards.json b/src/data/standards.json index 6d26445f6515..f3c97b88df85 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -232,6 +232,32 @@ "impact": "Low Impact", "impactColour": "info" }, + { + "name": "standards.ExternalMFATrusted", + "cat": "Entra (AAD) Standards", + "tag": ["lowimpact"], + "helpText": "Sets the state of the Cross-tenant access setting to trust external MFA. This allows guest users to use their home tenant MFA to access your tenant.", + "addedComponent": [ + { + "type": "Select", + "label": "Select value", + "name": "standards.ExternalMFATrusted.state", + "values": [ + { + "label": "Enabled", + "value": "true" + }, + { + "label": "Disabled", + "value": "false" + } + ] + } + ], + "label": "Sets the Cross-tenant access setting to trust external MFA", + "impact": "Low Impact", + "impactColour": "info" + }, { "name": "standards.DisableTenantCreation", "cat": "Entra (AAD) Standards", From 66b8be6d8ee92510225e85e1279ea375650b21b5 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Tue, 26 Mar 2024 21:14:50 +0100 Subject: [PATCH 061/133] dynamic lists --- src/views/identity/administration/AddGroup.jsx | 15 +++++++++++++++ .../identity/administration/AddGroupTemplate.jsx | 15 +++++++++++++++ .../administration/DeployGroupTemplate.jsx | 10 ++++++++++ 3 files changed, 40 insertions(+) diff --git a/src/views/identity/administration/AddGroup.jsx b/src/views/identity/administration/AddGroup.jsx index 9faa8544bca7..3c2c308d1cef 100644 --- a/src/views/identity/administration/AddGroup.jsx +++ b/src/views/identity/administration/AddGroup.jsx @@ -139,6 +139,12 @@ const AddGroup = () => { + + { } /> + + +
    diff --git a/src/views/identity/administration/AddGroupTemplate.jsx b/src/views/identity/administration/AddGroupTemplate.jsx index 80d54b54c575..1a6bd6ecf6e6 100644 --- a/src/views/identity/administration/AddGroupTemplate.jsx +++ b/src/views/identity/administration/AddGroupTemplate.jsx @@ -70,6 +70,11 @@ const AddGroupTemplate = () => { value="security" />{' '} + { } /> + + + + diff --git a/src/views/identity/administration/DeployGroupTemplate.jsx b/src/views/identity/administration/DeployGroupTemplate.jsx index 64b730df4d43..e0524fa0d970 100644 --- a/src/views/identity/administration/DeployGroupTemplate.jsx +++ b/src/views/identity/administration/DeployGroupTemplate.jsx @@ -153,6 +153,8 @@ const ApplyGroupTemplate = () => { placeholder="Select a group type" values={[ { label: 'Dynamic Group', value: 'dynamic' }, + { label: 'Dynamic Distribution Group (Beta)', value: 'dynamicdistribution' }, + { label: 'Security Group', value: 'generic' }, { label: 'Distribution group', value: 'distribution' }, { label: 'Azure Role Group', value: 'azurerole' }, @@ -207,6 +209,14 @@ const ApplyGroupTemplate = () => { placeholder="Enter membership rule syntax" /> + + +
    From 712988ffe2d0c6030a63c2909515306522026aef Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Wed, 27 Mar 2024 16:50:46 +0100 Subject: [PATCH 062/133] fixes bug with blank arrays --- src/components/tables/CellTable.jsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/tables/CellTable.jsx b/src/components/tables/CellTable.jsx index e03cd95059bd..549e4805dfa0 100644 --- a/src/components/tables/CellTable.jsx +++ b/src/components/tables/CellTable.jsx @@ -21,7 +21,11 @@ export default function cellTable( } if (!Array.isArray(columnProp) && typeof columnProp === 'object') { - columnProp = [columnProp] + columnProp = Object.keys(columnProp).map((key) => { + return { + [key]: columnProp[key], + } + }) } if (Array.isArray(columnProp) && typeof columnProp[0] !== 'object') { From d1dcd45528d4a9360322264a8209a9225f2a5f5c Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Wed, 27 Mar 2024 17:52:45 +0100 Subject: [PATCH 063/133] fixes #2210 --- src/components/tables/CippTable.jsx | 111 +++++++++++++--------------- 1 file changed, 51 insertions(+), 60 deletions(-) diff --git a/src/components/tables/CippTable.jsx b/src/components/tables/CippTable.jsx index 7b155136c17b..c033e8c39688 100644 --- a/src/components/tables/CippTable.jsx +++ b/src/components/tables/CippTable.jsx @@ -38,6 +38,7 @@ import { useSearchParams } from 'react-router-dom' import CopyToClipboard from 'react-copy-to-clipboard' import { setDefaultColumns } from 'src/store/features/app' import { end } from '@popperjs/core' +import { current } from '@reduxjs/toolkit' const FilterComponent = ({ filterText, onFilter, onClear, filterlist, onFilterPreset }) => ( <> @@ -630,74 +631,64 @@ export default function CippTable({ return null }) - var exportData = filteredItems + // Define the flatten function + const flatten = (obj, prefix = '') => { + return Object.keys(obj).reduce((output, key) => { + const newKey = prefix ? `${prefix}.${key}` : key + const value = obj[key] === null ? '' : obj[key] - var filtered = - Array.isArray(exportData) && exportData.length > 0 - ? exportData.map((obj) => - // eslint-disable-next-line no-sequences - /* keys.reduce((acc, curr) => ((acc[curr] = obj[curr]), acc), {}),*/ - keys.reduce((acc, curr) => { - const key = curr.split('/') - if (key.length > 1) { - let property = obj - for (let x = 0; x < key.length; x++) { - if ( - Object.prototype.hasOwnProperty.call(property, key[x]) && - property[key[x]] !== null - ) { - property = property[key[x]] - } else { - property = 'n/a' - break - } - } - acc[curr] = property - } else { - if (typeof exportFormatter[curr] === 'function') { - acc[curr] = exportFormatter[curr]({ cell: obj[curr] }) - } else { - acc[curr] = obj[curr] - } - } - return acc - }, {}), - ) - : [] - - const flatten = (obj, prefix) => { - let output = {} - for (let k in obj) { - let val = obj[k] - if (val === null) { - val = '' - } - const newKey = prefix ? prefix + '.' + k : k - if (typeof val === 'object') { - if (Array.isArray(val)) { - const { ...arrToObj } = val - const newObj = flatten(arrToObj, newKey) - output = { ...output, ...newObj } - } else { - const newObj = flatten(val, newKey) - output = { ...output, ...newObj } - } + if (typeof value === 'object' && !Array.isArray(value)) { + Object.assign(output, flatten(value, newKey)) } else { - output = { ...output, [newKey]: val } + output[newKey] = value } - } - return output + return output + }, {}) } - filtered = filtered.map((item) => flatten(item)) - let dataFlat + // Define the applyFormatter function + const applyFormatter = (obj) => { + return Object.keys(obj).reduce((acc, key) => { + const formatter = exportFormatter[key] + // Since the keys after flattening will be dot-separated, we need to adjust this to support nested keys if necessary. + const keyParts = key.split('.') + const finalKeyPart = keyParts[keyParts.length - 1] + const formattedValue = + typeof formatter === 'function' ? formatter({ cell: obj[key] }) : obj[key] + acc[key] = formattedValue + return acc + }, {}) + } - if (Array.isArray(data)) { - dataFlat = data.map((item) => flatten(item)) - } else { - dataFlat = [] + // Process exportData function + const processExportData = (exportData, selectedColumns) => { + //filter out the columns that are not selected via selectedColumns + exportData = exportData.map((item) => { + return Object.keys(item) + .filter((key) => selectedColumns.find((o) => o.exportSelector === key)) + .reduce((obj, key) => { + obj[key] = item[key] + return obj + }, {}) + }) + return Array.isArray(exportData) && exportData.length > 0 + ? exportData.map((obj) => { + const flattenedObj = flatten(obj) + return applyFormatter(flattenedObj) + }) + : [] } + // Applying the processExportData function to both filteredItems and data + var filtered = processExportData(filteredItems, updatedColumns) + + // Adjusted dataFlat processing to include formatting + let dataFlat = Array.isArray(data) + ? data.map((item) => { + const flattenedItem = flatten(item) + return applyFormatter(flattenedItem) + }) + : [] if (!disablePDFExport) { if (dynamicColumns === true) { defaultActions.push([ From 31378543c12ffb44d33d307203ad8e5951ecef2d Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Wed, 27 Mar 2024 18:32:44 +0100 Subject: [PATCH 064/133] added alerts --- src/views/tenant/administration/ListAlertsQueue.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/views/tenant/administration/ListAlertsQueue.jsx b/src/views/tenant/administration/ListAlertsQueue.jsx index 1c155771a9bd..abce88eca036 100644 --- a/src/views/tenant/administration/ListAlertsQueue.jsx +++ b/src/views/tenant/administration/ListAlertsQueue.jsx @@ -39,6 +39,8 @@ const alertsList = [ inputName: 'SharePointQuotaQuota', }, { name: 'ExpiringLicenses', label: 'Alert on licenses expiring in 30 days' }, + { name: 'NewAppApproval', label: 'Alert on new apps in the application approval list' }, + { name: 'SecDefaultsUpsell', label: 'Alert on Security Defaults automatic enablement' }, { name: 'DefenderStatus', @@ -221,7 +223,6 @@ const ListClassicAlerts = () => { ) From 06a41ad15f32d7bdd5d98ec4a10b8f7d256955fe Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Wed, 27 Mar 2024 18:57:49 +0100 Subject: [PATCH 065/133] changes --- src/views/identity/administration/EditUser.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/identity/administration/EditUser.jsx b/src/views/identity/administration/EditUser.jsx index f456f6f9c4fd..4f2aef34773e 100644 --- a/src/views/identity/administration/EditUser.jsx +++ b/src/views/identity/administration/EditUser.jsx @@ -107,7 +107,7 @@ const EditUser = () => { PostalCode: values.postalCode, usageLocation: values.usageLocation ? values.usageLocation.value : '', UserID: userId, - Username: values.mailNickname, + Username: values.username, streetAddress: values.streetAddress, tenantID: tenantDomain, mustchangepass: values.RequirePasswordChange, @@ -222,7 +222,7 @@ const EditUser = () => { From ee11d7097682debd7945f5dff4a87c72539da6bc Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 27 Mar 2024 13:59:56 -0400 Subject: [PATCH 066/133] fix radio/checkbox bug --- src/components/forms/RFFComponents.jsx | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/components/forms/RFFComponents.jsx b/src/components/forms/RFFComponents.jsx index fef24a7cb418..b3d491caa5b7 100644 --- a/src/components/forms/RFFComponents.jsx +++ b/src/components/forms/RFFComponents.jsx @@ -14,7 +14,7 @@ import Select from 'react-select' import Creatable, { useCreatable } from 'react-select/creatable' import { Field } from 'react-final-form' import { FieldArray } from 'react-final-form-arrays' -import React, { useState, useMemo, useRef } from 'react' +import React, { useState, useMemo } from 'react' import PropTypes from 'prop-types' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { debounce } from 'lodash-es' @@ -37,6 +37,7 @@ const sharedPropTypes = { error: PropTypes.any, }), }), + onClick: PropTypes.func, } export const RFFCFormFeedback = ({ meta }) => { @@ -54,7 +55,14 @@ RFFCFormFeedback.propTypes = { }), } -export const RFFCFormCheck = ({ name, label, className = 'mb-3', validate, disabled = false }) => { +export const RFFCFormCheck = ({ + name, + label, + className = 'mb-3', + validate, + disabled = false, + onClick, +}) => { return ( {({ input, meta }) => ( @@ -67,6 +75,7 @@ export const RFFCFormCheck = ({ name, label, className = 'mb-3', validate, disab disabled={disabled} id={name} label={label} + onClick={onClick} />
    @@ -92,6 +101,7 @@ export const RFFCFormSwitch = ({ validate, disabled = false, initialValue, + onClick, }) => { return ( @@ -113,6 +123,7 @@ export const RFFCFormSwitch = ({ disabled={disabled} id={name} label={label} + onClick={onClick} /> {input.value && } {sublabel} @@ -239,6 +250,7 @@ export const RFFCFormRadio = ({ className = 'mb-3', validate, disabled = false, + onClick, }) => { return ( @@ -252,6 +264,7 @@ export const RFFCFormRadio = ({ type="radio" name={name} label={label} + onClick={onClick} />
    From 79946f852c746841c19bc19f5bc3fc87125ad9e3 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Wed, 27 Mar 2024 21:32:46 +0100 Subject: [PATCH 067/133] fixes selector --- src/views/tenant/administration/Tenants.jsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/views/tenant/administration/Tenants.jsx b/src/views/tenant/administration/Tenants.jsx index 24b700a30f08..87ab0a9d12da 100644 --- a/src/views/tenant/administration/Tenants.jsx +++ b/src/views/tenant/administration/Tenants.jsx @@ -11,8 +11,9 @@ import { CippTenantOffcanvasRow } from 'src/components/utilities/CippTenantOffca const TenantsList = () => { const TenantListSelector = useSelector((state) => state.app.TenantListSelector) const tenant = useSelector((state) => state.app.currentTenant) + console.log('TenantListSelector', TenantListSelector) const [columnOmits, setOmitVisible] = useState(TenantListSelector) - + console.log('columnOmits', columnOmits) const generatePortalColumn = (portal) => ({ name: portal.label, omit: columnOmits, @@ -59,7 +60,7 @@ const TenantsList = () => { ] const titleButton = ( setOmitVisible(!columnOmits)} title={columnOmits ? 'Show Direct Links' : 'Hide Direct Links'} /> @@ -73,6 +74,7 @@ const TenantsList = () => { datatable={{ keyField: 'id', columns, + dynamicColumns: false, reportName: `${tenant.tenantId}-Tenants-List`, path: '/api/ListTenants', }} From e20249e1ac2982977db9fc6ee0ca6c342a84474c Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 27 Mar 2024 16:35:49 -0400 Subject: [PATCH 068/133] fix tenant access check --- src/views/cipp/app-settings/SettingsGeneral.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/views/cipp/app-settings/SettingsGeneral.jsx b/src/views/cipp/app-settings/SettingsGeneral.jsx index 887758f30abb..86297419f548 100644 --- a/src/views/cipp/app-settings/SettingsGeneral.jsx +++ b/src/views/cipp/app-settings/SettingsGeneral.jsx @@ -439,6 +439,7 @@ export function SettingsGeneral() { columns={checkAccessColumns} tableProps={tableProps} data={accessCheckResult.data.Results} + dynamicColumns={false} /> )} From 0a177407d205724a61104db774d10f0882c02999 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Wed, 27 Mar 2024 21:42:54 +0100 Subject: [PATCH 069/133] fixes ap issue disappearing offCanvas --- .../autopilot/AutopilotListDevices.jsx | 124 +++++++++--------- 1 file changed, 63 insertions(+), 61 deletions(-) diff --git a/src/views/endpoint/autopilot/AutopilotListDevices.jsx b/src/views/endpoint/autopilot/AutopilotListDevices.jsx index f7c58629f4b8..486d289bb881 100644 --- a/src/views/endpoint/autopilot/AutopilotListDevices.jsx +++ b/src/views/endpoint/autopilot/AutopilotListDevices.jsx @@ -14,71 +14,73 @@ import { useLazyGenericGetRequestQuery } from 'src/store/api/app' import { CellTip } from 'src/components/tables' import { TitleButton } from 'src/components/buttons' -const AutopilotListDevices = () => { +const OffCanvas = (row, index, column) => { const tenant = useSelector((state) => state.app.currentTenant) - const [ExecuteGetRequest, getResults] = useLazyGenericGetRequestQuery() + const [ocVisible, setOCVisible] = useState(false) - const Actions = (row, index, column) => { - return ( - <> - setOCVisible(true)}> - - - + setOCVisible(true)}> + + + setOCVisible(false)} - /> - - ) - } + modalMessage: 'Select the user to assign', + }, + { + label: 'Delete Device', + color: 'danger', + modal: true, + modalUrl: `/api/RemoveAPDevice?ID=${row.id}&tenantFilter=${tenant.defaultDomainName}`, + modalMessage: 'Are you sure you want to delete this device?', + }, + ]} + placement="end" + visible={ocVisible} + id={row.id} + hideFunction={() => setOCVisible(false)} + /> + + ) +} +const AutopilotListDevices = () => { + const [ExecuteGetRequest, getResults] = useLazyGenericGetRequestQuery() + const tenant = useSelector((state) => state.app.currentTenant) const columns = [ { @@ -124,8 +126,8 @@ const AutopilotListDevices = () => { exportSelector: 'enrollmentState', }, { - name: (row) => row['Actions'], - cell: Actions, + name: 'Actions', + cell: OffCanvas, }, ] From d7cf61db1e40c84f73032c0aa92825429d3e1c40 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 27 Mar 2024 17:22:24 -0400 Subject: [PATCH 070/133] add standards from PR #2257 #2256 #2255 #2254 --- src/data/standards.json | 220 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) diff --git a/src/data/standards.json b/src/data/standards.json index f3c97b88df85..cab53f3144d6 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -788,6 +788,226 @@ "impact": "Low Impact", "impactColour": "info" }, + { + "name": "standards.AntiPhishPolicy", + "cat": "Defender Standards", + "tag": ["lowimpact", "CIS"], + "helpText": "This creates a Anti-Phishing policy that automatically enables Mailbox Intelligence and spoofing, optional switches for Mailtips.", + "addedComponent": [ + { + "type": "number", + "label": "Phishing email threshold. (Default 1)", + "name": "standards.AntiPhishPolicy.PhishThresholdLevel", + "default": 1 + }, + { + "type": "boolean", + "label": "Show first contact safety tip", + "name": "standards.AntiPhishPolicy.EnableFirstContactSafetyTips", + "default": true + }, + { + "type": "boolean", + "label": "Show user impersonation safety tip", + "name": "standards.AntiPhishPolicy.EnableSimilarUsersSafetyTips", + "default": true + }, + { + "type": "boolean", + "label": "Show domain impersonation safety tip", + "name": "standards.AntiPhishPolicy.EnableSimilarDomainsSafetyTips", + "default": true + }, + { + "type": "boolean", + "label": "Show user impersonation unusual characters safety tip", + "name": "standards.AntiPhishPolicy.EnableUnusualCharactersSafetyTips", + "default": true + }, + { + "type": "Select", + "label": "If Mailbox Intelligence detects an impersonated user", + "name": "standards.AntiPhishPolicy.MailboxIntelligenceProtectionAction", + "values": [ + { + "label": "Move to Junk Folder", + "value": "MoveToJmf" + }, + { + "label": "Delete the message before its delivered", + "value": "Delete" + }, + { + "label": "Quarantine the message", + "value": "Quarantine" + } + ] + }, + { + "type": "Select", + "label": "Apply quarantine policy", + "name": "standards.AntiPhishPolicy.MailboxIntelligenceQuarantineTag", + "values": [ + { + "label": "AdminOnlyAccessPolicy", + "value": "AdminOnlyAccessPolicy" + }, + { + "label": "DefaultFullAccessPolicy", + "value": "DefaultFullAccessPolicy" + }, + { + "label": "DefaultFullAccessWithNotificationPolicy", + "value": "DefaultFullAccessWithNotificationPolicy" + } + ] + } + ], + "label": "Default Anti-Phishing Policy", + "impact": "Low Impact", + "impactColour": "info" + }, + { + "name": "standards.SafeAttachmentPolicy", + "cat": "Defender Standards", + "tag": ["lowimpact", "CIS"], + "helpText": "This creates a Safe Attachment policy", + "addedComponent": [ + { + "type": "Select", + "label": "Action", + "name": "standards.SafeAttachmentPolicy.Action", + "values": [ + { + "label": "Allow", + "value": "Allow" + }, + { + "label": "Block", + "value": "Block" + }, + { + "label": "DynamicDelivery", + "value": "DynamicDelivery" + } + ] + }, + { + "type": "Select", + "label": "QuarantineTag", + "name": "standards.SafeAttachmentPolicy.QuarantineTag", + "values": [ + { + "label": "AdminOnlyAccessPolicy", + "value": "AdminOnlyAccessPolicy" + }, + { + "label": "DefaultFullAccessPolicy", + "value": "DefaultFullAccessPolicy" + }, + { + "label": "DefaultFullAccessWithNotificationPolicy", + "value": "DefaultFullAccessWithNotificationPolicy" + } + ] + }, + { + "type": "boolean", + "label": "Redirect", + "name": "standards.SafeAttachmentPolicy.Redirect" + }, + { + "type": "input", + "name": "standards.SafeAttachmentPolicy.RedirectAddress", + "label": "Redirect Address" + } + ], + "label": "Default Safe Attachment Policy", + "impact": "Low Impact", + "impactColour": "info" + }, + { + "name": "standards.AtpPolicyForO365", + "cat": "Defender Standards", + "tag": ["lowimpact", "CIS"], + "helpText": "This creates a Atp policy that enables Defender for Office 365 for Sharepoint, OneDrive and Microsoft Teams.", + "addedComponent": [ + { + "type": "boolean", + "label": "Allow people to click through Protected View even if Safe Documents identified the file as malicious", + "name": "standards.AtpPolicyForO365.AllowSafeDocsOpen", + "default": false + } + ], + "label": "Default Atp Policy For O365", + "impact": "Low Impact", + "impactColour": "info" + }, + { + "name": "standards.MalwareFilterPolicy", + "cat": "Defender Standards", + "tag": ["lowimpact", "CIS"], + "helpText": "This creates a Malware filter policy that enables the default File filter and Zero-hour auto purge for malware.", + "addedComponent": [ + { + "type": "Select", + "label": "FileTypeAction", + "name": "standards.MalwareFilterPolicy.FileTypeAction", + "values": [ + { + "label": "Reject", + "value": "Reject" + }, + { + "label": "Quarantine the message", + "value": "Quarantine" + } + ] + }, + { + "type": "Select", + "label": "QuarantineTag", + "name": "standards.MalwareFilterPolicy.QuarantineTag", + "values": [ + { + "label": "AdminOnlyAccessPolicy", + "value": "AdminOnlyAccessPolicy" + }, + { + "label": "DefaultFullAccessPolicy", + "value": "DefaultFullAccessPolicy" + }, + { + "label": "DefaultFullAccessWithNotificationPolicy", + "value": "DefaultFullAccessWithNotificationPolicy" + } + ] + }, + { + "type": "boolean", + "label": "Enable Internal Sender Admin Notifications", + "name": "standards.MalwareFilterPolicy.EnableInternalSenderAdminNotifications" + }, + { + "type": "input", + "name": "standards.MalwareFilterPolicy.InternalSenderAdminAddress", + "label": "Internal Sender Admin Address" + }, + { + "type": "boolean", + "label": "Enable Internal Sender Admin Notifications", + "name": "standards.MalwareFilterPolicy.EnableExternalSenderAdminNotifications" + }, + { + "type": "input", + "name": "standards.MalwareFilterPolicy.ExternalSenderAdminAddress", + "label": "External Sender Admin Address" + } + ], + "label": "Default Malware Filter Policy", + "impact": "Low Impact", + "impactColour": "info" + }, { "name": "standards.intuneDeviceRetirementDays", "cat": "Intune Standards", From 6e616b9cc701e5368104430fcc724442306bc6ad Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 28 Mar 2024 13:09:07 +0100 Subject: [PATCH 071/133] improved search --- src/components/tables/CippTable.jsx | 31 ++++++++++++++++------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/components/tables/CippTable.jsx b/src/components/tables/CippTable.jsx index c033e8c39688..9498fc271c2e 100644 --- a/src/components/tables/CippTable.jsx +++ b/src/components/tables/CippTable.jsx @@ -278,28 +278,29 @@ export default function CippTable({ debounceSetGraphFilter(query) return data } else if (filterText.startsWith('Complex:')) { - const conditions = filterText.slice(9).split(';') + // Split conditions by ';' and 'or', and trim spaces + const conditions = filterText + .slice(9) + .split(/\s*or\s*|\s*;\s*/i) // Split by 'or' or ';', case insensitive, with optional spaces + .map((condition) => condition.trim()) - return conditions.reduce((filteredData, condition) => { - const match = condition.trim().match(/(\w+)\s*(eq|ne|like|notlike|gt|lt)\s*(.+)/) + return data.filter((item) => { + // Check if any condition is met for the item + return conditions.some((condition) => { + const match = condition.match(/(\w+)\s*(eq|ne|like|notlike|gt|lt)\s*(.+)/) - if (!match) { - return filteredData // Keep the current filtered data as is - } + if (!match) return false - let [property, operator, value] = match.slice(1) - value = escapeRegExp(value) // Escape special characters + let [property, operator, value] = match.slice(1) + value = escapeRegExp(value) // Escape special characters - return filteredData.filter((item) => { - // Find the actual key in the item that matches the property (case insensitive) const actualKey = Object.keys(item).find( (key) => key.toLowerCase() === property.toLowerCase(), ) if (!actualKey) { - //set the error message so the user understands the key is not found. console.error(`FilterError: Property "${property}" not found.`) - return false // Keep the item if the property is not found + return false } switch (operator) { @@ -316,10 +317,10 @@ export default function CippTable({ case 'lt': return parseFloat(item[actualKey]) < parseFloat(value) default: - return true + return false // Should not reach here normally } }) - }, data) + }) } else { return data.filter( (item) => JSON.stringify(item).toLowerCase().indexOf(filterText.toLowerCase()) !== -1, @@ -327,6 +328,8 @@ export default function CippTable({ } } + // Helper functions like `debounce` and `escapeRegExp` should be defined somewhere in your code + // For example, a simple escapeRegExp function could be: const filteredItems = Array.isArray(data) ? filterData(data, filterText) : [] const applyFilter = (e) => { From 9e6e01dc2de3a2a76f1e2d7629d5556b17b07981 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 28 Mar 2024 13:33:11 +0100 Subject: [PATCH 072/133] fixes for or --- src/components/tables/CippTable.jsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/tables/CippTable.jsx b/src/components/tables/CippTable.jsx index 9498fc271c2e..3c246cbecb40 100644 --- a/src/components/tables/CippTable.jsx +++ b/src/components/tables/CippTable.jsx @@ -33,12 +33,11 @@ import { import { cellGenericFormatter } from './CellGenericFormat' import { ModalService } from '../utilities' import { useLazyGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app' -import { debounce, update } from 'lodash-es' +import { debounce } from 'lodash-es' import { useSearchParams } from 'react-router-dom' import CopyToClipboard from 'react-copy-to-clipboard' import { setDefaultColumns } from 'src/store/features/app' -import { end } from '@popperjs/core' -import { current } from '@reduxjs/toolkit' +import M365Licenses from 'src/data/M365Licenses' const FilterComponent = ({ filterText, onFilter, onClear, filterlist, onFilterPreset }) => ( <> From 329e0b07d76ec2d613d512c689b11e020d6387ab Mon Sep 17 00:00:00 2001 From: John Duprey Date: Thu, 28 Mar 2024 13:28:01 -0400 Subject: [PATCH 073/133] WizardTableField set dynamicColumns to false --- src/components/tables/WizardTableField.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/tables/WizardTableField.jsx b/src/components/tables/WizardTableField.jsx index bb6ba35a9da1..ac65a722029d 100644 --- a/src/components/tables/WizardTableField.jsx +++ b/src/components/tables/WizardTableField.jsx @@ -73,6 +73,7 @@ export default class WizardTableField extends React.Component { selectableRows: true, onSelectedRowsChange: this.handleSelect, }} + dynamicColumns={false} {...props} /> ) From 694ca32ce291ea34d749f92c60ef4694693c393b Mon Sep 17 00:00:00 2001 From: John Duprey Date: Thu, 28 Mar 2024 17:06:48 -0400 Subject: [PATCH 074/133] remove lighthouse requirement for tenant check --- src/views/cipp/app-settings/SettingsGeneral.jsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/views/cipp/app-settings/SettingsGeneral.jsx b/src/views/cipp/app-settings/SettingsGeneral.jsx index 86297419f548..e2c887ecd806 100644 --- a/src/views/cipp/app-settings/SettingsGeneral.jsx +++ b/src/views/cipp/app-settings/SettingsGeneral.jsx @@ -85,13 +85,6 @@ export function SettingsGeneral() { omit: showExtendedInfo, exportSelector: 'GDAPRoles', }, - { - name: 'SAM User Roles', - selector: (row) => row?.SAMUserRoles, - cell: cellTableFormatter('SAMUserRoles', false, true), - omit: showExtendedInfo, - exportSelector: 'SAMUserRoles', - }, ] const checkGDAPColumns = [ From b0509ec8504ca257c0141a309766793cc8720ea5 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Thu, 28 Mar 2024 17:07:04 -0400 Subject: [PATCH 075/133] add version update function --- Tools/Update-Version.ps1 | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 Tools/Update-Version.ps1 diff --git a/Tools/Update-Version.ps1 b/Tools/Update-Version.ps1 new file mode 100644 index 000000000000..48ad6e6bf9ba --- /dev/null +++ b/Tools/Update-Version.ps1 @@ -0,0 +1,10 @@ +Param($Version) +Set-Location (Get-Item $PSScriptRoot).Parent.FullName +$Files = @('version_latest.txt', 'public/version_latest.txt') +foreach ($File in $Files) { + Set-Content $File -Value $Version +} + +$Package = Get-Content package.json | ConvertFrom-Json +$Package.version = $Version +$Package | ConvertTo-Json -Depth 10 | Set-Content package.json From 58a9cabc946c15f6589520f1c03fe7327ae7ae01 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Thu, 28 Mar 2024 23:13:07 -0400 Subject: [PATCH 076/133] Mail Test --- src/_nav.jsx | 5 + src/routes.js | 7 ++ src/views/email-exchange/tools/MailTest.jsx | 101 ++++++++++++++++++++ 3 files changed, 113 insertions(+) create mode 100644 src/views/email-exchange/tools/MailTest.jsx diff --git a/src/_nav.jsx b/src/_nav.jsx index d3f46a503c75..f55c93339bd1 100644 --- a/src/_nav.jsx +++ b/src/_nav.jsx @@ -622,6 +622,11 @@ const _nav = [ name: 'Mailbox Restores', to: '/email/tools/mailbox-restores', }, + { + component: CNavItem, + name: 'Mail Test', + to: '/email/tools/mail-test', + }, ], }, { diff --git a/src/routes.js b/src/routes.js index 9997cd58f515..794ebb4b4c4d 100644 --- a/src/routes.js +++ b/src/routes.js @@ -1,4 +1,5 @@ import React from 'react' +import MailTest from 'src/views/email-exchange/tools/MailTest' const Home = React.lazy(() => import('src/views/home/Home')) const Logs = React.lazy(() => import('src/views/cipp/Logs')) @@ -247,6 +248,7 @@ const MailboxRestoreWizard = React.lazy(() => import('src/views/email-exchange/tools/MailboxRestoreWizard'), ) const MailboxRestores = React.lazy(() => import('src/views/email-exchange/tools/MailboxRestores')) +const Mailtest = React.lazy(() => import('src/views/email-exchange/tools/MailTest')) const routes = [ // { path: '/', exact: true, name: 'Home' }, @@ -611,6 +613,11 @@ const routes = [ name: 'Mailbox Restores', component: MailboxRestores, }, + { + path: '/email/tools/mail-test', + name: 'Mail Test', + component: MailTest, + }, { path: '/email/spamfilter/add-template', name: 'Add Spamfilter Template', diff --git a/src/views/email-exchange/tools/MailTest.jsx b/src/views/email-exchange/tools/MailTest.jsx new file mode 100644 index 000000000000..bc98185de466 --- /dev/null +++ b/src/views/email-exchange/tools/MailTest.jsx @@ -0,0 +1,101 @@ +import React from 'react' +import { CippCallout, CippPageList } from 'src/components/layout' +import { cellBooleanFormatter, cellDateFormatter } from 'src/components/tables' +import { cellGenericFormatter } from 'src/components/tables/CellGenericFormat' +import { useGenericGetRequestQuery } from 'src/store/api/app' + +const MailTest = () => { + const { data: config, isSuccess } = useGenericGetRequestQuery({ + path: '/api/ExecMailTest', + params: { Action: 'CheckConfig' }, + }) + + const columns = [ + { + name: 'Received', + selector: (row) => row['Received'], + sortable: true, + exportSelector: 'Received', + cell: cellDateFormatter({ format: 'short' }), + }, + { + name: 'From', + selector: (row) => row['From'], + sortable: true, + exportSelector: 'From', + cell: cellGenericFormatter(), + }, + { + name: 'Subject', + selector: (row) => row['Subject'], + sortable: true, + exportSelector: 'Subject', + cell: cellGenericFormatter(), + }, + { + name: 'SPF', + selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'spf')[0].Status == 'pass', + cell: cellBooleanFormatter(), + }, + { + name: 'DKIM', + selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'dkim')[0].Status == 'pass', + cell: cellBooleanFormatter(), + }, + { + name: 'DMARC', + selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'dmarc')[0].Status == 'pass', + cell: cellBooleanFormatter(), + }, + { + name: 'Comp Auth', + selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'compauth')[0].Status == 'pass', + cell: cellBooleanFormatter(), + }, + { + name: 'Auth Details', + selector: (row) => row['AuthResult'], + exportSelector: 'AuthResult', + cell: cellGenericFormatter(), + }, + { + name: 'Headers', + selector: (row) => row['Headers'], + exportSelector: 'Headers', + cell: cellGenericFormatter(), + }, + { + name: 'Open Message', + selector: (row) => row['Link'], + exportSelector: 'Link', + cell: cellGenericFormatter(), + }, + ] + return ( +
    + {isSuccess && ( + + {config?.HasMailRead && + 'Mail Test Email: ' + config?.MailAddresses.filter((x) => x?.IsPrimary)[0]?.Address} + {config?.HasMailRead == false && 'Permission Check: ' + config?.Message} + + )} + {isSuccess && config?.HasMailRead === true && ( + + )} +
    + ) +} + +export default MailTest From e6efeeb2339d5524628ebff3cbafb87906129f45 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Fri, 29 Mar 2024 01:23:39 -0400 Subject: [PATCH 077/133] Update MailTest.jsx --- src/views/email-exchange/tools/MailTest.jsx | 38 +++++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/views/email-exchange/tools/MailTest.jsx b/src/views/email-exchange/tools/MailTest.jsx index bc98185de466..9c31a1eb8155 100644 --- a/src/views/email-exchange/tools/MailTest.jsx +++ b/src/views/email-exchange/tools/MailTest.jsx @@ -1,3 +1,4 @@ +import { CButton, CSpinner } from '@coreui/react' import React from 'react' import { CippCallout, CippPageList } from 'src/components/layout' import { cellBooleanFormatter, cellDateFormatter } from 'src/components/tables' @@ -5,11 +6,15 @@ import { cellGenericFormatter } from 'src/components/tables/CellGenericFormat' import { useGenericGetRequestQuery } from 'src/store/api/app' const MailTest = () => { - const { data: config, isSuccess } = useGenericGetRequestQuery({ + const configQuery = useGenericGetRequestQuery({ path: '/api/ExecMailTest', params: { Action: 'CheckConfig' }, }) + function handleConfigRetry() { + configQuery.refetch() + } + const columns = [ { name: 'Received', @@ -73,14 +78,33 @@ const MailTest = () => { ] return (
    - {isSuccess && ( - - {config?.HasMailRead && - 'Mail Test Email: ' + config?.MailAddresses.filter((x) => x?.IsPrimary)[0]?.Address} - {config?.HasMailRead == false && 'Permission Check: ' + config?.Message} + {configQuery.isSuccess && ( + + {configQuery.data?.HasMailRead && ( + <> + Mail test email: + x?.IsPrimary)[0]?.Address + } + > + {configQuery.data?.MailAddresses.filter((x) => x?.IsPrimary)[0]?.Address} + + + )} + {configQuery.data?.HasMailRead == false && ( + <> + Permission Check: {configQuery.data?.Message}{' '} + handleConfigRetry()}> + Retry + + + )} )} - {isSuccess && config?.HasMailRead === true && ( + {configQuery.isLoading && } + {configQuery.isSuccess && configQuery.data?.HasMailRead === true && ( Date: Fri, 29 Mar 2024 13:12:19 +0100 Subject: [PATCH 078/133] add multi select offboarding --- .../administration/OffboardingWizard.jsx | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/views/identity/administration/OffboardingWizard.jsx b/src/views/identity/administration/OffboardingWizard.jsx index 86ec8293eff6..af4358b1822e 100644 --- a/src/views/identity/administration/OffboardingWizard.jsx +++ b/src/views/identity/administration/OffboardingWizard.jsx @@ -74,7 +74,7 @@ const OffboardingWizard = () => { RemoveLicenses: values.RemoveLicenses, ResetPass: values.ResetPass, RevokeSessions: values.RevokeSessions, - user: values.User.value, + user: values.User, deleteuser: values.DeleteUser, removeRules: values.RemoveRules, removeMobile: values.RemoveMobile, @@ -119,6 +119,7 @@ const OffboardingWizard = () => {
    ({ value: user.userPrincipalName, @@ -278,10 +279,16 @@ const OffboardingWizard = () => {
    Selected Tenant:
    {tenantDomain} - -
    Selected User:
    - {props.values.User.value} -
    + + {props.values.User.map((user) => ( + +
    Selected User:
    + {user.value} +
    + ))}
    From fe5c2b36c2e40824d51b72529243bb5aeaf6d485 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Fri, 29 Mar 2024 13:18:47 +0100 Subject: [PATCH 079/133] add alert for going over maximum --- .../identity/administration/OffboardingWizard.jsx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/views/identity/administration/OffboardingWizard.jsx b/src/views/identity/administration/OffboardingWizard.jsx index af4358b1822e..688be60b885f 100644 --- a/src/views/identity/administration/OffboardingWizard.jsx +++ b/src/views/identity/administration/OffboardingWizard.jsx @@ -129,6 +129,17 @@ const OffboardingWizard = () => { name="User" /> {usersError && Failed to load list of users} + + {/* eslint-disable react/prop-types */} + {(props) => ( + <> + {console.log(props.values)} + {props.values.User?.length >= 3 && ( + A maximum of three users is recommend. + )} + + )} +

    From eb56d1570caa41dc7ad6563203729d5aac2db3d6 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Fri, 29 Mar 2024 13:24:24 +0100 Subject: [PATCH 080/133] up version --- package.json | 2 +- public/version_latest.txt | 2 +- version_latest.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 5103fa09b1bc..9e73b8d43a81 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cipp", - "version": "5.3.2", + "version": "5.4.0", "description": "The CyberDrain Improved Partner Portal is a portal to help manage administration for Microsoft Partners.", "homepage": "https://cipp.app/", "bugs": { diff --git a/public/version_latest.txt b/public/version_latest.txt index 84197c89467d..8a30e8f94a39 100644 --- a/public/version_latest.txt +++ b/public/version_latest.txt @@ -1 +1 @@ -5.3.2 +5.4.0 diff --git a/version_latest.txt b/version_latest.txt index 84197c89467d..8a30e8f94a39 100644 --- a/version_latest.txt +++ b/version_latest.txt @@ -1 +1 @@ -5.3.2 +5.4.0 From 5c69db8417f51eb31fbebdb4797d4189dcadc52f Mon Sep 17 00:00:00 2001 From: John Duprey Date: Fri, 29 Mar 2024 08:38:35 -0400 Subject: [PATCH 081/133] Update MailTest.jsx --- src/views/email-exchange/tools/MailTest.jsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/views/email-exchange/tools/MailTest.jsx b/src/views/email-exchange/tools/MailTest.jsx index 9c31a1eb8155..d433e658dba3 100644 --- a/src/views/email-exchange/tools/MailTest.jsx +++ b/src/views/email-exchange/tools/MailTest.jsx @@ -1,4 +1,5 @@ import { CButton, CSpinner } from '@coreui/react' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import React from 'react' import { CippCallout, CippPageList } from 'src/components/layout' import { cellBooleanFormatter, cellDateFormatter } from 'src/components/tables' @@ -96,8 +97,8 @@ const MailTest = () => { {configQuery.data?.HasMailRead == false && ( <> Permission Check: {configQuery.data?.Message}{' '} - handleConfigRetry()}> - Retry + handleConfigRetry()}> + {configQuery.isLoading ? : } Retry )} From 479ebbb485b52724a3a77984e8515f397d460ed1 Mon Sep 17 00:00:00 2001 From: Esco Date: Mon, 25 Mar 2024 13:17:48 +0100 Subject: [PATCH 082/133] Added default value support to standards number type --- src/views/tenant/standards/ListAppliedStandards.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/views/tenant/standards/ListAppliedStandards.jsx b/src/views/tenant/standards/ListAppliedStandards.jsx index ba5c10a14601..19a45bc0b089 100644 --- a/src/views/tenant/standards/ListAppliedStandards.jsx +++ b/src/views/tenant/standards/ListAppliedStandards.jsx @@ -491,6 +491,7 @@ const ApplyNewStandard = () => { className="mb-3" name={component.name} label={component.label} + hiddenValue={component.default ?? 0} /> )} {component.type === 'boolean' && ( From fe66cd8dd385d49f47c63aaf5d8ac0d0b6c13256 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Fri, 29 Mar 2024 18:29:28 -0400 Subject: [PATCH 083/133] handle undefined/null columns --- src/components/tables/CellTable.jsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/tables/CellTable.jsx b/src/components/tables/CellTable.jsx index 549e4805dfa0..aca744aed572 100644 --- a/src/components/tables/CellTable.jsx +++ b/src/components/tables/CellTable.jsx @@ -20,7 +20,12 @@ export default function cellTable( columnProp = column } - if (!Array.isArray(columnProp) && typeof columnProp === 'object') { + if ( + !Array.isArray(columnProp) && + typeof columnProp === 'object' && + columnProp !== undefined && + columnProp !== null + ) { columnProp = Object.keys(columnProp).map((key) => { return { [key]: columnProp[key], From ad3dcd9a86827623e47decf0d86ca76472e6cc0e Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Sun, 31 Mar 2024 22:19:54 +0200 Subject: [PATCH 084/133] favourites adding --- src/App.jsx | 40 +- src/adminRoutes.js | 76 -- src/components/layout/AppSidebar.jsx | 8 +- src/components/utilities/CippauthCheck.jsx | 27 + src/components/utilities/PrivateRoute.jsx | 39 +- src/hooks/useNavFavouriteCheck.jsx | 31 + src/hooks/useRouteNavCompare.jsx | 33 + src/routes.js | 714 ---------------- src/routes.json | 921 +++++++++++++++++++++ src/views/cipp/UserSettings.jsx | 50 +- 10 files changed, 1065 insertions(+), 874 deletions(-) delete mode 100644 src/adminRoutes.js create mode 100644 src/components/utilities/CippauthCheck.jsx create mode 100644 src/hooks/useNavFavouriteCheck.jsx create mode 100644 src/hooks/useRouteNavCompare.jsx delete mode 100644 src/routes.js create mode 100644 src/routes.json diff --git a/src/App.jsx b/src/App.jsx index db95409b5c98..d10d00cf6434 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -2,22 +2,19 @@ import React, { Suspense } from 'react' import { BrowserRouter, Route, Routes, Navigate } from 'react-router-dom' import { PrivateRoute, FullScreenLoading, ErrorBoundary } from 'src/components/utilities' import 'src/scss/style.scss' -import routes from 'src/routes' import { Helmet } from 'react-helmet-async' -import adminRoutes from './adminRoutes' import Skeleton from 'react-loading-skeleton' import TimeAgo from 'javascript-time-ago' import en from 'javascript-time-ago/locale/en.json' TimeAgo.addDefaultLocale(en) import { library } from '@fortawesome/fontawesome-svg-core' import { fas } from '@fortawesome/free-solid-svg-icons' +import routes from 'src/routes' +import { useAuthCheck } from './components/utilities/CippauthCheck' library.add(fas) - -// Containers +const dynamicImport = (path) => React.lazy(() => import(`./${path}`)) const DefaultLayout = React.lazy(() => import('./layout/DefaultLayout')) - -// Pages const Page401 = React.lazy(() => import('./views/pages/page401/Page401')) const Page403 = React.lazy(() => import('./views/pages/page403/Page403')) const Page404 = React.lazy(() => import('./views/pages/page404/Page404')) @@ -25,7 +22,6 @@ const Page500 = React.lazy(() => import('./views/pages/page500/Page500')) const PageLogOut = React.lazy(() => import('src/views/pages/LogoutRedirect/PageLogOut')) const Login = React.lazy(() => import('./views/pages/login/Login')) const Logout = React.lazy(() => import('./views/pages/login/Logout')) - const App = () => { return ( @@ -50,43 +46,23 @@ const App = () => { } > {routes.map((route, idx) => { + const Component = dynamicImport(route.component) + const allowedRoles = route.allowedRoles return ( - route.component && ( - }> - - CIPP - {route.name} - - - - - - } - /> - ) - ) - })} - {adminRoutes.map((route, idx) => { - return ( - route.component && ( + Component && ( + }> CIPP - {route.name} - + diff --git a/src/adminRoutes.js b/src/adminRoutes.js deleted file mode 100644 index 2f6f666ab905..000000000000 --- a/src/adminRoutes.js +++ /dev/null @@ -1,76 +0,0 @@ -import React from 'react' - -const CIPPSettings = React.lazy(() => import('src/views/cipp/app-settings/CIPPSettings')) -const Setup = React.lazy(() => import('src/views/cipp/Setup')) -const ApplyStandard = React.lazy(() => import('src/views/tenant/standards/ListStandards')) -const GDAPStatus = React.lazy(() => import('src/views/tenant/administration/ListGDAPQueue')) -const GDAP = React.lazy(() => import('src/views/tenant/administration/GDAPWizard')) -const GDAPInvite = React.lazy(() => import('src/views/tenant/administration/GDAPInviteWizard')) -const GDAPRoleWizard = React.lazy(() => import('src/views/tenant/administration/GDAPRoleWizard')) -const GDAPRoles = React.lazy(() => import('src/views/tenant/administration/ListGDAPRoles')) -const GDAPRelationships = React.lazy(() => - import('./views/tenant/administration/ListGDAPRelationships'), -) -const appapproval = React.lazy(() => import('src/views/cipp/AppApproval')) -const TenantOffboardingWizard = React.lazy(() => - import('src/views/tenant/administration/TenantOffboardingWizard'), -) -const TenantOnboardingWizard = React.lazy(() => - import('src/views/tenant/administration/TenantOnboardingWizard'), -) - -const adminRoutes = [ - { path: '/cipp', name: 'CIPP' }, - { path: '/cipp/cipp', name: 'CIPP' }, - { path: '/cipp/settings', name: 'Settings', component: CIPPSettings }, - { path: '/cipp/setup', name: 'Setup', component: Setup }, - - { path: '/tenant/administration/gdap', name: 'GDAP Wizard', component: GDAP }, - { - path: '/tenant/administration/gdap-invite', - name: 'GDAP Invite Wizard', - component: GDAPInvite, - }, - { - path: '/tenant/administration/gdap-role-wizard', - name: 'GDAP Role Wizard', - component: GDAPRoleWizard, - }, - { - path: '/tenant/administration/gdap-roles', - name: 'GDAP Roles', - component: GDAPRoles, - }, - { - path: '/tenant/administration/gdap-relationships', - name: 'GDAP Relationships', - component: GDAPRelationships, - }, - { - path: '/tenant/administration/appapproval', - name: 'App Approval', - component: appapproval, - }, - { - path: '/tenant/administration/gdap-status', - name: 'GDAP Status', - component: GDAPStatus, - }, - { - path: '/tenant/standards/list-standards', - name: 'List Standard', - component: ApplyStandard, - }, - { - path: '/tenant/administration/tenant-offboarding-wizard', - name: 'Tenant Offboarding', - component: TenantOffboardingWizard, - }, - { - path: '/tenant/administration/tenant-onboarding-wizard', - name: 'Tenant Onboarding', - component: TenantOnboardingWizard, - }, -] - -export default adminRoutes diff --git a/src/components/layout/AppSidebar.jsx b/src/components/layout/AppSidebar.jsx index f680f42116d1..8a0b0c8a2432 100644 --- a/src/components/layout/AppSidebar.jsx +++ b/src/components/layout/AppSidebar.jsx @@ -12,6 +12,10 @@ import { AppSidebarNav } from 'src/components/layout' import SimpleBar from 'simplebar-react' import 'simplebar/dist/simplebar.min.css' import navigation from 'src/_nav' +import { useAuthCheck } from '../utilities/CippauthCheck' +import routes from 'src/routes' +import { useRouteNavCompare } from 'src/hooks/useRouteNavCompare' +import { useNavFavouriteCheck } from 'src/hooks/useNavFavouriteCheck' const AppSidebar = () => { const i = @@ -22,6 +26,8 @@ const AppSidebar = () => { if (!i.includes('JGySCBt1QXmNc')) { throw '' } + const newNav = useRouteNavCompare(navigation) + const navwithFavourites = useNavFavouriteCheck(newNav) return ( { @@ -41,7 +47,7 @@ const AppSidebar = () => { /> - + diff --git a/src/components/utilities/CippauthCheck.jsx b/src/components/utilities/CippauthCheck.jsx new file mode 100644 index 000000000000..338c22233bf7 --- /dev/null +++ b/src/components/utilities/CippauthCheck.jsx @@ -0,0 +1,27 @@ +import { useLoadClientPrincipalQuery } from 'src/store/api/auth' +import { useDispatch } from 'react-redux' +import { updateAccessToken } from 'src/store/features/auth' +import { Navigate } from 'react-router-dom' + +export const useAuthCheck = (allowedRoles) => { + const dispatch = useDispatch() + const { data: profile, isFetching } = useLoadClientPrincipalQuery() + if (isFetching) { + return { isLoading: true, component: null } + } + dispatch(updateAccessToken(profile)) + let roles = profile?.clientPrincipal?.userRoles || [] + + if (!profile?.clientPrincipal) { + return { + component: ( + + ), + result: false, + } + } + if (allowedRoles && !allowedRoles.some((role) => roles.includes(role))) { + return { component: , result: true } + } + return { component: null, result: false } +} diff --git a/src/components/utilities/PrivateRoute.jsx b/src/components/utilities/PrivateRoute.jsx index b89f0d5aa8ee..b63ba0617b47 100644 --- a/src/components/utilities/PrivateRoute.jsx +++ b/src/components/utilities/PrivateRoute.jsx @@ -1,41 +1,20 @@ import React from 'react' -import { Navigate } from 'react-router-dom' -import { useLoadClientPrincipalQuery } from 'src/store/api/auth' import { FullScreenLoading } from 'src/components/utilities' -import { useDispatch } from 'react-redux' -import { updateAccessToken } from 'src/store/features/auth' import PropTypes from 'prop-types' +import { useAuthCheck } from './CippauthCheck' -export const PrivateRoute = ({ children, routeType }) => { - const dispatch = useDispatch() - const { data: profile, error, isFetching } = useLoadClientPrincipalQuery() - //console.log() - if (isFetching) { +export const PrivateRoute = ({ children, allowedRoles }) => { + const { isLoading, component: authComponent } = useAuthCheck(allowedRoles) + if (isLoading) { return } - - dispatch(updateAccessToken(profile)) - let roles = null - if (null !== profile?.clientPrincipal) { - roles = profile?.clientPrincipal.userRoles - } else if (null === profile?.clientPrincipal) { - return - } - if (null === roles) { - return - } else { - const isAuthenticated = - roles.includes('admin') || roles.includes('editor') || (roles.includes('readonly') && !error) - const isAdmin = roles.includes('admin') - if (routeType === 'admin') { - return !isAdmin ? : children - } else { - return !isAuthenticated ? : children - } + if (authComponent) { + return authComponent } + return children } PrivateRoute.propTypes = { - children: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]), - routeType: PropTypes.string, + children: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]).isRequired, + allowedRoles: PropTypes.arrayOf(PropTypes.string), } diff --git a/src/hooks/useNavFavouriteCheck.jsx b/src/hooks/useNavFavouriteCheck.jsx new file mode 100644 index 000000000000..622bc2ea0573 --- /dev/null +++ b/src/hooks/useNavFavouriteCheck.jsx @@ -0,0 +1,31 @@ +import { CNavGroup, CNavItem, CNavTitle } from '@coreui/react' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { useSelector } from 'react-redux' + +export const useNavFavouriteCheck = (navigation) => { + const favourites = useSelector((state) => state.app.userSettingsDefaults?.favourites) + + if (Array.isArray(favourites)) { + const newNavigation = [ + { component: CNavTitle, name: 'Favourites' }, + { + component: CNavGroup, + section: 'favourites', + name: 'Favourites', + to: '/favorites', + icon: , + items: favourites.map((item) => { + console.log(item) + return { + name: item.value.name, + to: item.value.to, + component: CNavItem, + } + }), + }, + ...navigation, + ] + return newNavigation + } + return navigation +} diff --git a/src/hooks/useRouteNavCompare.jsx b/src/hooks/useRouteNavCompare.jsx new file mode 100644 index 000000000000..aee23a37474d --- /dev/null +++ b/src/hooks/useRouteNavCompare.jsx @@ -0,0 +1,33 @@ +import { useLoadClientPrincipalQuery } from 'src/store/api/auth' +import { useDispatch } from 'react-redux' +import { updateAccessToken } from 'src/store/features/auth' +import routes from 'src/routes' + +export const useRouteNavCompare = (navigation) => { + const dispatch = useDispatch() + const { data: profile, isFetching } = useLoadClientPrincipalQuery() + if (isFetching) { + return { isLoading: true, component: null } + } + dispatch(updateAccessToken(profile)) + let roles = profile?.clientPrincipal?.userRoles || [] + let newNavigation = navigation.map((nav) => { + if (nav.items) { + nav.items = nav.items.filter((item) => { + const route = routes.find((r) => r.path === item.to) + if ( + !route || + (route.allowedRoles && route.allowedRoles.some((role) => roles.includes(role))) + ) { + return true + } else { + console.log('Removing route', item) + return false + } + }) + } + return nav + }) + + return newNavigation +} diff --git a/src/routes.js b/src/routes.js deleted file mode 100644 index 794ebb4b4c4d..000000000000 --- a/src/routes.js +++ /dev/null @@ -1,714 +0,0 @@ -import React from 'react' -import MailTest from 'src/views/email-exchange/tools/MailTest' - -const Home = React.lazy(() => import('src/views/home/Home')) -const Logs = React.lazy(() => import('src/views/cipp/Logs')) -const Scheduler = React.lazy(() => import('src/views/cipp/Scheduler')) -const Statistics = React.lazy(() => import('src/views/cipp/Statistics')) -const Users = React.lazy(() => import('src/views/identity/administration/Users')) -const DeletedItems = React.lazy(() => import('src/views/identity/administration/Deleted')) -const ViewBEC = React.lazy(() => import('src/views/identity/administration/ViewBEC')) -const AddUser = React.lazy(() => import('src/views/identity/administration/AddUser')) -const AddUserBulk = React.lazy(() => import('src/views/identity/administration/AddUserBulk')) - -const InviteGuest = React.lazy(() => import('src/views/identity/administration/InviteGuest')) -const EditUser = React.lazy(() => import('src/views/identity/administration/EditUser')) -const ViewUser = React.lazy(() => import('src/views/identity/administration/ViewUser')) -const Groups = React.lazy(() => import('src/views/identity/administration/Groups')) -const AddGroup = React.lazy(() => import('src/views/identity/administration/AddGroup')) -const UserSettings = React.lazy(() => import('src/views/cipp/UserSettings')) - -const AddGroupTemplates = React.lazy(() => - import('src/views/identity/administration/AddGroupTemplate'), -) -const DeployGroupTemplates = React.lazy(() => - import('src/views/identity/administration/DeployGroupTemplate'), -) -const GeoIPLookup = React.lazy(() => import('src/views/tenant/administration/GeoIPLookup')) - -const TenantLookup = React.lazy(() => import('src/views/tenant/administration/TenantLookup')) - -const GroupTemplates = React.lazy(() => import('src/views/identity/administration/GroupTemplates')) - -const EditGroup = React.lazy(() => import('src/views/identity/administration/EditGroup')) -const ViewGroup = React.lazy(() => import('src/views/identity/administration/ViewGroup')) -const Roles = React.lazy(() => import('src/views/identity/administration/Roles')) -const Devices = React.lazy(() => import('src/views/endpoint/intune/Devices')) -const allDevices = React.lazy(() => import('src/views/identity/administration/Devices')) - -const PageLogOut = React.lazy(() => import('src/views/pages/LogoutRedirect/PageLogOut')) - -const Page404 = React.lazy(() => import('src/views/pages/page404/Page404')) -const Page403 = React.lazy(() => import('src/views/pages/page403/Page403')) -const Page500 = React.lazy(() => import('src/views/pages/page500/Page500')) - -const MFAReport = React.lazy(() => import('src/views/identity/reports/MFAReport')) -const Tenants = React.lazy(() => import('src/views/tenant/administration/Tenants')) -const AlertWizard = React.lazy(() => import('src/views/tenant/administration/AlertWizard')) -const AlertRules = React.lazy(() => import('src/views/tenant/administration/AlertRules')) - -const AlertsQueue = React.lazy(() => import('src/views/tenant/administration/ListAlertsQueue')) -const GraphExplorer = React.lazy(() => import('src/views/tenant/administration/GraphExplorer')) - -const Domains = React.lazy(() => import('src/views/tenant/administration/Domains')) -const EditTenant = React.lazy(() => import('src/views/tenant/administration/EditTenant')) -const ConditionalAccess = React.lazy(() => import('src/views/tenant/conditional/ConditionalAccess')) -const DeployVacationCA = React.lazy(() => import('src/views/tenant/conditional/DeployVacation')) -const NamedLocations = React.lazy(() => import('src/views/tenant/conditional/NamedLocations')) - -const ListConditionalTemplates = React.lazy(() => - import('src/views/tenant/conditional/ListCATemplates'), -) - -const DeployNamedLocation = React.lazy(() => - import('src/views/tenant/conditional/DeployNamedLocation'), -) -const AddConditionalTemplate = React.lazy(() => - import('src/views/tenant/conditional/AddCATemplate'), -) - -const DeployConditional = React.lazy(() => import('src/views/tenant/conditional/DeployCA')) - -const ListLicences = React.lazy(() => import('src/views/tenant/administration/ListLicences')) -const ListAppConsent = React.lazy(() => import('src/views/tenant/administration/ListOauthApps')) - -const InActiveUserReport = React.lazy(() => import('src/views/identity/reports/InactiveUsers')) -const SignInReport = React.lazy(() => import('src/views/identity/reports/SignIns')) - -const AzureADConnectReport = React.lazy(() => - import('src/views/identity/reports/AzureADConnectReport'), -) -const DeviceComplianceReport = React.lazy(() => - import('src/views/security/reports/ListDeviceComplianceReport'), -) -const BestPracticeAnalyzer = React.lazy(() => - import('src/views/tenant/standards/BestPracticeAnalyser'), -) -const BPAReportBuilder = React.lazy(() => import('src/views/tenant/standards/BPAReportBuilder')) -const DomainsAnalyser = React.lazy(() => import('src/views/tenant/standards/DomainsAnalyser')) -const OffboardingWizard = React.lazy(() => - import('src/views/identity/administration/OffboardingWizard'), -) -const ListAppliedStandards = React.lazy(() => - import('src/views/tenant/standards/ListAppliedStandards'), -) -const IndividualDomain = React.lazy(() => import('src/views/tenant/standards/IndividualDomain')) -const ListAlerts = React.lazy(() => import('src/views/security/incidents/ListAlerts')) -const ApplicationsList = React.lazy(() => - import('src/views/endpoint/applications/ApplicationsList'), -) -const ApplicationsQueue = React.lazy(() => - import('src/views/endpoint/applications/ListApplicationQueue'), -) -const ApplicationsAddChocoApp = React.lazy(() => - import('src/views/endpoint/applications/ApplicationsAddChocoApp'), -) -const ApplicationsAddWingetApp = React.lazy(() => - import('src/views/endpoint/applications/ApplicationsAddWinGet'), -) -const ApplicationsAddOfficeApp = React.lazy(() => - import('src/views/endpoint/applications/ApplicationsAddOffice'), -) -const ApplicationsAddRMMApp = React.lazy(() => - import('src/views/endpoint/applications/ApplicationsAddRMM'), -) -const AutopilotAddDevice = React.lazy(() => - import('src/views/endpoint/autopilot/AutopilotAddDevice'), -) -const AutopilotAddProfile = React.lazy(() => - import('src/views/endpoint/autopilot/AutopilotAddProfile'), -) -const AutopilotAddStatusPage = React.lazy(() => - import('src/views/endpoint/autopilot/AutopilotAddStatusPage'), -) -const AutopilotListDevices = React.lazy(() => - import('src/views/endpoint/autopilot/AutopilotListDevices'), -) -const AutopilotListProfiles = React.lazy(() => - import('src/views/endpoint/autopilot/AutopilotListProfiles'), -) -const AutopilotListStatusPages = React.lazy(() => - import('src/views/endpoint/autopilot/AutopilotListStatusPages'), -) -const IntuneListPolicies = React.lazy(() => import('src/views/endpoint/intune/MEMListPolicies')) -const IntuneListCompliance = React.lazy(() => import('src/views/endpoint/intune/MEMListCompliance')) - -const IntuneListAppProtection = React.lazy(() => - import('src/views/endpoint/intune/MEMListAppProtection'), -) - -const MEMEditPolicy = React.lazy(() => import('src/views/endpoint/intune/MEMEditPolicy')) - -const IntuneCAPolicies = React.lazy(() => import('src/views/endpoint/intune/MEMCAPolicies')) -const IntuneAddPolicy = React.lazy(() => import('src/views/endpoint/intune/MEMAddPolicy')) -const MEMAddPolicyTemplate = React.lazy(() => - import('src/views/endpoint/intune/MEMAddPolicyTemplate'), -) -const IntuneListPolicyTemplate = React.lazy(() => - import('src/views/endpoint/intune/MEMListPolicyTemplates'), -) -const ListDefender = React.lazy(() => import('src/views/security/defender/ListDefender')) -const ListVulnerabilities = React.lazy(() => import('src/views/security/defender/ListVuln')) - -const DeployDefender = React.lazy(() => import('src/views/security/defender/DeployDefender')) - -const OneDriveList = React.lazy(() => import('src/views/teams-share/onedrive/OneDriveList')) -const SharepointList = React.lazy(() => import('src/views/teams-share/sharepoint/SharepointList')) -const BusinessVoice = React.lazy(() => import('src/views/teams-share/teams/BusinessVoice')) -const TeamsListTeam = React.lazy(() => import('src/views/teams-share/teams/TeamsListTeam')) -const TeamsAddTeam = React.lazy(() => import('src/views/teams-share/teams/TeamsAddTeam')) -const ViewTeamsSettings = React.lazy(() => import('src/views/teams-share/teams/ViewTeamSettings')) -const TeamsActivity = React.lazy(() => import('src/views/teams-share/teams/TeamsActivity')) -const ContactsList = React.lazy(() => - import('src/views/email-exchange/administration/ContactsList'), -) -const EditContact = React.lazy(() => import('src/views/email-exchange/administration/EditContact')) -const EditMailboxPermissions = React.lazy(() => - import('src/views/email-exchange/administration/EditMailboxPermissions'), -) -const AddSharedMailbox = React.lazy(() => - import('src/views/email-exchange/administration/AddSharedMailbox'), -) -const AddContact = React.lazy(() => import('src/views/email-exchange/administration/AddContact')) -const EditCalendarPermissions = React.lazy(() => - import('src/views/email-exchange/administration/EditCalendarPermissions'), -) -const ViewMobileDevices = React.lazy(() => - import('src/views/email-exchange/administration/ViewMobileDevices'), -) -const MailboxesList = React.lazy(() => - import('src/views/email-exchange/administration/MailboxesList'), -) -const MailboxRulesList = React.lazy(() => - import('src/views/email-exchange/administration/MailboxRuleList'), -) -const QuarantineList = React.lazy(() => - import('src/views/email-exchange/administration/QuarantineList'), -) -const MailboxClientAccessSettingsList = React.lazy(() => - import('src/views/email-exchange/reports/MailboxClientAccessSettingsList'), -) -const MailboxStatisticsList = React.lazy(() => - import('src/views/email-exchange/reports/MailboxStatisticsList'), -) -const SharedMailboxEnabledAccount = React.lazy(() => - import('src/views/email-exchange/reports/SharedMailboxEnabledAccount'), -) -const MessageTrace = React.lazy(() => import('src/views/email-exchange/reports/MessageTrace')) -const PhishingPoliciesList = React.lazy(() => - import('src/views/email-exchange/reports/PhishingPoliciesList'), -) -const TransportRulesList = React.lazy(() => - import('src/views/email-exchange/transport/TransportRules'), -) -const TransportTemplate = React.lazy(() => - import('src/views/email-exchange/transport/ListTransportTemplates'), -) -const AddTransportTemplate = React.lazy(() => - import('src/views/email-exchange/transport/AddTransportTemplate'), -) -const TransportDeploy = React.lazy(() => - import('src/views/email-exchange/transport/DeployTransport'), -) -const SpamfilterList = React.lazy(() => import('src/views/email-exchange/spamfilter/Spamfilter')) -const SpamFilterTemplate = React.lazy(() => - import('src/views/email-exchange/spamfilter/ListSpamfilterTemplates'), -) -const AddSpamFilterTemplate = React.lazy(() => - import('src/views/email-exchange/spamfilter/AddSpamfilterTemplate'), -) -const SpamFilterDeploy = React.lazy(() => - import('src/views/email-exchange/spamfilter/DeploySpamfilter'), -) -const ConnectorList = React.lazy(() => import('src/views/email-exchange/connectors/ConnectorList')) -const ConnectorListTemplates = React.lazy(() => - import('src/views/email-exchange/connectors/ListConnectorTemplates'), -) -const DeployConnector = React.lazy(() => - import('src/views/email-exchange/connectors/DeployConnector'), -) -const AddConnectorTemplate = React.lazy(() => - import('src/views/email-exchange/connectors/AddConnectorTemplate'), -) - -const SecurityComplianceAlerts = React.lazy(() => import('src/views/security/incidents/ListAlerts')) -const SecurityComplianceIncidents = React.lazy(() => - import('src/views/security/incidents/ListIncidents'), -) -const License = React.lazy(() => import('src/views/pages/license/License')) -const ServiceHealth = React.lazy(() => import('src/views/tenant/administration/ServiceHealth')) - -const EnterpriseApplications = React.lazy(() => - import('src/views/tenant/administration/ListEnterpriseApps'), -) -const AppConsentRequests = React.lazy(() => - import('src/views/tenant/administration/ListAppConsentRequests'), -) -const MailboxRestoreWizard = React.lazy(() => - import('src/views/email-exchange/tools/MailboxRestoreWizard'), -) -const MailboxRestores = React.lazy(() => import('src/views/email-exchange/tools/MailboxRestores')) -const Mailtest = React.lazy(() => import('src/views/email-exchange/tools/MailTest')) - -const routes = [ - // { path: '/', exact: true, name: 'Home' }, - { path: '/home', name: 'Home', component: Home }, - { path: '/cipp/logs', name: 'Logs', component: Logs }, - { path: '/cipp/scheduler', name: 'Scheduler', component: Scheduler }, - { path: '/cipp/statistics', name: 'Statistics', component: Statistics }, - { path: '/cipp/404', name: 'Error', component: Page404 }, - { path: '/cipp/403', name: 'Error', component: Page403 }, - { path: '/cipp/500', name: 'Error', component: Page500 }, - { path: '/identity', name: 'Identity' }, - { path: '/identity/administration/users/add', name: 'Add User', component: AddUser }, - { - path: '/identity/administration/users/addbulk', - name: 'Add User Bulk', - component: AddUserBulk, - }, - - { path: '/identity/administration/users/edit', name: 'Edit User', component: EditUser }, - { path: '/identity/administration/users/view', name: 'View User', component: ViewUser }, - { - path: '/identity/administration/users/InviteGuest', - name: 'Invite Guest', - component: InviteGuest, - }, - { path: '/identity/administration/ViewBec', name: 'View BEC', component: ViewBEC }, - { path: '/identity/administration', name: 'Administration' }, - { path: '/identity/administration/users', name: 'Users', component: Users }, - { path: '/identity/administration/devices', name: 'Devices', component: allDevices }, - - { path: '/identity/administration/groups/add', name: 'Add Group', component: AddGroup }, - { - path: '/identity/administration/group-templates', - name: 'Group Templates', - component: GroupTemplates, - }, - { - path: '/identity/administration/group-add-template', - name: 'Add Group Template', - component: AddGroupTemplates, - }, - { - path: '/identity/administration/deploy-group-template', - name: 'Deploy Group Template', - component: DeployGroupTemplates, - }, - { path: '/identity/administration/groups/edit', name: 'Edit Group', component: EditGroup }, - { path: '/identity/administration/groups/view', name: 'View Group', component: ViewGroup }, - { path: '/identity/administration/groups', name: 'Groups', component: Groups }, - { path: '/identity/administration/roles', name: 'Roles', component: Roles }, - { - path: '/identity/administration/deleted-items', - name: 'Deleted Items', - component: DeletedItems, - }, - - { path: '/teams-share/teams/business-voice', name: 'BusinessVoice', component: BusinessVoice }, - { - path: '/identity/administration/offboarding-wizard', - name: 'Offboarding Wizard', - component: OffboardingWizard, - }, - { path: '/identity/reports', name: 'Reports' }, - { path: '/endpoint/reports/devices', name: 'Devices', component: Devices }, - { path: '/identity/reports/mfa-report', name: 'MFA Report', component: MFAReport }, - { - path: '/identity/reports/inactive-users-report', - name: 'Inactive Users Report', - component: InActiveUserReport, - }, - { - path: '/identity/reports/Signin-report', - name: 'Sign-In Report', - component: SignInReport, - }, - { - path: '/identity/reports/azure-ad-connect-report', - name: 'AAD Connect Report', - component: AzureADConnectReport, - }, - { path: '/tenant', name: 'Tenant' }, - { path: '/tenant/administration', name: 'Administration' }, - { path: '/tenant/administration/tenants', name: 'Tenants', component: Tenants }, - { path: '/tenant/administration/tenants/edit', name: 'Edit Tenant', component: EditTenant }, - { path: '/tenant/administration/domains', name: 'Domains', component: Domains }, - { path: '/tenant/administration/alertswizard', name: 'Alerts Wizard', component: AlertWizard }, - { path: '/tenant/administration/alertrules', name: 'Alerts Wizard', component: AlertRules }, - - { path: '/tenant/administration/alertsqueue', name: 'Alerts Queue', component: AlertsQueue }, - { - path: '/tenant/administration/graph-explorer', - name: 'Graph Explorer', - component: GraphExplorer, - }, - { - path: '/tenant/administration/service-health', - name: 'Service Health', - component: ServiceHealth, - }, - { - path: '/tenant/administration/enterprise-apps', - name: 'Enterprise Applications', - component: EnterpriseApplications, - }, - { - path: '/tenant/administration/app-consent-requests', - name: 'App Consent Requests', - component: AppConsentRequests, - }, - { - path: '/tenant/conditional/list-policies', - name: 'Conditional Access', - component: ConditionalAccess, - }, - { - path: '/tenant/conditional/deploy-vacation', - name: 'Deploy Vacation Mode', - component: DeployVacationCA, - }, - { - path: '/tenant/conditional/list-named-locations', - name: 'Named Locations', - component: NamedLocations, - }, - { - path: '/tenant/conditional/deploy', - name: 'Deploy Conditional Access', - component: DeployConditional, - }, - { - path: '/tenant/conditional/deploy-named-location', - name: 'Deploy Named Locations', - component: DeployNamedLocation, - }, - { - path: '/tenant/conditional/list-template', - name: 'Conditional Access Templates', - component: ListConditionalTemplates, - }, - { - path: '/tenant/conditional/add-template', - name: 'Conditional Access Add Template', - component: AddConditionalTemplate, - }, - { - path: '/tenant/administration/list-licenses', - name: 'List Licenses', - component: ListLicences, - }, - { - path: '/tenant/administration/application-consent', - name: 'Consented Applications', - component: ListAppConsent, - }, - { path: '/tenant/standards', name: 'Standards' }, - { - path: '/tenant/standards/list-applied-standards', - name: 'List Applied Standards', - component: ListAppliedStandards, - }, - { - path: '/tenant/standards/bpa-report', - name: 'Best Practice Report', - component: BestPracticeAnalyzer, - }, - { - path: '/tenant/standards/domains-analyser', - name: 'Domains Analyser', - component: DomainsAnalyser, - }, - { - path: '/tenant/standards/individual-domains', - name: 'Individual Domain Check', - component: IndividualDomain, - }, - { - path: '/tenant/administration/tenantlookup', - name: 'Tenant Lookup', - component: TenantLookup, - }, - { - path: '/tenant/tools/geoiplookup', - name: 'Geo IP Lookup', - component: GeoIPLookup, - }, - { - path: '/tenant/tools/bpa-report-builder', - name: 'BPA Report Builder', - component: BPAReportBuilder, - }, - { path: '/tenant/standards/alert-list', name: 'Alert List (Alpha)', component: ListAlerts }, - { path: '/endpoint', name: 'Endpoint' }, - { path: '/endpoint/applications', name: 'Applications' }, - { path: '/endpoint/applications/list', name: 'List Applications', component: ApplicationsList }, - { path: '/endpoint/applications/queue', name: 'Application Queue', component: ApplicationsQueue }, - - { - path: '/endpoint/applications/add-choco-app', - name: 'Add Choco App', - component: ApplicationsAddChocoApp, - }, - { - path: '/endpoint/applications/add-winget-app', - name: 'Add Store App', - component: ApplicationsAddWingetApp, - }, - { - path: '/endpoint/applications/add-office-app', - name: 'Add Office App', - component: ApplicationsAddOfficeApp, - }, - { - path: '/endpoint/applications/add-rmm-app', - name: 'Add RMM App', - component: ApplicationsAddRMMApp, - }, - { path: '/endpoint/autopilot', name: 'Autopilot' }, - { path: '/endpoint/autopilot/add-device', name: 'Add Device', component: AutopilotAddDevice }, - { path: '/endpoint/autopilot/add-profile', name: 'Add Profile', component: AutopilotAddProfile }, - { - path: '/endpoint/autopilot/add-status-page', - name: 'Add Status Page', - component: AutopilotAddStatusPage, - }, - { - path: '/endpoint/autopilot/list-devices', - name: 'List Devices', - component: AutopilotListDevices, - }, - { - path: '/endpoint/autopilot/list-profiles', - name: 'List Profiles', - component: AutopilotListProfiles, - }, - { - path: '/endpoint/autopilot/list-status-pages', - name: 'List Status Pages', - component: AutopilotListStatusPages, - }, - { path: '/endpoint/MEM', name: 'MEM' }, - { - path: '/endpoint/MEM/list-policies', - name: 'List Intune Policies', - component: IntuneListPolicies, - }, - { - path: '/endpoint/MEM/list-compliance-policies', - name: 'List Intune Compliance Policies', - component: IntuneListCompliance, - }, - { - path: '/endpoint/MEM/list-appprotection-policies', - name: 'List App Protection Policies', - component: IntuneListAppProtection, - }, - - { path: '/endpoint/MEM/edit-policy', name: 'Edit MEM Policy', component: MEMEditPolicy }, - { path: '/endpoint/MEM/ca-policies', name: 'List Status Pages', component: IntuneCAPolicies }, - { path: '/endpoint/MEM/add-policy', name: 'Add Intune Policy', component: IntuneAddPolicy }, - { - path: '/endpoint/MEM/add-policy-template', - name: 'Add Endpoint Manager Policy Template', - component: MEMAddPolicyTemplate, - }, - { - path: '/endpoint/MEM/list-templates', - name: 'List Intune Policy Template', - component: IntuneListPolicyTemplate, - }, - { path: '/security/defender', name: 'Defender' }, - { path: '/security/defender/deployment', name: 'Deploy Defender', component: DeployDefender }, - { path: '/security/defender/list-defender', name: 'List Defender', component: ListDefender }, - { - path: '/security/defender/list-defender-tvm', - name: 'List Vulnerabilities', - component: ListVulnerabilities, - }, - - { path: '/teams-share', name: 'Teams & SharePoint' }, - { path: '/teams-share/onedrive', name: 'OneDrive' }, - { path: '/teams-share/onedrive/list', name: 'List OneDrive', component: OneDriveList }, - { path: '/teams-share/sharepoint', name: 'SharePoint' }, - { - path: '/teams-share/sharepoint/list-sharepoint', - name: 'List SharePoint', - component: SharepointList, - }, - { path: '/teams-share/teams', name: 'Teams' }, - { path: '/teams-share/teams/list-team', name: 'List Teams', component: TeamsListTeam }, - { - path: '/teams-share/teams/view-team-settings', - name: 'View Team Settings', - component: ViewTeamsSettings, - }, - { path: '/teams-share/teams/add-team', name: 'Add Team', component: TeamsAddTeam }, - { path: '/teams-share/teams/teams-activity', name: 'Teams Activity', component: TeamsActivity }, - { name: 'Email & Exchange', path: '/email' }, - { name: 'Email Administration', path: '/email/administration' }, - { name: 'List Contacts', path: '/email/administration/contacts', component: ContactsList }, - { - path: '/email/connectors/list-connectors', - name: 'List Connectors', - component: ConnectorList, - }, - { - path: '/email/connectors/deploy-connector', - name: 'Deploy Connectors', - component: DeployConnector, - }, - { - path: '/email/connectors/add-connector-templates', - name: 'Add Connectors Templates', - component: AddConnectorTemplate, - }, - { - path: '/email/connectors/list-connector-templates', - name: 'List Connectors Templates', - component: ConnectorListTemplates, - }, - { - path: '/email/transport/list-rules', - name: 'List Transport Rules', - component: TransportRulesList, - }, - { - path: '/email/transport/deploy-rules', - name: 'Deploy Transport Rule', - component: TransportDeploy, - }, - { - path: '/email/transport/list-templates', - name: 'Transport Rule Templates', - component: TransportTemplate, - }, - { - path: '/email/transport/add-template', - name: 'Transport Rule Add Temmplate', - component: AddTransportTemplate, - }, - { - path: '/email/spamfilter/list-spamfilter', - name: 'List Spamfilter', - component: SpamfilterList, - }, - { - path: '/email/spamfilter/deploy', - name: 'Deploy Spamfilter', - component: SpamFilterDeploy, - }, - { - path: '/email/spamfilter/list-templates', - name: 'List Spamfilter Templates', - component: SpamFilterTemplate, - }, - { - path: '/email/tools/mailbox-restore-wizard', - name: 'Mailbox Restore Wizard', - component: MailboxRestoreWizard, - }, - { - path: '/email/tools/mailbox-restores', - name: 'Mailbox Restores', - component: MailboxRestores, - }, - { - path: '/email/tools/mail-test', - name: 'Mail Test', - component: MailTest, - }, - { - path: '/email/spamfilter/add-template', - name: 'Add Spamfilter Template', - component: AddSpamFilterTemplate, - }, - { - name: 'Edit Mailbox Permissions', - path: '/email/administration/edit-mailbox-permissions', - component: EditMailboxPermissions, - }, - { - name: 'Add Shared Mailbox', - path: '/email/administration/add-shared-mailbox', - component: AddSharedMailbox, - }, - { - name: 'Edit Contact', - path: '/email/administration/add-contact', - component: AddContact, - }, - { - name: 'Edit Calendar Permissions', - path: '/email/administration/edit-calendar-permissions', - component: EditCalendarPermissions, - }, - { - name: 'View Mobile Devices', - path: '/email/administration/view-mobile-devices', - component: ViewMobileDevices, - }, - { name: 'Edit Contact', path: '/email/administration/edit-contact', component: EditContact }, - { name: 'List Mailboxes', path: '/email/administration/mailboxes', component: MailboxesList }, - { - name: 'List Mailbox Rules', - path: '/email/administration/mailbox-rules', - component: MailboxRulesList, - }, - - { - name: 'List Quarantine', - path: '/email/administration/Quarantine', - component: QuarantineList, - }, - - { name: 'Email Reports', path: '/email/reports' }, - { - name: 'Mailbox Statistics', - path: '/email/reports/mailbox-statistics', - component: MailboxStatisticsList, - }, - { - name: 'Shared Mailbox Enabled Account', - path: '/email/reports/SharedMailboxEnabledAccount', - component: SharedMailboxEnabledAccount, - }, - { - name: 'Mailbox Client Access Settings', - path: '/email/reports/mailbox-cas-settings', - component: MailboxClientAccessSettingsList, - }, - { name: 'Message Trace', path: '/email/reports/message-trace', component: MessageTrace }, - { path: '/cipp/user-settings', name: 'User Settings', component: UserSettings }, - - { - name: 'Phishing Policies', - path: '/email/reports/phishing-policies', - component: PhishingPoliciesList, - }, - { name: 'Security & Compliance', path: '/security' }, - { name: 'Security Administration', path: '/security/administration' }, - { name: 'Security Reports', path: '/security/reports' }, - { - name: 'List Alerts', - path: '/security/incidents/list-alerts', - component: SecurityComplianceAlerts, - }, - { - name: 'List Incidents', - path: '/security/incidents/list-incidents', - component: SecurityComplianceIncidents, - }, - { - name: 'List Device Compliance Report', - path: '/security/reports/list-device-compliance', - component: DeviceComplianceReport, - }, - { - name: 'License', - path: '/license', - component: License, - }, -] - -export default routes diff --git a/src/routes.json b/src/routes.json new file mode 100644 index 000000000000..bdb96a077822 --- /dev/null +++ b/src/routes.json @@ -0,0 +1,921 @@ +[ + { + "path": "/home", + "name": "Home", + "component": "views/home/Home", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/cipp/logs", + "name": "Logs", + "component": "views/cipp/Logs", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/cipp/scheduler", + "name": "Scheduler", + "component": "views/cipp/Scheduler", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/cipp/statistics", + "name": "Statistics", + "component": "views/cipp/Statistics", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/cipp/404", + "name": "Error", + "component": "views/pages/page404/Page404", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/cipp/403", + "name": "Error", + "component": "views/pages/page403/Page403", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/cipp/500", + "name": "Error", + "component": "views/pages/page500/Page500", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity", + "name": "Identity", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration/users/add", + "name": "Add User", + "component": "views/identity/administration/AddUser", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration/users/addbulk", + "name": "Add User Bulk", + "component": "views/identity/administration/AddUserBulk", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration/users/edit", + "name": "Edit User", + "component": "views/identity/administration/EditUser", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration/users/view", + "name": "View User", + "component": "views/identity/administration/ViewUser", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration/users/InviteGuest", + "name": "Invite Guest", + "component": "views/identity/administration/InviteGuest", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration/ViewBec", + "name": "View BEC", + "component": "views/identity/administration/ViewBEC", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration", + "name": "Administration", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration/users", + "name": "Users", + "component": "views/identity/administration/Users", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration/devices", + "name": "Devices", + "component": "views/identity/administration/Devices", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration/groups/add", + "name": "Add Group", + "component": "views/identity/administration/AddGroup", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration/group-templates", + "name": "Group Templates", + "component": "views/identity/administration/GroupTemplates", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration/group-add-template", + "name": "Add Group Template", + "component": "views/identity/administration/AddGroupTemplate", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration/deploy-group-template", + "name": "Deploy Group Template", + "component": "views/identity/administration/DeployGroupTemplate", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration/groups/edit", + "name": "Edit Group", + "component": "views/identity/administration/EditGroup", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration/groups/view", + "name": "View Group", + "component": "views/identity/administration/ViewGroup", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration/groups", + "name": "Groups", + "component": "views/identity/administration/Groups", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration/roles", + "name": "Roles", + "component": "views/identity/administration/Roles", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration/deleted-items", + "name": "Deleted Items", + "component": "views/identity/administration/Deleted", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/teams-share/teams/business-voice", + "name": "BusinessVoice", + "component": "views/teams-share/teams/BusinessVoice", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/administration/offboarding-wizard", + "name": "Offboarding Wizard", + "component": "views/identity/administration/OffboardingWizard", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/reports", + "name": "Reports", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/reports/devices", + "name": "Devices", + "component": "views/endpoint/intune/Devices", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/reports/mfa-report", + "name": "MFA Report", + "component": "views/identity/reports/MFAReport", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/reports/inactive-users-report", + "name": "Inactive Users Report", + "component": "views/identity/reports/InactiveUsers", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/reports/Signin-report", + "name": "Sign-In Report", + "component": "views/identity/reports/SignIns", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/identity/reports/azure-ad-connect-report", + "name": "AAD Connect Report", + "component": "views/identity/reports/AzureADConnectReport", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant", + "name": "Tenant", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/administration", + "name": "Administration", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/administration/tenants", + "name": "Tenants", + "component": "views/tenant/administration/Tenants", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/administration/tenants/edit", + "name": "Edit Tenant", + "component": "views/tenant/administration/EditTenant", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/administration/domains", + "name": "Domains", + "component": "views/tenant/administration/Domains", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/administration/alertswizard", + "name": "Alerts Wizard", + "component": "views/tenant/administration/AlertWizard", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/administration/alertrules", + "name": "Alerts Wizard", + "component": "views/tenant/administration/AlertRules", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/administration/alertsqueue", + "name": "Alerts Queue", + "component": "views/tenant/administration/ListAlertsQueue", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/administration/graph-explorer", + "name": "Graph Explorer", + "component": "views/tenant/administration/GraphExplorer", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/administration/service-health", + "name": "Service Health", + "component": "views/tenant/administration/ServiceHealth", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/administration/enterprise-apps", + "name": "Enterprise Applications", + "component": "views/tenant/administration/ListEnterpriseApps", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/administration/app-consent-requests", + "name": "App Consent Requests", + "component": "views/tenant/administration/ListAppConsentRequests", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/conditional/list-policies", + "name": "Conditional Access", + "component": "views/tenant/conditional/ConditionalAccess", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/conditional/deploy-vacation", + "name": "Deploy Vacation Mode", + "component": "views/tenant/conditional/DeployVacation", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/conditional/list-named-locations", + "name": "Named Locations", + "component": "views/tenant/conditional/NamedLocations", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/conditional/deploy", + "name": "Deploy Conditional Access", + "component": "views/tenant/conditional/DeployCA", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/conditional/deploy-named-location", + "name": "Deploy Named Locations", + "component": "views/tenant/conditional/DeployNamedLocation", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/conditional/list-template", + "name": "Conditional Access Templates", + "component": "views/tenant/conditional/ListCATemplates", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/conditional/add-template", + "name": "Conditional Access Add Template", + "component": "views/tenant/conditional/AddCATemplate", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/administration/list-licenses", + "name": "List Licenses", + "component": "views/tenant/administration/ListLicences", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/administration/application-consent", + "name": "Consented Applications", + "component": "views/tenant/administration/ListOauthApps", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/standards", + "name": "Standards", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/standards/list-applied-standards", + "name": "List Applied Standards", + "component": "views/tenant/standards/ListAppliedStandards", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/standards/bpa-report", + "name": "Best Practice Report", + "component": "views/tenant/standards/BestPracticeAnalyser", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/standards/domains-analyser", + "name": "Domains Analyser", + "component": "views/tenant/standards/DomainsAnalyser", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/standards/individual-domains", + "name": "Individual Domain Check", + "component": "views/tenant/standards/IndividualDomain", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/administration/tenantlookup", + "name": "Tenant Lookup", + "component": "views/tenant/administration/TenantLookup", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/tools/geoiplookup", + "name": "Geo IP Lookup", + "component": "views/tenant/administration/GeoIPLookup", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/tools/bpa-report-builder", + "name": "BPA Report Builder", + "component": "views/tenant/standards/BPAReportBuilder", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/tenant/standards/alert-list", + "name": "Alert List (Alpha)", + "component": "views/security/incidents/ListAlerts", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint", + "name": "Endpoint", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/applications", + "name": "Applications", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/applications/list", + "name": "List Applications", + "component": "views/endpoint/applications/ApplicationsList", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/applications/queue", + "name": "Application Queue", + "component": "views/endpoint/applications/ListApplicationQueue", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/applications/add-choco-app", + "name": "Add Choco App", + "component": "views/endpoint/applications/ApplicationsAddChocoApp", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/applications/add-winget-app", + "name": "Add Store App", + "component": "views/endpoint/applications/ApplicationsAddWinGet", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/applications/add-office-app", + "name": "Add Office App", + "component": "views/endpoint/applications/ApplicationsAddOffice", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/applications/add-rmm-app", + "name": "Add RMM App", + "component": "views/endpoint/applications/ApplicationsAddRMM", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/autopilot", + "name": "Autopilot", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/autopilot/add-device", + "name": "Add Device", + "component": "views/endpoint/autopilot/AutopilotAddDevice", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/autopilot/add-profile", + "name": "Add Profile", + "component": "views/endpoint/autopilot/AutopilotAddProfile", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/autopilot/add-status-page", + "name": "Add Status Page", + "component": "views/endpoint/autopilot/AutopilotAddStatusPage", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/autopilot/list-devices", + "name": "List Devices", + "component": "views/endpoint/autopilot/AutopilotListDevices", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/autopilot/list-profiles", + "name": "List Profiles", + "component": "views/endpoint/autopilot/AutopilotListProfiles", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/autopilot/list-status-pages", + "name": "List Status Pages", + "component": "views/endpoint/autopilot/AutopilotListStatusPages", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/MEM", + "name": "MEM", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/MEM/list-policies", + "name": "List Intune Policies", + "component": "views/endpoint/intune/MEMListPolicies", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/MEM/list-compliance-policies", + "name": "List Intune Compliance Policies", + "component": "views/endpoint/intune/MEMListCompliance", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/MEM/list-appprotection-policies", + "name": "List App Protection Policies", + "component": "views/endpoint/intune/MEMListAppProtection", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/MEM/edit-policy", + "name": "Edit MEM Policy", + "component": "views/endpoint/intune/MEMEditPolicy", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/MEM/ca-policies", + "name": "List Status Pages", + "component": "views/endpoint/intune/MEMCAPolicies", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/MEM/add-policy", + "name": "Add Intune Policy", + "component": "views/endpoint/intune/MEMAddPolicy", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/MEM/add-policy-template", + "name": "Add Endpoint Manager Policy Template", + "component": "views/endpoint/intune/MEMAddPolicyTemplate", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/endpoint/MEM/list-templates", + "name": "List Intune Policy Template", + "component": "views/endpoint/intune/MEMListPolicyTemplates", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/security/defender", + "name": "Defender", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/security/defender/deployment", + "name": "Deploy Defender", + "component": "views/security/defender/DeployDefender", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/security/defender/list-defender", + "name": "List Defender", + "component": "views/security/defender/ListDefender", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/security/defender/list-defender-tvm", + "name": "List Vulnerabilities", + "component": "views/security/defender/ListVuln", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/teams-share", + "name": "Teams & SharePoint", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/teams-share/onedrive", + "name": "OneDrive", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/teams-share/onedrive/list", + "name": "List OneDrive", + "component": "views/teams-share/onedrive/OneDriveList", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/teams-share/sharepoint", + "name": "SharePoint", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/teams-share/sharepoint/list-sharepoint", + "name": "List SharePoint", + "component": "views/teams-share/sharepoint/SharepointList", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/teams-share/teams", + "name": "Teams", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/teams-share/teams/list-team", + "name": "List Teams", + "component": "views/teams-share/teams/TeamsListTeam", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/teams-share/teams/view-team-settings", + "name": "View Team Settings", + "component": "views/teams-share/teams/ViewTeamSettings", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/teams-share/teams/add-team", + "name": "Add Team", + "component": "views/teams-share/teams/TeamsAddTeam", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/teams-share/teams/teams-activity", + "name": "Teams Activity", + "component": "views/teams-share/teams/TeamsActivity", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "Email & Exchange", + "path": "/email", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "Email Administration", + "path": "/email/administration", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "List Contacts", + "path": "/email/administration/contacts", + "component": "views/email-exchange/administration/ContactsList", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/email/connectors/list-connectors", + "name": "List Connectors", + "component": "views/email-exchange/connectors/ConnectorList", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/email/connectors/deploy-connector", + "name": "Deploy Connectors", + "component": "views/email-exchange/connectors/DeployConnector", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/email/connectors/add-connector-templates", + "name": "Add Connectors Templates", + "component": "views/email-exchange/connectors/AddConnectorTemplate", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/email/connectors/list-connector-templates", + "name": "List Connectors Templates", + "component": "views/email-exchange/connectors/ListConnectorTemplates", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/email/transport/list-rules", + "name": "List Transport Rules", + "component": "views/email-exchange/transport/TransportRules", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/email/transport/deploy-rules", + "name": "Deploy Transport Rule", + "component": "views/email-exchange/transport/DeployTransport", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/email/transport/list-templates", + "name": "Transport Rule Templates", + "component": "views/email-exchange/transport/ListTransportTemplates", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/email/transport/add-template", + "name": "Transport Rule Add Temmplate", + "component": "views/email-exchange/transport/AddTransportTemplate", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/email/spamfilter/list-spamfilter", + "name": "List Spamfilter", + "component": "views/email-exchange/spamfilter/Spamfilter", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/email/spamfilter/deploy", + "name": "Deploy Spamfilter", + "component": "views/email-exchange/spamfilter/DeploySpamfilter", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/email/spamfilter/list-templates", + "name": "List Spamfilter Templates", + "component": "views/email-exchange/spamfilter/ListSpamfilterTemplates", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/email/tools/mailbox-restore-wizard", + "name": "Mailbox Restore Wizard", + "component": "views/email-exchange/tools/MailboxRestoreWizard", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/email/tools/mailbox-restores", + "name": "Mailbox Restores", + "component": "views/email-exchange/tools/MailboxRestores", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/email/tools/mail-test", + "name": "Mail Test", + "component": "views/email-exchange/tools/MailTest", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/email/spamfilter/add-template", + "name": "Add Spamfilter Template", + "component": "views/email-exchange/spamfilter/AddSpamfilterTemplate", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "Edit Mailbox Permissions", + "path": "/email/administration/edit-mailbox-permissions", + "component": "views/email-exchange/administration/EditMailboxPermissions", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "Add Shared Mailbox", + "path": "/email/administration/add-shared-mailbox", + "component": "views/email-exchange/administration/AddSharedMailbox", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "Edit Contact", + "path": "/email/administration/add-contact", + "component": "views/email-exchange/administration/AddContact", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "Edit Calendar Permissions", + "path": "/email/administration/edit-calendar-permissions", + "component": "views/email-exchange/administration/EditCalendarPermissions", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "View Mobile Devices", + "path": "/email/administration/view-mobile-devices", + "component": "views/email-exchange/administration/ViewMobileDevices", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "Edit Contact", + "path": "/email/administration/edit-contact", + "component": "views/email-exchange/administration/EditContact", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "List Mailboxes", + "path": "/email/administration/mailboxes", + "component": "views/email-exchange/administration/MailboxesList", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "List Mailbox Rules", + "path": "/email/administration/mailbox-rules", + "component": "views/email-exchange/administration/MailboxRuleList", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "List Quarantine", + "path": "/email/administration/Quarantine", + "component": "views/email-exchange/administration/QuarantineList", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "Email Reports", + "path": "/email/reports", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "Mailbox Statistics", + "path": "/email/reports/mailbox-statistics", + "component": "views/email-exchange/reports/MailboxStatisticsList", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "Shared Mailbox Enabled Account", + "path": "/email/reports/SharedMailboxEnabledAccount", + "component": "views/email-exchange/reports/SharedMailboxEnabledAccount", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "Mailbox Client Access Settings", + "path": "/email/reports/mailbox-cas-settings", + "component": "views/email-exchange/reports/MailboxClientAccessSettingsList", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "Message Trace", + "path": "/email/reports/message-trace", + "component": "views/email-exchange/reports/MessageTrace", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/cipp/user-settings", + "name": "User Settings", + "component": "views/cipp/UserSettings", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "Phishing Policies", + "path": "/email/reports/phishing-policies", + "component": "views/email-exchange/reports/PhishingPoliciesList", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "Security & Compliance", + "path": "/security", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "Security Administration", + "path": "/security/administration", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "Security Reports", + "path": "/security/reports", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "List Alerts", + "path": "/security/incidents/list-alerts", + "component": "views/security/incidents/ListAlerts", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "List Incidents", + "path": "/security/incidents/list-incidents", + "component": "views/security/incidents/ListIncidents", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "List Device Compliance Report", + "path": "/security/reports/list-device-compliance", + "component": "views/security/reports/ListDeviceComplianceReport", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "name": "License", + "path": "/license", + "component": "views/pages/license/License", + "allowedRoles": ["admin", "editor", "readonly"] + }, + { + "path": "/cipp", + "name": "CIPP", + "allowedRoles": ["admin"] + }, + { + "path": "/cipp/cipp", + "name": "CIPP", + "allowedRoles": ["admin"] + }, + { + "path": "/cipp/settings", + "name": "Settings", + "component": "views/cipp/app-settings/CIPPSettings", + "allowedRoles": ["admin"] + }, + { + "path": "/cipp/setup", + "name": "Setup", + "component": "views/cipp/Setup", + "allowedRoles": ["admin"] + }, + { + "path": "/tenant/administration/gdap", + "name": "GDAP Wizard", + "component": "views/tenant/administration/GDAPWizard", + "allowedRoles": ["admin"] + }, + { + "path": "/tenant/administration/gdap-invite", + "name": "GDAP Invite Wizard", + "component": "views/tenant/administration/GDAPInviteWizard", + "allowedRoles": ["admin"] + }, + { + "path": "/tenant/administration/gdap-role-wizard", + "name": "GDAP Role Wizard", + "component": "views/tenant/administration/GDAPRoleWizard", + "allowedRoles": ["admin"] + }, + { + "path": "/tenant/administration/gdap-roles", + "name": "GDAP Roles", + "component": "views/tenant/administration/ListGDAPRoles", + "allowedRoles": ["admin"] + }, + { + "path": "/tenant/administration/gdap-relationships", + "name": "GDAP Relationships", + "component": "./views/tenant/administration/ListGDAPRelationships", + "allowedRoles": ["admin"] + }, + { + "path": "/tenant/administration/appapproval", + "name": "App Approval", + "component": "views/cipp/AppApproval", + "allowedRoles": ["admin"] + }, + { + "path": "/tenant/administration/gdap-status", + "name": "GDAP Status", + "component": "views/tenant/administration/ListGDAPQueue", + "allowedRoles": ["admin"] + }, + { + "path": "/tenant/standards/list-standards", + "name": "List Standard", + "component": "views/tenant/standards/ListStandards", + "allowedRoles": ["admin"] + }, + { + "path": "/tenant/administration/tenant-offboarding-wizard", + "name": "Tenant Offboarding", + "component": "views/tenant/administration/TenantOffboardingWizard", + "allowedRoles": ["admin"] + }, + { + "path": "/tenant/administration/tenant-onboarding-wizard", + "name": "Tenant Onboarding", + "component": "views/tenant/administration/TenantOnboardingWizard", + "allowedRoles": ["admin"] + } +] diff --git a/src/views/cipp/UserSettings.jsx b/src/views/cipp/UserSettings.jsx index 953d94df0d7c..21ab0182287c 100644 --- a/src/views/cipp/UserSettings.jsx +++ b/src/views/cipp/UserSettings.jsx @@ -14,9 +14,9 @@ import { import { useDispatch, useSelector } from 'react-redux' import { Form } from 'react-final-form' import { RFFCFormSwitch, RFFSelectSearch } from 'src/components/forms' +import _nav from 'src/_nav' import { useGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app' -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import 'react-datepicker/dist/react-datepicker.css' import TenantListSelector from 'src/components/utilities/TenantListSelector' @@ -204,26 +204,34 @@ const UserSettings = () => { isLoading={availableProperties.isFetching} />
    - - - {addedAttributes > 0 && ( - setAddedAttribute(addedAttributes - 1)} - className={`circular-button`} - title={'-'} - > - - - )} - setAddedAttribute(addedAttributes + 1)} - className={`circular-button`} - title={'+'} - > - - - - + + +

    Favourite Menu Items

    +
    + acc.concat(val.items), []) + .map( + (item) => ( + console.log(item), + { + name: item?.name, + value: { to: item?.to, name: item?.name }, + } + ), + )} + allowCreate={false} + refreshFunction={() => + setRandom3((Math.random() + 1).toString(36).substring(7)) + } + isLoading={availableProperties.isFetching} + /> +
    From e493d7174f523e578e29c8129304fbb4011a7829 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Tue, 2 Apr 2024 11:43:42 +0200 Subject: [PATCH 085/133] add dash header if favorites are set. --- src/hooks/useNavFavouriteCheck.jsx | 1 + src/views/tenant/conditional/NamedLocations.jsx | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/useNavFavouriteCheck.jsx b/src/hooks/useNavFavouriteCheck.jsx index 622bc2ea0573..90f710405b18 100644 --- a/src/hooks/useNavFavouriteCheck.jsx +++ b/src/hooks/useNavFavouriteCheck.jsx @@ -23,6 +23,7 @@ export const useNavFavouriteCheck = (navigation) => { } }), }, + { component: CNavTitle, name: 'Dashboard' }, ...navigation, ] return newNavigation diff --git a/src/views/tenant/conditional/NamedLocations.jsx b/src/views/tenant/conditional/NamedLocations.jsx index b7f1ebb0f68c..93679c0751b9 100644 --- a/src/views/tenant/conditional/NamedLocations.jsx +++ b/src/views/tenant/conditional/NamedLocations.jsx @@ -58,7 +58,6 @@ const columns = [ name: 'Last Modified (Local)', selector: (row) => DateNotNull(row['modifiedDateTime']), sortable: true, - cell: cellDateFormatter(), exportSelector: 'modifiedDateTime', maxWidth: '150px', }, From d4ef10f16243ed6580ef4cbf7b8196ea557196c5 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Tue, 2 Apr 2024 11:46:24 -0400 Subject: [PATCH 086/133] null safe props on mail test --- src/views/email-exchange/tools/MailTest.jsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/views/email-exchange/tools/MailTest.jsx b/src/views/email-exchange/tools/MailTest.jsx index d433e658dba3..633d351fd489 100644 --- a/src/views/email-exchange/tools/MailTest.jsx +++ b/src/views/email-exchange/tools/MailTest.jsx @@ -40,22 +40,22 @@ const MailTest = () => { }, { name: 'SPF', - selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'spf')[0].Status == 'pass', + selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'spf')[0]?.Status == 'pass', cell: cellBooleanFormatter(), }, { name: 'DKIM', - selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'dkim')[0].Status == 'pass', + selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'dkim')[0]?.Status == 'pass', cell: cellBooleanFormatter(), }, { name: 'DMARC', - selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'dmarc')[0].Status == 'pass', + selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'dmarc')[0]?.Status == 'pass', cell: cellBooleanFormatter(), }, { name: 'Comp Auth', - selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'compauth')[0].Status == 'pass', + selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'compauth')[0]?.Status == 'pass', cell: cellBooleanFormatter(), }, { From 73209c1209a9e852c9cbeb95f40aa09f7bd32440 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Tue, 2 Apr 2024 22:01:10 +0200 Subject: [PATCH 087/133] Update licenses --- src/data/M365Licenses.json | 1380 +++++++++++++++++++++++++----------- 1 file changed, 974 insertions(+), 406 deletions(-) diff --git a/src/data/M365Licenses.json b/src/data/M365Licenses.json index 3f8b5e97c369..fd2757b1b074 100644 --- a/src/data/M365Licenses.json +++ b/src/data/M365Licenses.json @@ -351,6 +351,38 @@ "Service_Plan_Id": "bea4c11e-220a-4e6d-8eb8-8ea15d019f90", "Service_Plans_Included_Friendly_Names": "Azure Rights Management" }, + { + "Product_Display_Name": "Basic Collaboration", + "String_Id": "OFFICEBASIC", + "GUID": "4468c39a-28b2-42fb-9094-840bcf28771f", + "Service_Plan_Name": "EXCHANGE_S_STANDARD", + "Service_Plan_Id": "9aaf7827-d63c-4b61-89c3-182f06f82e5c", + "Service_Plans_Included_Friendly_Names": "Exchange Online (Plan 1)" + }, + { + "Product_Display_Name": "Basic Collaboration", + "String_Id": "OFFICEBASIC", + "GUID": "4468c39a-28b2-42fb-9094-840bcf28771f", + "Service_Plan_Name": "ONEDRIVELITE_IW", + "Service_Plan_Id": "b4ac11a0-32ff-4e78-982d-e039fa803dec", + "Service_Plans_Included_Friendly_Names": "Office for the web with OneDrive for business" + }, + { + "Product_Display_Name": "Basic Collaboration", + "String_Id": "OFFICEBASIC", + "GUID": "4468c39a-28b2-42fb-9094-840bcf28771f", + "Service_Plan_Name": "MCOBASIC", + "Service_Plan_Id": "448898aa-3ae7-478c-b49a-1fac7a8a35cf", + "Service_Plans_Included_Friendly_Names": "Skype Meetings" + }, + { + "Product_Display_Name": "Basic Collaboration", + "String_Id": "OFFICEBASIC", + "GUID": "4468c39a-28b2-42fb-9094-840bcf28771f", + "Service_Plan_Name": "YAMMER_BASIC", + "Service_Plan_Id": "6db7aeea-6c4a-475d-bbb0-7338bc73d646", + "Service_Plans_Included_Friendly_Names": "Yammer" + }, { "Product_Display_Name": "Business Apps (free)", "String_Id": "SMB_APPS", @@ -957,7 +989,7 @@ "GUID": "a3d0cd86-8068-4071-ad40-4dc5b5908c4b", "Service_Plan_Name": "CDS_CUSTOMER_INSIGHTS_BASE", "Service_Plan_Id": "d04ca659-b119-4a92-b8fc-3ede584a9d65", - "Service_Plans_Included_Friendly_Names": "Dataverse for Customer Insights�BASE" + "Service_Plans_Included_Friendly_Names": "Dataverse for Customer Insights?BASE" }, { "Product_Display_Name": "Dynamics 365 Customer Insights Attach", @@ -1221,7 +1253,7 @@ "GUID": "0c250654-c7f7-461f-871a-7222f6592cf2", "Service_Plan_Name": "CDS_CUSTOMER_INSIGHTS_BASE", "Service_Plan_Id": "d04ca659-b119-4a92-b8fc-3ede584a9d65", - "Service_Plans_Included_Friendly_Names": "Dataverse for Cust Insights�BASE" + "Service_Plans_Included_Friendly_Names": "Dataverse for Cust Insights?BASE" }, { "Product_Display_Name": "Dynamics 365 Customer Insights Standalone", @@ -1567,6 +1599,22 @@ "Service_Plan_Id": "5dbe027f-2339-4123-9542-606e4d348a72", "Service_Plans_Included_Friendly_Names": "SharePoint (Plan 2)" }, + { + "Product_Display_Name": "Dynamics 365 for Customer Service Professional Attach to Qualifying Dynamics 365 Base Offer", + "String_Id": "D365_CUSTOMER_SERVICE_PRO_ATTACH", + "GUID": "19dec69d-d9f3-4792-8a39-d8ecdf51937b", + "Service_Plan_Name": "D365_CUSTOMER_SERVICE_PRO_ATTACH", + "Service_Plan_Id": "a9dd2dca-10ae-4da2-aaf0-d3fe8a825110", + "Service_Plans_Included_Friendly_Names": "Dynamics 365 for Customer Service Pro Attach" + }, + { + "Product_Display_Name": "Dynamics 365 for Customer Service Professional Attach to Qualifying Dynamics 365 Base Offer", + "String_Id": "D365_CUSTOMER_SERVICE_PRO_ATTACH", + "GUID": "19dec69d-d9f3-4792-8a39-d8ecdf51937b", + "Service_Plan_Name": "EXCHANGE_S_FOUNDATION", + "Service_Plan_Id": "113feb6c-3fe4-4440-bddc-54d774bf0318", + "Service_Plans_Included_Friendly_Names": "Exchange Foundation" + }, { "Product_Display_Name": "Dynamics 365 Customer Voice", "String_Id": "DYN365_CUSTOMER_VOICE_BASE", @@ -1757,7 +1805,7 @@ "GUID": "977464c4-bfaf-4b67-b761-a9bb735a2196", "Service_Plan_Name": "CRM_AUTO_ROUTING_ENGINE_ADDON", "Service_Plan_Id": "24435e4b-87d0-4d7d-8beb-63a9b1573022", - "Service_Plans_Included_Friendly_Names": "Field Service � Automated Routing Engine Add-On" + "Service_Plans_Included_Friendly_Names": "Field Service ? Automated Routing Engine Add-On" }, { "Product_Display_Name": "Dynamics 365 Field Service, Enterprise Edition - Resource Scheduling Optimization", @@ -1765,7 +1813,7 @@ "GUID": "977464c4-bfaf-4b67-b761-a9bb735a2196", "Service_Plan_Name": "CRM_AUTO_ROUTING_ADDON", "Service_Plan_Id": "2ba394e0-6f18-4b77-b45f-a5663bbab540", - "Service_Plans_Included_Friendly_Names": "RETIRED - Field Service � Automated Routing Engine Add-On" + "Service_Plans_Included_Friendly_Names": "RETIRED - Field Service ? Automated Routing Engine Add-On" }, { "Product_Display_Name": "Dynamics 365 Field Service, Enterprise Edition - Resource Scheduling Optimization", @@ -2495,6 +2543,46 @@ "Service_Plan_Id": "874fc546-6efe-4d22-90b8-5c4e7aa59f4b", "Service_Plans_Included_Friendly_Names": "DYNAMICS 365 FOR FINANCIALS" }, + { + "Product_Display_Name": "Dynamics 365 Guides vTrial", + "String_Id": "Dynamics_365_Guides_vTrial", + "GUID": "99cb3f83-fbec-4aa1-8262-9679e6df7c53", + "Service_Plan_Name": "D365_GUIDES_VIRAL_TRIAL", + "Service_Plan_Id": "fe986032-d840-4817-82d4-51fe4fbbe163", + "Service_Plans_Included_Friendly_Names": "Dynamics 365 Guides vTrial" + }, + { + "Product_Display_Name": "Dynamics 365 Guides vTrial", + "String_Id": "Dynamics_365_Guides_vTrial", + "GUID": "99cb3f83-fbec-4aa1-8262-9679e6df7c53", + "Service_Plan_Name": "EXCHANGE_S_FOUNDATION", + "Service_Plan_Id": "113feb6c-3fe4-4440-bddc-54d774bf0318", + "Service_Plans_Included_Friendly_Names": "Exchange Foundation" + }, + { + "Product_Display_Name": "Dynamics 365 Guides vTrial", + "String_Id": "Dynamics_365_Guides_vTrial", + "GUID": "99cb3f83-fbec-4aa1-8262-9679e6df7c53", + "Service_Plan_Name": "DYN365_CDS_VIRAL", + "Service_Plan_Id": "17ab22cd-a0b3-4536-910a-cb6eb12696c0", + "Service_Plans_Included_Friendly_Names": "Common Data Service" + }, + { + "Product_Display_Name": "Dynamics 365 Guides vTrial", + "String_Id": "Dynamics_365_Guides_vTrial", + "GUID": "99cb3f83-fbec-4aa1-8262-9679e6df7c53", + "Service_Plan_Name": "POWER_APPS_DYN365_VIRAL_TRIAL_MIXED_REALITY", + "Service_Plan_Id": "066e2fd1-ba15-40e7-aa96-d6636b1cdf71", + "Service_Plans_Included_Friendly_Names": "Power Apps for Dynamics 365 Mixed Reality" + }, + { + "Product_Display_Name": "Dynamics 365 Guides vTrial", + "String_Id": "Dynamics_365_Guides_vTrial", + "GUID": "99cb3f83-fbec-4aa1-8262-9679e6df7c53", + "Service_Plan_Name": "POWER_AUTOMATE_DYN365_VIRAL_TRIAL_MIXED_REALITY", + "Service_Plan_Id": "26fa8a18-2812-4b3d-96b4-864818ce26be", + "Service_Plans_Included_Friendly_Names": "Power Automate for Dynamics 365 Mixed Reality" + }, { "Product_Display_Name": "Dynamics 365 Hybrid Connector", "String_Id": "CRM_HYBRIDCONNECTOR", @@ -2623,6 +2711,118 @@ "Service_Plan_Id": "113feb6c-3fe4-4440-bddc-54d774bf0318", "Service_Plans_Included_Friendly_Names": "Exchange Foundation" }, + { + "Product_Display_Name": "Dynamics 365 Operations ? Activity", + "String_Id": "Dyn365_Operations_Activity", + "GUID": "b75074f1-4c54-41bf-970f-c9ac871567f5", + "Service_Plan_Name": "DYN365_RETAIL_Activity", + "Service_Plan_Id": "f06754ec-6d72-4bf6-991c-4cb5413d9932", + "Service_Plans_Included_Friendly_Names": "Dynamics 365 for Retail Activity" + }, + { + "Product_Display_Name": "Dynamics 365 Operations ? Activity", + "String_Id": "Dyn365_Operations_Activity", + "GUID": "b75074f1-4c54-41bf-970f-c9ac871567f5", + "Service_Plan_Name": "DYN365_Enterprise_Talent_Attract_Activity", + "Service_Plan_Id": "aac5a56b-b02e-4608-8014-b076646d4011", + "Service_Plans_Included_Friendly_Names": "Dynamics 365 for Talent - Attract Experience Activity" + }, + { + "Product_Display_Name": "Dynamics 365 Operations ? Activity", + "String_Id": "Dyn365_Operations_Activity", + "GUID": "b75074f1-4c54-41bf-970f-c9ac871567f5", + "Service_Plan_Name": "DYN365_Enterprise_Talent_Onboard_Activity", + "Service_Plan_Id": "db225597-e9c2-4d96-8ace-5424744c80f8", + "Service_Plans_Included_Friendly_Names": "Dynamics 365 for Talent - Onboard Experience" + }, + { + "Product_Display_Name": "Dynamics 365 Operations ? Activity", + "String_Id": "Dyn365_Operations_Activity", + "GUID": "b75074f1-4c54-41bf-970f-c9ac871567f5", + "Service_Plan_Name": "Dynamics_365_for_Talent_Activity", + "Service_Plan_Id": "1f87ee90-5c3a-4cf9-b6fd-e3e8017c26ec", + "Service_Plans_Included_Friendly_Names": "Dynamics 365 for Talent Activity" + }, + { + "Product_Display_Name": "Dynamics 365 Operations ? Activity", + "String_Id": "Dyn365_Operations_Activity", + "GUID": "b75074f1-4c54-41bf-970f-c9ac871567f5", + "Service_Plan_Name": "Dynamics_365_for_Operations_Activity", + "Service_Plan_Id": "6bddf93e-d6f4-4991-b9fc-30cfdf07ee7b", + "Service_Plans_Included_Friendly_Names": "Dynamics365 for Operations Activity" + }, + { + "Product_Display_Name": "Dynamics 365 Operations ? Activity", + "String_Id": "Dyn365_Operations_Activity", + "GUID": "b75074f1-4c54-41bf-970f-c9ac871567f5", + "Service_Plan_Name": "EXCHANGE_S_FOUNDATION", + "Service_Plan_Id": "113feb6c-3fe4-4440-bddc-54d774bf0318", + "Service_Plans_Included_Friendly_Names": "Exchange Foundation" + }, + { + "Product_Display_Name": "Dynamics 365 Project Operations Attach", + "String_Id": "DYN365_PROJECT_OPERATIONS_ATTACH", + "GUID": "af739e8e-dd11-4eb5-a986-5908f595c603", + "Service_Plan_Name": "D365CDSforProjectOperations", + "Service_Plan_Id": "7df1d500-ca5c-4229-8cea-815bc88798c9", + "Service_Plans_Included_Friendly_Names": "Common Data Service for Dynamics 365 Project Operations" + }, + { + "Product_Display_Name": "Dynamics 365 Project Operations Attach", + "String_Id": "DYN365_PROJECT_OPERATIONS_ATTACH", + "GUID": "af739e8e-dd11-4eb5-a986-5908f595c603", + "Service_Plan_Name": "D365_ProjectOperationsCDSAttach", + "Service_Plan_Id": "e564d403-7eaf-4c91-b92f-bb0dc62026e1", + "Service_Plans_Included_Friendly_Names": "Dynamics 365 Project Operations CDS Attach" + }, + { + "Product_Display_Name": "Dynamics 365 Project Operations Attach", + "String_Id": "DYN365_PROJECT_OPERATIONS_ATTACH", + "GUID": "af739e8e-dd11-4eb5-a986-5908f595c603", + "Service_Plan_Name": "Power_Pages_Internal_User", + "Service_Plan_Id": "60bf28f9-2b70-4522-96f7-335f5e06c941", + "Service_Plans_Included_Friendly_Names": "Power Pages Internal User" + }, + { + "Product_Display_Name": "Dynamics 365 Project Operations Attach", + "String_Id": "DYN365_PROJECT_OPERATIONS_ATTACH", + "GUID": "af739e8e-dd11-4eb5-a986-5908f595c603", + "Service_Plan_Name": "D365_ProjectOperations", + "Service_Plan_Id": "69f07c66-bee4-4222-b051-195095efee5b", + "Service_Plans_Included_Friendly_Names": "Dynamics 365 Project Operations" + }, + { + "Product_Display_Name": "Dynamics 365 Project Operations Attach", + "String_Id": "DYN365_PROJECT_OPERATIONS_ATTACH", + "GUID": "af739e8e-dd11-4eb5-a986-5908f595c603", + "Service_Plan_Name": "D365_ProjectOperationsAttach", + "Service_Plan_Id": "fa7675bd-6717-40e7-8172-d0bbcbe1ab12", + "Service_Plans_Included_Friendly_Names": "Dynamics 365 Project Operations Attach" + }, + { + "Product_Display_Name": "Dynamics 365 Project Operations Attach", + "String_Id": "DYN365_PROJECT_OPERATIONS_ATTACH", + "GUID": "af739e8e-dd11-4eb5-a986-5908f595c603", + "Service_Plan_Name": "EXCHANGE_S_FOUNDATION", + "Service_Plan_Id": "113feb6c-3fe4-4440-bddc-54d774bf0318", + "Service_Plans_Included_Friendly_Names": "Exchange Foundation" + }, + { + "Product_Display_Name": "Dynamics 365 Project Operations Attach", + "String_Id": "DYN365_PROJECT_OPERATIONS_ATTACH", + "GUID": "af739e8e-dd11-4eb5-a986-5908f595c603", + "Service_Plan_Name": "PROJECT_FOR_PROJECT_OPERATIONS_ATTACH", + "Service_Plan_Id": "6d8e07c6-9613-484f-8cc1-a66c5c3979bb", + "Service_Plans_Included_Friendly_Names": "Project for Project Operations Attach" + }, + { + "Product_Display_Name": "Dynamics 365 Project Operations Attach", + "String_Id": "DYN365_PROJECT_OPERATIONS_ATTACH", + "GUID": "af739e8e-dd11-4eb5-a986-5908f595c603", + "Service_Plan_Name": "SHAREPOINTSTANDARD", + "Service_Plan_Id": "c7699d2e-19aa-44de-8edf-1736da088ca1", + "Service_Plans_Included_Friendly_Names": "SharePoint (Plan 1)" + }, { "Product_Display_Name": "Dynamics 365 for Project Service Automation Enterprise Edition for Government", "String_Id": "DYN365_ENTERPRISE_PROJECT_SERVICE_AUTOMATION_GOV", @@ -3095,6 +3295,54 @@ "Service_Plan_Id": "2da8e897-7791-486b-b08f-cc63c8129df7", "Service_Plans_Included_Friendly_Names": "Dynamics 365 for Sales" }, + { + "Product_Display_Name": "Dynamics 365 for Supply Chain Management Attach to Qualifying Dynamics 365 Base Offer", + "String_Id": "DYN365_SCM_ATTACH", + "GUID": "090b4a96-8114-4c95-9c91-60e81ef53302", + "Service_Plan_Name": "Power_Pages_Internal_User", + "Service_Plan_Id": "60bf28f9-2b70-4522-96f7-335f5e06c941", + "Service_Plans_Included_Friendly_Names": "Power Pages Internal User" + }, + { + "Product_Display_Name": "Dynamics 365 for Supply Chain Management Attach to Qualifying Dynamics 365 Base Offer", + "String_Id": "DYN365_SCM_ATTACH", + "GUID": "090b4a96-8114-4c95-9c91-60e81ef53302", + "Service_Plan_Name": "DYN365_CDS_SUPPLYCHAINMANAGEMENT", + "Service_Plan_Id": "b6a8b974-2956-4e14-ae81-f0384c363528", + "Service_Plans_Included_Friendly_Names": "Common Data Service for Dynamics 365 Supply Chain Management" + }, + { + "Product_Display_Name": "Dynamics 365 for Supply Chain Management Attach to Qualifying Dynamics 365 Base Offer", + "String_Id": "DYN365_SCM_ATTACH", + "GUID": "090b4a96-8114-4c95-9c91-60e81ef53302", + "Service_Plan_Name": "CDS_FOR_IOM", + "Service_Plan_Id": "2bb89402-51e9-4c5a-be33-e954a9dd1ba6", + "Service_Plans_Included_Friendly_Names": "Dataverse for IOM" + }, + { + "Product_Display_Name": "Dynamics 365 for Supply Chain Management Attach to Qualifying Dynamics 365 Base Offer", + "String_Id": "DYN365_SCM_ATTACH", + "GUID": "090b4a96-8114-4c95-9c91-60e81ef53302", + "Service_Plan_Name": "DYN365_REGULATORY_SERVICE", + "Service_Plan_Id": "c7657ae3-c0b0-4eed-8c1d-6a7967bd9c65", + "Service_Plans_Included_Friendly_Names": "Dynamics 365 for Finance and Operations, Enterprise edition - Regulatory Service" + }, + { + "Product_Display_Name": "Dynamics 365 for Supply Chain Management Attach to Qualifying Dynamics 365 Base Offer", + "String_Id": "DYN365_SCM_ATTACH", + "GUID": "090b4a96-8114-4c95-9c91-60e81ef53302", + "Service_Plan_Name": "D365_SCM_Attach", + "Service_Plan_Id": "b21c777f-c2d5-486e-88f6-fc0a3e474271", + "Service_Plans_Included_Friendly_Names": "Dynamics 365 for Supply Chain Management Attach" + }, + { + "Product_Display_Name": "Dynamics 365 for Supply Chain Management Attach to Qualifying Dynamics 365 Base Offer", + "String_Id": "DYN365_SCM_ATTACH", + "GUID": "090b4a96-8114-4c95-9c91-60e81ef53302", + "Service_Plan_Name": "EXCHANGE_S_FOUNDATION", + "Service_Plan_Id": "113feb6c-3fe4-4440-bddc-54d774bf0318", + "Service_Plans_Included_Friendly_Names": "Exchange Foundation" + }, { "Product_Display_Name": "Dynamics 365 for Marketing Business Edition", "String_Id": "DYN365_BUSINESS_MARKETING", @@ -5053,7 +5301,7 @@ "GUID": "4b590615-0888-425a-a965-b3bf7789848d", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 A3 for Faculty", @@ -5421,7 +5669,7 @@ "GUID": "7cfd9a2b-e110-4c39-bf20-c6a3f36a3121", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 A3 for Students", @@ -6077,7 +6325,7 @@ "GUID": "1aa94593-ca12-4254-a738-81a5972958e8", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 A3 - Unattended License for students use benefit", @@ -6413,7 +6661,7 @@ "GUID": "e97c048c-37a4-45fb-ab50-922fbf07a370", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 A5 for Faculty", @@ -7021,7 +7269,7 @@ "GUID": "46c119d4-0379-4a9d-85e4-97c66d3f909e", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 A5 for Students", @@ -7901,7 +8149,7 @@ "GUID": "9b8fe788-6174-4c4e-983b-3330c93ec278", "Service_Plan_Name": "Content_Explorer", "Service_Plan_Id": "d9fa6af4-e046-4c89-9226-729a0786685d", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Premium" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Premium" }, { "Product_Display_Name": "Microsoft 365 A5 Suite features for faculty", @@ -9125,7 +9373,7 @@ "GUID": "f245ecc8-75af-4f8e-b61f-27d8114de5f3", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Copilot" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 Business Standard", @@ -9397,7 +9645,7 @@ "GUID": "c1f79c29-5d7a-4bec-a2c1-1a76774864c0", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Bing Chat Enterprise" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 Business Standard EEA (no Teams)", @@ -10077,7 +10325,7 @@ "GUID": "cbdc14ab-d96c-4c30-b9f4-6ada7cdc1d46", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Copilot" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 Business Premium", @@ -10493,7 +10741,7 @@ "GUID": "a3f586b6-8cce-4d9b-99d6-55238397f77a", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Bing Chat Enterprise" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 Business Premium EEA (no Teams)", @@ -10871,6 +11119,30 @@ "Service_Plan_Id": "ded3d325-1bdc-453e-8432-5bac26d7a014", "Service_Plans_Included_Friendly_Names": "Power Virtual Agents for Office 365" }, + { + "Product_Display_Name": "Microsoft 365 Business Voice (US)", + "String_Id": "BUSINESS_VOICE_MED2_TELCO", + "GUID": "08d7bce8-6e16-490e-89db-1d508e5e9609", + "Service_Plan_Name": "MCOMEETADV", + "Service_Plan_Id": "3e26ee1f-8a5f-4d52-aee2-b81ce45c8f40", + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Audio Conferencing" + }, + { + "Product_Display_Name": "Microsoft 365 Business Voice (US)", + "String_Id": "BUSINESS_VOICE_MED2_TELCO", + "GUID": "08d7bce8-6e16-490e-89db-1d508e5e9609", + "Service_Plan_Name": "MCOPSTN1", + "Service_Plan_Id": "4ed3ff63-69d7-4fb7-b984-5aec7f605ca8", + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Domestic Calling Plan" + }, + { + "Product_Display_Name": "Microsoft 365 Business Voice (US)", + "String_Id": "BUSINESS_VOICE_MED2_TELCO", + "GUID": "08d7bce8-6e16-490e-89db-1d508e5e9609", + "Service_Plan_Name": "MCOEV", + "Service_Plan_Id": "4828c8ec-dc2e-4779-b502-87ac9ce28ab7", + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Phone System" + }, { "Product_Display_Name": "Microsoft 365 Domestic Calling Plan (120 Minutes)", "String_Id": "MCOPSTN_5", @@ -10923,17 +11195,17 @@ "Product_Display_Name": "Microsoft 365 E3", "String_Id": "SPE_E3", "GUID": "05e9a617-0261-4cee-bb44-138d3ef5d965", - "Service_Plan_Name": "CDS_O365_P2", - "Service_Plan_Id": "95b76021-6a53-4741-ab8b-1d1f3d66a95a", - "Service_Plans_Included_Friendly_Names": "Common Data Service for Teams" + "Service_Plan_Name": "Bing_Chat_Enterprise", + "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 E3", "String_Id": "SPE_E3", "GUID": "05e9a617-0261-4cee-bb44-138d3ef5d965", - "Service_Plan_Name": "Bing_Chat_Enterprise", - "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Copilot" + "Service_Plan_Name": "CDS_O365_P2", + "Service_Plan_Id": "95b76021-6a53-4741-ab8b-1d1f3d66a95a", + "Service_Plans_Included_Friendly_Names": "Common Data Service for Teams" }, { "Product_Display_Name": "Microsoft 365 E3", @@ -10943,13 +11215,21 @@ "Service_Plan_Id": "efb87545-963c-4e0d-99df-69c6916d9eb0", "Service_Plans_Included_Friendly_Names": "Exchange Online (Plan 2)" }, + { + "Product_Display_Name": "Microsoft 365 E3", + "String_Id": "SPE_E3", + "GUID": "05e9a617-0261-4cee-bb44-138d3ef5d965", + "Service_Plan_Name": "MESH_IMMERSIVE_FOR_TEAMS", + "Service_Plan_Id": "f0ff6ac6-297d-49cd-be34-6dfef97f0c28", + "Service_Plans_Included_Friendly_Names": "Immersive spaces for Teams" + }, { "Product_Display_Name": "Microsoft 365 E3", "String_Id": "SPE_E3", "GUID": "05e9a617-0261-4cee-bb44-138d3ef5d965", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 E3", @@ -11281,167 +11561,167 @@ }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Azure Rights Management", + "Service_Plan_Name": "RMS_S_ENTERPRISE", "Service_Plan_Id": "bea4c11e-220a-4e6d-8eb8-8ea15d019f90", - "Service_Plans_Included_Friendly_Names": "RMS_S_ENTERPRISE" + "Service_Plans_Included_Friendly_Names": "Azure Rights Management" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Common Data Service for Teams", + "Service_Plan_Name": "CDS_O365_P2", "Service_Plan_Id": "95b76021-6a53-4741-ab8b-1d1f3d66a95a", - "Service_Plans_Included_Friendly_Names": "CDS_O365_P2" + "Service_Plans_Included_Friendly_Names": "Common Data Service for Teams" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Copilot", + "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Bing_Chat_Enterprise" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Exchange Online (Plan 2)", + "Service_Plan_Name": "EXCHANGE_S_ENTERPRISE", "Service_Plan_Id": "efb87545-963c-4e0d-99df-69c6916d9eb0", - "Service_Plans_Included_Friendly_Names": "EXCHANGE_S_ENTERPRISE" + "Service_Plans_Included_Friendly_Names": "Exchange Online (Plan 2)" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Information Protection and Governance Analytics � Standard", + "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "ContentExplorer_Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Information Protection for Office 365 - Standard", + "Service_Plan_Name": "MIP_S_CLP1", "Service_Plan_Id": "5136a095-5cf0-4aff-bec3-e84448b38ea5", - "Service_Plans_Included_Friendly_Names": "MIP_S_CLP1" + "Service_Plans_Included_Friendly_Names": "Information Protection for Office 365 - Standard" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Insights by MyAnalytics", + "Service_Plan_Name": "MYANALYTICS_P2", "Service_Plan_Id": "33c4f319-9bdd-48d6-9c4d-410b750a4a5a", - "Service_Plans_Included_Friendly_Names": "MYANALYTICS_P2" + "Service_Plans_Included_Friendly_Names": "Insights by MyAnalytics" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Microsoft 365 Apps for enterprise", + "Service_Plan_Name": "OFFICESUBSCRIPTION", "Service_Plan_Id": "43de0ff5-c92c-492b-9116-175376d08c38", - "Service_Plans_Included_Friendly_Names": "OFFICESUBSCRIPTION" + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Apps for enterprise" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Microsoft 365 Lighthouse (Plan 1)", + "Service_Plan_Name": "M365_LIGHTHOUSE_CUSTOMER_PLAN1", "Service_Plan_Id": "6f23d6a9-adbf-481c-8538-b4c095654487", - "Service_Plans_Included_Friendly_Names": "M365_LIGHTHOUSE_CUSTOMER_PLAN1" + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Lighthouse (Plan 1)" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Microsoft 365 Lighthouse (Plan 2)", + "Service_Plan_Name": "M365_LIGHTHOUSE_PARTNER_PLAN1", "Service_Plan_Id": "d55411c9-cfff-40a9-87c7-240f14df7da5", - "Service_Plans_Included_Friendly_Names": "M365_LIGHTHOUSE_PARTNER_PLAN1" + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Lighthouse (Plan 2)" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Microsoft Bookings", + "Service_Plan_Name": "MICROSOFTBOOKINGS", "Service_Plan_Id": "199a5c09-e0ca-4e37-8f7c-b05d533e1ea2", - "Service_Plans_Included_Friendly_Names": "MICROSOFTBOOKINGS" + "Service_Plans_Included_Friendly_Names": "Microsoft Bookings" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Microsoft Clipchamp", + "Service_Plan_Name": "CLIPCHAMP", "Service_Plan_Id": "a1ace008-72f3-4ea0-8dac-33b3a23a2472", - "Service_Plans_Included_Friendly_Names": "CLIPCHAMP" + "Service_Plans_Included_Friendly_Names": "Microsoft Clipchamp" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Microsoft Defender for Endpoint Plan 1", + "Service_Plan_Name": "MDE_LITE", "Service_Plan_Id": "292cc034-7b7c-4950-aaf5-943befd3f1d4", - "Service_Plans_Included_Friendly_Names": "MDE_LITE" + "Service_Plans_Included_Friendly_Names": "Microsoft Defender for Endpoint Plan 1" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Microsoft Forms (Plan E3)", + "Service_Plan_Name": "FORMS_PLAN_E3", "Service_Plan_Id": "2789c901-c14e-48ab-a76a-be334d9d793a", - "Service_Plans_Included_Friendly_Names": "FORMS_PLAN_E3" + "Service_Plans_Included_Friendly_Names": "Microsoft Forms (Plan E3)" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Microsoft Kaizala Pro", + "Service_Plan_Name": "KAIZALA_O365_P3", "Service_Plan_Id": "aebd3021-9f8f-4bf8-bbe3-0ed2f4f047a1", - "Service_Plans_Included_Friendly_Names": "KAIZALA_O365_P3" + "Service_Plans_Included_Friendly_Names": "Microsoft Kaizala Pro" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Microsoft Planner", + "Service_Plan_Name": "PROJECTWORKMANAGEMENT", "Service_Plan_Id": "b737dad2-2f6c-4c65-90e3-ca563267e8b9", - "Service_Plans_Included_Friendly_Names": "PROJECTWORKMANAGEMENT" + "Service_Plans_Included_Friendly_Names": "Microsoft Planner" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Microsoft Search", + "Service_Plan_Name": "MICROSOFT_SEARCH", "Service_Plan_Id": "94065c59-bc8e-4e8b-89e5-5138d471eaff", - "Service_Plans_Included_Friendly_Names": "MICROSOFT_SEARCH" + "Service_Plans_Included_Friendly_Names": "Microsoft Search" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Microsoft StaffHub", + "Service_Plan_Name": "Deskless", "Service_Plan_Id": "8c7d2df8-86f0-4902-b2ed-a0458298f3b3", - "Service_Plans_Included_Friendly_Names": "Deskless" + "Service_Plans_Included_Friendly_Names": "Microsoft StaffHub" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Microsoft Stream for Office 365 E3", + "Service_Plan_Name": "STREAM_O365_E3", "Service_Plan_Id": "9e700747-8b1d-45e5-ab8d-ef187ceec156", - "Service_Plans_Included_Friendly_Names": "STREAM_O365_E3" + "Service_Plans_Included_Friendly_Names": "Microsoft Stream for Office 365 E3" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Mobile Device Management for Office 365", + "Service_Plan_Name": "INTUNE_O365", "Service_Plan_Id": "882e1d05-acd1-4ccb-8708-6ee03664b117", - "Service_Plans_Included_Friendly_Names": "INTUNE_O365" + "Service_Plans_Included_Friendly_Names": "Mobile Device Management for Office 365" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", "Service_Plan_Name": "Nucleus", "Service_Plan_Id": "db4d623d-b514-490b-b7ef-8885eee514de", @@ -11449,187 +11729,187 @@ }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Office for the Web", + "Service_Plan_Name": "SHAREPOINTWAC", "Service_Plan_Id": "e95bec33-7c88-4a70-8e19-b10bd9d0c014", - "Service_Plans_Included_Friendly_Names": "SHAREPOINTWAC" + "Service_Plans_Included_Friendly_Names": "Office for the Web" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Project for Office (Plan E3)", + "Service_Plan_Name": "PROJECT_O365_P2", "Service_Plan_Id": "31b4e2fc-4cd6-4e7d-9c1b-41407303bd66", - "Service_Plans_Included_Friendly_Names": "PROJECT_O365_P2" + "Service_Plans_Included_Friendly_Names": "Project for Office (Plan E3)" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "SharePoint (Plan 2)", + "Service_Plan_Name": "SHAREPOINTENTERPRISE", "Service_Plan_Id": "5dbe027f-2339-4123-9542-606e4d348a72", - "Service_Plans_Included_Friendly_Names": "SHAREPOINTENTERPRISE" + "Service_Plans_Included_Friendly_Names": "SharePoint (Plan 2)" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Skype for Business Online (Plan 2)", + "Service_Plan_Name": "MCOSTANDARD", "Service_Plan_Id": "0feaeb32-d00e-4d66-bd5a-43b5b83db82c", - "Service_Plans_Included_Friendly_Names": "MCOSTANDARD" + "Service_Plans_Included_Friendly_Names": "Skype for Business Online (Plan 2)" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Sway", + "Service_Plan_Name": "SWAY", "Service_Plan_Id": "a23b959c-7ce8-4e57-9140-b90eb88a9e97", - "Service_Plans_Included_Friendly_Names": "SWAY" + "Service_Plans_Included_Friendly_Names": "Sway" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "To-Do (Plan 2)", + "Service_Plan_Name": "BPOS_S_TODO_2", "Service_Plan_Id": "c87f142c-d1e9-4363-8630-aaea9c4d9ae5", - "Service_Plans_Included_Friendly_Names": "BPOS_S_TODO_2" + "Service_Plans_Included_Friendly_Names": "To-Do (Plan 2)" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Viva Engage Core", + "Service_Plan_Name": "VIVAENGAGE_CORE", "Service_Plan_Id": "a82fbf69-b4d7-49f4-83a6-915b2cf354f4", - "Service_Plans_Included_Friendly_Names": "VIVAENGAGE_CORE" + "Service_Plans_Included_Friendly_Names": "Viva Engage Core" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Viva Learning Seeded", + "Service_Plan_Name": "VIVA_LEARNING_SEEDED", "Service_Plan_Id": "b76fb638-6ba6-402a-b9f9-83d28acb3d86", - "Service_Plans_Included_Friendly_Names": "VIVA_LEARNING_SEEDED" + "Service_Plans_Included_Friendly_Names": "Viva Learning Seeded" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Whiteboard (Plan 2)", + "Service_Plan_Name": "WHITEBOARD_PLAN2", "Service_Plan_Id": "94a54592-cd8b-425e-87c6-97868b000b91", - "Service_Plans_Included_Friendly_Names": "WHITEBOARD_PLAN2" + "Service_Plans_Included_Friendly_Names": "Whiteboard (Plan 2)" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Yammer Enterprise", + "Service_Plan_Name": "YAMMER_ENTERPRISE", "Service_Plan_Id": "7547a3fe-08ee-4ccb-b430-5077c5041653", - "Service_Plans_Included_Friendly_Names": "YAMMER_ENTERPRISE" + "Service_Plans_Included_Friendly_Names": "Yammer Enterprise" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Universal Print", + "Service_Plan_Name": "UNIVERSAL_PRINT_01", "Service_Plan_Id": "795f6fe0-cc4d-4773-b050-5dde4dc704c9", - "Service_Plans_Included_Friendly_Names": "UNIVERSAL_PRINT_01" + "Service_Plans_Included_Friendly_Names": "Universal Print" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Windows 10/11 Enterprise (Original)", + "Service_Plan_Name": "WIN10_PRO_ENT_SUB", "Service_Plan_Id": "21b439ba-a0ca-424f-a6cc-52f954a5b111", - "Service_Plans_Included_Friendly_Names": "WIN10_PRO_ENT_SUB" + "Service_Plans_Included_Friendly_Names": "Windows 10/11 Enterprise (Original)" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Windows Autopatch", + "Service_Plan_Name": "Windows_Autopatch", "Service_Plan_Id": "9a6eeb79-0b4b-4bf0-9808-39d99a2cd5a3", - "Service_Plans_Included_Friendly_Names": "Windows_Autopatch" + "Service_Plans_Included_Friendly_Names": "Windows Autopatch" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Windows Update for Business Deployment Service", + "Service_Plan_Name": "WINDOWSUPDATEFORBUSINESS_DEPLOYMENTSERVICE", "Service_Plan_Id": "7bf960f6-2cd9-443a-8046-5dbff9558365", - "Service_Plans_Included_Friendly_Names": "WINDOWSUPDATEFORBUSINESS_DEPLOYMENTSERVICE" + "Service_Plans_Included_Friendly_Names": "Windows Update for Business Deployment Service" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Azure Information Protection Premium P1", + "Service_Plan_Name": "RMS_S_PREMIUM", "Service_Plan_Id": "6c57d4b6-3b23-47a5-9bc9-69f17b4947b3", - "Service_Plans_Included_Friendly_Names": "RMS_S_PREMIUM" + "Service_Plans_Included_Friendly_Names": "Azure Information Protection Premium P1" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Common Data Service", + "Service_Plan_Name": "DYN365_CDS_O365_P2", "Service_Plan_Id": "4ff01e01-1ba7-4d71-8cf8-ce96c3bbcf14", - "Service_Plans_Included_Friendly_Names": "DYN365_CDS_O365_P2" + "Service_Plans_Included_Friendly_Names": "Common Data Service" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Microsoft Azure Multi-Factor Authentication", + "Service_Plan_Name": "MFA_PREMIUM", "Service_Plan_Id": "8a256a2b-b617-496d-b51b-e76466e88db0", - "Service_Plans_Included_Friendly_Names": "MFA_PREMIUM" + "Service_Plans_Included_Friendly_Names": "Microsoft Azure Multi-Factor Authentication" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Microsoft Defender for Cloud Apps Discovery", + "Service_Plan_Name": "ADALLOM_S_DISCOVERY", "Service_Plan_Id": "932ad362-64a8-4783-9106-97849a1a30b9", - "Service_Plans_Included_Friendly_Names": "ADALLOM_S_DISCOVERY" + "Service_Plans_Included_Friendly_Names": "Microsoft Defender for Cloud Apps Discovery" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Microsoft Entra ID P1", + "Service_Plan_Name": "AAD_PREMIUM", "Service_Plan_Id": "41781fb2-bc02-4b7c-bd55-b576c07bb09d", - "Service_Plans_Included_Friendly_Names": "AAD_PREMIUM" + "Service_Plans_Included_Friendly_Names": "Microsoft Entra ID P1" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Microsoft Intune Plan 1", + "Service_Plan_Name": "INTUNE_A", "Service_Plan_Id": "c1ec4a95-1f05-45b3-a911-aa3fa01094f5", - "Service_Plans_Included_Friendly_Names": "INTUNE_A" + "Service_Plans_Included_Friendly_Names": "Microsoft Intune Plan 1" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Power Apps for Office 365", + "Service_Plan_Name": "POWERAPPS_O365_P2", "Service_Plan_Id": "c68f8d98-5534-41c8-bf36-22fa496fa792", - "Service_Plans_Included_Friendly_Names": "POWERAPPS_O365_P2" + "Service_Plans_Included_Friendly_Names": "Power Apps for Office 365" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Power Automate for Office 365", + "Service_Plan_Name": "FLOW_O365_P2", "Service_Plan_Id": "76846ad7-7776-4c40-a281-a386362dd1b9", - "Service_Plans_Included_Friendly_Names": "FLOW_O365_P2" + "Service_Plans_Included_Friendly_Names": "Power Automate for Office 365" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o�Teams�Bundle_M3", + "String_Id": "O365_w/o?Teams?Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Power Virtual Agents for Office 365", + "Service_Plan_Name": "POWER_VIRTUAL_AGENTS_O365_P2", "Service_Plan_Id": "041fe683-03e4-45b6-b1af-c0cdc516daee", - "Service_Plans_Included_Friendly_Names": "POWER_VIRTUAL_AGENTS_O365_P2" + "Service_Plans_Included_Friendly_Names": "Power Virtual Agents for Office 365" }, { "Product_Display_Name": "Microsoft 365 E3 Extra Features", @@ -11653,7 +11933,7 @@ "GUID": "f5b15d67-b99e-406b-90f1-308452f94de6", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Copilot" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 E3 Extra Features", @@ -11679,13 +11959,21 @@ "Service_Plan_Id": "9a6eeb79-0b4b-4bf0-9808-39d99a2cd5a3", "Service_Plans_Included_Friendly_Names": "Windows Autopatch" }, + { + "Product_Display_Name": "Microsoft 365 E3 Extra Features", + "String_Id": "Microsoft_365_E3_Extra_Features", + "GUID": "f5b15d67-b99e-406b-90f1-308452f94de6", + "Service_Plan_Name": "WINDOWSUPDATEFORBUSINESS_DEPLOYMENTSERVICE", + "Service_Plan_Id": "7bf960f6-2cd9-443a-8046-5dbff9558365", + "Service_Plans_Included_Friendly_Names": "Windows Update for Business Deployment Service" + }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams) - Unattended License", "String_Id": "Microsoft_365_E3_EEA_(no_Teams)_Unattended_License", "GUID": "a23dbafb-3396-48b3-ad9c-a304fe206043", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Bing Chat Enterprise" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams) - Unattended License", @@ -12053,7 +12341,7 @@ "GUID": "c2ac2ee4-9bb1-47e4-8541-d689c7e83371", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Copilot" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 E3 - Unattended License", @@ -12421,7 +12709,7 @@ "GUID": "0c21030a-7e60-4ec7-9a0f-0042e0e0211a", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Copilot" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 E3 (500 seats min)_HUB", @@ -12437,7 +12725,7 @@ "GUID": "0c21030a-7e60-4ec7-9a0f-0042e0e0211a", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 E3 (500 seats min)_HUB", @@ -12773,7 +13061,7 @@ "GUID": "602e6573-55a3-46b1-a1a0-cc267991501a", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Copilot" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams) (500 seats min)_HUB", @@ -12789,7 +13077,7 @@ "GUID": "602e6573-55a3-46b1-a1a0-cc267991501a", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams) (500 seats min)_HUB", @@ -13355,17 +13643,17 @@ "Product_Display_Name": "Microsoft 365 E5", "String_Id": "SPE_E5", "GUID": "06ebc4ee-1bb5-47dd-8120-11324bc54e06", - "Service_Plan_Name": "CDS_O365_P3", - "Service_Plan_Id": "afa73018-811e-46e9-988f-f75d2b1b8430", - "Service_Plans_Included_Friendly_Names": "Common Data Service for Teams" + "Service_Plan_Name": "Bing_Chat_Enterprise", + "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 E5", "String_Id": "SPE_E5", "GUID": "06ebc4ee-1bb5-47dd-8120-11324bc54e06", - "Service_Plan_Name": "Bing_Chat_Enterprise", - "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Copilot" + "Service_Plan_Name": "CDS_O365_P3", + "Service_Plan_Id": "afa73018-811e-46e9-988f-f75d2b1b8430", + "Service_Plans_Included_Friendly_Names": "Common Data Service for Teams" }, { "Product_Display_Name": "Microsoft 365 E5", @@ -13407,6 +13695,14 @@ "Service_Plan_Id": "a6520331-d7d4-4276-95f5-15c0933bc757", "Service_Plans_Included_Friendly_Names": "Graph Connectors Search with Index" }, + { + "Product_Display_Name": "Microsoft 365 E5", + "String_Id": "SPE_E5", + "GUID": "06ebc4ee-1bb5-47dd-8120-11324bc54e06", + "Service_Plan_Name": "MESH_IMMERSIVE_FOR_TEAMS", + "Service_Plan_Id": "f0ff6ac6-297d-49cd-be34-6dfef97f0c28", + "Service_Plans_Included_Friendly_Names": "Immersive spaces for Teams" + }, { "Product_Display_Name": "Microsoft 365 E5", "String_Id": "SPE_E5", @@ -13429,7 +13725,7 @@ "GUID": "06ebc4ee-1bb5-47dd-8120-11324bc54e06", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 E5", @@ -14069,7 +14365,7 @@ "GUID": "6ee4114a-9b2d-4577-9e7a-49fa43d222d3", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams) with Calling Minutes", @@ -14605,7 +14901,7 @@ "GUID": "90277bc7-a6fe-4181-99d8-712b08b8d32b", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Bing Chat Enterprise" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams) without Audio Conferencing", @@ -14677,7 +14973,7 @@ "GUID": "90277bc7-a6fe-4181-99d8-712b08b8d32b", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams) without Audio Conferencing", @@ -15253,7 +15549,7 @@ "GUID": "db684ac5-c0e7-4f92-8284-ef9ebde75d33", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Copilot" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 E5 (500 seats min)_HUB", @@ -15317,7 +15613,7 @@ "GUID": "db684ac5-c0e7-4f92-8284-ef9ebde75d33", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 E5 (500 seats min)_HUB", @@ -15909,7 +16205,7 @@ "GUID": "c42b9cae-ea4f-4ab7-9717-81576235ccac", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Copilot" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 E5 Developer (without Windows and Audio Conferencing)", @@ -16477,7 +16773,7 @@ "GUID": "184efa21-98c3-4e5d-95ab-d07053a96e67", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 E5 Compliance", @@ -16627,337 +16923,337 @@ "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "SharePoint Online (Plan 2)", + "Service_Plan_Name": "SHAREPOINTENTERPRISE", "Service_Plan_Id": "5dbe027f-2339-4123-9542-606e4d348a72", - "Service_Plans_Included_Friendly_Names": "SHAREPOINTENTERPRISE" + "Service_Plans_Included_Friendly_Names": "SharePoint Online (Plan 2)" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Bing Chat Enterprise", + "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Bing_Chat_Enterprise" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Common Data Service for Teams", + "Service_Plan_Name": "CDS_O365_P3", "Service_Plan_Id": "afa73018-811e-46e9-988f-f75d2b1b8430", - "Service_Plans_Included_Friendly_Names": "CDS_O365_P3" + "Service_Plans_Included_Friendly_Names": "Common Data Service for Teams" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Customer Lockbox", + "Service_Plan_Name": "LOCKBOX_ENTERPRISE", "Service_Plan_Id": "9f431833-0334-42de-a7dc-70aa40db46db", - "Service_Plans_Included_Friendly_Names": "LOCKBOX_ENTERPRISE" + "Service_Plans_Included_Friendly_Names": "Customer Lockbox" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Customer Lockbox (A)", + "Service_Plan_Name": "CustomerLockboxA_Enterprise", "Service_Plan_Id": "3ec18638-bd4c-4d3b-8905-479ed636b83e", - "Service_Plans_Included_Friendly_Names": "CustomerLockboxA_Enterprise" + "Service_Plans_Included_Friendly_Names": "Customer Lockbox (A)" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Data Classification in Microsoft 365", + "Service_Plan_Name": "MIP_S_Exchange", "Service_Plan_Id": "cd31b152-6326-4d1b-ae1b-997b625182e6", - "Service_Plans_Included_Friendly_Names": "MIP_S_Exchange" + "Service_Plans_Included_Friendly_Names": "Data Classification in Microsoft 365" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Exchange Online (Plan 2)", + "Service_Plan_Name": "EXCHANGE_S_ENTERPRISE", "Service_Plan_Id": "efb87545-963c-4e0d-99df-69c6916d9eb0", - "Service_Plans_Included_Friendly_Names": "EXCHANGE_S_ENTERPRISE" + "Service_Plans_Included_Friendly_Names": "Exchange Online (Plan 2)" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Graph Connectors Search with Index", + "Service_Plan_Name": "GRAPH_CONNECTORS_SEARCH_INDEX", "Service_Plan_Id": "a6520331-d7d4-4276-95f5-15c0933bc757", - "Service_Plans_Included_Friendly_Names": "GRAPH_CONNECTORS_SEARCH_INDEX" + "Service_Plans_Included_Friendly_Names": "Graph Connectors Search with Index" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Information Barriers", + "Service_Plan_Name": "INFORMATION_BARRIERS", "Service_Plan_Id": "c4801e8a-cb58-4c35-aca6-f2dcc106f287", - "Service_Plans_Included_Friendly_Names": "INFORMATION_BARRIERS" + "Service_Plans_Included_Friendly_Names": "Information Barriers" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Information Protection and Governance Analytics - Premium", + "Service_Plan_Name": "Content_Explorer", "Service_Plan_Id": "d9fa6af4-e046-4c89-9226-729a0786685d", - "Service_Plans_Included_Friendly_Names": "Content_Explorer" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics - Premium" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Information Protection and Governance Analytics � Standard", + "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "ContentExplorer_Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Information Protection for Office 365 - Premium", + "Service_Plan_Name": "MIP_S_CLP2", "Service_Plan_Id": "efb0351d-3b08-4503-993d-383af8de41e3", - "Service_Plans_Included_Friendly_Names": "MIP_S_CLP2" + "Service_Plans_Included_Friendly_Names": "Information Protection for Office 365 - Premium" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Information Protection for Office 365 - Standard", + "Service_Plan_Name": "MIP_S_CLP1", "Service_Plan_Id": "5136a095-5cf0-4aff-bec3-e84448b38ea5", - "Service_Plans_Included_Friendly_Names": "MIP_S_CLP1" + "Service_Plans_Included_Friendly_Names": "Information Protection for Office 365 - Standard" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Insights by MyAnalytics", + "Service_Plan_Name": "MYANALYTICS_P2", "Service_Plan_Id": "33c4f319-9bdd-48d6-9c4d-410b750a4a5a", - "Service_Plans_Included_Friendly_Names": "MYANALYTICS_P2" + "Service_Plans_Included_Friendly_Names": "Insights by MyAnalytics" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft 365 Advanced Auditing", + "Service_Plan_Name": "M365_ADVANCED_AUDITING", "Service_Plan_Id": "2f442157-a11c-46b9-ae5b-6e39ff4e5849", - "Service_Plans_Included_Friendly_Names": "M365_ADVANCED_AUDITING" + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Advanced Auditing" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft 365 Apps for enterprise", + "Service_Plan_Name": "OFFICESUBSCRIPTION", "Service_Plan_Id": "43de0ff5-c92c-492b-9116-175376d08c38", - "Service_Plans_Included_Friendly_Names": "OFFICESUBSCRIPTION" + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Apps for enterprise" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft 365 Audio Conferencing", + "Service_Plan_Name": "MCOMEETADV", "Service_Plan_Id": "3e26ee1f-8a5f-4d52-aee2-b81ce45c8f40", - "Service_Plans_Included_Friendly_Names": "MCOMEETADV" + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Audio Conferencing" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft 365 Audit Platform", + "Service_Plan_Name": "M365_AUDIT_PLATFORM", "Service_Plan_Id": "f6de4823-28fa-440b-b886-4783fa86ddba", - "Service_Plans_Included_Friendly_Names": "M365_AUDIT_PLATFORM" + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Audit Platform" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft 365 Communication Compliance", + "Service_Plan_Name": "MICROSOFT_COMMUNICATION_COMPLIANCE", "Service_Plan_Id": "a413a9ff-720c-4822-98ef-2f37c2a21f4c", - "Service_Plans_Included_Friendly_Names": "MICROSOFT_COMMUNICATION_COMPLIANCE" + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Communication Compliance" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft 365 Defender", + "Service_Plan_Name": "MTP", "Service_Plan_Id": "bf28f719-7844-4079-9c78-c1307898e192", - "Service_Plans_Included_Friendly_Names": "MTP" + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Defender" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft 365 Lighthouse (Plan 1)", + "Service_Plan_Name": "M365_LIGHTHOUSE_CUSTOMER_PLAN1", "Service_Plan_Id": "6f23d6a9-adbf-481c-8538-b4c095654487", - "Service_Plans_Included_Friendly_Names": "M365_LIGHTHOUSE_CUSTOMER_PLAN1" + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Lighthouse (Plan 1)" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft 365 Phone System", + "Service_Plan_Name": "MCOEV", "Service_Plan_Id": "4828c8ec-dc2e-4779-b502-87ac9ce28ab7", - "Service_Plans_Included_Friendly_Names": "MCOEV" + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Phone System" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Bookings", + "Service_Plan_Name": "MICROSOFTBOOKINGS", "Service_Plan_Id": "199a5c09-e0ca-4e37-8f7c-b05d533e1ea2", - "Service_Plans_Included_Friendly_Names": "MICROSOFTBOOKINGS" + "Service_Plans_Included_Friendly_Names": "Microsoft Bookings" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Clipchamp", + "Service_Plan_Name": "CLIPCHAMP", "Service_Plan_Id": "a1ace008-72f3-4ea0-8dac-33b3a23a2472", - "Service_Plans_Included_Friendly_Names": "CLIPCHAMP" + "Service_Plans_Included_Friendly_Names": "Microsoft Clipchamp" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Communications DLP", + "Service_Plan_Name": "COMMUNICATIONS_DLP", "Service_Plan_Id": "6dc145d6-95dd-4191-b9c3-185575ee6f6b", - "Service_Plans_Included_Friendly_Names": "COMMUNICATIONS_DLP" + "Service_Plans_Included_Friendly_Names": "Microsoft Communications DLP" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Customer Key", + "Service_Plan_Name": "CUSTOMER_KEY", "Service_Plan_Id": "6db1f1db-2b46-403f-be40-e39395f08dbb", - "Service_Plans_Included_Friendly_Names": "CUSTOMER_KEY" + "Service_Plans_Included_Friendly_Names": "Microsoft Customer Key" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Data Investigations", + "Service_Plan_Name": "DATA_INVESTIGATIONS", "Service_Plan_Id": "46129a58-a698-46f0-aa5b-17f6586297d9", - "Service_Plans_Included_Friendly_Names": "DATA_INVESTIGATIONS" + "Service_Plans_Included_Friendly_Names": "Microsoft Data Investigations" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Defender for Office 365 (Plan 1)", + "Service_Plan_Name": "ATP_ENTERPRISE", "Service_Plan_Id": "f20fedf3-f3c3-43c3-8267-2bfdd51c0939", - "Service_Plans_Included_Friendly_Names": "ATP_ENTERPRISE" + "Service_Plans_Included_Friendly_Names": "Microsoft Defender for Office 365 (Plan 1)" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Defender for Office 365 (Plan 2)", + "Service_Plan_Name": "THREAT_INTELLIGENCE", "Service_Plan_Id": "8e0c0a52-6a6c-4d40-8370-dd62790dcd70", - "Service_Plans_Included_Friendly_Names": "THREAT_INTELLIGENCE" + "Service_Plans_Included_Friendly_Names": "Microsoft Defender for Office 365 (Plan 2)" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Excel Advanced Analytics", + "Service_Plan_Name": "EXCEL_PREMIUM", "Service_Plan_Id": "531ee2f8-b1cb-453b-9c21-d2180d014ca5", - "Service_Plans_Included_Friendly_Names": "EXCEL_PREMIUM" + "Service_Plans_Included_Friendly_Names": "Microsoft Excel Advanced Analytics" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Forms (Plan E5)", + "Service_Plan_Name": "FORMS_PLAN_E5", "Service_Plan_Id": "e212cbc7-0961-4c40-9825-01117710dcb1", - "Service_Plans_Included_Friendly_Names": "FORMS_PLAN_E5" + "Service_Plans_Included_Friendly_Names": "Microsoft Forms (Plan E5)" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Information Governance", + "Service_Plan_Name": "INFO_GOVERNANCE", "Service_Plan_Id": "e26c2fcc-ab91-4a61-b35c-03cdc8dddf66", - "Service_Plans_Included_Friendly_Names": "INFO_GOVERNANCE" + "Service_Plans_Included_Friendly_Names": "Microsoft Information Governance" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Insider Risk Management", + "Service_Plan_Name": "INSIDER_RISK", "Service_Plan_Id": "d587c7a3-bda9-4f99-8776-9bcf59c84f75", - "Service_Plans_Included_Friendly_Names": "INSIDER_RISK" + "Service_Plans_Included_Friendly_Names": "Microsoft Insider Risk Management" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Kaizala Pro", + "Service_Plan_Name": "KAIZALA_STANDALONE", "Service_Plan_Id": "0898bdbb-73b0-471a-81e5-20f1fe4dd66e", - "Service_Plans_Included_Friendly_Names": "KAIZALA_STANDALONE" + "Service_Plans_Included_Friendly_Names": "Microsoft Kaizala Pro" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft ML-Based Classification", + "Service_Plan_Name": "ML_CLASSIFICATION", "Service_Plan_Id": "d2d51368-76c9-4317-ada2-a12c004c432f", - "Service_Plans_Included_Friendly_Names": "ML_CLASSIFICATION" + "Service_Plans_Included_Friendly_Names": "Microsoft ML-Based Classification" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft MyAnalytics (Full)", + "Service_Plan_Name": "EXCHANGE_ANALYTICS", "Service_Plan_Id": "34c0d7a0-a70f-4668-9238-47f9fc208882", - "Service_Plans_Included_Friendly_Names": "EXCHANGE_ANALYTICS" + "Service_Plans_Included_Friendly_Names": "Microsoft MyAnalytics (Full)" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Planner", + "Service_Plan_Name": "PROJECTWORKMANAGEMENT", "Service_Plan_Id": "b737dad2-2f6c-4c65-90e3-ca563267e8b9", - "Service_Plans_Included_Friendly_Names": "PROJECTWORKMANAGEMENT" + "Service_Plans_Included_Friendly_Names": "Microsoft Planner" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Records Management", + "Service_Plan_Name": "RECORDS_MANAGEMENT", "Service_Plan_Id": "65cc641f-cccd-4643-97e0-a17e3045e541", - "Service_Plans_Included_Friendly_Names": "RECORDS_MANAGEMENT" + "Service_Plans_Included_Friendly_Names": "Microsoft Records Management" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Search", + "Service_Plan_Name": "MICROSOFT_SEARCH", "Service_Plan_Id": "94065c59-bc8e-4e8b-89e5-5138d471eaff", - "Service_Plans_Included_Friendly_Names": "MICROSOFT_SEARCH" + "Service_Plans_Included_Friendly_Names": "Microsoft Search" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft StaffHub", + "Service_Plan_Name": "Deskless", "Service_Plan_Id": "8c7d2df8-86f0-4902-b2ed-a0458298f3b3", - "Service_Plans_Included_Friendly_Names": "Deskless" + "Service_Plans_Included_Friendly_Names": "Microsoft StaffHub" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Stream for Office 365 E5", + "Service_Plan_Name": "STREAM_O365_E5", "Service_Plan_Id": "6c6042f5-6f01-4d67-b8c1-eb99d36eed3e", - "Service_Plans_Included_Friendly_Names": "STREAM_O365_E5" + "Service_Plans_Included_Friendly_Names": "Microsoft Stream for Office 365 E5" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Mobile Device Management for Office 365", + "Service_Plan_Name": "INTUNE_O365", "Service_Plan_Id": "882e1d05-acd1-4ccb-8708-6ee03664b117", - "Service_Plans_Included_Friendly_Names": "INTUNE_O365" + "Service_Plans_Included_Friendly_Names": "Mobile Device Management for Office 365" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", @@ -16971,289 +17267,289 @@ "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Office 365 Advanced eDiscovery", + "Service_Plan_Name": "EQUIVIO_ANALYTICS", "Service_Plan_Id": "4de31727-a228-4ec3-a5bf-8e45b5ca48cc", - "Service_Plans_Included_Friendly_Names": "EQUIVIO_ANALYTICS" + "Service_Plans_Included_Friendly_Names": "Office 365 Advanced eDiscovery" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Office 365 Cloud App Security", + "Service_Plan_Name": "ADALLOM_S_O365", "Service_Plan_Id": "8c098270-9dd4-4350-9b30-ba4703f3b36b", - "Service_Plans_Included_Friendly_Names": "ADALLOM_S_O365" + "Service_Plans_Included_Friendly_Names": "Office 365 Cloud App Security" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Office 365 Privileged Access Management", + "Service_Plan_Name": "PAM_ENTERPRISE", "Service_Plan_Id": "b1188c4c-1b36-4018-b48b-ee07604f6feb", - "Service_Plans_Included_Friendly_Names": "PAM_ENTERPRISE" + "Service_Plans_Included_Friendly_Names": "Office 365 Privileged Access Management" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Office 365 SafeDocs", + "Service_Plan_Name": "SAFEDOCS", "Service_Plan_Id": "bf6f5520-59e3-4f82-974b-7dbbc4fd27c7", - "Service_Plans_Included_Friendly_Names": "SAFEDOCS" + "Service_Plans_Included_Friendly_Names": "Office 365 SafeDocs" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Office for the Web", + "Service_Plan_Name": "SHAREPOINTWAC", "Service_Plan_Id": "e95bec33-7c88-4a70-8e19-b10bd9d0c014", - "Service_Plans_Included_Friendly_Names": "SHAREPOINTWAC" + "Service_Plans_Included_Friendly_Names": "Office for the Web" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Power Apps for Office 365 (Plan 3)", + "Service_Plan_Name": "POWERAPPS_O365_P3", "Service_Plan_Id": "9c0dab89-a30c-4117-86e7-97bda240acd2", - "Service_Plans_Included_Friendly_Names": "POWERAPPS_O365_P3" + "Service_Plans_Included_Friendly_Names": "Power Apps for Office 365 (Plan 3)" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Premium Encryption in Office 365", + "Service_Plan_Name": "PREMIUM_ENCRYPTION", "Service_Plan_Id": "617b097b-4b93-4ede-83de-5f075bb5fb2f", - "Service_Plans_Included_Friendly_Names": "PREMIUM_ENCRYPTION" + "Service_Plans_Included_Friendly_Names": "Premium Encryption in Office 365" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Project for Office (Plan E5)", + "Service_Plan_Name": "PROJECT_O365_P3", "Service_Plan_Id": "b21a6b06-1988-436e-a07b-51ec6d9f52ad", - "Service_Plans_Included_Friendly_Names": "PROJECT_O365_P3" + "Service_Plans_Included_Friendly_Names": "Project for Office (Plan E5)" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "RETIRED - Microsoft Communications Compliance", + "Service_Plan_Name": "COMMUNICATIONS_COMPLIANCE", "Service_Plan_Id": "41fcdd7d-4733-4863-9cf4-c65b83ce2df4", - "Service_Plans_Included_Friendly_Names": "COMMUNICATIONS_COMPLIANCE" + "Service_Plans_Included_Friendly_Names": "RETIRED - Microsoft Communications Compliance" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "RETIRED - Microsoft Insider Risk Management", + "Service_Plan_Name": "INSIDER_RISK_MANAGEMENT", "Service_Plan_Id": "9d0c4ee5-e4a1-4625-ab39-d82b619b1a34", - "Service_Plans_Included_Friendly_Names": "INSIDER_RISK_MANAGEMENT" + "Service_Plans_Included_Friendly_Names": "RETIRED - Microsoft Insider Risk Management" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Skype for Business Online (Plan 2)", + "Service_Plan_Name": "MCOSTANDARD", "Service_Plan_Id": "0feaeb32-d00e-4d66-bd5a-43b5b83db82c", - "Service_Plans_Included_Friendly_Names": "MCOSTANDARD" + "Service_Plans_Included_Friendly_Names": "Skype for Business Online (Plan 2)" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Sway", + "Service_Plan_Name": "SWAY", "Service_Plan_Id": "a23b959c-7ce8-4e57-9140-b90eb88a9e97", - "Service_Plans_Included_Friendly_Names": "SWAY" + "Service_Plans_Included_Friendly_Names": "Sway" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "To-Do (Plan 3)", + "Service_Plan_Name": "BPOS_S_TODO_3", "Service_Plan_Id": "3fb82609-8c27-4f7b-bd51-30634711ee67", - "Service_Plans_Included_Friendly_Names": "BPOS_S_TODO_3" + "Service_Plans_Included_Friendly_Names": "To-Do (Plan 3)" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Viva Engage Core", + "Service_Plan_Name": "VIVAENGAGE_CORE", "Service_Plan_Id": "a82fbf69-b4d7-49f4-83a6-915b2cf354f4", - "Service_Plans_Included_Friendly_Names": "VIVAENGAGE_CORE" + "Service_Plans_Included_Friendly_Names": "Viva Engage Core" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Viva Learning Seeded", + "Service_Plan_Name": "VIVA_LEARNING_SEEDED", "Service_Plan_Id": "b76fb638-6ba6-402a-b9f9-83d28acb3d86", - "Service_Plans_Included_Friendly_Names": "VIVA_LEARNING_SEEDED" + "Service_Plans_Included_Friendly_Names": "Viva Learning Seeded" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Whiteboard (Plan 3)", + "Service_Plan_Name": "WHITEBOARD_PLAN3", "Service_Plan_Id": "4a51bca5-1eff-43f5-878c-177680f191af", - "Service_Plans_Included_Friendly_Names": "WHITEBOARD_PLAN3" + "Service_Plans_Included_Friendly_Names": "Whiteboard (Plan 3)" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Yammer Enterprise", + "Service_Plan_Name": "YAMMER_ENTERPRISE", "Service_Plan_Id": "7547a3fe-08ee-4ccb-b430-5077c5041653", - "Service_Plans_Included_Friendly_Names": "YAMMER_ENTERPRISE" + "Service_Plans_Included_Friendly_Names": "Yammer Enterprise" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Defender for Endpoint", + "Service_Plan_Name": "WINDEFATP", "Service_Plan_Id": "871d91ec-ec1a-452b-a83f-bd76c7d770ef", - "Service_Plans_Included_Friendly_Names": "WINDEFATP" + "Service_Plans_Included_Friendly_Names": "Microsoft Defender for Endpoint" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Endpoint DLP", + "Service_Plan_Name": "MICROSOFTENDPOINTDLP", "Service_Plan_Id": "64bfac92-2b17-4482-b5e5-a0304429de3e", - "Service_Plans_Included_Friendly_Names": "MICROSOFTENDPOINTDLP" + "Service_Plans_Included_Friendly_Names": "Microsoft Endpoint DLP" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Universal Print", + "Service_Plan_Name": "UNIVERSAL_PRINT_01", "Service_Plan_Id": "795f6fe0-cc4d-4773-b050-5dde4dc704c9", - "Service_Plans_Included_Friendly_Names": "UNIVERSAL_PRINT_01" + "Service_Plans_Included_Friendly_Names": "Universal Print" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Windows 10/11 Enterprise (Original)", + "Service_Plan_Name": "WIN10_PRO_ENT_SUB", "Service_Plan_Id": "21b439ba-a0ca-424f-a6cc-52f954a5b111", - "Service_Plans_Included_Friendly_Names": "WIN10_PRO_ENT_SUB" + "Service_Plans_Included_Friendly_Names": "Windows 10/11 Enterprise (Original)" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Windows Autopatch", + "Service_Plan_Name": "Windows_Autopatch", "Service_Plan_Id": "9a6eeb79-0b4b-4bf0-9808-39d99a2cd5a3", - "Service_Plans_Included_Friendly_Names": "Windows_Autopatch" + "Service_Plans_Included_Friendly_Names": "Windows Autopatch" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Windows Update for Business Deployment Service", + "Service_Plan_Name": "WINDOWSUPDATEFORBUSINESS_DEPLOYMENTSERVICE", "Service_Plan_Id": "7bf960f6-2cd9-443a-8046-5dbff9558365", - "Service_Plans_Included_Friendly_Names": "WINDOWSUPDATEFORBUSINESS_DEPLOYMENTSERVICE" + "Service_Plans_Included_Friendly_Names": "Windows Update for Business Deployment Service" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Azure Information Protection Premium P1", + "Service_Plan_Name": "RMS_S_PREMIUM", "Service_Plan_Id": "6c57d4b6-3b23-47a5-9bc9-69f17b4947b3", - "Service_Plans_Included_Friendly_Names": "RMS_S_PREMIUM" + "Service_Plans_Included_Friendly_Names": "Azure Information Protection Premium P1" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Azure Information Protection Premium P2", + "Service_Plan_Name": "RMS_S_PREMIUM2", "Service_Plan_Id": "5689bec4-755d-4753-8b61-40975025187c", - "Service_Plans_Included_Friendly_Names": "RMS_S_PREMIUM2" + "Service_Plans_Included_Friendly_Names": "Azure Information Protection Premium P2" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Azure Rights Management", + "Service_Plan_Name": "RMS_S_ENTERPRISE", "Service_Plan_Id": "bea4c11e-220a-4e6d-8eb8-8ea15d019f90", - "Service_Plans_Included_Friendly_Names": "RMS_S_ENTERPRISE" + "Service_Plans_Included_Friendly_Names": "Azure Rights Management" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Common Data Service", + "Service_Plan_Name": "DYN365_CDS_O365_P3", "Service_Plan_Id": "28b0fa46-c39a-4188-89e2-58e979a6b014", - "Service_Plans_Included_Friendly_Names": "DYN365_CDS_O365_P3" + "Service_Plans_Included_Friendly_Names": "Common Data Service" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Azure Multi-Factor Authentication", + "Service_Plan_Name": "MFA_PREMIUM", "Service_Plan_Id": "8a256a2b-b617-496d-b51b-e76466e88db0", - "Service_Plans_Included_Friendly_Names": "MFA_PREMIUM" + "Service_Plans_Included_Friendly_Names": "Microsoft Azure Multi-Factor Authentication" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Defender for Cloud Apps", + "Service_Plan_Name": "ADALLOM_S_STANDALONE", "Service_Plan_Id": "2e2ddb96-6af9-4b1d-a3f0-d6ecfd22edb2", - "Service_Plans_Included_Friendly_Names": "ADALLOM_S_STANDALONE" + "Service_Plans_Included_Friendly_Names": "Microsoft Defender for Cloud Apps" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Defender for Identity", + "Service_Plan_Name": "ATA", "Service_Plan_Id": "14ab5db5-e6c4-4b20-b4bc-13e36fd2227f", - "Service_Plans_Included_Friendly_Names": "ATA" + "Service_Plans_Included_Friendly_Names": "Microsoft Defender for Identity" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Entra ID P1", + "Service_Plan_Name": "AAD_PREMIUM", "Service_Plan_Id": "41781fb2-bc02-4b7c-bd55-b576c07bb09d", - "Service_Plans_Included_Friendly_Names": "AAD_PREMIUM" + "Service_Plans_Included_Friendly_Names": "Microsoft Entra ID P1" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Entra ID P2", + "Service_Plan_Name": "AAD_PREMIUM_P2", "Service_Plan_Id": "eec0eb4f-6444-4f95-aba0-50c24d67f998", - "Service_Plans_Included_Friendly_Names": "AAD_PREMIUM_P2" + "Service_Plans_Included_Friendly_Names": "Microsoft Entra ID P2" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Microsoft Intune Plan 1", + "Service_Plan_Name": "INTUNE_A", "Service_Plan_Id": "c1ec4a95-1f05-45b3-a911-aa3fa01094f5", - "Service_Plans_Included_Friendly_Names": "INTUNE_A" + "Service_Plans_Included_Friendly_Names": "Microsoft Intune Plan 1" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Power Automate for Office 365", + "Service_Plan_Name": "FLOW_O365_P3", "Service_Plan_Id": "07699545-9485-468e-95b6-2fca3738be01", - "Service_Plans_Included_Friendly_Names": "FLOW_O365_P3" + "Service_Plans_Included_Friendly_Names": "Power Automate for Office 365" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Power BI Pro", + "Service_Plan_Name": "BI_AZURE_P2", "Service_Plan_Id": "70d33638-9c74-4d01-bfd3-562de28bd4ba", - "Service_Plans_Included_Friendly_Names": "BI_AZURE_P2" + "Service_Plans_Included_Friendly_Names": "Power BI Pro" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Power Virtual Agents for Office 365", + "Service_Plan_Name": "POWER_VIRTUAL_AGENTS_O365_P3", "Service_Plan_Id": "ded3d325-1bdc-453e-8432-5bac26d7a014", - "Service_Plans_Included_Friendly_Names": "POWER_VIRTUAL_AGENTS_O365_P3" + "Service_Plans_Included_Friendly_Names": "Power Virtual Agents for Office 365" }, { "Product_Display_Name": "Microsoft 365 E5 Security", @@ -17397,7 +17693,7 @@ "GUID": "a91fc4e0-65e5-4266-aa76-4037509c1626", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Copilot" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 E5 with Calling Minutes", @@ -17461,7 +17757,7 @@ "GUID": "a91fc4e0-65e5-4266-aa76-4037509c1626", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 E5 with Calling Minutes", @@ -18061,7 +18357,7 @@ "GUID": "cd2925a3-5076-4233-8931-638a8c94f773", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Copilot" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 E5 without Audio Conferencing", @@ -18125,7 +18421,7 @@ "GUID": "cd2925a3-5076-4233-8931-638a8c94f773", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 E5 without Audio Conferencing", @@ -18725,7 +19021,7 @@ "GUID": "2113661c-6509-4034-98bb-9c47bd28d63c", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Copilot" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 E5 without Audio Conferencing (500 seats min)_HUB", @@ -18789,7 +19085,7 @@ "GUID": "2113661c-6509-4034-98bb-9c47bd28d63c", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 E5 without Audio Conferencing (500 seats min)_HUB", @@ -19357,7 +19653,7 @@ "GUID": "1e988bf3-8b7c-4731-bec0-4e2a2946600c", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Copilot" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams) (500 seats min)_HUB", @@ -19421,7 +19717,7 @@ "GUID": "1e988bf3-8b7c-4731-bec0-4e2a2946600c", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams) (500 seats min)_HUB", @@ -20005,7 +20301,7 @@ "GUID": "a640eead-25f6-4bec-97e3-23cfd382d7c2", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Copilot" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams) without Audio Conferencing (500 seats min)_HUB", @@ -20061,7 +20357,7 @@ "GUID": "a640eead-25f6-4bec-97e3-23cfd382d7c2", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams) without Audio Conferencing (500 seats min)_HUB", @@ -20645,7 +20941,7 @@ "GUID": "4eb45c5b-0d19-4e33-b87c-adfc25268f20", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 E5_USGOV_GCCHIGH", @@ -21255,6 +21551,14 @@ "Service_Plan_Id": "bea4c11e-220a-4e6d-8eb8-8ea15d019f90", "Service_Plans_Included_Friendly_Names": "Azure Rights Management" }, + { + "Product_Display_Name": "Microsoft 365 F3", + "String_Id": "SPE_F1", + "GUID": "66b55226-6b4f-492c-910c-a3b7a3c9d993", + "Service_Plan_Name": "Bing_Chat_Enterprise", + "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + }, { "Product_Display_Name": "Microsoft 365 F3", "String_Id": "SPE_F1", @@ -21271,6 +21575,14 @@ "Service_Plan_Id": "4a82b400-a79f-41a4-b4e2-e94f5787b113", "Service_Plans_Included_Friendly_Names": "Exchange Online Kiosk" }, + { + "Product_Display_Name": "Microsoft 365 F3", + "String_Id": "SPE_F1", + "GUID": "66b55226-6b4f-492c-910c-a3b7a3c9d993", + "Service_Plan_Name": "M365_LIGHTHOUSE_CUSTOMER_PLAN1", + "Service_Plan_Id": "6f23d6a9-adbf-481c-8538-b4c095654487", + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Lighthouse (Plan 1)" + }, { "Product_Display_Name": "Microsoft 365 F3", "String_Id": "SPE_F1", @@ -21399,6 +21711,14 @@ "Service_Plan_Id": "80873e7a-cd2a-4e67-b061-1b5381a676a5", "Service_Plans_Included_Friendly_Names": "To-Do (Firstline)" }, + { + "Product_Display_Name": "Microsoft 365 F3", + "String_Id": "SPE_F1", + "GUID": "66b55226-6b4f-492c-910c-a3b7a3c9d993", + "Service_Plan_Name": "VIVAENGAGE_CORE", + "Service_Plan_Id": "a82fbf69-b4d7-49f4-83a6-915b2cf354f4", + "Service_Plans_Included_Friendly_Names": "Viva Engage Core" + }, { "Product_Display_Name": "Microsoft 365 F3", "String_Id": "SPE_F1", @@ -21443,17 +21763,17 @@ "Product_Display_Name": "Microsoft 365 F3", "String_Id": "SPE_F1", "GUID": "66b55226-6b4f-492c-910c-a3b7a3c9d993", - "Service_Plan_Name": "WINDOWSUPDATEFORBUSINESS_DEPLOYMENTSERVICE", - "Service_Plan_Id": "7bf960f6-2cd9-443a-8046-5dbff9558365", - "Service_Plans_Included_Friendly_Names": "Windows Update for Business Deployment Service" + "Service_Plan_Name": "Windows_Autopatch", + "Service_Plan_Id": "9a6eeb79-0b4b-4bf0-9808-39d99a2cd5a3", + "Service_Plans_Included_Friendly_Names": "Windows Autopatch" }, { "Product_Display_Name": "Microsoft 365 F3", "String_Id": "SPE_F1", "GUID": "66b55226-6b4f-492c-910c-a3b7a3c9d993", - "Service_Plan_Name": "AAD_PREMIUM", - "Service_Plan_Id": "41781fb2-bc02-4b7c-bd55-b576c07bb09d", - "Service_Plans_Included_Friendly_Names": "Microsoft Entra ID P1" + "Service_Plan_Name": "WINDOWSUPDATEFORBUSINESS_DEPLOYMENTSERVICE", + "Service_Plan_Id": "7bf960f6-2cd9-443a-8046-5dbff9558365", + "Service_Plans_Included_Friendly_Names": "Windows Update for Business Deployment Service" }, { "Product_Display_Name": "Microsoft 365 F3", @@ -21487,13 +21807,21 @@ "Service_Plan_Id": "932ad362-64a8-4783-9106-97849a1a30b9", "Service_Plans_Included_Friendly_Names": "Microsoft Defender for Cloud Apps Discovery" }, + { + "Product_Display_Name": "Microsoft 365 F3", + "String_Id": "SPE_F1", + "GUID": "66b55226-6b4f-492c-910c-a3b7a3c9d993", + "Service_Plan_Name": "AAD_PREMIUM", + "Service_Plan_Id": "41781fb2-bc02-4b7c-bd55-b576c07bb09d", + "Service_Plans_Included_Friendly_Names": "Microsoft Entra ID P1" + }, { "Product_Display_Name": "Microsoft 365 F3", "String_Id": "SPE_F1", "GUID": "66b55226-6b4f-492c-910c-a3b7a3c9d993", "Service_Plan_Name": "INTUNE_A", "Service_Plan_Id": "c1ec4a95-1f05-45b3-a911-aa3fa01094f5", - "Service_Plans_Included_Friendly_Names": "Microsoft Intune" + "Service_Plans_Included_Friendly_Names": "Microsoft Intune Plan 1" }, { "Product_Display_Name": "Microsoft 365 F3", @@ -21527,14 +21855,6 @@ "Service_Plan_Id": "ba2fdb48-290b-4632-b46a-e4ecc58ac11a", "Service_Plans_Included_Friendly_Names": "Power Virtual Agents for Office 365" }, - { - "Product_Display_Name": "Microsoft 365 F3", - "String_Id": "SPE_F1", - "GUID": "66b55226-6b4f-492c-910c-a3b7a3c9d993", - "Service_Plan_Name": "VIVAENGAGE_CORE", - "Service_Plan_Id": "a82fbf69-b4d7-49f4-83a6-915b2cf354f4", - "Service_Plans_Included_Friendly_Names": "Viva Engage Core" - }, { "Product_Display_Name": "Microsoft 365 F3 EEA (no Teams)", "String_Id": "Microsoft_365_F3_EEA_(no_Teams)", @@ -22205,7 +22525,7 @@ "GUID": "9cfd6bc3-84cd-4274-8a21-8c7c41d6c350", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 F5 Compliance Add-on AR (DOD)_USGOV_DOD", @@ -22965,7 +23285,7 @@ "GUID": "e2be619b-b125-455f-8660-fb503e431a5d", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 GCC G5", @@ -23413,7 +23733,7 @@ "GUID": "b0f809d5-a662-4391-a5aa-136e9c565b9d", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 GCC G5 w/o WDATP/CAS Unified", @@ -23805,7 +24125,7 @@ "GUID": "99cc8282-2f74-4954-83b7-c6a9a1999067", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Copilot" + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Microsoft 365 E5 Suite features", @@ -23815,6 +24135,14 @@ "Service_Plan_Id": "3ec18638-bd4c-4d3b-8905-479ed636b83e", "Service_Plans_Included_Friendly_Names": "Customer Lockbox (A)" }, + { + "Product_Display_Name": "Microsoft 365 E5 Suite features", + "String_Id": "M365_E5_SUITE_COMPONENTS", + "GUID": "99cc8282-2f74-4954-83b7-c6a9a1999067", + "Service_Plan_Name": "MESH_IMMERSIVE_FOR_TEAMS", + "Service_Plan_Id": "f0ff6ac6-297d-49cd-be34-6dfef97f0c28", + "Service_Plans_Included_Friendly_Names": "Immersive spaces for Teams" + }, { "Product_Display_Name": "Microsoft 365 E5 Suite features", "String_Id": "M365_E5_SUITE_COMPONENTS", @@ -23887,6 +24215,14 @@ "Service_Plan_Id": "9a6eeb79-0b4b-4bf0-9808-39d99a2cd5a3", "Service_Plans_Included_Friendly_Names": "Windows Autopatch" }, + { + "Product_Display_Name": "Microsoft 365 E5 Suite features", + "String_Id": "M365_E5_SUITE_COMPONENTS", + "GUID": "99cc8282-2f74-4954-83b7-c6a9a1999067", + "Service_Plan_Name": "WINDOWSUPDATEFORBUSINESS_DEPLOYMENTSERVICE", + "Service_Plan_Id": "7bf960f6-2cd9-443a-8046-5dbff9558365", + "Service_Plans_Included_Friendly_Names": "Windows Update for Business Deployment Service" + }, { "Product_Display_Name": "Microsoft 365 E5 Suite features", "String_Id": "M365_E5_SUITE_COMPONENTS", @@ -24069,7 +24405,7 @@ "GUID": "e823ca47-49c4-46b3-b38d-ca11d5abe3d2", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Microsoft 365 G3 GCC", @@ -24799,6 +25135,14 @@ "Service_Plan_Id": "871d91ec-ec1a-452b-a83f-bd76c7d770ef", "Service_Plans_Included_Friendly_Names": "MICROSOFT DEFENDER FOR ENDPOINT" }, + { + "Product_Display_Name": "Microsoft Defender for Endpoint F2", + "String_Id": "Microsoft_Defender_for_Endpoint_F2", + "GUID": "e430a580-c37b-4d16-adba-d881d7cd0364", + "Service_Plan_Name": "WINDEFATP", + "Service_Plan_Id": "871d91ec-ec1a-452b-a83f-bd76c7d770ef", + "Service_Plans_Included_Friendly_Names": "Microsoft Defender for Endpoint" + }, { "Product_Display_Name": "Microsoft Defender for Endpoint P1", "String_Id": "DEFENDER_ENDPOINT_P1", @@ -25023,6 +25367,14 @@ "Service_Plan_Id": "874fc546-6efe-4d22-90b8-5c4e7aa59f4b", "Service_Plans_Included_Friendly_Names": "POWERAPPS FOR DYNAMICS 365" }, + { + "Product_Display_Name": "Microsoft Entra ID Governance", + "String_Id": "Microsoft_Entra_ID_Governance", + "GUID": "cf6b0d46-4093-4546-a0ab-0b1546dcc10e", + "Service_Plan_Name": "Entra_Identity_Governance", + "Service_Plan_Id": "e866a266-3cff-43a3-acca-0c90a7e00c8b", + "Service_Plans_Included_Friendly_Names": "Entra Identity Governance" + }, { "Product_Display_Name": "Microsoft Fabric (Free)", "String_Id": "POWER_BI_STANDARD", @@ -25503,6 +25855,38 @@ "Service_Plan_Id": "83bced11-77ce-4071-95bd-240133796768", "Service_Plans_Included_Friendly_Names": "Microsoft Stream Storage Add-On" }, + { + "Product_Display_Name": "Microsoft Sustainability Manager USL Essentials", + "String_Id": "Microsoft_Cloud_for_Sustainability_USL", + "GUID": "ece037b4-a52b-4cf8-93ea-649e5d83767a", + "Service_Plan_Name": "MCS_BizApps_Cloud_for_Sustainability_USL", + "Service_Plan_Id": "c46c42af-d654-4385-8c85-29a84f3dfb22", + "Service_Plans_Included_Friendly_Names": "MCS - BizApps - Cloud for Sustainability USL" + }, + { + "Product_Display_Name": "Microsoft Sustainability Manager USL Essentials", + "String_Id": "Microsoft_Cloud_for_Sustainability_USL", + "GUID": "ece037b4-a52b-4cf8-93ea-649e5d83767a", + "Service_Plan_Name": "POWER_APPS_FOR_MCS_USL", + "Service_Plan_Id": "5ffd371c-037a-41a2-98a3-6452f8c5de17", + "Service_Plans_Included_Friendly_Names": "Power Apps for Cloud for Sustainability USL" + }, + { + "Product_Display_Name": "Microsoft Sustainability Manager USL Essentials", + "String_Id": "Microsoft_Cloud_for_Sustainability_USL", + "GUID": "ece037b4-a52b-4cf8-93ea-649e5d83767a", + "Service_Plan_Name": "POWER_AUTOMATE_FOR_MCS_USL", + "Service_Plan_Id": "ccbe468e-7973-442c-8ec4-5fbe16438711", + "Service_Plans_Included_Friendly_Names": "Power Automate for Cloud for Sustainability USL" + }, + { + "Product_Display_Name": "Microsoft Sustainability Manager USL Essentials", + "String_Id": "Microsoft_Cloud_for_Sustainability_USL", + "GUID": "ece037b4-a52b-4cf8-93ea-649e5d83767a", + "Service_Plan_Name": "EXCHANGE_S_FOUNDATION", + "Service_Plan_Id": "113feb6c-3fe4-4440-bddc-54d774bf0318", + "Service_Plans_Included_Friendly_Names": "Exchange Foundation" + }, { "Product_Display_Name": "Microsoft Teams Audio Conferencing with dial-out to USA/CAN", "String_Id": "Microsoft_Teams_Audio_Conferencing_select_dial_out", @@ -25559,6 +25943,22 @@ "Service_Plan_Id": "36b29273-c6d0-477a-aca6-6fbe24f538e3", "Service_Plans_Included_Friendly_Names": "WHITEBOARD (FIRSTLINE)" }, + { + "Product_Display_Name": "Microsoft Teams Calling Plan pay-as-you-go (country zone 1 - US)", + "String_Id": "Microsoft_Teams_Calling_Plan_pay_as_you_go_(country_zone_1_US)", + "GUID": "9b196e97-5830-4c2e-adc2-1e10ebf5dee5", + "Service_Plan_Name": "MCOPSTN_PAYG_1", + "Service_Plan_Id": "156a1efe-17cd-4b03-9f17-2eb512298fb3", + "Service_Plans_Included_Friendly_Names": "Microsoft Teams Calling Plan pay-as-you-go - country zone 1" + }, + { + "Product_Display_Name": "Microsoft Teams Domestic Calling Plan (240 min)", + "String_Id": "MCOPSTN_6", + "GUID": "729dbb8f-8d56-4994-8e33-2f218f549544", + "Service_Plan_Name": "MCOPSTN6", + "Service_Plan_Id": "346d83bf-6fe6-42ca-b424-b9300d2e21bf", + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Domestic Calling Plan (240 min)" + }, { "Product_Display_Name": "Microsoft Teams Essentials", "String_Id": "Teams_Ess", @@ -28325,7 +28725,7 @@ "GUID": "a4585165-0533-458a-97e3-c400570268c4", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Office 365 A5 for faculty", @@ -28781,7 +29181,7 @@ "GUID": "ee656612-49fa-43e5-b67e-cb1fdf7699df", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Office 365 A5 for students", @@ -30051,9 +30451,33 @@ "Product_Display_Name": "Office 365 E3", "String_Id": "ENTERPRISEPACK", "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", - "Service_Plan_Name": "DYN365_CDS_O365_P2", - "Service_Plan_Id": "4ff01e01-1ba7-4d71-8cf8-ce96c3bbcf14", - "Service_Plans_Included_Friendly_Names": "Common Data Service - O365 P2" + "Service_Plan_Name": "MESH_AVATARS_FOR_TEAMS", + "Service_Plan_Id": "dcf9d2f4-772e-4434-b757-77a453cfbc02", + "Service_Plans_Included_Friendly_Names": "Avatars for Teams" + }, + { + "Product_Display_Name": "Office 365 E3", + "String_Id": "ENTERPRISEPACK", + "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", + "Service_Plan_Name": "MESH_AVATARS_ADDITIONAL_FOR_TEAMS", + "Service_Plan_Id": "3efbd4ed-8958-4824-8389-1321f8730af8", + "Service_Plans_Included_Friendly_Names": "Avatars for Teams (additional)" + }, + { + "Product_Display_Name": "Office 365 E3", + "String_Id": "ENTERPRISEPACK", + "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", + "Service_Plan_Name": "RMS_S_ENTERPRISE", + "Service_Plan_Id": "bea4c11e-220a-4e6d-8eb8-8ea15d019f90", + "Service_Plans_Included_Friendly_Names": "Azure Rights Management" + }, + { + "Product_Display_Name": "Office 365 E3", + "String_Id": "ENTERPRISEPACK", + "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", + "Service_Plan_Name": "Bing_Chat_Enterprise", + "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", + "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" }, { "Product_Display_Name": "Office 365 E3", @@ -30061,7 +30485,7 @@ "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", "Service_Plan_Name": "CDS_O365_P2", "Service_Plan_Id": "95b76021-6a53-4741-ab8b-1d1f3d66a95a", - "Service_Plans_Included_Friendly_Names": "Common Data Service for Teams_P2" + "Service_Plans_Included_Friendly_Names": "Common Data Service for Teams" }, { "Product_Display_Name": "Office 365 E3", @@ -30071,13 +30495,21 @@ "Service_Plan_Id": "efb87545-963c-4e0d-99df-69c6916d9eb0", "Service_Plans_Included_Friendly_Names": "Exchange Online (Plan 2)" }, + { + "Product_Display_Name": "Office 365 E3", + "String_Id": "ENTERPRISEPACK", + "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", + "Service_Plan_Name": "MESH_IMMERSIVE_FOR_TEAMS", + "Service_Plan_Id": "f0ff6ac6-297d-49cd-be34-6dfef97f0c28", + "Service_Plans_Included_Friendly_Names": "Immersive spaces for Teams" + }, { "Product_Display_Name": "Office 365 E3", "String_Id": "ENTERPRISEPACK", "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics - Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Office 365 E3", @@ -30101,15 +30533,15 @@ "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", "Service_Plan_Name": "OFFICESUBSCRIPTION", "Service_Plan_Id": "43de0ff5-c92c-492b-9116-175376d08c38", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Apps for enterprise" + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Apps for Enterprise" }, { "Product_Display_Name": "Office 365 E3", "String_Id": "ENTERPRISEPACK", "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", - "Service_Plan_Name": "RMS_S_ENTERPRISE", - "Service_Plan_Id": "bea4c11e-220a-4e6d-8eb8-8ea15d019f90", - "Service_Plans_Included_Friendly_Names": "Microsoft Microsoft Entra Rights" + "Service_Plan_Name": "M365_LIGHTHOUSE_CUSTOMER_PLAN1", + "Service_Plan_Id": "6f23d6a9-adbf-481c-8538-b4c095654487", + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Lighthouse (Plan 1)" }, { "Product_Display_Name": "Office 365 E3", @@ -30133,7 +30565,7 @@ "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", "Service_Plan_Name": "KAIZALA_O365_P3", "Service_Plan_Id": "aebd3021-9f8f-4bf8-bbe3-0ed2f4f047a1", - "Service_Plans_Included_Friendly_Names": "Microsoft Kaizala Pro Plan 3" + "Service_Plans_Included_Friendly_Names": "Microsoft Kaizala Pro" }, { "Product_Display_Name": "Office 365 E3", @@ -30165,7 +30597,7 @@ "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", "Service_Plan_Name": "STREAM_O365_E3", "Service_Plan_Id": "9e700747-8b1d-45e5-ab8d-ef187ceec156", - "Service_Plans_Included_Friendly_Names": "Microsoft Stream for O365 E3 SKU" + "Service_Plans_Included_Friendly_Names": "Microsoft Stream for Office 365 E3" }, { "Product_Display_Name": "Office 365 E3", @@ -30187,33 +30619,17 @@ "Product_Display_Name": "Office 365 E3", "String_Id": "ENTERPRISEPACK", "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", - "Service_Plan_Name": "SHAREPOINTWAC", - "Service_Plan_Id": "e95bec33-7c88-4a70-8e19-b10bd9d0c014", - "Service_Plans_Included_Friendly_Names": "Office for the web" - }, - { - "Product_Display_Name": "Office 365 E3", - "String_Id": "ENTERPRISEPACK", - "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", - "Service_Plan_Name": "POWERAPPS_O365_P2", - "Service_Plan_Id": "c68f8d98-5534-41c8-bf36-22fa496fa792", - "Service_Plans_Included_Friendly_Names": "Power Apps for Office 365" - }, - { - "Product_Display_Name": "Office 365 E3", - "String_Id": "ENTERPRISEPACK", - "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", - "Service_Plan_Name": "FLOW_O365_P2", - "Service_Plan_Id": "76846ad7-7776-4c40-a281-a386362dd1b9", - "Service_Plans_Included_Friendly_Names": "Power Automate for Office 365" + "Service_Plan_Name": "Nucleus", + "Service_Plan_Id": "db4d623d-b514-490b-b7ef-8885eee514de", + "Service_Plans_Included_Friendly_Names": "Nucleus" }, { "Product_Display_Name": "Office 365 E3", "String_Id": "ENTERPRISEPACK", "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", - "Service_Plan_Name": "POWER_VIRTUAL_AGENTS_O365_P2", - "Service_Plan_Id": "041fe683-03e4-45b6-b1af-c0cdc516daee", - "Service_Plans_Included_Friendly_Names": "Power Virtual Agents for Office 365 P2" + "Service_Plan_Name": "SHAREPOINTWAC", + "Service_Plan_Id": "e95bec33-7c88-4a70-8e19-b10bd9d0c014", + "Service_Plans_Included_Friendly_Names": "Office for the Web" }, { "Product_Display_Name": "Office 365 E3", @@ -30287,6 +30703,38 @@ "Service_Plan_Id": "7547a3fe-08ee-4ccb-b430-5077c5041653", "Service_Plans_Included_Friendly_Names": "Yammer Enterprise" }, + { + "Product_Display_Name": "Office 365 E3", + "String_Id": "ENTERPRISEPACK", + "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", + "Service_Plan_Name": "DYN365_CDS_O365_P2", + "Service_Plan_Id": "4ff01e01-1ba7-4d71-8cf8-ce96c3bbcf14", + "Service_Plans_Included_Friendly_Names": "Common Data Service" + }, + { + "Product_Display_Name": "Office 365 E3", + "String_Id": "ENTERPRISEPACK", + "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", + "Service_Plan_Name": "POWERAPPS_O365_P2", + "Service_Plan_Id": "c68f8d98-5534-41c8-bf36-22fa496fa792", + "Service_Plans_Included_Friendly_Names": "Power Apps for Office 365" + }, + { + "Product_Display_Name": "Office 365 E3", + "String_Id": "ENTERPRISEPACK", + "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", + "Service_Plan_Name": "FLOW_O365_P2", + "Service_Plan_Id": "76846ad7-7776-4c40-a281-a386362dd1b9", + "Service_Plans_Included_Friendly_Names": "Power Automate for Office 365" + }, + { + "Product_Display_Name": "Office 365 E3", + "String_Id": "ENTERPRISEPACK", + "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", + "Service_Plan_Name": "POWER_VIRTUAL_AGENTS_O365_P2", + "Service_Plan_Id": "041fe683-03e4-45b6-b1af-c0cdc516daee", + "Service_Plans_Included_Friendly_Names": "Power Virtual Agents for Office 365" + }, { "Product_Display_Name": "Office 365 E3 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_E3", @@ -30309,7 +30757,7 @@ "GUID": "d711d25a-a21c-492f-bd19-aae1e8ebaf30", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Office 365 E3 EEA (no Teams)", @@ -31437,7 +31885,7 @@ "GUID": "cf50bae9-29e8-4775-b07c-56ee10e3776d", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Office 365 E5 EEA (no Teams)", @@ -31901,7 +32349,7 @@ "GUID": "71772aeb-4bb8-4f74-9dd4-36c7a9b5ca74", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Office 365 E5 EEA (no Teams) without Audio Conferencing", @@ -32349,7 +32797,7 @@ "GUID": "26d45bd9-adf1-46cd-a9e1-51e9a5524128", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Office 365 E5 Without Audio Conferencing", @@ -33437,7 +33885,7 @@ "GUID": "535a3a29-c5f0-42fe-8215-d3b9e1f38c4a", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Office 365 G3 GCC", @@ -33629,7 +34077,7 @@ "GUID": "24aebea8-7fac-48d0-8750-de4ee1fde205", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Office 365 G3 without Microsoft 365 Apps GCC", @@ -33845,7 +34293,7 @@ "GUID": "8900a2c0-edba-4079-bdf3-b276e293b6a8", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Office 365 G5 GCC", @@ -34197,7 +34645,7 @@ "GUID": "1341559b-49df-443c-8e79-fa604fed2d82", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Office 365 GCC G5 without Audio Conferencing", @@ -34541,7 +34989,7 @@ "GUID": "2f105cc2-c2c1-435b-a955-c5e82156c05d", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" }, { "Product_Display_Name": "Office 365 GCC G5 without Power BI and Phone System", @@ -35487,6 +35935,46 @@ "Service_Plan_Id": "8e2c2c3d-07f6-4da7-86a9-e78cc8c2c8b9", "Service_Plans_Included_Friendly_Names": "Power Automate for Power Apps per App Plan for Government" }, + { + "Product_Display_Name": "Power Apps Per User BD Only", + "String_Id": "POWERAPPS_PER_USER_BD_ONLY", + "GUID": "2ced8a00-3ed1-4295-ab7c-57170ff28e58", + "Service_Plan_Name": "Power_Pages_Internal_User", + "Service_Plan_Id": "60bf28f9-2b70-4522-96f7-335f5e06c941", + "Service_Plans_Included_Friendly_Names": "Power Pages Internal User" + }, + { + "Product_Display_Name": "Power Apps Per User BD Only", + "String_Id": "POWERAPPS_PER_USER_BD_ONLY", + "GUID": "2ced8a00-3ed1-4295-ab7c-57170ff28e58", + "Service_Plan_Name": "EXCHANGE_S_FOUNDATION", + "Service_Plan_Id": "113feb6c-3fe4-4440-bddc-54d774bf0318", + "Service_Plans_Included_Friendly_Names": "Exchange Foundation" + }, + { + "Product_Display_Name": "Power Apps Per User BD Only", + "String_Id": "POWERAPPS_PER_USER_BD_ONLY", + "GUID": "2ced8a00-3ed1-4295-ab7c-57170ff28e58", + "Service_Plan_Name": "CDS_ POWERAPPS_PER_USER_CUSTOM", + "Service_Plan_Id": "2e8dde43-6986-479d-b179-7dbe31c31f60", + "Service_Plans_Included_Friendly_Names": "CDS Power Apps Per User Custom" + }, + { + "Product_Display_Name": "Power Apps Per User BD Only", + "String_Id": "POWERAPPS_PER_USER_BD_ONLY", + "GUID": "2ced8a00-3ed1-4295-ab7c-57170ff28e58", + "Service_Plan_Name": "POWERAPPS_PER_USER", + "Service_Plan_Id": "ea2cf03b-ac60-46ae-9c1d-eeaeb63cec86", + "Service_Plans_Included_Friendly_Names": "Power Apps per User Plan" + }, + { + "Product_Display_Name": "Power Apps Per User BD Only", + "String_Id": "POWERAPPS_PER_USER_BD_ONLY", + "GUID": "2ced8a00-3ed1-4295-ab7c-57170ff28e58", + "Service_Plan_Name": "Flow_PowerApps_PerUser", + "Service_Plan_Id": "dc789ed8-0170-4b65-a415-eb77d5bb350a", + "Service_Plans_Included_Friendly_Names": "Power Automate for Power Apps per User Plan" + }, { "Product_Display_Name": "Power Apps per user plan", "String_Id": "POWERAPPS_PER_USER", @@ -36648,7 +37136,7 @@ "Service_Plans_Included_Friendly_Names": "Flow for CCI Bots" }, { - "Product_Display_Name": "Privacy Management � risk", + "Product_Display_Name": "Privacy Management ? risk", "String_Id": "PRIVACY_MANAGEMENT_RISK", "GUID": "e42bc969-759a-4820-9283-6b73085b68e6", "Service_Plan_Name": "MIP_S_Exchange", @@ -36656,7 +37144,7 @@ "Service_Plans_Included_Friendly_Names": "Data Classification in Microsoft 365" }, { - "Product_Display_Name": "Privacy Management � risk", + "Product_Display_Name": "Privacy Management ? risk", "String_Id": "PRIVACY_MANAGEMENT_RISK", "GUID": "e42bc969-759a-4820-9283-6b73085b68e6", "Service_Plan_Name": "PRIVACY_MANGEMENT_RISK", @@ -36664,7 +37152,7 @@ "Service_Plans_Included_Friendly_Names": "Priva - Risk" }, { - "Product_Display_Name": "Privacy Management � risk", + "Product_Display_Name": "Privacy Management ? risk", "String_Id": "PRIVACY_MANAGEMENT_RISK", "GUID": "e42bc969-759a-4820-9283-6b73085b68e6", "Service_Plan_Name": "PRIVACY_MANGEMENT_RISK_EXCHANGE", @@ -38287,6 +38775,14 @@ "Service_Plan_Id": "6b340437-d6f9-4dc5-8cc2-99163f7f83d6", "Service_Plans_Included_Friendly_Names": "MCOPSTN3" }, + { + "Product_Display_Name": "Teams Phone Mobile", + "String_Id": "Operator_Connect_Mobile", + "GUID": "b84d58c9-0a0d-46cf-8a4b-d9f23c1674d5", + "Service_Plan_Name": "MCOFMC1", + "Service_Plan_Id": "cb22fbd7-ed7d-4786-a27a-e4cd617b69c0", + "Service_Plans_Included_Friendly_Names": "Teams Phone Mobile" + }, { "Product_Display_Name": "Teams Phone with Calling Plan", "String_Id": "MCOTEAMS_ESSENTIALS", @@ -38303,6 +38799,70 @@ "Service_Plan_Id": "4828c8ec-dc2e-4779-b502-87ac9ce28ab7", "Service_Plans_Included_Friendly_Names": "Microsoft 365 Phone System" }, + { + "Product_Display_Name": "Teams Premium (for Departments)", + "String_Id": "Teams_Premium_(for_Departments)", + "GUID": "52ea0e27-ae73-4983-a08f-13561ebdb823", + "Service_Plan_Name": "MICROSOFT_ECDN", + "Service_Plan_Id": "85704d55-2e73-47ee-93b4-4b8ea14db92b", + "Service_Plans_Included_Friendly_Names": "Microsoft eCDN" + }, + { + "Product_Display_Name": "Teams Premium (for Departments)", + "String_Id": "Teams_Premium_(for_Departments)", + "GUID": "52ea0e27-ae73-4983-a08f-13561ebdb823", + "Service_Plan_Name": "MESH_IMMERSIVE", + "Service_Plan_Id": "acbca54f-c771-423b-a476-6d7a98cbbcec", + "Service_Plans_Included_Friendly_Names": "Microsoft Mesh" + }, + { + "Product_Display_Name": "Teams Premium (for Departments)", + "String_Id": "Teams_Premium_(for_Departments)", + "GUID": "52ea0e27-ae73-4983-a08f-13561ebdb823", + "Service_Plan_Name": "TEAMSPRO_MGMT", + "Service_Plan_Id": "0504111f-feb8-4a3c-992a-70280f9a2869", + "Service_Plans_Included_Friendly_Names": "Microsoft Teams Premium Intelligent" + }, + { + "Product_Display_Name": "Teams Premium (for Departments)", + "String_Id": "Teams_Premium_(for_Departments)", + "GUID": "52ea0e27-ae73-4983-a08f-13561ebdb823", + "Service_Plan_Name": "TEAMSPRO_CUST", + "Service_Plan_Id": "cc8c0802-a325-43df-8cba-995d0c6cb373", + "Service_Plans_Included_Friendly_Names": "Microsoft Teams Premium Personalized" + }, + { + "Product_Display_Name": "Teams Premium (for Departments)", + "String_Id": "Teams_Premium_(for_Departments)", + "GUID": "52ea0e27-ae73-4983-a08f-13561ebdb823", + "Service_Plan_Name": "TEAMSPRO_PROTECTION", + "Service_Plan_Id": "f8b44f54-18bb-46a3-9658-44ab58712968", + "Service_Plans_Included_Friendly_Names": "Microsoft Teams Premium Secure" + }, + { + "Product_Display_Name": "Teams Premium (for Departments)", + "String_Id": "Teams_Premium_(for_Departments)", + "GUID": "52ea0e27-ae73-4983-a08f-13561ebdb823", + "Service_Plan_Name": "TEAMSPRO_VIRTUALAPPT", + "Service_Plan_Id": "9104f592-f2a7-4f77-904c-ca5a5715883f", + "Service_Plans_Included_Friendly_Names": "Microsoft Teams Premium Virtual Appointment" + }, + { + "Product_Display_Name": "Teams Premium (for Departments)", + "String_Id": "Teams_Premium_(for_Departments)", + "GUID": "52ea0e27-ae73-4983-a08f-13561ebdb823", + "Service_Plan_Name": "MCO_VIRTUAL_APPT", + "Service_Plan_Id": "711413d0-b36e-4cd4-93db-0a50a4ab7ea3", + "Service_Plans_Included_Friendly_Names": "Microsoft Teams Premium Virtual Appointments" + }, + { + "Product_Display_Name": "Teams Premium (for Departments)", + "String_Id": "Teams_Premium_(for_Departments)", + "GUID": "52ea0e27-ae73-4983-a08f-13561ebdb823", + "Service_Plan_Name": "TEAMSPRO_WEBINAR", + "Service_Plan_Id": "78b58230-ec7e-4309-913c-93a45cc4735b", + "Service_Plans_Included_Friendly_Names": "Microsoft Teams Premium Webinar" + }, { "Product_Display_Name": "Teams Rooms Premium", "String_Id": "MTR_PREM", @@ -38591,6 +39151,14 @@ "Service_Plan_Id": "2bdbaf8f-738f-4ac7-9234-3c3ee2ce7d0f", "Service_Plans_Included_Friendly_Names": "Visio Web App" }, + { + "Product_Display_Name": "Viva Goals User-led", + "String_Id": "Viva_Goals_User_led", + "GUID": "3a349c99-ffec-43d2-a2e8-6b97fcb71103", + "Service_Plan_Name": "Viva_Goals_Premium", + "Service_Plan_Id": "b44c6eaf-5c9f-478c-8f16-8cea26353bfb", + "Service_Plans_Included_Friendly_Names": "Viva Goals" + }, { "Product_Display_Name": "Viva Topics", "String_Id": "TOPIC_EXPERIENCES", From f1934dad4675a0d4c0c248d5212f2fac87e7383c Mon Sep 17 00:00:00 2001 From: Esco Date: Wed, 3 Apr 2024 11:44:02 +0200 Subject: [PATCH 088/133] Fix Number defaultValue Update standards.json fix? Co-Authored-By: Kai Stenbro <58435124+GreenChiip@users.noreply.github.com> --- src/components/forms/RFFComponents.jsx | 3 ++- src/data/standards.json | 12 ++++++++---- src/views/tenant/standards/ListAppliedStandards.jsx | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/components/forms/RFFComponents.jsx b/src/components/forms/RFFComponents.jsx index b3d491caa5b7..089a0c6b5226 100644 --- a/src/components/forms/RFFComponents.jsx +++ b/src/components/forms/RFFComponents.jsx @@ -150,10 +150,11 @@ export const RFFCFormInput = ({ spellCheck = true, autoFocus = false, hiddenValue, + defaultValue, onChange, }) => { return ( - + {({ input, meta }) => { const handleChange = onChange ? (e) => { diff --git a/src/data/standards.json b/src/data/standards.json index cab53f3144d6..ba4f6f28d18f 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -308,7 +308,8 @@ { "type": "number", "name": "standards.NudgeMFA.snoozeDurationInDays", - "label": "Number of days to allow users to skip registering Authenticator (0-14, default is 1)" + "label": "Number of days to allow users to skip registering Authenticator (0-14, default is 1)", + "default": 1 } ], "label": "Sets the state for the request to setup Authenticator", @@ -542,7 +543,8 @@ "type": "number", "name": "standards.EnableMailTips.MailTipsLargeAudienceThreshold", "label": "Number of recipients to trigger the large audience MailTip (Default is 25)", - "placeholder": "Enter a profile name" + "placeholder": "Enter a profile name", + "default": 25 } ], "label": "Enable all MailTips", @@ -598,12 +600,14 @@ { "type": "number", "name": "standards.SendReceiveLimitTenant.SendLimit", - "label": "Send limit in MB (Default is 35)" + "label": "Send limit in MB (Default is 35)", + "default": 35 }, { "type": "number", "name": "standards.SendReceiveLimitTenant.ReceiveLimit", - "label": "Receive Limit in MB (Default is 36)" + "label": "Receive Limit in MB (Default is 36)", + "default": 36 } ], "label": "Set send/receive size limits", diff --git a/src/views/tenant/standards/ListAppliedStandards.jsx b/src/views/tenant/standards/ListAppliedStandards.jsx index 19a45bc0b089..5d681c58d142 100644 --- a/src/views/tenant/standards/ListAppliedStandards.jsx +++ b/src/views/tenant/standards/ListAppliedStandards.jsx @@ -491,7 +491,7 @@ const ApplyNewStandard = () => { className="mb-3" name={component.name} label={component.label} - hiddenValue={component.default ?? 0} + defaultValue={component.default} /> )} {component.type === 'boolean' && ( From 6ffac0459d47a2eb97cd97bdc2577e22f228b3df Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 3 Apr 2024 10:46:48 -0400 Subject: [PATCH 089/133] preserve tableFilter in tenant selector fixes #2293 --- src/components/utilities/TenantSelector.jsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/utilities/TenantSelector.jsx b/src/components/utilities/TenantSelector.jsx index 3abcc5b9c46f..a7c059c39d4f 100644 --- a/src/components/utilities/TenantSelector.jsx +++ b/src/components/utilities/TenantSelector.jsx @@ -42,6 +42,11 @@ const TenantSelector = ({ action, showAllTenantSelector = true, NavSelector = fa const Paramcount = Array.from(searchParams).length if (Paramcount <= 1) { const customerId = searchParams.get('customerId') + const tableFilter = searchParams.get('tableFilter') + var newSearchParams = {} + if (tableFilter) { + newSearchParams.tableFilter = tableFilter + } if (customerId && isSuccess) { const currentTenant = tenants.filter((tenant) => tenant.customerId === customerId) if (currentTenant.length > 0) { @@ -49,7 +54,8 @@ const TenantSelector = ({ action, showAllTenantSelector = true, NavSelector = fa } } if (!customerId && Object.keys(currentTenant).length > 0) { - updateSearchParams({ customerId: currentTenant?.customerId }) + newSearchParams.customerId = currentTenant?.customerId + updateSearchParams(newSearchParams) } } }, [dispatch, isSuccess, searchParams, currentTenant, tenants, updateSearchParams]) From 8a36a890dea0ddcd56ef0fc03b00d337758f48e7 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 3 Apr 2024 12:26:19 -0400 Subject: [PATCH 090/133] Up version --- package-lock.json | 4 ++-- package.json | 2 +- public/version_latest.txt | 2 +- version_latest.txt | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 99f82d32aada..2542349cba28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cipp", - "version": "5.3.2", + "version": "5.4.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cipp", - "version": "5.3.2", + "version": "5.4.1", "license": "AGPL-3.0", "dependencies": { "@coreui/chartjs": "^3.0.0", diff --git a/package.json b/package.json index 9e73b8d43a81..3a1237c0f6c0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cipp", - "version": "5.4.0", + "version": "5.4.1", "description": "The CyberDrain Improved Partner Portal is a portal to help manage administration for Microsoft Partners.", "homepage": "https://cipp.app/", "bugs": { diff --git a/public/version_latest.txt b/public/version_latest.txt index 8a30e8f94a39..ade65226e0aa 100644 --- a/public/version_latest.txt +++ b/public/version_latest.txt @@ -1 +1 @@ -5.4.0 +5.4.1 diff --git a/version_latest.txt b/version_latest.txt index 8a30e8f94a39..ade65226e0aa 100644 --- a/version_latest.txt +++ b/version_latest.txt @@ -1 +1 @@ -5.4.0 +5.4.1 From 298e1bcd9197d816ac684705a2bcc5c0e32fa9a3 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Wed, 3 Apr 2024 19:09:18 +0200 Subject: [PATCH 091/133] add jsx --- src/App.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.jsx b/src/App.jsx index d10d00cf6434..922a083050e5 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -13,7 +13,7 @@ import routes from 'src/routes' import { useAuthCheck } from './components/utilities/CippauthCheck' library.add(fas) -const dynamicImport = (path) => React.lazy(() => import(`./${path}`)) +const dynamicImport = (path) => React.lazy(() => import(`./${path}.jsx`)) const DefaultLayout = React.lazy(() => import('./layout/DefaultLayout')) const Page401 = React.lazy(() => import('./views/pages/page401/Page401')) const Page403 = React.lazy(() => import('./views/pages/page403/Page403')) From b1cf7e2d5d41296ef120279c712795606dd0a0e0 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Wed, 3 Apr 2024 19:40:57 +0200 Subject: [PATCH 092/133] potential fix. --- src/App.jsx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 922a083050e5..1b2db0d6e9ec 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -13,7 +13,8 @@ import routes from 'src/routes' import { useAuthCheck } from './components/utilities/CippauthCheck' library.add(fas) -const dynamicImport = (path) => React.lazy(() => import(`./${path}.jsx`)) + +const dynamicImport = (path) => React.lazy(() => import(`./${path}`)) const DefaultLayout = React.lazy(() => import('./layout/DefaultLayout')) const Page401 = React.lazy(() => import('./views/pages/page401/Page401')) const Page403 = React.lazy(() => import('./views/pages/page403/Page403')) @@ -22,6 +23,14 @@ const Page500 = React.lazy(() => import('./views/pages/page500/Page500')) const PageLogOut = React.lazy(() => import('src/views/pages/LogoutRedirect/PageLogOut')) const Login = React.lazy(() => import('./views/pages/login/Login')) const Logout = React.lazy(() => import('./views/pages/login/Logout')) +//we loop through the routes array, dynamicly create the component by using dynamicImport, add the component to the route array as 'component' key. + +routes.forEach((route) => { + if (route.component) { + route['component'] = dynamicImport(route.component) + } +}) + const App = () => { return ( @@ -46,10 +55,9 @@ const App = () => { } > {routes.map((route, idx) => { - const Component = dynamicImport(route.component) const allowedRoles = route.allowedRoles return ( - Component && ( + route.component && ( { CIPP - {route.name} - + From 043b6d3446ec074275faefe2f14c03818ecb9411 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 3 Apr 2024 15:06:40 -0400 Subject: [PATCH 093/133] Revert "Merge pull request #2298 from KelvinTegelaar/dev" This reverts commit e3cb1417323c144a4e96d87306734157391c9f86, reversing changes made to 1c3eb562dad6b818d1e6974e3b296240aa0285ed. --- package-lock.json | 4 +- package.json | 2 +- public/version_latest.txt | 2 +- src/App.jsx | 40 +- src/adminRoutes.js | 76 + src/components/forms/RFFComponents.jsx | 3 +- src/components/layout/AppSidebar.jsx | 8 +- src/components/tables/CellTable.jsx | 7 +- src/components/utilities/CippauthCheck.jsx | 27 - src/components/utilities/PrivateRoute.jsx | 39 +- src/components/utilities/TenantSelector.jsx | 8 +- src/data/M365Licenses.json | 1380 +++++------------ src/data/standards.json | 12 +- src/hooks/useNavFavouriteCheck.jsx | 32 - src/hooks/useRouteNavCompare.jsx | 33 - src/routes.js | 714 +++++++++ src/routes.json | 921 ----------- src/views/cipp/UserSettings.jsx | 50 +- src/views/email-exchange/tools/MailTest.jsx | 8 +- .../tenant/conditional/NamedLocations.jsx | 1 + .../tenant/standards/ListAppliedStandards.jsx | 1 - version_latest.txt | 2 +- 22 files changed, 1297 insertions(+), 2073 deletions(-) create mode 100644 src/adminRoutes.js delete mode 100644 src/components/utilities/CippauthCheck.jsx delete mode 100644 src/hooks/useNavFavouriteCheck.jsx delete mode 100644 src/hooks/useRouteNavCompare.jsx create mode 100644 src/routes.js delete mode 100644 src/routes.json diff --git a/package-lock.json b/package-lock.json index 2542349cba28..99f82d32aada 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cipp", - "version": "5.4.1", + "version": "5.3.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cipp", - "version": "5.4.1", + "version": "5.3.2", "license": "AGPL-3.0", "dependencies": { "@coreui/chartjs": "^3.0.0", diff --git a/package.json b/package.json index 3a1237c0f6c0..9e73b8d43a81 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cipp", - "version": "5.4.1", + "version": "5.4.0", "description": "The CyberDrain Improved Partner Portal is a portal to help manage administration for Microsoft Partners.", "homepage": "https://cipp.app/", "bugs": { diff --git a/public/version_latest.txt b/public/version_latest.txt index ade65226e0aa..8a30e8f94a39 100644 --- a/public/version_latest.txt +++ b/public/version_latest.txt @@ -1 +1 @@ -5.4.1 +5.4.0 diff --git a/src/App.jsx b/src/App.jsx index d10d00cf6434..db95409b5c98 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -2,19 +2,22 @@ import React, { Suspense } from 'react' import { BrowserRouter, Route, Routes, Navigate } from 'react-router-dom' import { PrivateRoute, FullScreenLoading, ErrorBoundary } from 'src/components/utilities' import 'src/scss/style.scss' +import routes from 'src/routes' import { Helmet } from 'react-helmet-async' +import adminRoutes from './adminRoutes' import Skeleton from 'react-loading-skeleton' import TimeAgo from 'javascript-time-ago' import en from 'javascript-time-ago/locale/en.json' TimeAgo.addDefaultLocale(en) import { library } from '@fortawesome/fontawesome-svg-core' import { fas } from '@fortawesome/free-solid-svg-icons' -import routes from 'src/routes' -import { useAuthCheck } from './components/utilities/CippauthCheck' library.add(fas) -const dynamicImport = (path) => React.lazy(() => import(`./${path}`)) + +// Containers const DefaultLayout = React.lazy(() => import('./layout/DefaultLayout')) + +// Pages const Page401 = React.lazy(() => import('./views/pages/page401/Page401')) const Page403 = React.lazy(() => import('./views/pages/page403/Page403')) const Page404 = React.lazy(() => import('./views/pages/page404/Page404')) @@ -22,6 +25,7 @@ const Page500 = React.lazy(() => import('./views/pages/page500/Page500')) const PageLogOut = React.lazy(() => import('src/views/pages/LogoutRedirect/PageLogOut')) const Login = React.lazy(() => import('./views/pages/login/Login')) const Logout = React.lazy(() => import('./views/pages/login/Logout')) + const App = () => { return ( @@ -46,23 +50,43 @@ const App = () => { } > {routes.map((route, idx) => { - const Component = dynamicImport(route.component) - const allowedRoles = route.allowedRoles return ( - Component && ( + route.component && ( + }> + + CIPP - {route.name} + + + + + + } + /> + ) + ) + })} + {adminRoutes.map((route, idx) => { + return ( + route.component && ( + }> CIPP - {route.name} - + diff --git a/src/adminRoutes.js b/src/adminRoutes.js new file mode 100644 index 000000000000..2f6f666ab905 --- /dev/null +++ b/src/adminRoutes.js @@ -0,0 +1,76 @@ +import React from 'react' + +const CIPPSettings = React.lazy(() => import('src/views/cipp/app-settings/CIPPSettings')) +const Setup = React.lazy(() => import('src/views/cipp/Setup')) +const ApplyStandard = React.lazy(() => import('src/views/tenant/standards/ListStandards')) +const GDAPStatus = React.lazy(() => import('src/views/tenant/administration/ListGDAPQueue')) +const GDAP = React.lazy(() => import('src/views/tenant/administration/GDAPWizard')) +const GDAPInvite = React.lazy(() => import('src/views/tenant/administration/GDAPInviteWizard')) +const GDAPRoleWizard = React.lazy(() => import('src/views/tenant/administration/GDAPRoleWizard')) +const GDAPRoles = React.lazy(() => import('src/views/tenant/administration/ListGDAPRoles')) +const GDAPRelationships = React.lazy(() => + import('./views/tenant/administration/ListGDAPRelationships'), +) +const appapproval = React.lazy(() => import('src/views/cipp/AppApproval')) +const TenantOffboardingWizard = React.lazy(() => + import('src/views/tenant/administration/TenantOffboardingWizard'), +) +const TenantOnboardingWizard = React.lazy(() => + import('src/views/tenant/administration/TenantOnboardingWizard'), +) + +const adminRoutes = [ + { path: '/cipp', name: 'CIPP' }, + { path: '/cipp/cipp', name: 'CIPP' }, + { path: '/cipp/settings', name: 'Settings', component: CIPPSettings }, + { path: '/cipp/setup', name: 'Setup', component: Setup }, + + { path: '/tenant/administration/gdap', name: 'GDAP Wizard', component: GDAP }, + { + path: '/tenant/administration/gdap-invite', + name: 'GDAP Invite Wizard', + component: GDAPInvite, + }, + { + path: '/tenant/administration/gdap-role-wizard', + name: 'GDAP Role Wizard', + component: GDAPRoleWizard, + }, + { + path: '/tenant/administration/gdap-roles', + name: 'GDAP Roles', + component: GDAPRoles, + }, + { + path: '/tenant/administration/gdap-relationships', + name: 'GDAP Relationships', + component: GDAPRelationships, + }, + { + path: '/tenant/administration/appapproval', + name: 'App Approval', + component: appapproval, + }, + { + path: '/tenant/administration/gdap-status', + name: 'GDAP Status', + component: GDAPStatus, + }, + { + path: '/tenant/standards/list-standards', + name: 'List Standard', + component: ApplyStandard, + }, + { + path: '/tenant/administration/tenant-offboarding-wizard', + name: 'Tenant Offboarding', + component: TenantOffboardingWizard, + }, + { + path: '/tenant/administration/tenant-onboarding-wizard', + name: 'Tenant Onboarding', + component: TenantOnboardingWizard, + }, +] + +export default adminRoutes diff --git a/src/components/forms/RFFComponents.jsx b/src/components/forms/RFFComponents.jsx index 089a0c6b5226..b3d491caa5b7 100644 --- a/src/components/forms/RFFComponents.jsx +++ b/src/components/forms/RFFComponents.jsx @@ -150,11 +150,10 @@ export const RFFCFormInput = ({ spellCheck = true, autoFocus = false, hiddenValue, - defaultValue, onChange, }) => { return ( - + {({ input, meta }) => { const handleChange = onChange ? (e) => { diff --git a/src/components/layout/AppSidebar.jsx b/src/components/layout/AppSidebar.jsx index 8a0b0c8a2432..f680f42116d1 100644 --- a/src/components/layout/AppSidebar.jsx +++ b/src/components/layout/AppSidebar.jsx @@ -12,10 +12,6 @@ import { AppSidebarNav } from 'src/components/layout' import SimpleBar from 'simplebar-react' import 'simplebar/dist/simplebar.min.css' import navigation from 'src/_nav' -import { useAuthCheck } from '../utilities/CippauthCheck' -import routes from 'src/routes' -import { useRouteNavCompare } from 'src/hooks/useRouteNavCompare' -import { useNavFavouriteCheck } from 'src/hooks/useNavFavouriteCheck' const AppSidebar = () => { const i = @@ -26,8 +22,6 @@ const AppSidebar = () => { if (!i.includes('JGySCBt1QXmNc')) { throw '' } - const newNav = useRouteNavCompare(navigation) - const navwithFavourites = useNavFavouriteCheck(newNav) return ( { @@ -47,7 +41,7 @@ const AppSidebar = () => { /> - + diff --git a/src/components/tables/CellTable.jsx b/src/components/tables/CellTable.jsx index aca744aed572..549e4805dfa0 100644 --- a/src/components/tables/CellTable.jsx +++ b/src/components/tables/CellTable.jsx @@ -20,12 +20,7 @@ export default function cellTable( columnProp = column } - if ( - !Array.isArray(columnProp) && - typeof columnProp === 'object' && - columnProp !== undefined && - columnProp !== null - ) { + if (!Array.isArray(columnProp) && typeof columnProp === 'object') { columnProp = Object.keys(columnProp).map((key) => { return { [key]: columnProp[key], diff --git a/src/components/utilities/CippauthCheck.jsx b/src/components/utilities/CippauthCheck.jsx deleted file mode 100644 index 338c22233bf7..000000000000 --- a/src/components/utilities/CippauthCheck.jsx +++ /dev/null @@ -1,27 +0,0 @@ -import { useLoadClientPrincipalQuery } from 'src/store/api/auth' -import { useDispatch } from 'react-redux' -import { updateAccessToken } from 'src/store/features/auth' -import { Navigate } from 'react-router-dom' - -export const useAuthCheck = (allowedRoles) => { - const dispatch = useDispatch() - const { data: profile, isFetching } = useLoadClientPrincipalQuery() - if (isFetching) { - return { isLoading: true, component: null } - } - dispatch(updateAccessToken(profile)) - let roles = profile?.clientPrincipal?.userRoles || [] - - if (!profile?.clientPrincipal) { - return { - component: ( - - ), - result: false, - } - } - if (allowedRoles && !allowedRoles.some((role) => roles.includes(role))) { - return { component: , result: true } - } - return { component: null, result: false } -} diff --git a/src/components/utilities/PrivateRoute.jsx b/src/components/utilities/PrivateRoute.jsx index b63ba0617b47..b89f0d5aa8ee 100644 --- a/src/components/utilities/PrivateRoute.jsx +++ b/src/components/utilities/PrivateRoute.jsx @@ -1,20 +1,41 @@ import React from 'react' +import { Navigate } from 'react-router-dom' +import { useLoadClientPrincipalQuery } from 'src/store/api/auth' import { FullScreenLoading } from 'src/components/utilities' +import { useDispatch } from 'react-redux' +import { updateAccessToken } from 'src/store/features/auth' import PropTypes from 'prop-types' -import { useAuthCheck } from './CippauthCheck' -export const PrivateRoute = ({ children, allowedRoles }) => { - const { isLoading, component: authComponent } = useAuthCheck(allowedRoles) - if (isLoading) { +export const PrivateRoute = ({ children, routeType }) => { + const dispatch = useDispatch() + const { data: profile, error, isFetching } = useLoadClientPrincipalQuery() + //console.log() + if (isFetching) { return } - if (authComponent) { - return authComponent + + dispatch(updateAccessToken(profile)) + let roles = null + if (null !== profile?.clientPrincipal) { + roles = profile?.clientPrincipal.userRoles + } else if (null === profile?.clientPrincipal) { + return + } + if (null === roles) { + return + } else { + const isAuthenticated = + roles.includes('admin') || roles.includes('editor') || (roles.includes('readonly') && !error) + const isAdmin = roles.includes('admin') + if (routeType === 'admin') { + return !isAdmin ? : children + } else { + return !isAuthenticated ? : children + } } - return children } PrivateRoute.propTypes = { - children: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]).isRequired, - allowedRoles: PropTypes.arrayOf(PropTypes.string), + children: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]), + routeType: PropTypes.string, } diff --git a/src/components/utilities/TenantSelector.jsx b/src/components/utilities/TenantSelector.jsx index a7c059c39d4f..3abcc5b9c46f 100644 --- a/src/components/utilities/TenantSelector.jsx +++ b/src/components/utilities/TenantSelector.jsx @@ -42,11 +42,6 @@ const TenantSelector = ({ action, showAllTenantSelector = true, NavSelector = fa const Paramcount = Array.from(searchParams).length if (Paramcount <= 1) { const customerId = searchParams.get('customerId') - const tableFilter = searchParams.get('tableFilter') - var newSearchParams = {} - if (tableFilter) { - newSearchParams.tableFilter = tableFilter - } if (customerId && isSuccess) { const currentTenant = tenants.filter((tenant) => tenant.customerId === customerId) if (currentTenant.length > 0) { @@ -54,8 +49,7 @@ const TenantSelector = ({ action, showAllTenantSelector = true, NavSelector = fa } } if (!customerId && Object.keys(currentTenant).length > 0) { - newSearchParams.customerId = currentTenant?.customerId - updateSearchParams(newSearchParams) + updateSearchParams({ customerId: currentTenant?.customerId }) } } }, [dispatch, isSuccess, searchParams, currentTenant, tenants, updateSearchParams]) diff --git a/src/data/M365Licenses.json b/src/data/M365Licenses.json index fd2757b1b074..3f8b5e97c369 100644 --- a/src/data/M365Licenses.json +++ b/src/data/M365Licenses.json @@ -351,38 +351,6 @@ "Service_Plan_Id": "bea4c11e-220a-4e6d-8eb8-8ea15d019f90", "Service_Plans_Included_Friendly_Names": "Azure Rights Management" }, - { - "Product_Display_Name": "Basic Collaboration", - "String_Id": "OFFICEBASIC", - "GUID": "4468c39a-28b2-42fb-9094-840bcf28771f", - "Service_Plan_Name": "EXCHANGE_S_STANDARD", - "Service_Plan_Id": "9aaf7827-d63c-4b61-89c3-182f06f82e5c", - "Service_Plans_Included_Friendly_Names": "Exchange Online (Plan 1)" - }, - { - "Product_Display_Name": "Basic Collaboration", - "String_Id": "OFFICEBASIC", - "GUID": "4468c39a-28b2-42fb-9094-840bcf28771f", - "Service_Plan_Name": "ONEDRIVELITE_IW", - "Service_Plan_Id": "b4ac11a0-32ff-4e78-982d-e039fa803dec", - "Service_Plans_Included_Friendly_Names": "Office for the web with OneDrive for business" - }, - { - "Product_Display_Name": "Basic Collaboration", - "String_Id": "OFFICEBASIC", - "GUID": "4468c39a-28b2-42fb-9094-840bcf28771f", - "Service_Plan_Name": "MCOBASIC", - "Service_Plan_Id": "448898aa-3ae7-478c-b49a-1fac7a8a35cf", - "Service_Plans_Included_Friendly_Names": "Skype Meetings" - }, - { - "Product_Display_Name": "Basic Collaboration", - "String_Id": "OFFICEBASIC", - "GUID": "4468c39a-28b2-42fb-9094-840bcf28771f", - "Service_Plan_Name": "YAMMER_BASIC", - "Service_Plan_Id": "6db7aeea-6c4a-475d-bbb0-7338bc73d646", - "Service_Plans_Included_Friendly_Names": "Yammer" - }, { "Product_Display_Name": "Business Apps (free)", "String_Id": "SMB_APPS", @@ -989,7 +957,7 @@ "GUID": "a3d0cd86-8068-4071-ad40-4dc5b5908c4b", "Service_Plan_Name": "CDS_CUSTOMER_INSIGHTS_BASE", "Service_Plan_Id": "d04ca659-b119-4a92-b8fc-3ede584a9d65", - "Service_Plans_Included_Friendly_Names": "Dataverse for Customer Insights?BASE" + "Service_Plans_Included_Friendly_Names": "Dataverse for Customer Insights�BASE" }, { "Product_Display_Name": "Dynamics 365 Customer Insights Attach", @@ -1253,7 +1221,7 @@ "GUID": "0c250654-c7f7-461f-871a-7222f6592cf2", "Service_Plan_Name": "CDS_CUSTOMER_INSIGHTS_BASE", "Service_Plan_Id": "d04ca659-b119-4a92-b8fc-3ede584a9d65", - "Service_Plans_Included_Friendly_Names": "Dataverse for Cust Insights?BASE" + "Service_Plans_Included_Friendly_Names": "Dataverse for Cust Insights�BASE" }, { "Product_Display_Name": "Dynamics 365 Customer Insights Standalone", @@ -1599,22 +1567,6 @@ "Service_Plan_Id": "5dbe027f-2339-4123-9542-606e4d348a72", "Service_Plans_Included_Friendly_Names": "SharePoint (Plan 2)" }, - { - "Product_Display_Name": "Dynamics 365 for Customer Service Professional Attach to Qualifying Dynamics 365 Base Offer", - "String_Id": "D365_CUSTOMER_SERVICE_PRO_ATTACH", - "GUID": "19dec69d-d9f3-4792-8a39-d8ecdf51937b", - "Service_Plan_Name": "D365_CUSTOMER_SERVICE_PRO_ATTACH", - "Service_Plan_Id": "a9dd2dca-10ae-4da2-aaf0-d3fe8a825110", - "Service_Plans_Included_Friendly_Names": "Dynamics 365 for Customer Service Pro Attach" - }, - { - "Product_Display_Name": "Dynamics 365 for Customer Service Professional Attach to Qualifying Dynamics 365 Base Offer", - "String_Id": "D365_CUSTOMER_SERVICE_PRO_ATTACH", - "GUID": "19dec69d-d9f3-4792-8a39-d8ecdf51937b", - "Service_Plan_Name": "EXCHANGE_S_FOUNDATION", - "Service_Plan_Id": "113feb6c-3fe4-4440-bddc-54d774bf0318", - "Service_Plans_Included_Friendly_Names": "Exchange Foundation" - }, { "Product_Display_Name": "Dynamics 365 Customer Voice", "String_Id": "DYN365_CUSTOMER_VOICE_BASE", @@ -1805,7 +1757,7 @@ "GUID": "977464c4-bfaf-4b67-b761-a9bb735a2196", "Service_Plan_Name": "CRM_AUTO_ROUTING_ENGINE_ADDON", "Service_Plan_Id": "24435e4b-87d0-4d7d-8beb-63a9b1573022", - "Service_Plans_Included_Friendly_Names": "Field Service ? Automated Routing Engine Add-On" + "Service_Plans_Included_Friendly_Names": "Field Service � Automated Routing Engine Add-On" }, { "Product_Display_Name": "Dynamics 365 Field Service, Enterprise Edition - Resource Scheduling Optimization", @@ -1813,7 +1765,7 @@ "GUID": "977464c4-bfaf-4b67-b761-a9bb735a2196", "Service_Plan_Name": "CRM_AUTO_ROUTING_ADDON", "Service_Plan_Id": "2ba394e0-6f18-4b77-b45f-a5663bbab540", - "Service_Plans_Included_Friendly_Names": "RETIRED - Field Service ? Automated Routing Engine Add-On" + "Service_Plans_Included_Friendly_Names": "RETIRED - Field Service � Automated Routing Engine Add-On" }, { "Product_Display_Name": "Dynamics 365 Field Service, Enterprise Edition - Resource Scheduling Optimization", @@ -2543,46 +2495,6 @@ "Service_Plan_Id": "874fc546-6efe-4d22-90b8-5c4e7aa59f4b", "Service_Plans_Included_Friendly_Names": "DYNAMICS 365 FOR FINANCIALS" }, - { - "Product_Display_Name": "Dynamics 365 Guides vTrial", - "String_Id": "Dynamics_365_Guides_vTrial", - "GUID": "99cb3f83-fbec-4aa1-8262-9679e6df7c53", - "Service_Plan_Name": "D365_GUIDES_VIRAL_TRIAL", - "Service_Plan_Id": "fe986032-d840-4817-82d4-51fe4fbbe163", - "Service_Plans_Included_Friendly_Names": "Dynamics 365 Guides vTrial" - }, - { - "Product_Display_Name": "Dynamics 365 Guides vTrial", - "String_Id": "Dynamics_365_Guides_vTrial", - "GUID": "99cb3f83-fbec-4aa1-8262-9679e6df7c53", - "Service_Plan_Name": "EXCHANGE_S_FOUNDATION", - "Service_Plan_Id": "113feb6c-3fe4-4440-bddc-54d774bf0318", - "Service_Plans_Included_Friendly_Names": "Exchange Foundation" - }, - { - "Product_Display_Name": "Dynamics 365 Guides vTrial", - "String_Id": "Dynamics_365_Guides_vTrial", - "GUID": "99cb3f83-fbec-4aa1-8262-9679e6df7c53", - "Service_Plan_Name": "DYN365_CDS_VIRAL", - "Service_Plan_Id": "17ab22cd-a0b3-4536-910a-cb6eb12696c0", - "Service_Plans_Included_Friendly_Names": "Common Data Service" - }, - { - "Product_Display_Name": "Dynamics 365 Guides vTrial", - "String_Id": "Dynamics_365_Guides_vTrial", - "GUID": "99cb3f83-fbec-4aa1-8262-9679e6df7c53", - "Service_Plan_Name": "POWER_APPS_DYN365_VIRAL_TRIAL_MIXED_REALITY", - "Service_Plan_Id": "066e2fd1-ba15-40e7-aa96-d6636b1cdf71", - "Service_Plans_Included_Friendly_Names": "Power Apps for Dynamics 365 Mixed Reality" - }, - { - "Product_Display_Name": "Dynamics 365 Guides vTrial", - "String_Id": "Dynamics_365_Guides_vTrial", - "GUID": "99cb3f83-fbec-4aa1-8262-9679e6df7c53", - "Service_Plan_Name": "POWER_AUTOMATE_DYN365_VIRAL_TRIAL_MIXED_REALITY", - "Service_Plan_Id": "26fa8a18-2812-4b3d-96b4-864818ce26be", - "Service_Plans_Included_Friendly_Names": "Power Automate for Dynamics 365 Mixed Reality" - }, { "Product_Display_Name": "Dynamics 365 Hybrid Connector", "String_Id": "CRM_HYBRIDCONNECTOR", @@ -2711,118 +2623,6 @@ "Service_Plan_Id": "113feb6c-3fe4-4440-bddc-54d774bf0318", "Service_Plans_Included_Friendly_Names": "Exchange Foundation" }, - { - "Product_Display_Name": "Dynamics 365 Operations ? Activity", - "String_Id": "Dyn365_Operations_Activity", - "GUID": "b75074f1-4c54-41bf-970f-c9ac871567f5", - "Service_Plan_Name": "DYN365_RETAIL_Activity", - "Service_Plan_Id": "f06754ec-6d72-4bf6-991c-4cb5413d9932", - "Service_Plans_Included_Friendly_Names": "Dynamics 365 for Retail Activity" - }, - { - "Product_Display_Name": "Dynamics 365 Operations ? Activity", - "String_Id": "Dyn365_Operations_Activity", - "GUID": "b75074f1-4c54-41bf-970f-c9ac871567f5", - "Service_Plan_Name": "DYN365_Enterprise_Talent_Attract_Activity", - "Service_Plan_Id": "aac5a56b-b02e-4608-8014-b076646d4011", - "Service_Plans_Included_Friendly_Names": "Dynamics 365 for Talent - Attract Experience Activity" - }, - { - "Product_Display_Name": "Dynamics 365 Operations ? Activity", - "String_Id": "Dyn365_Operations_Activity", - "GUID": "b75074f1-4c54-41bf-970f-c9ac871567f5", - "Service_Plan_Name": "DYN365_Enterprise_Talent_Onboard_Activity", - "Service_Plan_Id": "db225597-e9c2-4d96-8ace-5424744c80f8", - "Service_Plans_Included_Friendly_Names": "Dynamics 365 for Talent - Onboard Experience" - }, - { - "Product_Display_Name": "Dynamics 365 Operations ? Activity", - "String_Id": "Dyn365_Operations_Activity", - "GUID": "b75074f1-4c54-41bf-970f-c9ac871567f5", - "Service_Plan_Name": "Dynamics_365_for_Talent_Activity", - "Service_Plan_Id": "1f87ee90-5c3a-4cf9-b6fd-e3e8017c26ec", - "Service_Plans_Included_Friendly_Names": "Dynamics 365 for Talent Activity" - }, - { - "Product_Display_Name": "Dynamics 365 Operations ? Activity", - "String_Id": "Dyn365_Operations_Activity", - "GUID": "b75074f1-4c54-41bf-970f-c9ac871567f5", - "Service_Plan_Name": "Dynamics_365_for_Operations_Activity", - "Service_Plan_Id": "6bddf93e-d6f4-4991-b9fc-30cfdf07ee7b", - "Service_Plans_Included_Friendly_Names": "Dynamics365 for Operations Activity" - }, - { - "Product_Display_Name": "Dynamics 365 Operations ? Activity", - "String_Id": "Dyn365_Operations_Activity", - "GUID": "b75074f1-4c54-41bf-970f-c9ac871567f5", - "Service_Plan_Name": "EXCHANGE_S_FOUNDATION", - "Service_Plan_Id": "113feb6c-3fe4-4440-bddc-54d774bf0318", - "Service_Plans_Included_Friendly_Names": "Exchange Foundation" - }, - { - "Product_Display_Name": "Dynamics 365 Project Operations Attach", - "String_Id": "DYN365_PROJECT_OPERATIONS_ATTACH", - "GUID": "af739e8e-dd11-4eb5-a986-5908f595c603", - "Service_Plan_Name": "D365CDSforProjectOperations", - "Service_Plan_Id": "7df1d500-ca5c-4229-8cea-815bc88798c9", - "Service_Plans_Included_Friendly_Names": "Common Data Service for Dynamics 365 Project Operations" - }, - { - "Product_Display_Name": "Dynamics 365 Project Operations Attach", - "String_Id": "DYN365_PROJECT_OPERATIONS_ATTACH", - "GUID": "af739e8e-dd11-4eb5-a986-5908f595c603", - "Service_Plan_Name": "D365_ProjectOperationsCDSAttach", - "Service_Plan_Id": "e564d403-7eaf-4c91-b92f-bb0dc62026e1", - "Service_Plans_Included_Friendly_Names": "Dynamics 365 Project Operations CDS Attach" - }, - { - "Product_Display_Name": "Dynamics 365 Project Operations Attach", - "String_Id": "DYN365_PROJECT_OPERATIONS_ATTACH", - "GUID": "af739e8e-dd11-4eb5-a986-5908f595c603", - "Service_Plan_Name": "Power_Pages_Internal_User", - "Service_Plan_Id": "60bf28f9-2b70-4522-96f7-335f5e06c941", - "Service_Plans_Included_Friendly_Names": "Power Pages Internal User" - }, - { - "Product_Display_Name": "Dynamics 365 Project Operations Attach", - "String_Id": "DYN365_PROJECT_OPERATIONS_ATTACH", - "GUID": "af739e8e-dd11-4eb5-a986-5908f595c603", - "Service_Plan_Name": "D365_ProjectOperations", - "Service_Plan_Id": "69f07c66-bee4-4222-b051-195095efee5b", - "Service_Plans_Included_Friendly_Names": "Dynamics 365 Project Operations" - }, - { - "Product_Display_Name": "Dynamics 365 Project Operations Attach", - "String_Id": "DYN365_PROJECT_OPERATIONS_ATTACH", - "GUID": "af739e8e-dd11-4eb5-a986-5908f595c603", - "Service_Plan_Name": "D365_ProjectOperationsAttach", - "Service_Plan_Id": "fa7675bd-6717-40e7-8172-d0bbcbe1ab12", - "Service_Plans_Included_Friendly_Names": "Dynamics 365 Project Operations Attach" - }, - { - "Product_Display_Name": "Dynamics 365 Project Operations Attach", - "String_Id": "DYN365_PROJECT_OPERATIONS_ATTACH", - "GUID": "af739e8e-dd11-4eb5-a986-5908f595c603", - "Service_Plan_Name": "EXCHANGE_S_FOUNDATION", - "Service_Plan_Id": "113feb6c-3fe4-4440-bddc-54d774bf0318", - "Service_Plans_Included_Friendly_Names": "Exchange Foundation" - }, - { - "Product_Display_Name": "Dynamics 365 Project Operations Attach", - "String_Id": "DYN365_PROJECT_OPERATIONS_ATTACH", - "GUID": "af739e8e-dd11-4eb5-a986-5908f595c603", - "Service_Plan_Name": "PROJECT_FOR_PROJECT_OPERATIONS_ATTACH", - "Service_Plan_Id": "6d8e07c6-9613-484f-8cc1-a66c5c3979bb", - "Service_Plans_Included_Friendly_Names": "Project for Project Operations Attach" - }, - { - "Product_Display_Name": "Dynamics 365 Project Operations Attach", - "String_Id": "DYN365_PROJECT_OPERATIONS_ATTACH", - "GUID": "af739e8e-dd11-4eb5-a986-5908f595c603", - "Service_Plan_Name": "SHAREPOINTSTANDARD", - "Service_Plan_Id": "c7699d2e-19aa-44de-8edf-1736da088ca1", - "Service_Plans_Included_Friendly_Names": "SharePoint (Plan 1)" - }, { "Product_Display_Name": "Dynamics 365 for Project Service Automation Enterprise Edition for Government", "String_Id": "DYN365_ENTERPRISE_PROJECT_SERVICE_AUTOMATION_GOV", @@ -3295,54 +3095,6 @@ "Service_Plan_Id": "2da8e897-7791-486b-b08f-cc63c8129df7", "Service_Plans_Included_Friendly_Names": "Dynamics 365 for Sales" }, - { - "Product_Display_Name": "Dynamics 365 for Supply Chain Management Attach to Qualifying Dynamics 365 Base Offer", - "String_Id": "DYN365_SCM_ATTACH", - "GUID": "090b4a96-8114-4c95-9c91-60e81ef53302", - "Service_Plan_Name": "Power_Pages_Internal_User", - "Service_Plan_Id": "60bf28f9-2b70-4522-96f7-335f5e06c941", - "Service_Plans_Included_Friendly_Names": "Power Pages Internal User" - }, - { - "Product_Display_Name": "Dynamics 365 for Supply Chain Management Attach to Qualifying Dynamics 365 Base Offer", - "String_Id": "DYN365_SCM_ATTACH", - "GUID": "090b4a96-8114-4c95-9c91-60e81ef53302", - "Service_Plan_Name": "DYN365_CDS_SUPPLYCHAINMANAGEMENT", - "Service_Plan_Id": "b6a8b974-2956-4e14-ae81-f0384c363528", - "Service_Plans_Included_Friendly_Names": "Common Data Service for Dynamics 365 Supply Chain Management" - }, - { - "Product_Display_Name": "Dynamics 365 for Supply Chain Management Attach to Qualifying Dynamics 365 Base Offer", - "String_Id": "DYN365_SCM_ATTACH", - "GUID": "090b4a96-8114-4c95-9c91-60e81ef53302", - "Service_Plan_Name": "CDS_FOR_IOM", - "Service_Plan_Id": "2bb89402-51e9-4c5a-be33-e954a9dd1ba6", - "Service_Plans_Included_Friendly_Names": "Dataverse for IOM" - }, - { - "Product_Display_Name": "Dynamics 365 for Supply Chain Management Attach to Qualifying Dynamics 365 Base Offer", - "String_Id": "DYN365_SCM_ATTACH", - "GUID": "090b4a96-8114-4c95-9c91-60e81ef53302", - "Service_Plan_Name": "DYN365_REGULATORY_SERVICE", - "Service_Plan_Id": "c7657ae3-c0b0-4eed-8c1d-6a7967bd9c65", - "Service_Plans_Included_Friendly_Names": "Dynamics 365 for Finance and Operations, Enterprise edition - Regulatory Service" - }, - { - "Product_Display_Name": "Dynamics 365 for Supply Chain Management Attach to Qualifying Dynamics 365 Base Offer", - "String_Id": "DYN365_SCM_ATTACH", - "GUID": "090b4a96-8114-4c95-9c91-60e81ef53302", - "Service_Plan_Name": "D365_SCM_Attach", - "Service_Plan_Id": "b21c777f-c2d5-486e-88f6-fc0a3e474271", - "Service_Plans_Included_Friendly_Names": "Dynamics 365 for Supply Chain Management Attach" - }, - { - "Product_Display_Name": "Dynamics 365 for Supply Chain Management Attach to Qualifying Dynamics 365 Base Offer", - "String_Id": "DYN365_SCM_ATTACH", - "GUID": "090b4a96-8114-4c95-9c91-60e81ef53302", - "Service_Plan_Name": "EXCHANGE_S_FOUNDATION", - "Service_Plan_Id": "113feb6c-3fe4-4440-bddc-54d774bf0318", - "Service_Plans_Included_Friendly_Names": "Exchange Foundation" - }, { "Product_Display_Name": "Dynamics 365 for Marketing Business Edition", "String_Id": "DYN365_BUSINESS_MARKETING", @@ -5301,7 +5053,7 @@ "GUID": "4b590615-0888-425a-a965-b3bf7789848d", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 A3 for Faculty", @@ -5669,7 +5421,7 @@ "GUID": "7cfd9a2b-e110-4c39-bf20-c6a3f36a3121", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 A3 for Students", @@ -6325,7 +6077,7 @@ "GUID": "1aa94593-ca12-4254-a738-81a5972958e8", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 A3 - Unattended License for students use benefit", @@ -6661,7 +6413,7 @@ "GUID": "e97c048c-37a4-45fb-ab50-922fbf07a370", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 A5 for Faculty", @@ -7269,7 +7021,7 @@ "GUID": "46c119d4-0379-4a9d-85e4-97c66d3f909e", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 A5 for Students", @@ -8149,7 +7901,7 @@ "GUID": "9b8fe788-6174-4c4e-983b-3330c93ec278", "Service_Plan_Name": "Content_Explorer", "Service_Plan_Id": "d9fa6af4-e046-4c89-9226-729a0786685d", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Premium" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Premium" }, { "Product_Display_Name": "Microsoft 365 A5 Suite features for faculty", @@ -9373,7 +9125,7 @@ "GUID": "f245ecc8-75af-4f8e-b61f-27d8114de5f3", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Copilot" }, { "Product_Display_Name": "Microsoft 365 Business Standard", @@ -9645,7 +9397,7 @@ "GUID": "c1f79c29-5d7a-4bec-a2c1-1a76774864c0", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Bing Chat Enterprise" }, { "Product_Display_Name": "Microsoft 365 Business Standard EEA (no Teams)", @@ -10325,7 +10077,7 @@ "GUID": "cbdc14ab-d96c-4c30-b9f4-6ada7cdc1d46", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Copilot" }, { "Product_Display_Name": "Microsoft 365 Business Premium", @@ -10741,7 +10493,7 @@ "GUID": "a3f586b6-8cce-4d9b-99d6-55238397f77a", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Bing Chat Enterprise" }, { "Product_Display_Name": "Microsoft 365 Business Premium EEA (no Teams)", @@ -11119,30 +10871,6 @@ "Service_Plan_Id": "ded3d325-1bdc-453e-8432-5bac26d7a014", "Service_Plans_Included_Friendly_Names": "Power Virtual Agents for Office 365" }, - { - "Product_Display_Name": "Microsoft 365 Business Voice (US)", - "String_Id": "BUSINESS_VOICE_MED2_TELCO", - "GUID": "08d7bce8-6e16-490e-89db-1d508e5e9609", - "Service_Plan_Name": "MCOMEETADV", - "Service_Plan_Id": "3e26ee1f-8a5f-4d52-aee2-b81ce45c8f40", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Audio Conferencing" - }, - { - "Product_Display_Name": "Microsoft 365 Business Voice (US)", - "String_Id": "BUSINESS_VOICE_MED2_TELCO", - "GUID": "08d7bce8-6e16-490e-89db-1d508e5e9609", - "Service_Plan_Name": "MCOPSTN1", - "Service_Plan_Id": "4ed3ff63-69d7-4fb7-b984-5aec7f605ca8", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Domestic Calling Plan" - }, - { - "Product_Display_Name": "Microsoft 365 Business Voice (US)", - "String_Id": "BUSINESS_VOICE_MED2_TELCO", - "GUID": "08d7bce8-6e16-490e-89db-1d508e5e9609", - "Service_Plan_Name": "MCOEV", - "Service_Plan_Id": "4828c8ec-dc2e-4779-b502-87ac9ce28ab7", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Phone System" - }, { "Product_Display_Name": "Microsoft 365 Domestic Calling Plan (120 Minutes)", "String_Id": "MCOPSTN_5", @@ -11191,14 +10919,6 @@ "Service_Plan_Id": "bea4c11e-220a-4e6d-8eb8-8ea15d019f90", "Service_Plans_Included_Friendly_Names": "Azure Rights Management" }, - { - "Product_Display_Name": "Microsoft 365 E3", - "String_Id": "SPE_E3", - "GUID": "05e9a617-0261-4cee-bb44-138d3ef5d965", - "Service_Plan_Name": "Bing_Chat_Enterprise", - "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" - }, { "Product_Display_Name": "Microsoft 365 E3", "String_Id": "SPE_E3", @@ -11211,17 +10931,17 @@ "Product_Display_Name": "Microsoft 365 E3", "String_Id": "SPE_E3", "GUID": "05e9a617-0261-4cee-bb44-138d3ef5d965", - "Service_Plan_Name": "EXCHANGE_S_ENTERPRISE", - "Service_Plan_Id": "efb87545-963c-4e0d-99df-69c6916d9eb0", - "Service_Plans_Included_Friendly_Names": "Exchange Online (Plan 2)" + "Service_Plan_Name": "Bing_Chat_Enterprise", + "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", + "Service_Plans_Included_Friendly_Names": "Copilot" }, { "Product_Display_Name": "Microsoft 365 E3", "String_Id": "SPE_E3", "GUID": "05e9a617-0261-4cee-bb44-138d3ef5d965", - "Service_Plan_Name": "MESH_IMMERSIVE_FOR_TEAMS", - "Service_Plan_Id": "f0ff6ac6-297d-49cd-be34-6dfef97f0c28", - "Service_Plans_Included_Friendly_Names": "Immersive spaces for Teams" + "Service_Plan_Name": "EXCHANGE_S_ENTERPRISE", + "Service_Plan_Id": "efb87545-963c-4e0d-99df-69c6916d9eb0", + "Service_Plans_Included_Friendly_Names": "Exchange Online (Plan 2)" }, { "Product_Display_Name": "Microsoft 365 E3", @@ -11229,7 +10949,7 @@ "GUID": "05e9a617-0261-4cee-bb44-138d3ef5d965", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 E3", @@ -11561,167 +11281,167 @@ }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "RMS_S_ENTERPRISE", + "Service_Plan_Name": "Azure Rights Management", "Service_Plan_Id": "bea4c11e-220a-4e6d-8eb8-8ea15d019f90", - "Service_Plans_Included_Friendly_Names": "Azure Rights Management" + "Service_Plans_Included_Friendly_Names": "RMS_S_ENTERPRISE" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "CDS_O365_P2", + "Service_Plan_Name": "Common Data Service for Teams", "Service_Plan_Id": "95b76021-6a53-4741-ab8b-1d1f3d66a95a", - "Service_Plans_Included_Friendly_Names": "Common Data Service for Teams" + "Service_Plans_Included_Friendly_Names": "CDS_O365_P2" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Bing_Chat_Enterprise", + "Service_Plan_Name": "Copilot", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Bing_Chat_Enterprise" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "EXCHANGE_S_ENTERPRISE", + "Service_Plan_Name": "Exchange Online (Plan 2)", "Service_Plan_Id": "efb87545-963c-4e0d-99df-69c6916d9eb0", - "Service_Plans_Included_Friendly_Names": "Exchange Online (Plan 2)" + "Service_Plans_Included_Friendly_Names": "EXCHANGE_S_ENTERPRISE" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "ContentExplorer_Standard", + "Service_Plan_Name": "Information Protection and Governance Analytics � Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "ContentExplorer_Standard" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "MIP_S_CLP1", + "Service_Plan_Name": "Information Protection for Office 365 - Standard", "Service_Plan_Id": "5136a095-5cf0-4aff-bec3-e84448b38ea5", - "Service_Plans_Included_Friendly_Names": "Information Protection for Office 365 - Standard" + "Service_Plans_Included_Friendly_Names": "MIP_S_CLP1" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "MYANALYTICS_P2", + "Service_Plan_Name": "Insights by MyAnalytics", "Service_Plan_Id": "33c4f319-9bdd-48d6-9c4d-410b750a4a5a", - "Service_Plans_Included_Friendly_Names": "Insights by MyAnalytics" + "Service_Plans_Included_Friendly_Names": "MYANALYTICS_P2" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "OFFICESUBSCRIPTION", + "Service_Plan_Name": "Microsoft 365 Apps for enterprise", "Service_Plan_Id": "43de0ff5-c92c-492b-9116-175376d08c38", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Apps for enterprise" + "Service_Plans_Included_Friendly_Names": "OFFICESUBSCRIPTION" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "M365_LIGHTHOUSE_CUSTOMER_PLAN1", + "Service_Plan_Name": "Microsoft 365 Lighthouse (Plan 1)", "Service_Plan_Id": "6f23d6a9-adbf-481c-8538-b4c095654487", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Lighthouse (Plan 1)" + "Service_Plans_Included_Friendly_Names": "M365_LIGHTHOUSE_CUSTOMER_PLAN1" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "M365_LIGHTHOUSE_PARTNER_PLAN1", + "Service_Plan_Name": "Microsoft 365 Lighthouse (Plan 2)", "Service_Plan_Id": "d55411c9-cfff-40a9-87c7-240f14df7da5", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Lighthouse (Plan 2)" + "Service_Plans_Included_Friendly_Names": "M365_LIGHTHOUSE_PARTNER_PLAN1" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "MICROSOFTBOOKINGS", + "Service_Plan_Name": "Microsoft Bookings", "Service_Plan_Id": "199a5c09-e0ca-4e37-8f7c-b05d533e1ea2", - "Service_Plans_Included_Friendly_Names": "Microsoft Bookings" + "Service_Plans_Included_Friendly_Names": "MICROSOFTBOOKINGS" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "CLIPCHAMP", + "Service_Plan_Name": "Microsoft Clipchamp", "Service_Plan_Id": "a1ace008-72f3-4ea0-8dac-33b3a23a2472", - "Service_Plans_Included_Friendly_Names": "Microsoft Clipchamp" + "Service_Plans_Included_Friendly_Names": "CLIPCHAMP" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "MDE_LITE", + "Service_Plan_Name": "Microsoft Defender for Endpoint Plan 1", "Service_Plan_Id": "292cc034-7b7c-4950-aaf5-943befd3f1d4", - "Service_Plans_Included_Friendly_Names": "Microsoft Defender for Endpoint Plan 1" + "Service_Plans_Included_Friendly_Names": "MDE_LITE" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "FORMS_PLAN_E3", + "Service_Plan_Name": "Microsoft Forms (Plan E3)", "Service_Plan_Id": "2789c901-c14e-48ab-a76a-be334d9d793a", - "Service_Plans_Included_Friendly_Names": "Microsoft Forms (Plan E3)" + "Service_Plans_Included_Friendly_Names": "FORMS_PLAN_E3" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "KAIZALA_O365_P3", + "Service_Plan_Name": "Microsoft Kaizala Pro", "Service_Plan_Id": "aebd3021-9f8f-4bf8-bbe3-0ed2f4f047a1", - "Service_Plans_Included_Friendly_Names": "Microsoft Kaizala Pro" + "Service_Plans_Included_Friendly_Names": "KAIZALA_O365_P3" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "PROJECTWORKMANAGEMENT", + "Service_Plan_Name": "Microsoft Planner", "Service_Plan_Id": "b737dad2-2f6c-4c65-90e3-ca563267e8b9", - "Service_Plans_Included_Friendly_Names": "Microsoft Planner" + "Service_Plans_Included_Friendly_Names": "PROJECTWORKMANAGEMENT" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "MICROSOFT_SEARCH", + "Service_Plan_Name": "Microsoft Search", "Service_Plan_Id": "94065c59-bc8e-4e8b-89e5-5138d471eaff", - "Service_Plans_Included_Friendly_Names": "Microsoft Search" + "Service_Plans_Included_Friendly_Names": "MICROSOFT_SEARCH" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Deskless", + "Service_Plan_Name": "Microsoft StaffHub", "Service_Plan_Id": "8c7d2df8-86f0-4902-b2ed-a0458298f3b3", - "Service_Plans_Included_Friendly_Names": "Microsoft StaffHub" + "Service_Plans_Included_Friendly_Names": "Deskless" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "STREAM_O365_E3", + "Service_Plan_Name": "Microsoft Stream for Office 365 E3", "Service_Plan_Id": "9e700747-8b1d-45e5-ab8d-ef187ceec156", - "Service_Plans_Included_Friendly_Names": "Microsoft Stream for Office 365 E3" + "Service_Plans_Included_Friendly_Names": "STREAM_O365_E3" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "INTUNE_O365", + "Service_Plan_Name": "Mobile Device Management for Office 365", "Service_Plan_Id": "882e1d05-acd1-4ccb-8708-6ee03664b117", - "Service_Plans_Included_Friendly_Names": "Mobile Device Management for Office 365" + "Service_Plans_Included_Friendly_Names": "INTUNE_O365" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", "Service_Plan_Name": "Nucleus", "Service_Plan_Id": "db4d623d-b514-490b-b7ef-8885eee514de", @@ -11729,187 +11449,187 @@ }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "SHAREPOINTWAC", + "Service_Plan_Name": "Office for the Web", "Service_Plan_Id": "e95bec33-7c88-4a70-8e19-b10bd9d0c014", - "Service_Plans_Included_Friendly_Names": "Office for the Web" + "Service_Plans_Included_Friendly_Names": "SHAREPOINTWAC" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "PROJECT_O365_P2", + "Service_Plan_Name": "Project for Office (Plan E3)", "Service_Plan_Id": "31b4e2fc-4cd6-4e7d-9c1b-41407303bd66", - "Service_Plans_Included_Friendly_Names": "Project for Office (Plan E3)" + "Service_Plans_Included_Friendly_Names": "PROJECT_O365_P2" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "SHAREPOINTENTERPRISE", + "Service_Plan_Name": "SharePoint (Plan 2)", "Service_Plan_Id": "5dbe027f-2339-4123-9542-606e4d348a72", - "Service_Plans_Included_Friendly_Names": "SharePoint (Plan 2)" + "Service_Plans_Included_Friendly_Names": "SHAREPOINTENTERPRISE" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "MCOSTANDARD", + "Service_Plan_Name": "Skype for Business Online (Plan 2)", "Service_Plan_Id": "0feaeb32-d00e-4d66-bd5a-43b5b83db82c", - "Service_Plans_Included_Friendly_Names": "Skype for Business Online (Plan 2)" + "Service_Plans_Included_Friendly_Names": "MCOSTANDARD" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "SWAY", + "Service_Plan_Name": "Sway", "Service_Plan_Id": "a23b959c-7ce8-4e57-9140-b90eb88a9e97", - "Service_Plans_Included_Friendly_Names": "Sway" + "Service_Plans_Included_Friendly_Names": "SWAY" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "BPOS_S_TODO_2", + "Service_Plan_Name": "To-Do (Plan 2)", "Service_Plan_Id": "c87f142c-d1e9-4363-8630-aaea9c4d9ae5", - "Service_Plans_Included_Friendly_Names": "To-Do (Plan 2)" + "Service_Plans_Included_Friendly_Names": "BPOS_S_TODO_2" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "VIVAENGAGE_CORE", + "Service_Plan_Name": "Viva Engage Core", "Service_Plan_Id": "a82fbf69-b4d7-49f4-83a6-915b2cf354f4", - "Service_Plans_Included_Friendly_Names": "Viva Engage Core" + "Service_Plans_Included_Friendly_Names": "VIVAENGAGE_CORE" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "VIVA_LEARNING_SEEDED", + "Service_Plan_Name": "Viva Learning Seeded", "Service_Plan_Id": "b76fb638-6ba6-402a-b9f9-83d28acb3d86", - "Service_Plans_Included_Friendly_Names": "Viva Learning Seeded" + "Service_Plans_Included_Friendly_Names": "VIVA_LEARNING_SEEDED" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "WHITEBOARD_PLAN2", + "Service_Plan_Name": "Whiteboard (Plan 2)", "Service_Plan_Id": "94a54592-cd8b-425e-87c6-97868b000b91", - "Service_Plans_Included_Friendly_Names": "Whiteboard (Plan 2)" + "Service_Plans_Included_Friendly_Names": "WHITEBOARD_PLAN2" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "YAMMER_ENTERPRISE", + "Service_Plan_Name": "Yammer Enterprise", "Service_Plan_Id": "7547a3fe-08ee-4ccb-b430-5077c5041653", - "Service_Plans_Included_Friendly_Names": "Yammer Enterprise" + "Service_Plans_Included_Friendly_Names": "YAMMER_ENTERPRISE" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "UNIVERSAL_PRINT_01", + "Service_Plan_Name": "Universal Print", "Service_Plan_Id": "795f6fe0-cc4d-4773-b050-5dde4dc704c9", - "Service_Plans_Included_Friendly_Names": "Universal Print" + "Service_Plans_Included_Friendly_Names": "UNIVERSAL_PRINT_01" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "WIN10_PRO_ENT_SUB", + "Service_Plan_Name": "Windows 10/11 Enterprise (Original)", "Service_Plan_Id": "21b439ba-a0ca-424f-a6cc-52f954a5b111", - "Service_Plans_Included_Friendly_Names": "Windows 10/11 Enterprise (Original)" + "Service_Plans_Included_Friendly_Names": "WIN10_PRO_ENT_SUB" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "Windows_Autopatch", + "Service_Plan_Name": "Windows Autopatch", "Service_Plan_Id": "9a6eeb79-0b4b-4bf0-9808-39d99a2cd5a3", - "Service_Plans_Included_Friendly_Names": "Windows Autopatch" + "Service_Plans_Included_Friendly_Names": "Windows_Autopatch" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "WINDOWSUPDATEFORBUSINESS_DEPLOYMENTSERVICE", + "Service_Plan_Name": "Windows Update for Business Deployment Service", "Service_Plan_Id": "7bf960f6-2cd9-443a-8046-5dbff9558365", - "Service_Plans_Included_Friendly_Names": "Windows Update for Business Deployment Service" + "Service_Plans_Included_Friendly_Names": "WINDOWSUPDATEFORBUSINESS_DEPLOYMENTSERVICE" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "RMS_S_PREMIUM", + "Service_Plan_Name": "Azure Information Protection Premium P1", "Service_Plan_Id": "6c57d4b6-3b23-47a5-9bc9-69f17b4947b3", - "Service_Plans_Included_Friendly_Names": "Azure Information Protection Premium P1" + "Service_Plans_Included_Friendly_Names": "RMS_S_PREMIUM" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "DYN365_CDS_O365_P2", + "Service_Plan_Name": "Common Data Service", "Service_Plan_Id": "4ff01e01-1ba7-4d71-8cf8-ce96c3bbcf14", - "Service_Plans_Included_Friendly_Names": "Common Data Service" + "Service_Plans_Included_Friendly_Names": "DYN365_CDS_O365_P2" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "MFA_PREMIUM", + "Service_Plan_Name": "Microsoft Azure Multi-Factor Authentication", "Service_Plan_Id": "8a256a2b-b617-496d-b51b-e76466e88db0", - "Service_Plans_Included_Friendly_Names": "Microsoft Azure Multi-Factor Authentication" + "Service_Plans_Included_Friendly_Names": "MFA_PREMIUM" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "ADALLOM_S_DISCOVERY", + "Service_Plan_Name": "Microsoft Defender for Cloud Apps Discovery", "Service_Plan_Id": "932ad362-64a8-4783-9106-97849a1a30b9", - "Service_Plans_Included_Friendly_Names": "Microsoft Defender for Cloud Apps Discovery" + "Service_Plans_Included_Friendly_Names": "ADALLOM_S_DISCOVERY" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "AAD_PREMIUM", + "Service_Plan_Name": "Microsoft Entra ID P1", "Service_Plan_Id": "41781fb2-bc02-4b7c-bd55-b576c07bb09d", - "Service_Plans_Included_Friendly_Names": "Microsoft Entra ID P1" + "Service_Plans_Included_Friendly_Names": "AAD_PREMIUM" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "INTUNE_A", + "Service_Plan_Name": "Microsoft Intune Plan 1", "Service_Plan_Id": "c1ec4a95-1f05-45b3-a911-aa3fa01094f5", - "Service_Plans_Included_Friendly_Names": "Microsoft Intune Plan 1" + "Service_Plans_Included_Friendly_Names": "INTUNE_A" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "POWERAPPS_O365_P2", + "Service_Plan_Name": "Power Apps for Office 365", "Service_Plan_Id": "c68f8d98-5534-41c8-bf36-22fa496fa792", - "Service_Plans_Included_Friendly_Names": "Power Apps for Office 365" + "Service_Plans_Included_Friendly_Names": "POWERAPPS_O365_P2" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "FLOW_O365_P2", + "Service_Plan_Name": "Power Automate for Office 365", "Service_Plan_Id": "76846ad7-7776-4c40-a281-a386362dd1b9", - "Service_Plans_Included_Friendly_Names": "Power Automate for Office 365" + "Service_Plans_Included_Friendly_Names": "FLOW_O365_P2" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams)", - "String_Id": "O365_w/o?Teams?Bundle_M3", + "String_Id": "O365_w/o�Teams�Bundle_M3", "GUID": "c2fe850d-fbbb-4858-b67d-bd0c6e746da3", - "Service_Plan_Name": "POWER_VIRTUAL_AGENTS_O365_P2", + "Service_Plan_Name": "Power Virtual Agents for Office 365", "Service_Plan_Id": "041fe683-03e4-45b6-b1af-c0cdc516daee", - "Service_Plans_Included_Friendly_Names": "Power Virtual Agents for Office 365" + "Service_Plans_Included_Friendly_Names": "POWER_VIRTUAL_AGENTS_O365_P2" }, { "Product_Display_Name": "Microsoft 365 E3 Extra Features", @@ -11933,7 +11653,7 @@ "GUID": "f5b15d67-b99e-406b-90f1-308452f94de6", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Copilot" }, { "Product_Display_Name": "Microsoft 365 E3 Extra Features", @@ -11959,21 +11679,13 @@ "Service_Plan_Id": "9a6eeb79-0b4b-4bf0-9808-39d99a2cd5a3", "Service_Plans_Included_Friendly_Names": "Windows Autopatch" }, - { - "Product_Display_Name": "Microsoft 365 E3 Extra Features", - "String_Id": "Microsoft_365_E3_Extra_Features", - "GUID": "f5b15d67-b99e-406b-90f1-308452f94de6", - "Service_Plan_Name": "WINDOWSUPDATEFORBUSINESS_DEPLOYMENTSERVICE", - "Service_Plan_Id": "7bf960f6-2cd9-443a-8046-5dbff9558365", - "Service_Plans_Included_Friendly_Names": "Windows Update for Business Deployment Service" - }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams) - Unattended License", "String_Id": "Microsoft_365_E3_EEA_(no_Teams)_Unattended_License", "GUID": "a23dbafb-3396-48b3-ad9c-a304fe206043", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Bing Chat Enterprise" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams) - Unattended License", @@ -12341,7 +12053,7 @@ "GUID": "c2ac2ee4-9bb1-47e4-8541-d689c7e83371", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Copilot" }, { "Product_Display_Name": "Microsoft 365 E3 - Unattended License", @@ -12709,7 +12421,7 @@ "GUID": "0c21030a-7e60-4ec7-9a0f-0042e0e0211a", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Copilot" }, { "Product_Display_Name": "Microsoft 365 E3 (500 seats min)_HUB", @@ -12725,7 +12437,7 @@ "GUID": "0c21030a-7e60-4ec7-9a0f-0042e0e0211a", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 E3 (500 seats min)_HUB", @@ -13061,7 +12773,7 @@ "GUID": "602e6573-55a3-46b1-a1a0-cc267991501a", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Copilot" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams) (500 seats min)_HUB", @@ -13077,7 +12789,7 @@ "GUID": "602e6573-55a3-46b1-a1a0-cc267991501a", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 E3 EEA (no Teams) (500 seats min)_HUB", @@ -13643,17 +13355,17 @@ "Product_Display_Name": "Microsoft 365 E5", "String_Id": "SPE_E5", "GUID": "06ebc4ee-1bb5-47dd-8120-11324bc54e06", - "Service_Plan_Name": "Bing_Chat_Enterprise", - "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plan_Name": "CDS_O365_P3", + "Service_Plan_Id": "afa73018-811e-46e9-988f-f75d2b1b8430", + "Service_Plans_Included_Friendly_Names": "Common Data Service for Teams" }, { "Product_Display_Name": "Microsoft 365 E5", "String_Id": "SPE_E5", "GUID": "06ebc4ee-1bb5-47dd-8120-11324bc54e06", - "Service_Plan_Name": "CDS_O365_P3", - "Service_Plan_Id": "afa73018-811e-46e9-988f-f75d2b1b8430", - "Service_Plans_Included_Friendly_Names": "Common Data Service for Teams" + "Service_Plan_Name": "Bing_Chat_Enterprise", + "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", + "Service_Plans_Included_Friendly_Names": "Copilot" }, { "Product_Display_Name": "Microsoft 365 E5", @@ -13695,14 +13407,6 @@ "Service_Plan_Id": "a6520331-d7d4-4276-95f5-15c0933bc757", "Service_Plans_Included_Friendly_Names": "Graph Connectors Search with Index" }, - { - "Product_Display_Name": "Microsoft 365 E5", - "String_Id": "SPE_E5", - "GUID": "06ebc4ee-1bb5-47dd-8120-11324bc54e06", - "Service_Plan_Name": "MESH_IMMERSIVE_FOR_TEAMS", - "Service_Plan_Id": "f0ff6ac6-297d-49cd-be34-6dfef97f0c28", - "Service_Plans_Included_Friendly_Names": "Immersive spaces for Teams" - }, { "Product_Display_Name": "Microsoft 365 E5", "String_Id": "SPE_E5", @@ -13725,7 +13429,7 @@ "GUID": "06ebc4ee-1bb5-47dd-8120-11324bc54e06", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 E5", @@ -14365,7 +14069,7 @@ "GUID": "6ee4114a-9b2d-4577-9e7a-49fa43d222d3", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams) with Calling Minutes", @@ -14901,7 +14605,7 @@ "GUID": "90277bc7-a6fe-4181-99d8-712b08b8d32b", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Bing Chat Enterprise" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams) without Audio Conferencing", @@ -14973,7 +14677,7 @@ "GUID": "90277bc7-a6fe-4181-99d8-712b08b8d32b", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams) without Audio Conferencing", @@ -15549,7 +15253,7 @@ "GUID": "db684ac5-c0e7-4f92-8284-ef9ebde75d33", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Copilot" }, { "Product_Display_Name": "Microsoft 365 E5 (500 seats min)_HUB", @@ -15613,7 +15317,7 @@ "GUID": "db684ac5-c0e7-4f92-8284-ef9ebde75d33", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 E5 (500 seats min)_HUB", @@ -16205,7 +15909,7 @@ "GUID": "c42b9cae-ea4f-4ab7-9717-81576235ccac", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Copilot" }, { "Product_Display_Name": "Microsoft 365 E5 Developer (without Windows and Audio Conferencing)", @@ -16773,7 +16477,7 @@ "GUID": "184efa21-98c3-4e5d-95ab-d07053a96e67", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 E5 Compliance", @@ -16923,337 +16627,337 @@ "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "SHAREPOINTENTERPRISE", + "Service_Plan_Name": "SharePoint Online (Plan 2)", "Service_Plan_Id": "5dbe027f-2339-4123-9542-606e4d348a72", - "Service_Plans_Included_Friendly_Names": "SharePoint Online (Plan 2)" + "Service_Plans_Included_Friendly_Names": "SHAREPOINTENTERPRISE" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Bing_Chat_Enterprise", + "Service_Plan_Name": "Bing Chat Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Bing_Chat_Enterprise" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "CDS_O365_P3", + "Service_Plan_Name": "Common Data Service for Teams", "Service_Plan_Id": "afa73018-811e-46e9-988f-f75d2b1b8430", - "Service_Plans_Included_Friendly_Names": "Common Data Service for Teams" + "Service_Plans_Included_Friendly_Names": "CDS_O365_P3" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "LOCKBOX_ENTERPRISE", + "Service_Plan_Name": "Customer Lockbox", "Service_Plan_Id": "9f431833-0334-42de-a7dc-70aa40db46db", - "Service_Plans_Included_Friendly_Names": "Customer Lockbox" + "Service_Plans_Included_Friendly_Names": "LOCKBOX_ENTERPRISE" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "CustomerLockboxA_Enterprise", + "Service_Plan_Name": "Customer Lockbox (A)", "Service_Plan_Id": "3ec18638-bd4c-4d3b-8905-479ed636b83e", - "Service_Plans_Included_Friendly_Names": "Customer Lockbox (A)" + "Service_Plans_Included_Friendly_Names": "CustomerLockboxA_Enterprise" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "MIP_S_Exchange", + "Service_Plan_Name": "Data Classification in Microsoft 365", "Service_Plan_Id": "cd31b152-6326-4d1b-ae1b-997b625182e6", - "Service_Plans_Included_Friendly_Names": "Data Classification in Microsoft 365" + "Service_Plans_Included_Friendly_Names": "MIP_S_Exchange" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "EXCHANGE_S_ENTERPRISE", + "Service_Plan_Name": "Exchange Online (Plan 2)", "Service_Plan_Id": "efb87545-963c-4e0d-99df-69c6916d9eb0", - "Service_Plans_Included_Friendly_Names": "Exchange Online (Plan 2)" + "Service_Plans_Included_Friendly_Names": "EXCHANGE_S_ENTERPRISE" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "GRAPH_CONNECTORS_SEARCH_INDEX", + "Service_Plan_Name": "Graph Connectors Search with Index", "Service_Plan_Id": "a6520331-d7d4-4276-95f5-15c0933bc757", - "Service_Plans_Included_Friendly_Names": "Graph Connectors Search with Index" + "Service_Plans_Included_Friendly_Names": "GRAPH_CONNECTORS_SEARCH_INDEX" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "INFORMATION_BARRIERS", + "Service_Plan_Name": "Information Barriers", "Service_Plan_Id": "c4801e8a-cb58-4c35-aca6-f2dcc106f287", - "Service_Plans_Included_Friendly_Names": "Information Barriers" + "Service_Plans_Included_Friendly_Names": "INFORMATION_BARRIERS" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Content_Explorer", + "Service_Plan_Name": "Information Protection and Governance Analytics - Premium", "Service_Plan_Id": "d9fa6af4-e046-4c89-9226-729a0786685d", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics - Premium" + "Service_Plans_Included_Friendly_Names": "Content_Explorer" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "ContentExplorer_Standard", + "Service_Plan_Name": "Information Protection and Governance Analytics � Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "ContentExplorer_Standard" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "MIP_S_CLP2", + "Service_Plan_Name": "Information Protection for Office 365 - Premium", "Service_Plan_Id": "efb0351d-3b08-4503-993d-383af8de41e3", - "Service_Plans_Included_Friendly_Names": "Information Protection for Office 365 - Premium" + "Service_Plans_Included_Friendly_Names": "MIP_S_CLP2" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "MIP_S_CLP1", + "Service_Plan_Name": "Information Protection for Office 365 - Standard", "Service_Plan_Id": "5136a095-5cf0-4aff-bec3-e84448b38ea5", - "Service_Plans_Included_Friendly_Names": "Information Protection for Office 365 - Standard" + "Service_Plans_Included_Friendly_Names": "MIP_S_CLP1" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "MYANALYTICS_P2", + "Service_Plan_Name": "Insights by MyAnalytics", "Service_Plan_Id": "33c4f319-9bdd-48d6-9c4d-410b750a4a5a", - "Service_Plans_Included_Friendly_Names": "Insights by MyAnalytics" + "Service_Plans_Included_Friendly_Names": "MYANALYTICS_P2" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "M365_ADVANCED_AUDITING", + "Service_Plan_Name": "Microsoft 365 Advanced Auditing", "Service_Plan_Id": "2f442157-a11c-46b9-ae5b-6e39ff4e5849", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Advanced Auditing" + "Service_Plans_Included_Friendly_Names": "M365_ADVANCED_AUDITING" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "OFFICESUBSCRIPTION", + "Service_Plan_Name": "Microsoft 365 Apps for enterprise", "Service_Plan_Id": "43de0ff5-c92c-492b-9116-175376d08c38", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Apps for enterprise" + "Service_Plans_Included_Friendly_Names": "OFFICESUBSCRIPTION" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "MCOMEETADV", + "Service_Plan_Name": "Microsoft 365 Audio Conferencing", "Service_Plan_Id": "3e26ee1f-8a5f-4d52-aee2-b81ce45c8f40", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Audio Conferencing" + "Service_Plans_Included_Friendly_Names": "MCOMEETADV" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "M365_AUDIT_PLATFORM", + "Service_Plan_Name": "Microsoft 365 Audit Platform", "Service_Plan_Id": "f6de4823-28fa-440b-b886-4783fa86ddba", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Audit Platform" + "Service_Plans_Included_Friendly_Names": "M365_AUDIT_PLATFORM" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "MICROSOFT_COMMUNICATION_COMPLIANCE", + "Service_Plan_Name": "Microsoft 365 Communication Compliance", "Service_Plan_Id": "a413a9ff-720c-4822-98ef-2f37c2a21f4c", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Communication Compliance" + "Service_Plans_Included_Friendly_Names": "MICROSOFT_COMMUNICATION_COMPLIANCE" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "MTP", + "Service_Plan_Name": "Microsoft 365 Defender", "Service_Plan_Id": "bf28f719-7844-4079-9c78-c1307898e192", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Defender" + "Service_Plans_Included_Friendly_Names": "MTP" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "M365_LIGHTHOUSE_CUSTOMER_PLAN1", + "Service_Plan_Name": "Microsoft 365 Lighthouse (Plan 1)", "Service_Plan_Id": "6f23d6a9-adbf-481c-8538-b4c095654487", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Lighthouse (Plan 1)" + "Service_Plans_Included_Friendly_Names": "M365_LIGHTHOUSE_CUSTOMER_PLAN1" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "MCOEV", + "Service_Plan_Name": "Microsoft 365 Phone System", "Service_Plan_Id": "4828c8ec-dc2e-4779-b502-87ac9ce28ab7", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Phone System" + "Service_Plans_Included_Friendly_Names": "MCOEV" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "MICROSOFTBOOKINGS", + "Service_Plan_Name": "Microsoft Bookings", "Service_Plan_Id": "199a5c09-e0ca-4e37-8f7c-b05d533e1ea2", - "Service_Plans_Included_Friendly_Names": "Microsoft Bookings" + "Service_Plans_Included_Friendly_Names": "MICROSOFTBOOKINGS" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "CLIPCHAMP", + "Service_Plan_Name": "Microsoft Clipchamp", "Service_Plan_Id": "a1ace008-72f3-4ea0-8dac-33b3a23a2472", - "Service_Plans_Included_Friendly_Names": "Microsoft Clipchamp" + "Service_Plans_Included_Friendly_Names": "CLIPCHAMP" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "COMMUNICATIONS_DLP", + "Service_Plan_Name": "Microsoft Communications DLP", "Service_Plan_Id": "6dc145d6-95dd-4191-b9c3-185575ee6f6b", - "Service_Plans_Included_Friendly_Names": "Microsoft Communications DLP" + "Service_Plans_Included_Friendly_Names": "COMMUNICATIONS_DLP" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "CUSTOMER_KEY", + "Service_Plan_Name": "Microsoft Customer Key", "Service_Plan_Id": "6db1f1db-2b46-403f-be40-e39395f08dbb", - "Service_Plans_Included_Friendly_Names": "Microsoft Customer Key" + "Service_Plans_Included_Friendly_Names": "CUSTOMER_KEY" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "DATA_INVESTIGATIONS", + "Service_Plan_Name": "Microsoft Data Investigations", "Service_Plan_Id": "46129a58-a698-46f0-aa5b-17f6586297d9", - "Service_Plans_Included_Friendly_Names": "Microsoft Data Investigations" + "Service_Plans_Included_Friendly_Names": "DATA_INVESTIGATIONS" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "ATP_ENTERPRISE", + "Service_Plan_Name": "Microsoft Defender for Office 365 (Plan 1)", "Service_Plan_Id": "f20fedf3-f3c3-43c3-8267-2bfdd51c0939", - "Service_Plans_Included_Friendly_Names": "Microsoft Defender for Office 365 (Plan 1)" + "Service_Plans_Included_Friendly_Names": "ATP_ENTERPRISE" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "THREAT_INTELLIGENCE", + "Service_Plan_Name": "Microsoft Defender for Office 365 (Plan 2)", "Service_Plan_Id": "8e0c0a52-6a6c-4d40-8370-dd62790dcd70", - "Service_Plans_Included_Friendly_Names": "Microsoft Defender for Office 365 (Plan 2)" + "Service_Plans_Included_Friendly_Names": "THREAT_INTELLIGENCE" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "EXCEL_PREMIUM", + "Service_Plan_Name": "Microsoft Excel Advanced Analytics", "Service_Plan_Id": "531ee2f8-b1cb-453b-9c21-d2180d014ca5", - "Service_Plans_Included_Friendly_Names": "Microsoft Excel Advanced Analytics" + "Service_Plans_Included_Friendly_Names": "EXCEL_PREMIUM" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "FORMS_PLAN_E5", + "Service_Plan_Name": "Microsoft Forms (Plan E5)", "Service_Plan_Id": "e212cbc7-0961-4c40-9825-01117710dcb1", - "Service_Plans_Included_Friendly_Names": "Microsoft Forms (Plan E5)" + "Service_Plans_Included_Friendly_Names": "FORMS_PLAN_E5" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "INFO_GOVERNANCE", + "Service_Plan_Name": "Microsoft Information Governance", "Service_Plan_Id": "e26c2fcc-ab91-4a61-b35c-03cdc8dddf66", - "Service_Plans_Included_Friendly_Names": "Microsoft Information Governance" + "Service_Plans_Included_Friendly_Names": "INFO_GOVERNANCE" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "INSIDER_RISK", + "Service_Plan_Name": "Microsoft Insider Risk Management", "Service_Plan_Id": "d587c7a3-bda9-4f99-8776-9bcf59c84f75", - "Service_Plans_Included_Friendly_Names": "Microsoft Insider Risk Management" + "Service_Plans_Included_Friendly_Names": "INSIDER_RISK" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "KAIZALA_STANDALONE", + "Service_Plan_Name": "Microsoft Kaizala Pro", "Service_Plan_Id": "0898bdbb-73b0-471a-81e5-20f1fe4dd66e", - "Service_Plans_Included_Friendly_Names": "Microsoft Kaizala Pro" + "Service_Plans_Included_Friendly_Names": "KAIZALA_STANDALONE" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "ML_CLASSIFICATION", + "Service_Plan_Name": "Microsoft ML-Based Classification", "Service_Plan_Id": "d2d51368-76c9-4317-ada2-a12c004c432f", - "Service_Plans_Included_Friendly_Names": "Microsoft ML-Based Classification" + "Service_Plans_Included_Friendly_Names": "ML_CLASSIFICATION" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "EXCHANGE_ANALYTICS", + "Service_Plan_Name": "Microsoft MyAnalytics (Full)", "Service_Plan_Id": "34c0d7a0-a70f-4668-9238-47f9fc208882", - "Service_Plans_Included_Friendly_Names": "Microsoft MyAnalytics (Full)" + "Service_Plans_Included_Friendly_Names": "EXCHANGE_ANALYTICS" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "PROJECTWORKMANAGEMENT", + "Service_Plan_Name": "Microsoft Planner", "Service_Plan_Id": "b737dad2-2f6c-4c65-90e3-ca563267e8b9", - "Service_Plans_Included_Friendly_Names": "Microsoft Planner" + "Service_Plans_Included_Friendly_Names": "PROJECTWORKMANAGEMENT" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "RECORDS_MANAGEMENT", + "Service_Plan_Name": "Microsoft Records Management", "Service_Plan_Id": "65cc641f-cccd-4643-97e0-a17e3045e541", - "Service_Plans_Included_Friendly_Names": "Microsoft Records Management" + "Service_Plans_Included_Friendly_Names": "RECORDS_MANAGEMENT" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "MICROSOFT_SEARCH", + "Service_Plan_Name": "Microsoft Search", "Service_Plan_Id": "94065c59-bc8e-4e8b-89e5-5138d471eaff", - "Service_Plans_Included_Friendly_Names": "Microsoft Search" + "Service_Plans_Included_Friendly_Names": "MICROSOFT_SEARCH" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Deskless", + "Service_Plan_Name": "Microsoft StaffHub", "Service_Plan_Id": "8c7d2df8-86f0-4902-b2ed-a0458298f3b3", - "Service_Plans_Included_Friendly_Names": "Microsoft StaffHub" + "Service_Plans_Included_Friendly_Names": "Deskless" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "STREAM_O365_E5", + "Service_Plan_Name": "Microsoft Stream for Office 365 E5", "Service_Plan_Id": "6c6042f5-6f01-4d67-b8c1-eb99d36eed3e", - "Service_Plans_Included_Friendly_Names": "Microsoft Stream for Office 365 E5" + "Service_Plans_Included_Friendly_Names": "STREAM_O365_E5" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "INTUNE_O365", + "Service_Plan_Name": "Mobile Device Management for Office 365", "Service_Plan_Id": "882e1d05-acd1-4ccb-8708-6ee03664b117", - "Service_Plans_Included_Friendly_Names": "Mobile Device Management for Office 365" + "Service_Plans_Included_Friendly_Names": "INTUNE_O365" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", @@ -17267,289 +16971,289 @@ "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "EQUIVIO_ANALYTICS", + "Service_Plan_Name": "Office 365 Advanced eDiscovery", "Service_Plan_Id": "4de31727-a228-4ec3-a5bf-8e45b5ca48cc", - "Service_Plans_Included_Friendly_Names": "Office 365 Advanced eDiscovery" + "Service_Plans_Included_Friendly_Names": "EQUIVIO_ANALYTICS" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "ADALLOM_S_O365", + "Service_Plan_Name": "Office 365 Cloud App Security", "Service_Plan_Id": "8c098270-9dd4-4350-9b30-ba4703f3b36b", - "Service_Plans_Included_Friendly_Names": "Office 365 Cloud App Security" + "Service_Plans_Included_Friendly_Names": "ADALLOM_S_O365" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "PAM_ENTERPRISE", + "Service_Plan_Name": "Office 365 Privileged Access Management", "Service_Plan_Id": "b1188c4c-1b36-4018-b48b-ee07604f6feb", - "Service_Plans_Included_Friendly_Names": "Office 365 Privileged Access Management" + "Service_Plans_Included_Friendly_Names": "PAM_ENTERPRISE" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "SAFEDOCS", + "Service_Plan_Name": "Office 365 SafeDocs", "Service_Plan_Id": "bf6f5520-59e3-4f82-974b-7dbbc4fd27c7", - "Service_Plans_Included_Friendly_Names": "Office 365 SafeDocs" + "Service_Plans_Included_Friendly_Names": "SAFEDOCS" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "SHAREPOINTWAC", + "Service_Plan_Name": "Office for the Web", "Service_Plan_Id": "e95bec33-7c88-4a70-8e19-b10bd9d0c014", - "Service_Plans_Included_Friendly_Names": "Office for the Web" + "Service_Plans_Included_Friendly_Names": "SHAREPOINTWAC" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "POWERAPPS_O365_P3", + "Service_Plan_Name": "Power Apps for Office 365 (Plan 3)", "Service_Plan_Id": "9c0dab89-a30c-4117-86e7-97bda240acd2", - "Service_Plans_Included_Friendly_Names": "Power Apps for Office 365 (Plan 3)" + "Service_Plans_Included_Friendly_Names": "POWERAPPS_O365_P3" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "PREMIUM_ENCRYPTION", + "Service_Plan_Name": "Premium Encryption in Office 365", "Service_Plan_Id": "617b097b-4b93-4ede-83de-5f075bb5fb2f", - "Service_Plans_Included_Friendly_Names": "Premium Encryption in Office 365" + "Service_Plans_Included_Friendly_Names": "PREMIUM_ENCRYPTION" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "PROJECT_O365_P3", + "Service_Plan_Name": "Project for Office (Plan E5)", "Service_Plan_Id": "b21a6b06-1988-436e-a07b-51ec6d9f52ad", - "Service_Plans_Included_Friendly_Names": "Project for Office (Plan E5)" + "Service_Plans_Included_Friendly_Names": "PROJECT_O365_P3" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "COMMUNICATIONS_COMPLIANCE", + "Service_Plan_Name": "RETIRED - Microsoft Communications Compliance", "Service_Plan_Id": "41fcdd7d-4733-4863-9cf4-c65b83ce2df4", - "Service_Plans_Included_Friendly_Names": "RETIRED - Microsoft Communications Compliance" + "Service_Plans_Included_Friendly_Names": "COMMUNICATIONS_COMPLIANCE" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "INSIDER_RISK_MANAGEMENT", + "Service_Plan_Name": "RETIRED - Microsoft Insider Risk Management", "Service_Plan_Id": "9d0c4ee5-e4a1-4625-ab39-d82b619b1a34", - "Service_Plans_Included_Friendly_Names": "RETIRED - Microsoft Insider Risk Management" + "Service_Plans_Included_Friendly_Names": "INSIDER_RISK_MANAGEMENT" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "MCOSTANDARD", + "Service_Plan_Name": "Skype for Business Online (Plan 2)", "Service_Plan_Id": "0feaeb32-d00e-4d66-bd5a-43b5b83db82c", - "Service_Plans_Included_Friendly_Names": "Skype for Business Online (Plan 2)" + "Service_Plans_Included_Friendly_Names": "MCOSTANDARD" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "SWAY", + "Service_Plan_Name": "Sway", "Service_Plan_Id": "a23b959c-7ce8-4e57-9140-b90eb88a9e97", - "Service_Plans_Included_Friendly_Names": "Sway" + "Service_Plans_Included_Friendly_Names": "SWAY" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "BPOS_S_TODO_3", + "Service_Plan_Name": "To-Do (Plan 3)", "Service_Plan_Id": "3fb82609-8c27-4f7b-bd51-30634711ee67", - "Service_Plans_Included_Friendly_Names": "To-Do (Plan 3)" + "Service_Plans_Included_Friendly_Names": "BPOS_S_TODO_3" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "VIVAENGAGE_CORE", + "Service_Plan_Name": "Viva Engage Core", "Service_Plan_Id": "a82fbf69-b4d7-49f4-83a6-915b2cf354f4", - "Service_Plans_Included_Friendly_Names": "Viva Engage Core" + "Service_Plans_Included_Friendly_Names": "VIVAENGAGE_CORE" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "VIVA_LEARNING_SEEDED", + "Service_Plan_Name": "Viva Learning Seeded", "Service_Plan_Id": "b76fb638-6ba6-402a-b9f9-83d28acb3d86", - "Service_Plans_Included_Friendly_Names": "Viva Learning Seeded" + "Service_Plans_Included_Friendly_Names": "VIVA_LEARNING_SEEDED" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "WHITEBOARD_PLAN3", + "Service_Plan_Name": "Whiteboard (Plan 3)", "Service_Plan_Id": "4a51bca5-1eff-43f5-878c-177680f191af", - "Service_Plans_Included_Friendly_Names": "Whiteboard (Plan 3)" + "Service_Plans_Included_Friendly_Names": "WHITEBOARD_PLAN3" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "YAMMER_ENTERPRISE", + "Service_Plan_Name": "Yammer Enterprise", "Service_Plan_Id": "7547a3fe-08ee-4ccb-b430-5077c5041653", - "Service_Plans_Included_Friendly_Names": "Yammer Enterprise" + "Service_Plans_Included_Friendly_Names": "YAMMER_ENTERPRISE" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "WINDEFATP", + "Service_Plan_Name": "Microsoft Defender for Endpoint", "Service_Plan_Id": "871d91ec-ec1a-452b-a83f-bd76c7d770ef", - "Service_Plans_Included_Friendly_Names": "Microsoft Defender for Endpoint" + "Service_Plans_Included_Friendly_Names": "WINDEFATP" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "MICROSOFTENDPOINTDLP", + "Service_Plan_Name": "Microsoft Endpoint DLP", "Service_Plan_Id": "64bfac92-2b17-4482-b5e5-a0304429de3e", - "Service_Plans_Included_Friendly_Names": "Microsoft Endpoint DLP" + "Service_Plans_Included_Friendly_Names": "MICROSOFTENDPOINTDLP" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "UNIVERSAL_PRINT_01", + "Service_Plan_Name": "Universal Print", "Service_Plan_Id": "795f6fe0-cc4d-4773-b050-5dde4dc704c9", - "Service_Plans_Included_Friendly_Names": "Universal Print" + "Service_Plans_Included_Friendly_Names": "UNIVERSAL_PRINT_01" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "WIN10_PRO_ENT_SUB", + "Service_Plan_Name": "Windows 10/11 Enterprise (Original)", "Service_Plan_Id": "21b439ba-a0ca-424f-a6cc-52f954a5b111", - "Service_Plans_Included_Friendly_Names": "Windows 10/11 Enterprise (Original)" + "Service_Plans_Included_Friendly_Names": "WIN10_PRO_ENT_SUB" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "Windows_Autopatch", + "Service_Plan_Name": "Windows Autopatch", "Service_Plan_Id": "9a6eeb79-0b4b-4bf0-9808-39d99a2cd5a3", - "Service_Plans_Included_Friendly_Names": "Windows Autopatch" + "Service_Plans_Included_Friendly_Names": "Windows_Autopatch" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "WINDOWSUPDATEFORBUSINESS_DEPLOYMENTSERVICE", + "Service_Plan_Name": "Windows Update for Business Deployment Service", "Service_Plan_Id": "7bf960f6-2cd9-443a-8046-5dbff9558365", - "Service_Plans_Included_Friendly_Names": "Windows Update for Business Deployment Service" + "Service_Plans_Included_Friendly_Names": "WINDOWSUPDATEFORBUSINESS_DEPLOYMENTSERVICE" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "RMS_S_PREMIUM", + "Service_Plan_Name": "Azure Information Protection Premium P1", "Service_Plan_Id": "6c57d4b6-3b23-47a5-9bc9-69f17b4947b3", - "Service_Plans_Included_Friendly_Names": "Azure Information Protection Premium P1" + "Service_Plans_Included_Friendly_Names": "RMS_S_PREMIUM" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "RMS_S_PREMIUM2", + "Service_Plan_Name": "Azure Information Protection Premium P2", "Service_Plan_Id": "5689bec4-755d-4753-8b61-40975025187c", - "Service_Plans_Included_Friendly_Names": "Azure Information Protection Premium P2" + "Service_Plans_Included_Friendly_Names": "RMS_S_PREMIUM2" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "RMS_S_ENTERPRISE", + "Service_Plan_Name": "Azure Rights Management", "Service_Plan_Id": "bea4c11e-220a-4e6d-8eb8-8ea15d019f90", - "Service_Plans_Included_Friendly_Names": "Azure Rights Management" + "Service_Plans_Included_Friendly_Names": "RMS_S_ENTERPRISE" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "DYN365_CDS_O365_P3", + "Service_Plan_Name": "Common Data Service", "Service_Plan_Id": "28b0fa46-c39a-4188-89e2-58e979a6b014", - "Service_Plans_Included_Friendly_Names": "Common Data Service" + "Service_Plans_Included_Friendly_Names": "DYN365_CDS_O365_P3" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "MFA_PREMIUM", + "Service_Plan_Name": "Microsoft Azure Multi-Factor Authentication", "Service_Plan_Id": "8a256a2b-b617-496d-b51b-e76466e88db0", - "Service_Plans_Included_Friendly_Names": "Microsoft Azure Multi-Factor Authentication" + "Service_Plans_Included_Friendly_Names": "MFA_PREMIUM" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "ADALLOM_S_STANDALONE", + "Service_Plan_Name": "Microsoft Defender for Cloud Apps", "Service_Plan_Id": "2e2ddb96-6af9-4b1d-a3f0-d6ecfd22edb2", - "Service_Plans_Included_Friendly_Names": "Microsoft Defender for Cloud Apps" + "Service_Plans_Included_Friendly_Names": "ADALLOM_S_STANDALONE" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "ATA", + "Service_Plan_Name": "Microsoft Defender for Identity", "Service_Plan_Id": "14ab5db5-e6c4-4b20-b4bc-13e36fd2227f", - "Service_Plans_Included_Friendly_Names": "Microsoft Defender for Identity" + "Service_Plans_Included_Friendly_Names": "ATA" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "AAD_PREMIUM", + "Service_Plan_Name": "Microsoft Entra ID P1", "Service_Plan_Id": "41781fb2-bc02-4b7c-bd55-b576c07bb09d", - "Service_Plans_Included_Friendly_Names": "Microsoft Entra ID P1" + "Service_Plans_Included_Friendly_Names": "AAD_PREMIUM" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "AAD_PREMIUM_P2", + "Service_Plan_Name": "Microsoft Entra ID P2", "Service_Plan_Id": "eec0eb4f-6444-4f95-aba0-50c24d67f998", - "Service_Plans_Included_Friendly_Names": "Microsoft Entra ID P2" + "Service_Plans_Included_Friendly_Names": "AAD_PREMIUM_P2" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "INTUNE_A", + "Service_Plan_Name": "Microsoft Intune Plan 1", "Service_Plan_Id": "c1ec4a95-1f05-45b3-a911-aa3fa01094f5", - "Service_Plans_Included_Friendly_Names": "Microsoft Intune Plan 1" + "Service_Plans_Included_Friendly_Names": "INTUNE_A" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "FLOW_O365_P3", + "Service_Plan_Name": "Power Automate for Office 365", "Service_Plan_Id": "07699545-9485-468e-95b6-2fca3738be01", - "Service_Plans_Included_Friendly_Names": "Power Automate for Office 365" + "Service_Plans_Included_Friendly_Names": "FLOW_O365_P3" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "BI_AZURE_P2", + "Service_Plan_Name": "Power BI Pro", "Service_Plan_Id": "70d33638-9c74-4d01-bfd3-562de28bd4ba", - "Service_Plans_Included_Friendly_Names": "Power BI Pro" + "Service_Plans_Included_Friendly_Names": "BI_AZURE_P2" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_M5", "GUID": "3271cf8e-2be5-4a09-a549-70fd05baaa17", - "Service_Plan_Name": "POWER_VIRTUAL_AGENTS_O365_P3", + "Service_Plan_Name": "Power Virtual Agents for Office 365", "Service_Plan_Id": "ded3d325-1bdc-453e-8432-5bac26d7a014", - "Service_Plans_Included_Friendly_Names": "Power Virtual Agents for Office 365" + "Service_Plans_Included_Friendly_Names": "POWER_VIRTUAL_AGENTS_O365_P3" }, { "Product_Display_Name": "Microsoft 365 E5 Security", @@ -17693,7 +17397,7 @@ "GUID": "a91fc4e0-65e5-4266-aa76-4037509c1626", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Copilot" }, { "Product_Display_Name": "Microsoft 365 E5 with Calling Minutes", @@ -17757,7 +17461,7 @@ "GUID": "a91fc4e0-65e5-4266-aa76-4037509c1626", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 E5 with Calling Minutes", @@ -18357,7 +18061,7 @@ "GUID": "cd2925a3-5076-4233-8931-638a8c94f773", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Copilot" }, { "Product_Display_Name": "Microsoft 365 E5 without Audio Conferencing", @@ -18421,7 +18125,7 @@ "GUID": "cd2925a3-5076-4233-8931-638a8c94f773", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 E5 without Audio Conferencing", @@ -19021,7 +18725,7 @@ "GUID": "2113661c-6509-4034-98bb-9c47bd28d63c", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Copilot" }, { "Product_Display_Name": "Microsoft 365 E5 without Audio Conferencing (500 seats min)_HUB", @@ -19085,7 +18789,7 @@ "GUID": "2113661c-6509-4034-98bb-9c47bd28d63c", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 E5 without Audio Conferencing (500 seats min)_HUB", @@ -19653,7 +19357,7 @@ "GUID": "1e988bf3-8b7c-4731-bec0-4e2a2946600c", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Copilot" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams) (500 seats min)_HUB", @@ -19717,7 +19421,7 @@ "GUID": "1e988bf3-8b7c-4731-bec0-4e2a2946600c", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams) (500 seats min)_HUB", @@ -20301,7 +20005,7 @@ "GUID": "a640eead-25f6-4bec-97e3-23cfd382d7c2", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Copilot" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams) without Audio Conferencing (500 seats min)_HUB", @@ -20357,7 +20061,7 @@ "GUID": "a640eead-25f6-4bec-97e3-23cfd382d7c2", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 E5 EEA (no Teams) without Audio Conferencing (500 seats min)_HUB", @@ -20941,7 +20645,7 @@ "GUID": "4eb45c5b-0d19-4e33-b87c-adfc25268f20", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 E5_USGOV_GCCHIGH", @@ -21551,14 +21255,6 @@ "Service_Plan_Id": "bea4c11e-220a-4e6d-8eb8-8ea15d019f90", "Service_Plans_Included_Friendly_Names": "Azure Rights Management" }, - { - "Product_Display_Name": "Microsoft 365 F3", - "String_Id": "SPE_F1", - "GUID": "66b55226-6b4f-492c-910c-a3b7a3c9d993", - "Service_Plan_Name": "Bing_Chat_Enterprise", - "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" - }, { "Product_Display_Name": "Microsoft 365 F3", "String_Id": "SPE_F1", @@ -21575,14 +21271,6 @@ "Service_Plan_Id": "4a82b400-a79f-41a4-b4e2-e94f5787b113", "Service_Plans_Included_Friendly_Names": "Exchange Online Kiosk" }, - { - "Product_Display_Name": "Microsoft 365 F3", - "String_Id": "SPE_F1", - "GUID": "66b55226-6b4f-492c-910c-a3b7a3c9d993", - "Service_Plan_Name": "M365_LIGHTHOUSE_CUSTOMER_PLAN1", - "Service_Plan_Id": "6f23d6a9-adbf-481c-8538-b4c095654487", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Lighthouse (Plan 1)" - }, { "Product_Display_Name": "Microsoft 365 F3", "String_Id": "SPE_F1", @@ -21711,14 +21399,6 @@ "Service_Plan_Id": "80873e7a-cd2a-4e67-b061-1b5381a676a5", "Service_Plans_Included_Friendly_Names": "To-Do (Firstline)" }, - { - "Product_Display_Name": "Microsoft 365 F3", - "String_Id": "SPE_F1", - "GUID": "66b55226-6b4f-492c-910c-a3b7a3c9d993", - "Service_Plan_Name": "VIVAENGAGE_CORE", - "Service_Plan_Id": "a82fbf69-b4d7-49f4-83a6-915b2cf354f4", - "Service_Plans_Included_Friendly_Names": "Viva Engage Core" - }, { "Product_Display_Name": "Microsoft 365 F3", "String_Id": "SPE_F1", @@ -21763,17 +21443,17 @@ "Product_Display_Name": "Microsoft 365 F3", "String_Id": "SPE_F1", "GUID": "66b55226-6b4f-492c-910c-a3b7a3c9d993", - "Service_Plan_Name": "Windows_Autopatch", - "Service_Plan_Id": "9a6eeb79-0b4b-4bf0-9808-39d99a2cd5a3", - "Service_Plans_Included_Friendly_Names": "Windows Autopatch" + "Service_Plan_Name": "WINDOWSUPDATEFORBUSINESS_DEPLOYMENTSERVICE", + "Service_Plan_Id": "7bf960f6-2cd9-443a-8046-5dbff9558365", + "Service_Plans_Included_Friendly_Names": "Windows Update for Business Deployment Service" }, { "Product_Display_Name": "Microsoft 365 F3", "String_Id": "SPE_F1", "GUID": "66b55226-6b4f-492c-910c-a3b7a3c9d993", - "Service_Plan_Name": "WINDOWSUPDATEFORBUSINESS_DEPLOYMENTSERVICE", - "Service_Plan_Id": "7bf960f6-2cd9-443a-8046-5dbff9558365", - "Service_Plans_Included_Friendly_Names": "Windows Update for Business Deployment Service" + "Service_Plan_Name": "AAD_PREMIUM", + "Service_Plan_Id": "41781fb2-bc02-4b7c-bd55-b576c07bb09d", + "Service_Plans_Included_Friendly_Names": "Microsoft Entra ID P1" }, { "Product_Display_Name": "Microsoft 365 F3", @@ -21807,21 +21487,13 @@ "Service_Plan_Id": "932ad362-64a8-4783-9106-97849a1a30b9", "Service_Plans_Included_Friendly_Names": "Microsoft Defender for Cloud Apps Discovery" }, - { - "Product_Display_Name": "Microsoft 365 F3", - "String_Id": "SPE_F1", - "GUID": "66b55226-6b4f-492c-910c-a3b7a3c9d993", - "Service_Plan_Name": "AAD_PREMIUM", - "Service_Plan_Id": "41781fb2-bc02-4b7c-bd55-b576c07bb09d", - "Service_Plans_Included_Friendly_Names": "Microsoft Entra ID P1" - }, { "Product_Display_Name": "Microsoft 365 F3", "String_Id": "SPE_F1", "GUID": "66b55226-6b4f-492c-910c-a3b7a3c9d993", "Service_Plan_Name": "INTUNE_A", "Service_Plan_Id": "c1ec4a95-1f05-45b3-a911-aa3fa01094f5", - "Service_Plans_Included_Friendly_Names": "Microsoft Intune Plan 1" + "Service_Plans_Included_Friendly_Names": "Microsoft Intune" }, { "Product_Display_Name": "Microsoft 365 F3", @@ -21855,6 +21527,14 @@ "Service_Plan_Id": "ba2fdb48-290b-4632-b46a-e4ecc58ac11a", "Service_Plans_Included_Friendly_Names": "Power Virtual Agents for Office 365" }, + { + "Product_Display_Name": "Microsoft 365 F3", + "String_Id": "SPE_F1", + "GUID": "66b55226-6b4f-492c-910c-a3b7a3c9d993", + "Service_Plan_Name": "VIVAENGAGE_CORE", + "Service_Plan_Id": "a82fbf69-b4d7-49f4-83a6-915b2cf354f4", + "Service_Plans_Included_Friendly_Names": "Viva Engage Core" + }, { "Product_Display_Name": "Microsoft 365 F3 EEA (no Teams)", "String_Id": "Microsoft_365_F3_EEA_(no_Teams)", @@ -22525,7 +22205,7 @@ "GUID": "9cfd6bc3-84cd-4274-8a21-8c7c41d6c350", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 F5 Compliance Add-on AR (DOD)_USGOV_DOD", @@ -23285,7 +22965,7 @@ "GUID": "e2be619b-b125-455f-8660-fb503e431a5d", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 GCC G5", @@ -23733,7 +23413,7 @@ "GUID": "b0f809d5-a662-4391-a5aa-136e9c565b9d", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 GCC G5 w/o WDATP/CAS Unified", @@ -24125,7 +23805,7 @@ "GUID": "99cc8282-2f74-4954-83b7-c6a9a1999067", "Service_Plan_Name": "Bing_Chat_Enterprise", "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plans_Included_Friendly_Names": "Copilot" }, { "Product_Display_Name": "Microsoft 365 E5 Suite features", @@ -24135,14 +23815,6 @@ "Service_Plan_Id": "3ec18638-bd4c-4d3b-8905-479ed636b83e", "Service_Plans_Included_Friendly_Names": "Customer Lockbox (A)" }, - { - "Product_Display_Name": "Microsoft 365 E5 Suite features", - "String_Id": "M365_E5_SUITE_COMPONENTS", - "GUID": "99cc8282-2f74-4954-83b7-c6a9a1999067", - "Service_Plan_Name": "MESH_IMMERSIVE_FOR_TEAMS", - "Service_Plan_Id": "f0ff6ac6-297d-49cd-be34-6dfef97f0c28", - "Service_Plans_Included_Friendly_Names": "Immersive spaces for Teams" - }, { "Product_Display_Name": "Microsoft 365 E5 Suite features", "String_Id": "M365_E5_SUITE_COMPONENTS", @@ -24215,14 +23887,6 @@ "Service_Plan_Id": "9a6eeb79-0b4b-4bf0-9808-39d99a2cd5a3", "Service_Plans_Included_Friendly_Names": "Windows Autopatch" }, - { - "Product_Display_Name": "Microsoft 365 E5 Suite features", - "String_Id": "M365_E5_SUITE_COMPONENTS", - "GUID": "99cc8282-2f74-4954-83b7-c6a9a1999067", - "Service_Plan_Name": "WINDOWSUPDATEFORBUSINESS_DEPLOYMENTSERVICE", - "Service_Plan_Id": "7bf960f6-2cd9-443a-8046-5dbff9558365", - "Service_Plans_Included_Friendly_Names": "Windows Update for Business Deployment Service" - }, { "Product_Display_Name": "Microsoft 365 E5 Suite features", "String_Id": "M365_E5_SUITE_COMPONENTS", @@ -24405,7 +24069,7 @@ "GUID": "e823ca47-49c4-46b3-b38d-ca11d5abe3d2", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Microsoft 365 G3 GCC", @@ -25135,14 +24799,6 @@ "Service_Plan_Id": "871d91ec-ec1a-452b-a83f-bd76c7d770ef", "Service_Plans_Included_Friendly_Names": "MICROSOFT DEFENDER FOR ENDPOINT" }, - { - "Product_Display_Name": "Microsoft Defender for Endpoint F2", - "String_Id": "Microsoft_Defender_for_Endpoint_F2", - "GUID": "e430a580-c37b-4d16-adba-d881d7cd0364", - "Service_Plan_Name": "WINDEFATP", - "Service_Plan_Id": "871d91ec-ec1a-452b-a83f-bd76c7d770ef", - "Service_Plans_Included_Friendly_Names": "Microsoft Defender for Endpoint" - }, { "Product_Display_Name": "Microsoft Defender for Endpoint P1", "String_Id": "DEFENDER_ENDPOINT_P1", @@ -25367,14 +25023,6 @@ "Service_Plan_Id": "874fc546-6efe-4d22-90b8-5c4e7aa59f4b", "Service_Plans_Included_Friendly_Names": "POWERAPPS FOR DYNAMICS 365" }, - { - "Product_Display_Name": "Microsoft Entra ID Governance", - "String_Id": "Microsoft_Entra_ID_Governance", - "GUID": "cf6b0d46-4093-4546-a0ab-0b1546dcc10e", - "Service_Plan_Name": "Entra_Identity_Governance", - "Service_Plan_Id": "e866a266-3cff-43a3-acca-0c90a7e00c8b", - "Service_Plans_Included_Friendly_Names": "Entra Identity Governance" - }, { "Product_Display_Name": "Microsoft Fabric (Free)", "String_Id": "POWER_BI_STANDARD", @@ -25855,38 +25503,6 @@ "Service_Plan_Id": "83bced11-77ce-4071-95bd-240133796768", "Service_Plans_Included_Friendly_Names": "Microsoft Stream Storage Add-On" }, - { - "Product_Display_Name": "Microsoft Sustainability Manager USL Essentials", - "String_Id": "Microsoft_Cloud_for_Sustainability_USL", - "GUID": "ece037b4-a52b-4cf8-93ea-649e5d83767a", - "Service_Plan_Name": "MCS_BizApps_Cloud_for_Sustainability_USL", - "Service_Plan_Id": "c46c42af-d654-4385-8c85-29a84f3dfb22", - "Service_Plans_Included_Friendly_Names": "MCS - BizApps - Cloud for Sustainability USL" - }, - { - "Product_Display_Name": "Microsoft Sustainability Manager USL Essentials", - "String_Id": "Microsoft_Cloud_for_Sustainability_USL", - "GUID": "ece037b4-a52b-4cf8-93ea-649e5d83767a", - "Service_Plan_Name": "POWER_APPS_FOR_MCS_USL", - "Service_Plan_Id": "5ffd371c-037a-41a2-98a3-6452f8c5de17", - "Service_Plans_Included_Friendly_Names": "Power Apps for Cloud for Sustainability USL" - }, - { - "Product_Display_Name": "Microsoft Sustainability Manager USL Essentials", - "String_Id": "Microsoft_Cloud_for_Sustainability_USL", - "GUID": "ece037b4-a52b-4cf8-93ea-649e5d83767a", - "Service_Plan_Name": "POWER_AUTOMATE_FOR_MCS_USL", - "Service_Plan_Id": "ccbe468e-7973-442c-8ec4-5fbe16438711", - "Service_Plans_Included_Friendly_Names": "Power Automate for Cloud for Sustainability USL" - }, - { - "Product_Display_Name": "Microsoft Sustainability Manager USL Essentials", - "String_Id": "Microsoft_Cloud_for_Sustainability_USL", - "GUID": "ece037b4-a52b-4cf8-93ea-649e5d83767a", - "Service_Plan_Name": "EXCHANGE_S_FOUNDATION", - "Service_Plan_Id": "113feb6c-3fe4-4440-bddc-54d774bf0318", - "Service_Plans_Included_Friendly_Names": "Exchange Foundation" - }, { "Product_Display_Name": "Microsoft Teams Audio Conferencing with dial-out to USA/CAN", "String_Id": "Microsoft_Teams_Audio_Conferencing_select_dial_out", @@ -25943,22 +25559,6 @@ "Service_Plan_Id": "36b29273-c6d0-477a-aca6-6fbe24f538e3", "Service_Plans_Included_Friendly_Names": "WHITEBOARD (FIRSTLINE)" }, - { - "Product_Display_Name": "Microsoft Teams Calling Plan pay-as-you-go (country zone 1 - US)", - "String_Id": "Microsoft_Teams_Calling_Plan_pay_as_you_go_(country_zone_1_US)", - "GUID": "9b196e97-5830-4c2e-adc2-1e10ebf5dee5", - "Service_Plan_Name": "MCOPSTN_PAYG_1", - "Service_Plan_Id": "156a1efe-17cd-4b03-9f17-2eb512298fb3", - "Service_Plans_Included_Friendly_Names": "Microsoft Teams Calling Plan pay-as-you-go - country zone 1" - }, - { - "Product_Display_Name": "Microsoft Teams Domestic Calling Plan (240 min)", - "String_Id": "MCOPSTN_6", - "GUID": "729dbb8f-8d56-4994-8e33-2f218f549544", - "Service_Plan_Name": "MCOPSTN6", - "Service_Plan_Id": "346d83bf-6fe6-42ca-b424-b9300d2e21bf", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Domestic Calling Plan (240 min)" - }, { "Product_Display_Name": "Microsoft Teams Essentials", "String_Id": "Teams_Ess", @@ -28725,7 +28325,7 @@ "GUID": "a4585165-0533-458a-97e3-c400570268c4", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Office 365 A5 for faculty", @@ -29181,7 +28781,7 @@ "GUID": "ee656612-49fa-43e5-b67e-cb1fdf7699df", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Office 365 A5 for students", @@ -30451,33 +30051,9 @@ "Product_Display_Name": "Office 365 E3", "String_Id": "ENTERPRISEPACK", "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", - "Service_Plan_Name": "MESH_AVATARS_FOR_TEAMS", - "Service_Plan_Id": "dcf9d2f4-772e-4434-b757-77a453cfbc02", - "Service_Plans_Included_Friendly_Names": "Avatars for Teams" - }, - { - "Product_Display_Name": "Office 365 E3", - "String_Id": "ENTERPRISEPACK", - "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", - "Service_Plan_Name": "MESH_AVATARS_ADDITIONAL_FOR_TEAMS", - "Service_Plan_Id": "3efbd4ed-8958-4824-8389-1321f8730af8", - "Service_Plans_Included_Friendly_Names": "Avatars for Teams (additional)" - }, - { - "Product_Display_Name": "Office 365 E3", - "String_Id": "ENTERPRISEPACK", - "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", - "Service_Plan_Name": "RMS_S_ENTERPRISE", - "Service_Plan_Id": "bea4c11e-220a-4e6d-8eb8-8ea15d019f90", - "Service_Plans_Included_Friendly_Names": "Azure Rights Management" - }, - { - "Product_Display_Name": "Office 365 E3", - "String_Id": "ENTERPRISEPACK", - "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", - "Service_Plan_Name": "Bing_Chat_Enterprise", - "Service_Plan_Id": "0d0c0d31-fae7-41f2-b909-eaf4d7f26dba", - "Service_Plans_Included_Friendly_Names": "Commercial data protection for Microsoft Copilot" + "Service_Plan_Name": "DYN365_CDS_O365_P2", + "Service_Plan_Id": "4ff01e01-1ba7-4d71-8cf8-ce96c3bbcf14", + "Service_Plans_Included_Friendly_Names": "Common Data Service - O365 P2" }, { "Product_Display_Name": "Office 365 E3", @@ -30485,7 +30061,7 @@ "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", "Service_Plan_Name": "CDS_O365_P2", "Service_Plan_Id": "95b76021-6a53-4741-ab8b-1d1f3d66a95a", - "Service_Plans_Included_Friendly_Names": "Common Data Service for Teams" + "Service_Plans_Included_Friendly_Names": "Common Data Service for Teams_P2" }, { "Product_Display_Name": "Office 365 E3", @@ -30495,21 +30071,13 @@ "Service_Plan_Id": "efb87545-963c-4e0d-99df-69c6916d9eb0", "Service_Plans_Included_Friendly_Names": "Exchange Online (Plan 2)" }, - { - "Product_Display_Name": "Office 365 E3", - "String_Id": "ENTERPRISEPACK", - "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", - "Service_Plan_Name": "MESH_IMMERSIVE_FOR_TEAMS", - "Service_Plan_Id": "f0ff6ac6-297d-49cd-be34-6dfef97f0c28", - "Service_Plans_Included_Friendly_Names": "Immersive spaces for Teams" - }, { "Product_Display_Name": "Office 365 E3", "String_Id": "ENTERPRISEPACK", "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics - Standard" }, { "Product_Display_Name": "Office 365 E3", @@ -30533,15 +30101,15 @@ "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", "Service_Plan_Name": "OFFICESUBSCRIPTION", "Service_Plan_Id": "43de0ff5-c92c-492b-9116-175376d08c38", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Apps for Enterprise" + "Service_Plans_Included_Friendly_Names": "Microsoft 365 Apps for enterprise" }, { "Product_Display_Name": "Office 365 E3", "String_Id": "ENTERPRISEPACK", "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", - "Service_Plan_Name": "M365_LIGHTHOUSE_CUSTOMER_PLAN1", - "Service_Plan_Id": "6f23d6a9-adbf-481c-8538-b4c095654487", - "Service_Plans_Included_Friendly_Names": "Microsoft 365 Lighthouse (Plan 1)" + "Service_Plan_Name": "RMS_S_ENTERPRISE", + "Service_Plan_Id": "bea4c11e-220a-4e6d-8eb8-8ea15d019f90", + "Service_Plans_Included_Friendly_Names": "Microsoft Microsoft Entra Rights" }, { "Product_Display_Name": "Office 365 E3", @@ -30565,7 +30133,7 @@ "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", "Service_Plan_Name": "KAIZALA_O365_P3", "Service_Plan_Id": "aebd3021-9f8f-4bf8-bbe3-0ed2f4f047a1", - "Service_Plans_Included_Friendly_Names": "Microsoft Kaizala Pro" + "Service_Plans_Included_Friendly_Names": "Microsoft Kaizala Pro Plan 3" }, { "Product_Display_Name": "Office 365 E3", @@ -30597,7 +30165,7 @@ "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", "Service_Plan_Name": "STREAM_O365_E3", "Service_Plan_Id": "9e700747-8b1d-45e5-ab8d-ef187ceec156", - "Service_Plans_Included_Friendly_Names": "Microsoft Stream for Office 365 E3" + "Service_Plans_Included_Friendly_Names": "Microsoft Stream for O365 E3 SKU" }, { "Product_Display_Name": "Office 365 E3", @@ -30619,17 +30187,33 @@ "Product_Display_Name": "Office 365 E3", "String_Id": "ENTERPRISEPACK", "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", - "Service_Plan_Name": "Nucleus", - "Service_Plan_Id": "db4d623d-b514-490b-b7ef-8885eee514de", - "Service_Plans_Included_Friendly_Names": "Nucleus" + "Service_Plan_Name": "SHAREPOINTWAC", + "Service_Plan_Id": "e95bec33-7c88-4a70-8e19-b10bd9d0c014", + "Service_Plans_Included_Friendly_Names": "Office for the web" }, { "Product_Display_Name": "Office 365 E3", "String_Id": "ENTERPRISEPACK", "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", - "Service_Plan_Name": "SHAREPOINTWAC", - "Service_Plan_Id": "e95bec33-7c88-4a70-8e19-b10bd9d0c014", - "Service_Plans_Included_Friendly_Names": "Office for the Web" + "Service_Plan_Name": "POWERAPPS_O365_P2", + "Service_Plan_Id": "c68f8d98-5534-41c8-bf36-22fa496fa792", + "Service_Plans_Included_Friendly_Names": "Power Apps for Office 365" + }, + { + "Product_Display_Name": "Office 365 E3", + "String_Id": "ENTERPRISEPACK", + "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", + "Service_Plan_Name": "FLOW_O365_P2", + "Service_Plan_Id": "76846ad7-7776-4c40-a281-a386362dd1b9", + "Service_Plans_Included_Friendly_Names": "Power Automate for Office 365" + }, + { + "Product_Display_Name": "Office 365 E3", + "String_Id": "ENTERPRISEPACK", + "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", + "Service_Plan_Name": "POWER_VIRTUAL_AGENTS_O365_P2", + "Service_Plan_Id": "041fe683-03e4-45b6-b1af-c0cdc516daee", + "Service_Plans_Included_Friendly_Names": "Power Virtual Agents for Office 365 P2" }, { "Product_Display_Name": "Office 365 E3", @@ -30703,38 +30287,6 @@ "Service_Plan_Id": "7547a3fe-08ee-4ccb-b430-5077c5041653", "Service_Plans_Included_Friendly_Names": "Yammer Enterprise" }, - { - "Product_Display_Name": "Office 365 E3", - "String_Id": "ENTERPRISEPACK", - "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", - "Service_Plan_Name": "DYN365_CDS_O365_P2", - "Service_Plan_Id": "4ff01e01-1ba7-4d71-8cf8-ce96c3bbcf14", - "Service_Plans_Included_Friendly_Names": "Common Data Service" - }, - { - "Product_Display_Name": "Office 365 E3", - "String_Id": "ENTERPRISEPACK", - "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", - "Service_Plan_Name": "POWERAPPS_O365_P2", - "Service_Plan_Id": "c68f8d98-5534-41c8-bf36-22fa496fa792", - "Service_Plans_Included_Friendly_Names": "Power Apps for Office 365" - }, - { - "Product_Display_Name": "Office 365 E3", - "String_Id": "ENTERPRISEPACK", - "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", - "Service_Plan_Name": "FLOW_O365_P2", - "Service_Plan_Id": "76846ad7-7776-4c40-a281-a386362dd1b9", - "Service_Plans_Included_Friendly_Names": "Power Automate for Office 365" - }, - { - "Product_Display_Name": "Office 365 E3", - "String_Id": "ENTERPRISEPACK", - "GUID": "6fd2c87f-b296-42f0-b197-1e91e994b900", - "Service_Plan_Name": "POWER_VIRTUAL_AGENTS_O365_P2", - "Service_Plan_Id": "041fe683-03e4-45b6-b1af-c0cdc516daee", - "Service_Plans_Included_Friendly_Names": "Power Virtual Agents for Office 365" - }, { "Product_Display_Name": "Office 365 E3 EEA (no Teams)", "String_Id": "O365_w/o_Teams_Bundle_E3", @@ -30757,7 +30309,7 @@ "GUID": "d711d25a-a21c-492f-bd19-aae1e8ebaf30", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Office 365 E3 EEA (no Teams)", @@ -31885,7 +31437,7 @@ "GUID": "cf50bae9-29e8-4775-b07c-56ee10e3776d", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Office 365 E5 EEA (no Teams)", @@ -32349,7 +31901,7 @@ "GUID": "71772aeb-4bb8-4f74-9dd4-36c7a9b5ca74", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Office 365 E5 EEA (no Teams) without Audio Conferencing", @@ -32797,7 +32349,7 @@ "GUID": "26d45bd9-adf1-46cd-a9e1-51e9a5524128", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Office 365 E5 Without Audio Conferencing", @@ -33885,7 +33437,7 @@ "GUID": "535a3a29-c5f0-42fe-8215-d3b9e1f38c4a", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Office 365 G3 GCC", @@ -34077,7 +33629,7 @@ "GUID": "24aebea8-7fac-48d0-8750-de4ee1fde205", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Office 365 G3 without Microsoft 365 Apps GCC", @@ -34293,7 +33845,7 @@ "GUID": "8900a2c0-edba-4079-bdf3-b276e293b6a8", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Office 365 G5 GCC", @@ -34645,7 +34197,7 @@ "GUID": "1341559b-49df-443c-8e79-fa604fed2d82", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Office 365 GCC G5 without Audio Conferencing", @@ -34989,7 +34541,7 @@ "GUID": "2f105cc2-c2c1-435b-a955-c5e82156c05d", "Service_Plan_Name": "ContentExplorer_Standard", "Service_Plan_Id": "2b815d45-56e4-4e3a-b65c-66cb9175b560", - "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics ? Standard" + "Service_Plans_Included_Friendly_Names": "Information Protection and Governance Analytics � Standard" }, { "Product_Display_Name": "Office 365 GCC G5 without Power BI and Phone System", @@ -35935,46 +35487,6 @@ "Service_Plan_Id": "8e2c2c3d-07f6-4da7-86a9-e78cc8c2c8b9", "Service_Plans_Included_Friendly_Names": "Power Automate for Power Apps per App Plan for Government" }, - { - "Product_Display_Name": "Power Apps Per User BD Only", - "String_Id": "POWERAPPS_PER_USER_BD_ONLY", - "GUID": "2ced8a00-3ed1-4295-ab7c-57170ff28e58", - "Service_Plan_Name": "Power_Pages_Internal_User", - "Service_Plan_Id": "60bf28f9-2b70-4522-96f7-335f5e06c941", - "Service_Plans_Included_Friendly_Names": "Power Pages Internal User" - }, - { - "Product_Display_Name": "Power Apps Per User BD Only", - "String_Id": "POWERAPPS_PER_USER_BD_ONLY", - "GUID": "2ced8a00-3ed1-4295-ab7c-57170ff28e58", - "Service_Plan_Name": "EXCHANGE_S_FOUNDATION", - "Service_Plan_Id": "113feb6c-3fe4-4440-bddc-54d774bf0318", - "Service_Plans_Included_Friendly_Names": "Exchange Foundation" - }, - { - "Product_Display_Name": "Power Apps Per User BD Only", - "String_Id": "POWERAPPS_PER_USER_BD_ONLY", - "GUID": "2ced8a00-3ed1-4295-ab7c-57170ff28e58", - "Service_Plan_Name": "CDS_ POWERAPPS_PER_USER_CUSTOM", - "Service_Plan_Id": "2e8dde43-6986-479d-b179-7dbe31c31f60", - "Service_Plans_Included_Friendly_Names": "CDS Power Apps Per User Custom" - }, - { - "Product_Display_Name": "Power Apps Per User BD Only", - "String_Id": "POWERAPPS_PER_USER_BD_ONLY", - "GUID": "2ced8a00-3ed1-4295-ab7c-57170ff28e58", - "Service_Plan_Name": "POWERAPPS_PER_USER", - "Service_Plan_Id": "ea2cf03b-ac60-46ae-9c1d-eeaeb63cec86", - "Service_Plans_Included_Friendly_Names": "Power Apps per User Plan" - }, - { - "Product_Display_Name": "Power Apps Per User BD Only", - "String_Id": "POWERAPPS_PER_USER_BD_ONLY", - "GUID": "2ced8a00-3ed1-4295-ab7c-57170ff28e58", - "Service_Plan_Name": "Flow_PowerApps_PerUser", - "Service_Plan_Id": "dc789ed8-0170-4b65-a415-eb77d5bb350a", - "Service_Plans_Included_Friendly_Names": "Power Automate for Power Apps per User Plan" - }, { "Product_Display_Name": "Power Apps per user plan", "String_Id": "POWERAPPS_PER_USER", @@ -37136,7 +36648,7 @@ "Service_Plans_Included_Friendly_Names": "Flow for CCI Bots" }, { - "Product_Display_Name": "Privacy Management ? risk", + "Product_Display_Name": "Privacy Management � risk", "String_Id": "PRIVACY_MANAGEMENT_RISK", "GUID": "e42bc969-759a-4820-9283-6b73085b68e6", "Service_Plan_Name": "MIP_S_Exchange", @@ -37144,7 +36656,7 @@ "Service_Plans_Included_Friendly_Names": "Data Classification in Microsoft 365" }, { - "Product_Display_Name": "Privacy Management ? risk", + "Product_Display_Name": "Privacy Management � risk", "String_Id": "PRIVACY_MANAGEMENT_RISK", "GUID": "e42bc969-759a-4820-9283-6b73085b68e6", "Service_Plan_Name": "PRIVACY_MANGEMENT_RISK", @@ -37152,7 +36664,7 @@ "Service_Plans_Included_Friendly_Names": "Priva - Risk" }, { - "Product_Display_Name": "Privacy Management ? risk", + "Product_Display_Name": "Privacy Management � risk", "String_Id": "PRIVACY_MANAGEMENT_RISK", "GUID": "e42bc969-759a-4820-9283-6b73085b68e6", "Service_Plan_Name": "PRIVACY_MANGEMENT_RISK_EXCHANGE", @@ -38775,14 +38287,6 @@ "Service_Plan_Id": "6b340437-d6f9-4dc5-8cc2-99163f7f83d6", "Service_Plans_Included_Friendly_Names": "MCOPSTN3" }, - { - "Product_Display_Name": "Teams Phone Mobile", - "String_Id": "Operator_Connect_Mobile", - "GUID": "b84d58c9-0a0d-46cf-8a4b-d9f23c1674d5", - "Service_Plan_Name": "MCOFMC1", - "Service_Plan_Id": "cb22fbd7-ed7d-4786-a27a-e4cd617b69c0", - "Service_Plans_Included_Friendly_Names": "Teams Phone Mobile" - }, { "Product_Display_Name": "Teams Phone with Calling Plan", "String_Id": "MCOTEAMS_ESSENTIALS", @@ -38799,70 +38303,6 @@ "Service_Plan_Id": "4828c8ec-dc2e-4779-b502-87ac9ce28ab7", "Service_Plans_Included_Friendly_Names": "Microsoft 365 Phone System" }, - { - "Product_Display_Name": "Teams Premium (for Departments)", - "String_Id": "Teams_Premium_(for_Departments)", - "GUID": "52ea0e27-ae73-4983-a08f-13561ebdb823", - "Service_Plan_Name": "MICROSOFT_ECDN", - "Service_Plan_Id": "85704d55-2e73-47ee-93b4-4b8ea14db92b", - "Service_Plans_Included_Friendly_Names": "Microsoft eCDN" - }, - { - "Product_Display_Name": "Teams Premium (for Departments)", - "String_Id": "Teams_Premium_(for_Departments)", - "GUID": "52ea0e27-ae73-4983-a08f-13561ebdb823", - "Service_Plan_Name": "MESH_IMMERSIVE", - "Service_Plan_Id": "acbca54f-c771-423b-a476-6d7a98cbbcec", - "Service_Plans_Included_Friendly_Names": "Microsoft Mesh" - }, - { - "Product_Display_Name": "Teams Premium (for Departments)", - "String_Id": "Teams_Premium_(for_Departments)", - "GUID": "52ea0e27-ae73-4983-a08f-13561ebdb823", - "Service_Plan_Name": "TEAMSPRO_MGMT", - "Service_Plan_Id": "0504111f-feb8-4a3c-992a-70280f9a2869", - "Service_Plans_Included_Friendly_Names": "Microsoft Teams Premium Intelligent" - }, - { - "Product_Display_Name": "Teams Premium (for Departments)", - "String_Id": "Teams_Premium_(for_Departments)", - "GUID": "52ea0e27-ae73-4983-a08f-13561ebdb823", - "Service_Plan_Name": "TEAMSPRO_CUST", - "Service_Plan_Id": "cc8c0802-a325-43df-8cba-995d0c6cb373", - "Service_Plans_Included_Friendly_Names": "Microsoft Teams Premium Personalized" - }, - { - "Product_Display_Name": "Teams Premium (for Departments)", - "String_Id": "Teams_Premium_(for_Departments)", - "GUID": "52ea0e27-ae73-4983-a08f-13561ebdb823", - "Service_Plan_Name": "TEAMSPRO_PROTECTION", - "Service_Plan_Id": "f8b44f54-18bb-46a3-9658-44ab58712968", - "Service_Plans_Included_Friendly_Names": "Microsoft Teams Premium Secure" - }, - { - "Product_Display_Name": "Teams Premium (for Departments)", - "String_Id": "Teams_Premium_(for_Departments)", - "GUID": "52ea0e27-ae73-4983-a08f-13561ebdb823", - "Service_Plan_Name": "TEAMSPRO_VIRTUALAPPT", - "Service_Plan_Id": "9104f592-f2a7-4f77-904c-ca5a5715883f", - "Service_Plans_Included_Friendly_Names": "Microsoft Teams Premium Virtual Appointment" - }, - { - "Product_Display_Name": "Teams Premium (for Departments)", - "String_Id": "Teams_Premium_(for_Departments)", - "GUID": "52ea0e27-ae73-4983-a08f-13561ebdb823", - "Service_Plan_Name": "MCO_VIRTUAL_APPT", - "Service_Plan_Id": "711413d0-b36e-4cd4-93db-0a50a4ab7ea3", - "Service_Plans_Included_Friendly_Names": "Microsoft Teams Premium Virtual Appointments" - }, - { - "Product_Display_Name": "Teams Premium (for Departments)", - "String_Id": "Teams_Premium_(for_Departments)", - "GUID": "52ea0e27-ae73-4983-a08f-13561ebdb823", - "Service_Plan_Name": "TEAMSPRO_WEBINAR", - "Service_Plan_Id": "78b58230-ec7e-4309-913c-93a45cc4735b", - "Service_Plans_Included_Friendly_Names": "Microsoft Teams Premium Webinar" - }, { "Product_Display_Name": "Teams Rooms Premium", "String_Id": "MTR_PREM", @@ -39151,14 +38591,6 @@ "Service_Plan_Id": "2bdbaf8f-738f-4ac7-9234-3c3ee2ce7d0f", "Service_Plans_Included_Friendly_Names": "Visio Web App" }, - { - "Product_Display_Name": "Viva Goals User-led", - "String_Id": "Viva_Goals_User_led", - "GUID": "3a349c99-ffec-43d2-a2e8-6b97fcb71103", - "Service_Plan_Name": "Viva_Goals_Premium", - "Service_Plan_Id": "b44c6eaf-5c9f-478c-8f16-8cea26353bfb", - "Service_Plans_Included_Friendly_Names": "Viva Goals" - }, { "Product_Display_Name": "Viva Topics", "String_Id": "TOPIC_EXPERIENCES", diff --git a/src/data/standards.json b/src/data/standards.json index ba4f6f28d18f..cab53f3144d6 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -308,8 +308,7 @@ { "type": "number", "name": "standards.NudgeMFA.snoozeDurationInDays", - "label": "Number of days to allow users to skip registering Authenticator (0-14, default is 1)", - "default": 1 + "label": "Number of days to allow users to skip registering Authenticator (0-14, default is 1)" } ], "label": "Sets the state for the request to setup Authenticator", @@ -543,8 +542,7 @@ "type": "number", "name": "standards.EnableMailTips.MailTipsLargeAudienceThreshold", "label": "Number of recipients to trigger the large audience MailTip (Default is 25)", - "placeholder": "Enter a profile name", - "default": 25 + "placeholder": "Enter a profile name" } ], "label": "Enable all MailTips", @@ -600,14 +598,12 @@ { "type": "number", "name": "standards.SendReceiveLimitTenant.SendLimit", - "label": "Send limit in MB (Default is 35)", - "default": 35 + "label": "Send limit in MB (Default is 35)" }, { "type": "number", "name": "standards.SendReceiveLimitTenant.ReceiveLimit", - "label": "Receive Limit in MB (Default is 36)", - "default": 36 + "label": "Receive Limit in MB (Default is 36)" } ], "label": "Set send/receive size limits", diff --git a/src/hooks/useNavFavouriteCheck.jsx b/src/hooks/useNavFavouriteCheck.jsx deleted file mode 100644 index 90f710405b18..000000000000 --- a/src/hooks/useNavFavouriteCheck.jsx +++ /dev/null @@ -1,32 +0,0 @@ -import { CNavGroup, CNavItem, CNavTitle } from '@coreui/react' -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import { useSelector } from 'react-redux' - -export const useNavFavouriteCheck = (navigation) => { - const favourites = useSelector((state) => state.app.userSettingsDefaults?.favourites) - - if (Array.isArray(favourites)) { - const newNavigation = [ - { component: CNavTitle, name: 'Favourites' }, - { - component: CNavGroup, - section: 'favourites', - name: 'Favourites', - to: '/favorites', - icon: , - items: favourites.map((item) => { - console.log(item) - return { - name: item.value.name, - to: item.value.to, - component: CNavItem, - } - }), - }, - { component: CNavTitle, name: 'Dashboard' }, - ...navigation, - ] - return newNavigation - } - return navigation -} diff --git a/src/hooks/useRouteNavCompare.jsx b/src/hooks/useRouteNavCompare.jsx deleted file mode 100644 index aee23a37474d..000000000000 --- a/src/hooks/useRouteNavCompare.jsx +++ /dev/null @@ -1,33 +0,0 @@ -import { useLoadClientPrincipalQuery } from 'src/store/api/auth' -import { useDispatch } from 'react-redux' -import { updateAccessToken } from 'src/store/features/auth' -import routes from 'src/routes' - -export const useRouteNavCompare = (navigation) => { - const dispatch = useDispatch() - const { data: profile, isFetching } = useLoadClientPrincipalQuery() - if (isFetching) { - return { isLoading: true, component: null } - } - dispatch(updateAccessToken(profile)) - let roles = profile?.clientPrincipal?.userRoles || [] - let newNavigation = navigation.map((nav) => { - if (nav.items) { - nav.items = nav.items.filter((item) => { - const route = routes.find((r) => r.path === item.to) - if ( - !route || - (route.allowedRoles && route.allowedRoles.some((role) => roles.includes(role))) - ) { - return true - } else { - console.log('Removing route', item) - return false - } - }) - } - return nav - }) - - return newNavigation -} diff --git a/src/routes.js b/src/routes.js new file mode 100644 index 000000000000..794ebb4b4c4d --- /dev/null +++ b/src/routes.js @@ -0,0 +1,714 @@ +import React from 'react' +import MailTest from 'src/views/email-exchange/tools/MailTest' + +const Home = React.lazy(() => import('src/views/home/Home')) +const Logs = React.lazy(() => import('src/views/cipp/Logs')) +const Scheduler = React.lazy(() => import('src/views/cipp/Scheduler')) +const Statistics = React.lazy(() => import('src/views/cipp/Statistics')) +const Users = React.lazy(() => import('src/views/identity/administration/Users')) +const DeletedItems = React.lazy(() => import('src/views/identity/administration/Deleted')) +const ViewBEC = React.lazy(() => import('src/views/identity/administration/ViewBEC')) +const AddUser = React.lazy(() => import('src/views/identity/administration/AddUser')) +const AddUserBulk = React.lazy(() => import('src/views/identity/administration/AddUserBulk')) + +const InviteGuest = React.lazy(() => import('src/views/identity/administration/InviteGuest')) +const EditUser = React.lazy(() => import('src/views/identity/administration/EditUser')) +const ViewUser = React.lazy(() => import('src/views/identity/administration/ViewUser')) +const Groups = React.lazy(() => import('src/views/identity/administration/Groups')) +const AddGroup = React.lazy(() => import('src/views/identity/administration/AddGroup')) +const UserSettings = React.lazy(() => import('src/views/cipp/UserSettings')) + +const AddGroupTemplates = React.lazy(() => + import('src/views/identity/administration/AddGroupTemplate'), +) +const DeployGroupTemplates = React.lazy(() => + import('src/views/identity/administration/DeployGroupTemplate'), +) +const GeoIPLookup = React.lazy(() => import('src/views/tenant/administration/GeoIPLookup')) + +const TenantLookup = React.lazy(() => import('src/views/tenant/administration/TenantLookup')) + +const GroupTemplates = React.lazy(() => import('src/views/identity/administration/GroupTemplates')) + +const EditGroup = React.lazy(() => import('src/views/identity/administration/EditGroup')) +const ViewGroup = React.lazy(() => import('src/views/identity/administration/ViewGroup')) +const Roles = React.lazy(() => import('src/views/identity/administration/Roles')) +const Devices = React.lazy(() => import('src/views/endpoint/intune/Devices')) +const allDevices = React.lazy(() => import('src/views/identity/administration/Devices')) + +const PageLogOut = React.lazy(() => import('src/views/pages/LogoutRedirect/PageLogOut')) + +const Page404 = React.lazy(() => import('src/views/pages/page404/Page404')) +const Page403 = React.lazy(() => import('src/views/pages/page403/Page403')) +const Page500 = React.lazy(() => import('src/views/pages/page500/Page500')) + +const MFAReport = React.lazy(() => import('src/views/identity/reports/MFAReport')) +const Tenants = React.lazy(() => import('src/views/tenant/administration/Tenants')) +const AlertWizard = React.lazy(() => import('src/views/tenant/administration/AlertWizard')) +const AlertRules = React.lazy(() => import('src/views/tenant/administration/AlertRules')) + +const AlertsQueue = React.lazy(() => import('src/views/tenant/administration/ListAlertsQueue')) +const GraphExplorer = React.lazy(() => import('src/views/tenant/administration/GraphExplorer')) + +const Domains = React.lazy(() => import('src/views/tenant/administration/Domains')) +const EditTenant = React.lazy(() => import('src/views/tenant/administration/EditTenant')) +const ConditionalAccess = React.lazy(() => import('src/views/tenant/conditional/ConditionalAccess')) +const DeployVacationCA = React.lazy(() => import('src/views/tenant/conditional/DeployVacation')) +const NamedLocations = React.lazy(() => import('src/views/tenant/conditional/NamedLocations')) + +const ListConditionalTemplates = React.lazy(() => + import('src/views/tenant/conditional/ListCATemplates'), +) + +const DeployNamedLocation = React.lazy(() => + import('src/views/tenant/conditional/DeployNamedLocation'), +) +const AddConditionalTemplate = React.lazy(() => + import('src/views/tenant/conditional/AddCATemplate'), +) + +const DeployConditional = React.lazy(() => import('src/views/tenant/conditional/DeployCA')) + +const ListLicences = React.lazy(() => import('src/views/tenant/administration/ListLicences')) +const ListAppConsent = React.lazy(() => import('src/views/tenant/administration/ListOauthApps')) + +const InActiveUserReport = React.lazy(() => import('src/views/identity/reports/InactiveUsers')) +const SignInReport = React.lazy(() => import('src/views/identity/reports/SignIns')) + +const AzureADConnectReport = React.lazy(() => + import('src/views/identity/reports/AzureADConnectReport'), +) +const DeviceComplianceReport = React.lazy(() => + import('src/views/security/reports/ListDeviceComplianceReport'), +) +const BestPracticeAnalyzer = React.lazy(() => + import('src/views/tenant/standards/BestPracticeAnalyser'), +) +const BPAReportBuilder = React.lazy(() => import('src/views/tenant/standards/BPAReportBuilder')) +const DomainsAnalyser = React.lazy(() => import('src/views/tenant/standards/DomainsAnalyser')) +const OffboardingWizard = React.lazy(() => + import('src/views/identity/administration/OffboardingWizard'), +) +const ListAppliedStandards = React.lazy(() => + import('src/views/tenant/standards/ListAppliedStandards'), +) +const IndividualDomain = React.lazy(() => import('src/views/tenant/standards/IndividualDomain')) +const ListAlerts = React.lazy(() => import('src/views/security/incidents/ListAlerts')) +const ApplicationsList = React.lazy(() => + import('src/views/endpoint/applications/ApplicationsList'), +) +const ApplicationsQueue = React.lazy(() => + import('src/views/endpoint/applications/ListApplicationQueue'), +) +const ApplicationsAddChocoApp = React.lazy(() => + import('src/views/endpoint/applications/ApplicationsAddChocoApp'), +) +const ApplicationsAddWingetApp = React.lazy(() => + import('src/views/endpoint/applications/ApplicationsAddWinGet'), +) +const ApplicationsAddOfficeApp = React.lazy(() => + import('src/views/endpoint/applications/ApplicationsAddOffice'), +) +const ApplicationsAddRMMApp = React.lazy(() => + import('src/views/endpoint/applications/ApplicationsAddRMM'), +) +const AutopilotAddDevice = React.lazy(() => + import('src/views/endpoint/autopilot/AutopilotAddDevice'), +) +const AutopilotAddProfile = React.lazy(() => + import('src/views/endpoint/autopilot/AutopilotAddProfile'), +) +const AutopilotAddStatusPage = React.lazy(() => + import('src/views/endpoint/autopilot/AutopilotAddStatusPage'), +) +const AutopilotListDevices = React.lazy(() => + import('src/views/endpoint/autopilot/AutopilotListDevices'), +) +const AutopilotListProfiles = React.lazy(() => + import('src/views/endpoint/autopilot/AutopilotListProfiles'), +) +const AutopilotListStatusPages = React.lazy(() => + import('src/views/endpoint/autopilot/AutopilotListStatusPages'), +) +const IntuneListPolicies = React.lazy(() => import('src/views/endpoint/intune/MEMListPolicies')) +const IntuneListCompliance = React.lazy(() => import('src/views/endpoint/intune/MEMListCompliance')) + +const IntuneListAppProtection = React.lazy(() => + import('src/views/endpoint/intune/MEMListAppProtection'), +) + +const MEMEditPolicy = React.lazy(() => import('src/views/endpoint/intune/MEMEditPolicy')) + +const IntuneCAPolicies = React.lazy(() => import('src/views/endpoint/intune/MEMCAPolicies')) +const IntuneAddPolicy = React.lazy(() => import('src/views/endpoint/intune/MEMAddPolicy')) +const MEMAddPolicyTemplate = React.lazy(() => + import('src/views/endpoint/intune/MEMAddPolicyTemplate'), +) +const IntuneListPolicyTemplate = React.lazy(() => + import('src/views/endpoint/intune/MEMListPolicyTemplates'), +) +const ListDefender = React.lazy(() => import('src/views/security/defender/ListDefender')) +const ListVulnerabilities = React.lazy(() => import('src/views/security/defender/ListVuln')) + +const DeployDefender = React.lazy(() => import('src/views/security/defender/DeployDefender')) + +const OneDriveList = React.lazy(() => import('src/views/teams-share/onedrive/OneDriveList')) +const SharepointList = React.lazy(() => import('src/views/teams-share/sharepoint/SharepointList')) +const BusinessVoice = React.lazy(() => import('src/views/teams-share/teams/BusinessVoice')) +const TeamsListTeam = React.lazy(() => import('src/views/teams-share/teams/TeamsListTeam')) +const TeamsAddTeam = React.lazy(() => import('src/views/teams-share/teams/TeamsAddTeam')) +const ViewTeamsSettings = React.lazy(() => import('src/views/teams-share/teams/ViewTeamSettings')) +const TeamsActivity = React.lazy(() => import('src/views/teams-share/teams/TeamsActivity')) +const ContactsList = React.lazy(() => + import('src/views/email-exchange/administration/ContactsList'), +) +const EditContact = React.lazy(() => import('src/views/email-exchange/administration/EditContact')) +const EditMailboxPermissions = React.lazy(() => + import('src/views/email-exchange/administration/EditMailboxPermissions'), +) +const AddSharedMailbox = React.lazy(() => + import('src/views/email-exchange/administration/AddSharedMailbox'), +) +const AddContact = React.lazy(() => import('src/views/email-exchange/administration/AddContact')) +const EditCalendarPermissions = React.lazy(() => + import('src/views/email-exchange/administration/EditCalendarPermissions'), +) +const ViewMobileDevices = React.lazy(() => + import('src/views/email-exchange/administration/ViewMobileDevices'), +) +const MailboxesList = React.lazy(() => + import('src/views/email-exchange/administration/MailboxesList'), +) +const MailboxRulesList = React.lazy(() => + import('src/views/email-exchange/administration/MailboxRuleList'), +) +const QuarantineList = React.lazy(() => + import('src/views/email-exchange/administration/QuarantineList'), +) +const MailboxClientAccessSettingsList = React.lazy(() => + import('src/views/email-exchange/reports/MailboxClientAccessSettingsList'), +) +const MailboxStatisticsList = React.lazy(() => + import('src/views/email-exchange/reports/MailboxStatisticsList'), +) +const SharedMailboxEnabledAccount = React.lazy(() => + import('src/views/email-exchange/reports/SharedMailboxEnabledAccount'), +) +const MessageTrace = React.lazy(() => import('src/views/email-exchange/reports/MessageTrace')) +const PhishingPoliciesList = React.lazy(() => + import('src/views/email-exchange/reports/PhishingPoliciesList'), +) +const TransportRulesList = React.lazy(() => + import('src/views/email-exchange/transport/TransportRules'), +) +const TransportTemplate = React.lazy(() => + import('src/views/email-exchange/transport/ListTransportTemplates'), +) +const AddTransportTemplate = React.lazy(() => + import('src/views/email-exchange/transport/AddTransportTemplate'), +) +const TransportDeploy = React.lazy(() => + import('src/views/email-exchange/transport/DeployTransport'), +) +const SpamfilterList = React.lazy(() => import('src/views/email-exchange/spamfilter/Spamfilter')) +const SpamFilterTemplate = React.lazy(() => + import('src/views/email-exchange/spamfilter/ListSpamfilterTemplates'), +) +const AddSpamFilterTemplate = React.lazy(() => + import('src/views/email-exchange/spamfilter/AddSpamfilterTemplate'), +) +const SpamFilterDeploy = React.lazy(() => + import('src/views/email-exchange/spamfilter/DeploySpamfilter'), +) +const ConnectorList = React.lazy(() => import('src/views/email-exchange/connectors/ConnectorList')) +const ConnectorListTemplates = React.lazy(() => + import('src/views/email-exchange/connectors/ListConnectorTemplates'), +) +const DeployConnector = React.lazy(() => + import('src/views/email-exchange/connectors/DeployConnector'), +) +const AddConnectorTemplate = React.lazy(() => + import('src/views/email-exchange/connectors/AddConnectorTemplate'), +) + +const SecurityComplianceAlerts = React.lazy(() => import('src/views/security/incidents/ListAlerts')) +const SecurityComplianceIncidents = React.lazy(() => + import('src/views/security/incidents/ListIncidents'), +) +const License = React.lazy(() => import('src/views/pages/license/License')) +const ServiceHealth = React.lazy(() => import('src/views/tenant/administration/ServiceHealth')) + +const EnterpriseApplications = React.lazy(() => + import('src/views/tenant/administration/ListEnterpriseApps'), +) +const AppConsentRequests = React.lazy(() => + import('src/views/tenant/administration/ListAppConsentRequests'), +) +const MailboxRestoreWizard = React.lazy(() => + import('src/views/email-exchange/tools/MailboxRestoreWizard'), +) +const MailboxRestores = React.lazy(() => import('src/views/email-exchange/tools/MailboxRestores')) +const Mailtest = React.lazy(() => import('src/views/email-exchange/tools/MailTest')) + +const routes = [ + // { path: '/', exact: true, name: 'Home' }, + { path: '/home', name: 'Home', component: Home }, + { path: '/cipp/logs', name: 'Logs', component: Logs }, + { path: '/cipp/scheduler', name: 'Scheduler', component: Scheduler }, + { path: '/cipp/statistics', name: 'Statistics', component: Statistics }, + { path: '/cipp/404', name: 'Error', component: Page404 }, + { path: '/cipp/403', name: 'Error', component: Page403 }, + { path: '/cipp/500', name: 'Error', component: Page500 }, + { path: '/identity', name: 'Identity' }, + { path: '/identity/administration/users/add', name: 'Add User', component: AddUser }, + { + path: '/identity/administration/users/addbulk', + name: 'Add User Bulk', + component: AddUserBulk, + }, + + { path: '/identity/administration/users/edit', name: 'Edit User', component: EditUser }, + { path: '/identity/administration/users/view', name: 'View User', component: ViewUser }, + { + path: '/identity/administration/users/InviteGuest', + name: 'Invite Guest', + component: InviteGuest, + }, + { path: '/identity/administration/ViewBec', name: 'View BEC', component: ViewBEC }, + { path: '/identity/administration', name: 'Administration' }, + { path: '/identity/administration/users', name: 'Users', component: Users }, + { path: '/identity/administration/devices', name: 'Devices', component: allDevices }, + + { path: '/identity/administration/groups/add', name: 'Add Group', component: AddGroup }, + { + path: '/identity/administration/group-templates', + name: 'Group Templates', + component: GroupTemplates, + }, + { + path: '/identity/administration/group-add-template', + name: 'Add Group Template', + component: AddGroupTemplates, + }, + { + path: '/identity/administration/deploy-group-template', + name: 'Deploy Group Template', + component: DeployGroupTemplates, + }, + { path: '/identity/administration/groups/edit', name: 'Edit Group', component: EditGroup }, + { path: '/identity/administration/groups/view', name: 'View Group', component: ViewGroup }, + { path: '/identity/administration/groups', name: 'Groups', component: Groups }, + { path: '/identity/administration/roles', name: 'Roles', component: Roles }, + { + path: '/identity/administration/deleted-items', + name: 'Deleted Items', + component: DeletedItems, + }, + + { path: '/teams-share/teams/business-voice', name: 'BusinessVoice', component: BusinessVoice }, + { + path: '/identity/administration/offboarding-wizard', + name: 'Offboarding Wizard', + component: OffboardingWizard, + }, + { path: '/identity/reports', name: 'Reports' }, + { path: '/endpoint/reports/devices', name: 'Devices', component: Devices }, + { path: '/identity/reports/mfa-report', name: 'MFA Report', component: MFAReport }, + { + path: '/identity/reports/inactive-users-report', + name: 'Inactive Users Report', + component: InActiveUserReport, + }, + { + path: '/identity/reports/Signin-report', + name: 'Sign-In Report', + component: SignInReport, + }, + { + path: '/identity/reports/azure-ad-connect-report', + name: 'AAD Connect Report', + component: AzureADConnectReport, + }, + { path: '/tenant', name: 'Tenant' }, + { path: '/tenant/administration', name: 'Administration' }, + { path: '/tenant/administration/tenants', name: 'Tenants', component: Tenants }, + { path: '/tenant/administration/tenants/edit', name: 'Edit Tenant', component: EditTenant }, + { path: '/tenant/administration/domains', name: 'Domains', component: Domains }, + { path: '/tenant/administration/alertswizard', name: 'Alerts Wizard', component: AlertWizard }, + { path: '/tenant/administration/alertrules', name: 'Alerts Wizard', component: AlertRules }, + + { path: '/tenant/administration/alertsqueue', name: 'Alerts Queue', component: AlertsQueue }, + { + path: '/tenant/administration/graph-explorer', + name: 'Graph Explorer', + component: GraphExplorer, + }, + { + path: '/tenant/administration/service-health', + name: 'Service Health', + component: ServiceHealth, + }, + { + path: '/tenant/administration/enterprise-apps', + name: 'Enterprise Applications', + component: EnterpriseApplications, + }, + { + path: '/tenant/administration/app-consent-requests', + name: 'App Consent Requests', + component: AppConsentRequests, + }, + { + path: '/tenant/conditional/list-policies', + name: 'Conditional Access', + component: ConditionalAccess, + }, + { + path: '/tenant/conditional/deploy-vacation', + name: 'Deploy Vacation Mode', + component: DeployVacationCA, + }, + { + path: '/tenant/conditional/list-named-locations', + name: 'Named Locations', + component: NamedLocations, + }, + { + path: '/tenant/conditional/deploy', + name: 'Deploy Conditional Access', + component: DeployConditional, + }, + { + path: '/tenant/conditional/deploy-named-location', + name: 'Deploy Named Locations', + component: DeployNamedLocation, + }, + { + path: '/tenant/conditional/list-template', + name: 'Conditional Access Templates', + component: ListConditionalTemplates, + }, + { + path: '/tenant/conditional/add-template', + name: 'Conditional Access Add Template', + component: AddConditionalTemplate, + }, + { + path: '/tenant/administration/list-licenses', + name: 'List Licenses', + component: ListLicences, + }, + { + path: '/tenant/administration/application-consent', + name: 'Consented Applications', + component: ListAppConsent, + }, + { path: '/tenant/standards', name: 'Standards' }, + { + path: '/tenant/standards/list-applied-standards', + name: 'List Applied Standards', + component: ListAppliedStandards, + }, + { + path: '/tenant/standards/bpa-report', + name: 'Best Practice Report', + component: BestPracticeAnalyzer, + }, + { + path: '/tenant/standards/domains-analyser', + name: 'Domains Analyser', + component: DomainsAnalyser, + }, + { + path: '/tenant/standards/individual-domains', + name: 'Individual Domain Check', + component: IndividualDomain, + }, + { + path: '/tenant/administration/tenantlookup', + name: 'Tenant Lookup', + component: TenantLookup, + }, + { + path: '/tenant/tools/geoiplookup', + name: 'Geo IP Lookup', + component: GeoIPLookup, + }, + { + path: '/tenant/tools/bpa-report-builder', + name: 'BPA Report Builder', + component: BPAReportBuilder, + }, + { path: '/tenant/standards/alert-list', name: 'Alert List (Alpha)', component: ListAlerts }, + { path: '/endpoint', name: 'Endpoint' }, + { path: '/endpoint/applications', name: 'Applications' }, + { path: '/endpoint/applications/list', name: 'List Applications', component: ApplicationsList }, + { path: '/endpoint/applications/queue', name: 'Application Queue', component: ApplicationsQueue }, + + { + path: '/endpoint/applications/add-choco-app', + name: 'Add Choco App', + component: ApplicationsAddChocoApp, + }, + { + path: '/endpoint/applications/add-winget-app', + name: 'Add Store App', + component: ApplicationsAddWingetApp, + }, + { + path: '/endpoint/applications/add-office-app', + name: 'Add Office App', + component: ApplicationsAddOfficeApp, + }, + { + path: '/endpoint/applications/add-rmm-app', + name: 'Add RMM App', + component: ApplicationsAddRMMApp, + }, + { path: '/endpoint/autopilot', name: 'Autopilot' }, + { path: '/endpoint/autopilot/add-device', name: 'Add Device', component: AutopilotAddDevice }, + { path: '/endpoint/autopilot/add-profile', name: 'Add Profile', component: AutopilotAddProfile }, + { + path: '/endpoint/autopilot/add-status-page', + name: 'Add Status Page', + component: AutopilotAddStatusPage, + }, + { + path: '/endpoint/autopilot/list-devices', + name: 'List Devices', + component: AutopilotListDevices, + }, + { + path: '/endpoint/autopilot/list-profiles', + name: 'List Profiles', + component: AutopilotListProfiles, + }, + { + path: '/endpoint/autopilot/list-status-pages', + name: 'List Status Pages', + component: AutopilotListStatusPages, + }, + { path: '/endpoint/MEM', name: 'MEM' }, + { + path: '/endpoint/MEM/list-policies', + name: 'List Intune Policies', + component: IntuneListPolicies, + }, + { + path: '/endpoint/MEM/list-compliance-policies', + name: 'List Intune Compliance Policies', + component: IntuneListCompliance, + }, + { + path: '/endpoint/MEM/list-appprotection-policies', + name: 'List App Protection Policies', + component: IntuneListAppProtection, + }, + + { path: '/endpoint/MEM/edit-policy', name: 'Edit MEM Policy', component: MEMEditPolicy }, + { path: '/endpoint/MEM/ca-policies', name: 'List Status Pages', component: IntuneCAPolicies }, + { path: '/endpoint/MEM/add-policy', name: 'Add Intune Policy', component: IntuneAddPolicy }, + { + path: '/endpoint/MEM/add-policy-template', + name: 'Add Endpoint Manager Policy Template', + component: MEMAddPolicyTemplate, + }, + { + path: '/endpoint/MEM/list-templates', + name: 'List Intune Policy Template', + component: IntuneListPolicyTemplate, + }, + { path: '/security/defender', name: 'Defender' }, + { path: '/security/defender/deployment', name: 'Deploy Defender', component: DeployDefender }, + { path: '/security/defender/list-defender', name: 'List Defender', component: ListDefender }, + { + path: '/security/defender/list-defender-tvm', + name: 'List Vulnerabilities', + component: ListVulnerabilities, + }, + + { path: '/teams-share', name: 'Teams & SharePoint' }, + { path: '/teams-share/onedrive', name: 'OneDrive' }, + { path: '/teams-share/onedrive/list', name: 'List OneDrive', component: OneDriveList }, + { path: '/teams-share/sharepoint', name: 'SharePoint' }, + { + path: '/teams-share/sharepoint/list-sharepoint', + name: 'List SharePoint', + component: SharepointList, + }, + { path: '/teams-share/teams', name: 'Teams' }, + { path: '/teams-share/teams/list-team', name: 'List Teams', component: TeamsListTeam }, + { + path: '/teams-share/teams/view-team-settings', + name: 'View Team Settings', + component: ViewTeamsSettings, + }, + { path: '/teams-share/teams/add-team', name: 'Add Team', component: TeamsAddTeam }, + { path: '/teams-share/teams/teams-activity', name: 'Teams Activity', component: TeamsActivity }, + { name: 'Email & Exchange', path: '/email' }, + { name: 'Email Administration', path: '/email/administration' }, + { name: 'List Contacts', path: '/email/administration/contacts', component: ContactsList }, + { + path: '/email/connectors/list-connectors', + name: 'List Connectors', + component: ConnectorList, + }, + { + path: '/email/connectors/deploy-connector', + name: 'Deploy Connectors', + component: DeployConnector, + }, + { + path: '/email/connectors/add-connector-templates', + name: 'Add Connectors Templates', + component: AddConnectorTemplate, + }, + { + path: '/email/connectors/list-connector-templates', + name: 'List Connectors Templates', + component: ConnectorListTemplates, + }, + { + path: '/email/transport/list-rules', + name: 'List Transport Rules', + component: TransportRulesList, + }, + { + path: '/email/transport/deploy-rules', + name: 'Deploy Transport Rule', + component: TransportDeploy, + }, + { + path: '/email/transport/list-templates', + name: 'Transport Rule Templates', + component: TransportTemplate, + }, + { + path: '/email/transport/add-template', + name: 'Transport Rule Add Temmplate', + component: AddTransportTemplate, + }, + { + path: '/email/spamfilter/list-spamfilter', + name: 'List Spamfilter', + component: SpamfilterList, + }, + { + path: '/email/spamfilter/deploy', + name: 'Deploy Spamfilter', + component: SpamFilterDeploy, + }, + { + path: '/email/spamfilter/list-templates', + name: 'List Spamfilter Templates', + component: SpamFilterTemplate, + }, + { + path: '/email/tools/mailbox-restore-wizard', + name: 'Mailbox Restore Wizard', + component: MailboxRestoreWizard, + }, + { + path: '/email/tools/mailbox-restores', + name: 'Mailbox Restores', + component: MailboxRestores, + }, + { + path: '/email/tools/mail-test', + name: 'Mail Test', + component: MailTest, + }, + { + path: '/email/spamfilter/add-template', + name: 'Add Spamfilter Template', + component: AddSpamFilterTemplate, + }, + { + name: 'Edit Mailbox Permissions', + path: '/email/administration/edit-mailbox-permissions', + component: EditMailboxPermissions, + }, + { + name: 'Add Shared Mailbox', + path: '/email/administration/add-shared-mailbox', + component: AddSharedMailbox, + }, + { + name: 'Edit Contact', + path: '/email/administration/add-contact', + component: AddContact, + }, + { + name: 'Edit Calendar Permissions', + path: '/email/administration/edit-calendar-permissions', + component: EditCalendarPermissions, + }, + { + name: 'View Mobile Devices', + path: '/email/administration/view-mobile-devices', + component: ViewMobileDevices, + }, + { name: 'Edit Contact', path: '/email/administration/edit-contact', component: EditContact }, + { name: 'List Mailboxes', path: '/email/administration/mailboxes', component: MailboxesList }, + { + name: 'List Mailbox Rules', + path: '/email/administration/mailbox-rules', + component: MailboxRulesList, + }, + + { + name: 'List Quarantine', + path: '/email/administration/Quarantine', + component: QuarantineList, + }, + + { name: 'Email Reports', path: '/email/reports' }, + { + name: 'Mailbox Statistics', + path: '/email/reports/mailbox-statistics', + component: MailboxStatisticsList, + }, + { + name: 'Shared Mailbox Enabled Account', + path: '/email/reports/SharedMailboxEnabledAccount', + component: SharedMailboxEnabledAccount, + }, + { + name: 'Mailbox Client Access Settings', + path: '/email/reports/mailbox-cas-settings', + component: MailboxClientAccessSettingsList, + }, + { name: 'Message Trace', path: '/email/reports/message-trace', component: MessageTrace }, + { path: '/cipp/user-settings', name: 'User Settings', component: UserSettings }, + + { + name: 'Phishing Policies', + path: '/email/reports/phishing-policies', + component: PhishingPoliciesList, + }, + { name: 'Security & Compliance', path: '/security' }, + { name: 'Security Administration', path: '/security/administration' }, + { name: 'Security Reports', path: '/security/reports' }, + { + name: 'List Alerts', + path: '/security/incidents/list-alerts', + component: SecurityComplianceAlerts, + }, + { + name: 'List Incidents', + path: '/security/incidents/list-incidents', + component: SecurityComplianceIncidents, + }, + { + name: 'List Device Compliance Report', + path: '/security/reports/list-device-compliance', + component: DeviceComplianceReport, + }, + { + name: 'License', + path: '/license', + component: License, + }, +] + +export default routes diff --git a/src/routes.json b/src/routes.json deleted file mode 100644 index bdb96a077822..000000000000 --- a/src/routes.json +++ /dev/null @@ -1,921 +0,0 @@ -[ - { - "path": "/home", - "name": "Home", - "component": "views/home/Home", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/cipp/logs", - "name": "Logs", - "component": "views/cipp/Logs", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/cipp/scheduler", - "name": "Scheduler", - "component": "views/cipp/Scheduler", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/cipp/statistics", - "name": "Statistics", - "component": "views/cipp/Statistics", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/cipp/404", - "name": "Error", - "component": "views/pages/page404/Page404", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/cipp/403", - "name": "Error", - "component": "views/pages/page403/Page403", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/cipp/500", - "name": "Error", - "component": "views/pages/page500/Page500", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity", - "name": "Identity", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration/users/add", - "name": "Add User", - "component": "views/identity/administration/AddUser", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration/users/addbulk", - "name": "Add User Bulk", - "component": "views/identity/administration/AddUserBulk", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration/users/edit", - "name": "Edit User", - "component": "views/identity/administration/EditUser", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration/users/view", - "name": "View User", - "component": "views/identity/administration/ViewUser", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration/users/InviteGuest", - "name": "Invite Guest", - "component": "views/identity/administration/InviteGuest", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration/ViewBec", - "name": "View BEC", - "component": "views/identity/administration/ViewBEC", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration", - "name": "Administration", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration/users", - "name": "Users", - "component": "views/identity/administration/Users", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration/devices", - "name": "Devices", - "component": "views/identity/administration/Devices", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration/groups/add", - "name": "Add Group", - "component": "views/identity/administration/AddGroup", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration/group-templates", - "name": "Group Templates", - "component": "views/identity/administration/GroupTemplates", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration/group-add-template", - "name": "Add Group Template", - "component": "views/identity/administration/AddGroupTemplate", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration/deploy-group-template", - "name": "Deploy Group Template", - "component": "views/identity/administration/DeployGroupTemplate", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration/groups/edit", - "name": "Edit Group", - "component": "views/identity/administration/EditGroup", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration/groups/view", - "name": "View Group", - "component": "views/identity/administration/ViewGroup", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration/groups", - "name": "Groups", - "component": "views/identity/administration/Groups", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration/roles", - "name": "Roles", - "component": "views/identity/administration/Roles", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration/deleted-items", - "name": "Deleted Items", - "component": "views/identity/administration/Deleted", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/teams-share/teams/business-voice", - "name": "BusinessVoice", - "component": "views/teams-share/teams/BusinessVoice", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/administration/offboarding-wizard", - "name": "Offboarding Wizard", - "component": "views/identity/administration/OffboardingWizard", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/reports", - "name": "Reports", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/reports/devices", - "name": "Devices", - "component": "views/endpoint/intune/Devices", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/reports/mfa-report", - "name": "MFA Report", - "component": "views/identity/reports/MFAReport", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/reports/inactive-users-report", - "name": "Inactive Users Report", - "component": "views/identity/reports/InactiveUsers", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/reports/Signin-report", - "name": "Sign-In Report", - "component": "views/identity/reports/SignIns", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/identity/reports/azure-ad-connect-report", - "name": "AAD Connect Report", - "component": "views/identity/reports/AzureADConnectReport", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant", - "name": "Tenant", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/administration", - "name": "Administration", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/administration/tenants", - "name": "Tenants", - "component": "views/tenant/administration/Tenants", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/administration/tenants/edit", - "name": "Edit Tenant", - "component": "views/tenant/administration/EditTenant", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/administration/domains", - "name": "Domains", - "component": "views/tenant/administration/Domains", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/administration/alertswizard", - "name": "Alerts Wizard", - "component": "views/tenant/administration/AlertWizard", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/administration/alertrules", - "name": "Alerts Wizard", - "component": "views/tenant/administration/AlertRules", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/administration/alertsqueue", - "name": "Alerts Queue", - "component": "views/tenant/administration/ListAlertsQueue", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/administration/graph-explorer", - "name": "Graph Explorer", - "component": "views/tenant/administration/GraphExplorer", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/administration/service-health", - "name": "Service Health", - "component": "views/tenant/administration/ServiceHealth", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/administration/enterprise-apps", - "name": "Enterprise Applications", - "component": "views/tenant/administration/ListEnterpriseApps", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/administration/app-consent-requests", - "name": "App Consent Requests", - "component": "views/tenant/administration/ListAppConsentRequests", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/conditional/list-policies", - "name": "Conditional Access", - "component": "views/tenant/conditional/ConditionalAccess", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/conditional/deploy-vacation", - "name": "Deploy Vacation Mode", - "component": "views/tenant/conditional/DeployVacation", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/conditional/list-named-locations", - "name": "Named Locations", - "component": "views/tenant/conditional/NamedLocations", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/conditional/deploy", - "name": "Deploy Conditional Access", - "component": "views/tenant/conditional/DeployCA", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/conditional/deploy-named-location", - "name": "Deploy Named Locations", - "component": "views/tenant/conditional/DeployNamedLocation", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/conditional/list-template", - "name": "Conditional Access Templates", - "component": "views/tenant/conditional/ListCATemplates", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/conditional/add-template", - "name": "Conditional Access Add Template", - "component": "views/tenant/conditional/AddCATemplate", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/administration/list-licenses", - "name": "List Licenses", - "component": "views/tenant/administration/ListLicences", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/administration/application-consent", - "name": "Consented Applications", - "component": "views/tenant/administration/ListOauthApps", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/standards", - "name": "Standards", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/standards/list-applied-standards", - "name": "List Applied Standards", - "component": "views/tenant/standards/ListAppliedStandards", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/standards/bpa-report", - "name": "Best Practice Report", - "component": "views/tenant/standards/BestPracticeAnalyser", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/standards/domains-analyser", - "name": "Domains Analyser", - "component": "views/tenant/standards/DomainsAnalyser", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/standards/individual-domains", - "name": "Individual Domain Check", - "component": "views/tenant/standards/IndividualDomain", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/administration/tenantlookup", - "name": "Tenant Lookup", - "component": "views/tenant/administration/TenantLookup", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/tools/geoiplookup", - "name": "Geo IP Lookup", - "component": "views/tenant/administration/GeoIPLookup", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/tools/bpa-report-builder", - "name": "BPA Report Builder", - "component": "views/tenant/standards/BPAReportBuilder", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/tenant/standards/alert-list", - "name": "Alert List (Alpha)", - "component": "views/security/incidents/ListAlerts", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint", - "name": "Endpoint", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/applications", - "name": "Applications", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/applications/list", - "name": "List Applications", - "component": "views/endpoint/applications/ApplicationsList", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/applications/queue", - "name": "Application Queue", - "component": "views/endpoint/applications/ListApplicationQueue", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/applications/add-choco-app", - "name": "Add Choco App", - "component": "views/endpoint/applications/ApplicationsAddChocoApp", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/applications/add-winget-app", - "name": "Add Store App", - "component": "views/endpoint/applications/ApplicationsAddWinGet", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/applications/add-office-app", - "name": "Add Office App", - "component": "views/endpoint/applications/ApplicationsAddOffice", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/applications/add-rmm-app", - "name": "Add RMM App", - "component": "views/endpoint/applications/ApplicationsAddRMM", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/autopilot", - "name": "Autopilot", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/autopilot/add-device", - "name": "Add Device", - "component": "views/endpoint/autopilot/AutopilotAddDevice", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/autopilot/add-profile", - "name": "Add Profile", - "component": "views/endpoint/autopilot/AutopilotAddProfile", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/autopilot/add-status-page", - "name": "Add Status Page", - "component": "views/endpoint/autopilot/AutopilotAddStatusPage", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/autopilot/list-devices", - "name": "List Devices", - "component": "views/endpoint/autopilot/AutopilotListDevices", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/autopilot/list-profiles", - "name": "List Profiles", - "component": "views/endpoint/autopilot/AutopilotListProfiles", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/autopilot/list-status-pages", - "name": "List Status Pages", - "component": "views/endpoint/autopilot/AutopilotListStatusPages", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/MEM", - "name": "MEM", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/MEM/list-policies", - "name": "List Intune Policies", - "component": "views/endpoint/intune/MEMListPolicies", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/MEM/list-compliance-policies", - "name": "List Intune Compliance Policies", - "component": "views/endpoint/intune/MEMListCompliance", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/MEM/list-appprotection-policies", - "name": "List App Protection Policies", - "component": "views/endpoint/intune/MEMListAppProtection", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/MEM/edit-policy", - "name": "Edit MEM Policy", - "component": "views/endpoint/intune/MEMEditPolicy", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/MEM/ca-policies", - "name": "List Status Pages", - "component": "views/endpoint/intune/MEMCAPolicies", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/MEM/add-policy", - "name": "Add Intune Policy", - "component": "views/endpoint/intune/MEMAddPolicy", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/MEM/add-policy-template", - "name": "Add Endpoint Manager Policy Template", - "component": "views/endpoint/intune/MEMAddPolicyTemplate", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/endpoint/MEM/list-templates", - "name": "List Intune Policy Template", - "component": "views/endpoint/intune/MEMListPolicyTemplates", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/security/defender", - "name": "Defender", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/security/defender/deployment", - "name": "Deploy Defender", - "component": "views/security/defender/DeployDefender", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/security/defender/list-defender", - "name": "List Defender", - "component": "views/security/defender/ListDefender", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/security/defender/list-defender-tvm", - "name": "List Vulnerabilities", - "component": "views/security/defender/ListVuln", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/teams-share", - "name": "Teams & SharePoint", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/teams-share/onedrive", - "name": "OneDrive", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/teams-share/onedrive/list", - "name": "List OneDrive", - "component": "views/teams-share/onedrive/OneDriveList", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/teams-share/sharepoint", - "name": "SharePoint", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/teams-share/sharepoint/list-sharepoint", - "name": "List SharePoint", - "component": "views/teams-share/sharepoint/SharepointList", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/teams-share/teams", - "name": "Teams", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/teams-share/teams/list-team", - "name": "List Teams", - "component": "views/teams-share/teams/TeamsListTeam", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/teams-share/teams/view-team-settings", - "name": "View Team Settings", - "component": "views/teams-share/teams/ViewTeamSettings", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/teams-share/teams/add-team", - "name": "Add Team", - "component": "views/teams-share/teams/TeamsAddTeam", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/teams-share/teams/teams-activity", - "name": "Teams Activity", - "component": "views/teams-share/teams/TeamsActivity", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "Email & Exchange", - "path": "/email", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "Email Administration", - "path": "/email/administration", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "List Contacts", - "path": "/email/administration/contacts", - "component": "views/email-exchange/administration/ContactsList", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/email/connectors/list-connectors", - "name": "List Connectors", - "component": "views/email-exchange/connectors/ConnectorList", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/email/connectors/deploy-connector", - "name": "Deploy Connectors", - "component": "views/email-exchange/connectors/DeployConnector", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/email/connectors/add-connector-templates", - "name": "Add Connectors Templates", - "component": "views/email-exchange/connectors/AddConnectorTemplate", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/email/connectors/list-connector-templates", - "name": "List Connectors Templates", - "component": "views/email-exchange/connectors/ListConnectorTemplates", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/email/transport/list-rules", - "name": "List Transport Rules", - "component": "views/email-exchange/transport/TransportRules", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/email/transport/deploy-rules", - "name": "Deploy Transport Rule", - "component": "views/email-exchange/transport/DeployTransport", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/email/transport/list-templates", - "name": "Transport Rule Templates", - "component": "views/email-exchange/transport/ListTransportTemplates", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/email/transport/add-template", - "name": "Transport Rule Add Temmplate", - "component": "views/email-exchange/transport/AddTransportTemplate", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/email/spamfilter/list-spamfilter", - "name": "List Spamfilter", - "component": "views/email-exchange/spamfilter/Spamfilter", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/email/spamfilter/deploy", - "name": "Deploy Spamfilter", - "component": "views/email-exchange/spamfilter/DeploySpamfilter", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/email/spamfilter/list-templates", - "name": "List Spamfilter Templates", - "component": "views/email-exchange/spamfilter/ListSpamfilterTemplates", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/email/tools/mailbox-restore-wizard", - "name": "Mailbox Restore Wizard", - "component": "views/email-exchange/tools/MailboxRestoreWizard", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/email/tools/mailbox-restores", - "name": "Mailbox Restores", - "component": "views/email-exchange/tools/MailboxRestores", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/email/tools/mail-test", - "name": "Mail Test", - "component": "views/email-exchange/tools/MailTest", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/email/spamfilter/add-template", - "name": "Add Spamfilter Template", - "component": "views/email-exchange/spamfilter/AddSpamfilterTemplate", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "Edit Mailbox Permissions", - "path": "/email/administration/edit-mailbox-permissions", - "component": "views/email-exchange/administration/EditMailboxPermissions", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "Add Shared Mailbox", - "path": "/email/administration/add-shared-mailbox", - "component": "views/email-exchange/administration/AddSharedMailbox", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "Edit Contact", - "path": "/email/administration/add-contact", - "component": "views/email-exchange/administration/AddContact", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "Edit Calendar Permissions", - "path": "/email/administration/edit-calendar-permissions", - "component": "views/email-exchange/administration/EditCalendarPermissions", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "View Mobile Devices", - "path": "/email/administration/view-mobile-devices", - "component": "views/email-exchange/administration/ViewMobileDevices", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "Edit Contact", - "path": "/email/administration/edit-contact", - "component": "views/email-exchange/administration/EditContact", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "List Mailboxes", - "path": "/email/administration/mailboxes", - "component": "views/email-exchange/administration/MailboxesList", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "List Mailbox Rules", - "path": "/email/administration/mailbox-rules", - "component": "views/email-exchange/administration/MailboxRuleList", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "List Quarantine", - "path": "/email/administration/Quarantine", - "component": "views/email-exchange/administration/QuarantineList", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "Email Reports", - "path": "/email/reports", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "Mailbox Statistics", - "path": "/email/reports/mailbox-statistics", - "component": "views/email-exchange/reports/MailboxStatisticsList", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "Shared Mailbox Enabled Account", - "path": "/email/reports/SharedMailboxEnabledAccount", - "component": "views/email-exchange/reports/SharedMailboxEnabledAccount", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "Mailbox Client Access Settings", - "path": "/email/reports/mailbox-cas-settings", - "component": "views/email-exchange/reports/MailboxClientAccessSettingsList", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "Message Trace", - "path": "/email/reports/message-trace", - "component": "views/email-exchange/reports/MessageTrace", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/cipp/user-settings", - "name": "User Settings", - "component": "views/cipp/UserSettings", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "Phishing Policies", - "path": "/email/reports/phishing-policies", - "component": "views/email-exchange/reports/PhishingPoliciesList", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "Security & Compliance", - "path": "/security", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "Security Administration", - "path": "/security/administration", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "Security Reports", - "path": "/security/reports", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "List Alerts", - "path": "/security/incidents/list-alerts", - "component": "views/security/incidents/ListAlerts", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "List Incidents", - "path": "/security/incidents/list-incidents", - "component": "views/security/incidents/ListIncidents", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "List Device Compliance Report", - "path": "/security/reports/list-device-compliance", - "component": "views/security/reports/ListDeviceComplianceReport", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "name": "License", - "path": "/license", - "component": "views/pages/license/License", - "allowedRoles": ["admin", "editor", "readonly"] - }, - { - "path": "/cipp", - "name": "CIPP", - "allowedRoles": ["admin"] - }, - { - "path": "/cipp/cipp", - "name": "CIPP", - "allowedRoles": ["admin"] - }, - { - "path": "/cipp/settings", - "name": "Settings", - "component": "views/cipp/app-settings/CIPPSettings", - "allowedRoles": ["admin"] - }, - { - "path": "/cipp/setup", - "name": "Setup", - "component": "views/cipp/Setup", - "allowedRoles": ["admin"] - }, - { - "path": "/tenant/administration/gdap", - "name": "GDAP Wizard", - "component": "views/tenant/administration/GDAPWizard", - "allowedRoles": ["admin"] - }, - { - "path": "/tenant/administration/gdap-invite", - "name": "GDAP Invite Wizard", - "component": "views/tenant/administration/GDAPInviteWizard", - "allowedRoles": ["admin"] - }, - { - "path": "/tenant/administration/gdap-role-wizard", - "name": "GDAP Role Wizard", - "component": "views/tenant/administration/GDAPRoleWizard", - "allowedRoles": ["admin"] - }, - { - "path": "/tenant/administration/gdap-roles", - "name": "GDAP Roles", - "component": "views/tenant/administration/ListGDAPRoles", - "allowedRoles": ["admin"] - }, - { - "path": "/tenant/administration/gdap-relationships", - "name": "GDAP Relationships", - "component": "./views/tenant/administration/ListGDAPRelationships", - "allowedRoles": ["admin"] - }, - { - "path": "/tenant/administration/appapproval", - "name": "App Approval", - "component": "views/cipp/AppApproval", - "allowedRoles": ["admin"] - }, - { - "path": "/tenant/administration/gdap-status", - "name": "GDAP Status", - "component": "views/tenant/administration/ListGDAPQueue", - "allowedRoles": ["admin"] - }, - { - "path": "/tenant/standards/list-standards", - "name": "List Standard", - "component": "views/tenant/standards/ListStandards", - "allowedRoles": ["admin"] - }, - { - "path": "/tenant/administration/tenant-offboarding-wizard", - "name": "Tenant Offboarding", - "component": "views/tenant/administration/TenantOffboardingWizard", - "allowedRoles": ["admin"] - }, - { - "path": "/tenant/administration/tenant-onboarding-wizard", - "name": "Tenant Onboarding", - "component": "views/tenant/administration/TenantOnboardingWizard", - "allowedRoles": ["admin"] - } -] diff --git a/src/views/cipp/UserSettings.jsx b/src/views/cipp/UserSettings.jsx index 21ab0182287c..953d94df0d7c 100644 --- a/src/views/cipp/UserSettings.jsx +++ b/src/views/cipp/UserSettings.jsx @@ -14,9 +14,9 @@ import { import { useDispatch, useSelector } from 'react-redux' import { Form } from 'react-final-form' import { RFFCFormSwitch, RFFSelectSearch } from 'src/components/forms' -import _nav from 'src/_nav' import { useGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import 'react-datepicker/dist/react-datepicker.css' import TenantListSelector from 'src/components/utilities/TenantListSelector' @@ -204,34 +204,26 @@ const UserSettings = () => { isLoading={availableProperties.isFetching} /> - - -

    Favourite Menu Items

    -
    - acc.concat(val.items), []) - .map( - (item) => ( - console.log(item), - { - name: item?.name, - value: { to: item?.to, name: item?.name }, - } - ), - )} - allowCreate={false} - refreshFunction={() => - setRandom3((Math.random() + 1).toString(36).substring(7)) - } - isLoading={availableProperties.isFetching} - /> -
    + + + {addedAttributes > 0 && ( + setAddedAttribute(addedAttributes - 1)} + className={`circular-button`} + title={'-'} + > + + + )} + setAddedAttribute(addedAttributes + 1)} + className={`circular-button`} + title={'+'} + > + + + +
    diff --git a/src/views/email-exchange/tools/MailTest.jsx b/src/views/email-exchange/tools/MailTest.jsx index 633d351fd489..d433e658dba3 100644 --- a/src/views/email-exchange/tools/MailTest.jsx +++ b/src/views/email-exchange/tools/MailTest.jsx @@ -40,22 +40,22 @@ const MailTest = () => { }, { name: 'SPF', - selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'spf')[0]?.Status == 'pass', + selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'spf')[0].Status == 'pass', cell: cellBooleanFormatter(), }, { name: 'DKIM', - selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'dkim')[0]?.Status == 'pass', + selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'dkim')[0].Status == 'pass', cell: cellBooleanFormatter(), }, { name: 'DMARC', - selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'dmarc')[0]?.Status == 'pass', + selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'dmarc')[0].Status == 'pass', cell: cellBooleanFormatter(), }, { name: 'Comp Auth', - selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'compauth')[0]?.Status == 'pass', + selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'compauth')[0].Status == 'pass', cell: cellBooleanFormatter(), }, { diff --git a/src/views/tenant/conditional/NamedLocations.jsx b/src/views/tenant/conditional/NamedLocations.jsx index 93679c0751b9..b7f1ebb0f68c 100644 --- a/src/views/tenant/conditional/NamedLocations.jsx +++ b/src/views/tenant/conditional/NamedLocations.jsx @@ -58,6 +58,7 @@ const columns = [ name: 'Last Modified (Local)', selector: (row) => DateNotNull(row['modifiedDateTime']), sortable: true, + cell: cellDateFormatter(), exportSelector: 'modifiedDateTime', maxWidth: '150px', }, diff --git a/src/views/tenant/standards/ListAppliedStandards.jsx b/src/views/tenant/standards/ListAppliedStandards.jsx index 5d681c58d142..ba5c10a14601 100644 --- a/src/views/tenant/standards/ListAppliedStandards.jsx +++ b/src/views/tenant/standards/ListAppliedStandards.jsx @@ -491,7 +491,6 @@ const ApplyNewStandard = () => { className="mb-3" name={component.name} label={component.label} - defaultValue={component.default} /> )} {component.type === 'boolean' && ( diff --git a/version_latest.txt b/version_latest.txt index ade65226e0aa..8a30e8f94a39 100644 --- a/version_latest.txt +++ b/version_latest.txt @@ -1 +1 @@ -5.4.1 +5.4.0 From 57d0bf6b1ad3ba9fd73de93d7ab51b478f94961f Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 3 Apr 2024 15:09:01 -0400 Subject: [PATCH 094/133] up version --- package-lock.json | 4 ++-- package.json | 2 +- public/version_latest.txt | 2 +- version_latest.txt | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 99f82d32aada..2aa77725f1a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cipp", - "version": "5.3.2", + "version": "5.4.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cipp", - "version": "5.3.2", + "version": "5.4.2", "license": "AGPL-3.0", "dependencies": { "@coreui/chartjs": "^3.0.0", diff --git a/package.json b/package.json index 9e73b8d43a81..97468afd515b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cipp", - "version": "5.4.0", + "version": "5.4.2", "description": "The CyberDrain Improved Partner Portal is a portal to help manage administration for Microsoft Partners.", "homepage": "https://cipp.app/", "bugs": { diff --git a/public/version_latest.txt b/public/version_latest.txt index 8a30e8f94a39..8ae03c11904c 100644 --- a/public/version_latest.txt +++ b/public/version_latest.txt @@ -1 +1 @@ -5.4.0 +5.4.2 diff --git a/version_latest.txt b/version_latest.txt index 8a30e8f94a39..8ae03c11904c 100644 --- a/version_latest.txt +++ b/version_latest.txt @@ -1 +1 @@ -5.4.0 +5.4.2 From 1d172a510429f314f83925f2a3deefd23a381a9a Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Wed, 3 Apr 2024 22:19:12 +0200 Subject: [PATCH 095/133] Fixes dynamic routes issues. --- .prettierignore | 3 + Generate-Import-Map.js | 35 +++++++++++ Importmap.ps1 | 22 +++++++ package.json | 1 + src/App.jsx | 17 ++--- src/importsMap.jsx | 138 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 208 insertions(+), 8 deletions(-) create mode 100644 Generate-Import-Map.js create mode 100644 Importmap.ps1 create mode 100644 src/importsMap.jsx diff --git a/.prettierignore b/.prettierignore index 849ddff3b7ec..1611c469b3e9 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1 +1,4 @@ dist/ +build/ +importsMap.jsx +Generate-Import-Map.js \ No newline at end of file diff --git a/Generate-Import-Map.js b/Generate-Import-Map.js new file mode 100644 index 000000000000..d8b23547c55b --- /dev/null +++ b/Generate-Import-Map.js @@ -0,0 +1,35 @@ +// Using ES Module syntax compatible with Node.js 18 and ensuring cross-platform compatibility +import fs from 'fs/promises' +import path from 'path' +import { fileURLToPath } from 'url' + +// Convert __dirname equivalent for ES Modules +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) + +// Adjust the relative path as necessary to point to your routes.json location +const routesPath = path.join(__dirname, './src/routes.json') // Example path + +// Load routes.json with an import assertion for JSON +const routes = await import(`file://${routesPath}`, { assert: { type: 'json' } }).then( + (module) => module.default, +) + +let importsMap = "import React from 'react'\n export const importsMap = {\n" + +routes.forEach((route) => { + if (route.component) { + // Adjust the import path to be relative to the importsMap.js file location + const importPath = route.component.replace('views', './views') + // Ensure paths are Unix-like for the dynamic import to work cross-platform + const unixImportPath = importPath.split(path.sep).join('/') + importsMap += ` "${route.path}": React.lazy(() => import('${unixImportPath}')), \n` + } +}) + +importsMap += '}\nexport default importsMap' + +// Specify the output file path for the generated imports map +const outputPath = path.join(__dirname, './src/importsMap.jsx') +await fs.writeFile(outputPath, importsMap) +console.log('Import map generated.') diff --git a/Importmap.ps1 b/Importmap.ps1 new file mode 100644 index 000000000000..357c3af5d1ce --- /dev/null +++ b/Importmap.ps1 @@ -0,0 +1,22 @@ +// generate-imports-map.js +const fs = require('fs') +const path = require('path') +const routes = require('./path/to/routes.json') + +let importsMap = 'export const importsMap = {\n' + +routes.forEach(route => { + if (route.component) { + // Convert the path to a format that's relative to where you'll be importing from + const importPath = route.component.replace('views', './views') + const componentName = path.basename(importPath) + + // Create an import statement for the component + importsMap += "${route.path}": React.lazy(() = > import('${importPath}')), \n`; + } + }) + +importsMap += '};\n' + +fs.writeFileSync(path.resolve(__dirname,'./src/importsMap.js'), importsMap) +console.log('Import map generated.') diff --git a/package.json b/package.json index 3a1237c0f6c0..042efe701871 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "license": "AGPL-3.0", "author": "CIPP Contributors", "scripts": { + "prebuild": "node Generate-Import-Map.js", "build": "echo react-scripts build && vite build", "changelog": "auto-changelog --starting-version 3.0.0 --commit-limit false --hide-credit", "lint": "eslint \"src/**/*.js\"", diff --git a/src/App.jsx b/src/App.jsx index 1b2db0d6e9ec..5e5678b80784 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -11,10 +11,14 @@ import { library } from '@fortawesome/fontawesome-svg-core' import { fas } from '@fortawesome/free-solid-svg-icons' import routes from 'src/routes' import { useAuthCheck } from './components/utilities/CippauthCheck' +import importsMap from './importsMap' library.add(fas) -const dynamicImport = (path) => React.lazy(() => import(`./${path}`)) +const dynamicImport = (path) => { + return importsMap[path] || null +} + const DefaultLayout = React.lazy(() => import('./layout/DefaultLayout')) const Page401 = React.lazy(() => import('./views/pages/page401/Page401')) const Page403 = React.lazy(() => import('./views/pages/page403/Page403')) @@ -25,12 +29,6 @@ const Login = React.lazy(() => import('./views/pages/login/Login')) const Logout = React.lazy(() => import('./views/pages/login/Logout')) //we loop through the routes array, dynamicly create the component by using dynamicImport, add the component to the route array as 'component' key. -routes.forEach((route) => { - if (route.component) { - route['component'] = dynamicImport(route.component) - } -}) - const App = () => { return ( @@ -56,6 +54,9 @@ const App = () => { > {routes.map((route, idx) => { const allowedRoles = route.allowedRoles + const Routecomponent = dynamicImport(route.path) + console.log('route', route) + console.log('Routecomponent', Routecomponent) return ( route.component && ( { CIPP - {route.name} - + diff --git a/src/importsMap.jsx b/src/importsMap.jsx new file mode 100644 index 000000000000..fd9f92661d53 --- /dev/null +++ b/src/importsMap.jsx @@ -0,0 +1,138 @@ +import React from 'react' + export const importsMap = { + "/home": React.lazy(() => import('./views/home/Home')), + "/cipp/logs": React.lazy(() => import('./views/cipp/Logs')), + "/cipp/scheduler": React.lazy(() => import('./views/cipp/Scheduler')), + "/cipp/statistics": React.lazy(() => import('./views/cipp/Statistics')), + "/cipp/404": React.lazy(() => import('./views/pages/page404/Page404')), + "/cipp/403": React.lazy(() => import('./views/pages/page403/Page403')), + "/cipp/500": React.lazy(() => import('./views/pages/page500/Page500')), + "/identity/administration/users/add": React.lazy(() => import('./views/identity/administration/AddUser')), + "/identity/administration/users/addbulk": React.lazy(() => import('./views/identity/administration/AddUserBulk')), + "/identity/administration/users/edit": React.lazy(() => import('./views/identity/administration/EditUser')), + "/identity/administration/users/view": React.lazy(() => import('./views/identity/administration/ViewUser')), + "/identity/administration/users/InviteGuest": React.lazy(() => import('./views/identity/administration/InviteGuest')), + "/identity/administration/ViewBec": React.lazy(() => import('./views/identity/administration/ViewBEC')), + "/identity/administration/users": React.lazy(() => import('./views/identity/administration/Users')), + "/identity/administration/devices": React.lazy(() => import('./views/identity/administration/Devices')), + "/identity/administration/groups/add": React.lazy(() => import('./views/identity/administration/AddGroup')), + "/identity/administration/group-templates": React.lazy(() => import('./views/identity/administration/GroupTemplates')), + "/identity/administration/group-add-template": React.lazy(() => import('./views/identity/administration/AddGroupTemplate')), + "/identity/administration/deploy-group-template": React.lazy(() => import('./views/identity/administration/DeployGroupTemplate')), + "/identity/administration/groups/edit": React.lazy(() => import('./views/identity/administration/EditGroup')), + "/identity/administration/groups/view": React.lazy(() => import('./views/identity/administration/ViewGroup')), + "/identity/administration/groups": React.lazy(() => import('./views/identity/administration/Groups')), + "/identity/administration/roles": React.lazy(() => import('./views/identity/administration/Roles')), + "/identity/administration/deleted-items": React.lazy(() => import('./views/identity/administration/Deleted')), + "/teams-share/teams/business-voice": React.lazy(() => import('./views/teams-share/teams/BusinessVoice')), + "/identity/administration/offboarding-wizard": React.lazy(() => import('./views/identity/administration/OffboardingWizard')), + "/endpoint/reports/devices": React.lazy(() => import('./views/endpoint/intune/Devices')), + "/identity/reports/mfa-report": React.lazy(() => import('./views/identity/reports/MFAReport')), + "/identity/reports/inactive-users-report": React.lazy(() => import('./views/identity/reports/InactiveUsers')), + "/identity/reports/Signin-report": React.lazy(() => import('./views/identity/reports/SignIns')), + "/identity/reports/azure-ad-connect-report": React.lazy(() => import('./views/identity/reports/AzureADConnectReport')), + "/tenant/administration/tenants": React.lazy(() => import('./views/tenant/administration/Tenants')), + "/tenant/administration/tenants/edit": React.lazy(() => import('./views/tenant/administration/EditTenant')), + "/tenant/administration/domains": React.lazy(() => import('./views/tenant/administration/Domains')), + "/tenant/administration/alertswizard": React.lazy(() => import('./views/tenant/administration/AlertWizard')), + "/tenant/administration/alertrules": React.lazy(() => import('./views/tenant/administration/AlertRules')), + "/tenant/administration/alertsqueue": React.lazy(() => import('./views/tenant/administration/ListAlertsQueue')), + "/tenant/administration/graph-explorer": React.lazy(() => import('./views/tenant/administration/GraphExplorer')), + "/tenant/administration/service-health": React.lazy(() => import('./views/tenant/administration/ServiceHealth')), + "/tenant/administration/enterprise-apps": React.lazy(() => import('./views/tenant/administration/ListEnterpriseApps')), + "/tenant/administration/app-consent-requests": React.lazy(() => import('./views/tenant/administration/ListAppConsentRequests')), + "/tenant/conditional/list-policies": React.lazy(() => import('./views/tenant/conditional/ConditionalAccess')), + "/tenant/conditional/deploy-vacation": React.lazy(() => import('./views/tenant/conditional/DeployVacation')), + "/tenant/conditional/list-named-locations": React.lazy(() => import('./views/tenant/conditional/NamedLocations')), + "/tenant/conditional/deploy": React.lazy(() => import('./views/tenant/conditional/DeployCA')), + "/tenant/conditional/deploy-named-location": React.lazy(() => import('./views/tenant/conditional/DeployNamedLocation')), + "/tenant/conditional/list-template": React.lazy(() => import('./views/tenant/conditional/ListCATemplates')), + "/tenant/conditional/add-template": React.lazy(() => import('./views/tenant/conditional/AddCATemplate')), + "/tenant/administration/list-licenses": React.lazy(() => import('./views/tenant/administration/ListLicences')), + "/tenant/administration/application-consent": React.lazy(() => import('./views/tenant/administration/ListOauthApps')), + "/tenant/standards/list-applied-standards": React.lazy(() => import('./views/tenant/standards/ListAppliedStandards')), + "/tenant/standards/bpa-report": React.lazy(() => import('./views/tenant/standards/BestPracticeAnalyser')), + "/tenant/standards/domains-analyser": React.lazy(() => import('./views/tenant/standards/DomainsAnalyser')), + "/tenant/standards/individual-domains": React.lazy(() => import('./views/tenant/standards/IndividualDomain')), + "/tenant/administration/tenantlookup": React.lazy(() => import('./views/tenant/administration/TenantLookup')), + "/tenant/tools/geoiplookup": React.lazy(() => import('./views/tenant/administration/GeoIPLookup')), + "/tenant/tools/bpa-report-builder": React.lazy(() => import('./views/tenant/standards/BPAReportBuilder')), + "/tenant/standards/alert-list": React.lazy(() => import('./views/security/incidents/ListAlerts')), + "/endpoint/applications/list": React.lazy(() => import('./views/endpoint/applications/ApplicationsList')), + "/endpoint/applications/queue": React.lazy(() => import('./views/endpoint/applications/ListApplicationQueue')), + "/endpoint/applications/add-choco-app": React.lazy(() => import('./views/endpoint/applications/ApplicationsAddChocoApp')), + "/endpoint/applications/add-winget-app": React.lazy(() => import('./views/endpoint/applications/ApplicationsAddWinGet')), + "/endpoint/applications/add-office-app": React.lazy(() => import('./views/endpoint/applications/ApplicationsAddOffice')), + "/endpoint/applications/add-rmm-app": React.lazy(() => import('./views/endpoint/applications/ApplicationsAddRMM')), + "/endpoint/autopilot/add-device": React.lazy(() => import('./views/endpoint/autopilot/AutopilotAddDevice')), + "/endpoint/autopilot/add-profile": React.lazy(() => import('./views/endpoint/autopilot/AutopilotAddProfile')), + "/endpoint/autopilot/add-status-page": React.lazy(() => import('./views/endpoint/autopilot/AutopilotAddStatusPage')), + "/endpoint/autopilot/list-devices": React.lazy(() => import('./views/endpoint/autopilot/AutopilotListDevices')), + "/endpoint/autopilot/list-profiles": React.lazy(() => import('./views/endpoint/autopilot/AutopilotListProfiles')), + "/endpoint/autopilot/list-status-pages": React.lazy(() => import('./views/endpoint/autopilot/AutopilotListStatusPages')), + "/endpoint/MEM/list-policies": React.lazy(() => import('./views/endpoint/intune/MEMListPolicies')), + "/endpoint/MEM/list-compliance-policies": React.lazy(() => import('./views/endpoint/intune/MEMListCompliance')), + "/endpoint/MEM/list-appprotection-policies": React.lazy(() => import('./views/endpoint/intune/MEMListAppProtection')), + "/endpoint/MEM/edit-policy": React.lazy(() => import('./views/endpoint/intune/MEMEditPolicy')), + "/endpoint/MEM/ca-policies": React.lazy(() => import('./views/endpoint/intune/MEMCAPolicies')), + "/endpoint/MEM/add-policy": React.lazy(() => import('./views/endpoint/intune/MEMAddPolicy')), + "/endpoint/MEM/add-policy-template": React.lazy(() => import('./views/endpoint/intune/MEMAddPolicyTemplate')), + "/endpoint/MEM/list-templates": React.lazy(() => import('./views/endpoint/intune/MEMListPolicyTemplates')), + "/security/defender/deployment": React.lazy(() => import('./views/security/defender/DeployDefender')), + "/security/defender/list-defender": React.lazy(() => import('./views/security/defender/ListDefender')), + "/security/defender/list-defender-tvm": React.lazy(() => import('./views/security/defender/ListVuln')), + "/teams-share/onedrive/list": React.lazy(() => import('./views/teams-share/onedrive/OneDriveList')), + "/teams-share/sharepoint/list-sharepoint": React.lazy(() => import('./views/teams-share/sharepoint/SharepointList')), + "/teams-share/teams/list-team": React.lazy(() => import('./views/teams-share/teams/TeamsListTeam')), + "/teams-share/teams/view-team-settings": React.lazy(() => import('./views/teams-share/teams/ViewTeamSettings')), + "/teams-share/teams/add-team": React.lazy(() => import('./views/teams-share/teams/TeamsAddTeam')), + "/teams-share/teams/teams-activity": React.lazy(() => import('./views/teams-share/teams/TeamsActivity')), + "/email/administration/contacts": React.lazy(() => import('./views/email-exchange/administration/ContactsList')), + "/email/connectors/list-connectors": React.lazy(() => import('./views/email-exchange/connectors/ConnectorList')), + "/email/connectors/deploy-connector": React.lazy(() => import('./views/email-exchange/connectors/DeployConnector')), + "/email/connectors/add-connector-templates": React.lazy(() => import('./views/email-exchange/connectors/AddConnectorTemplate')), + "/email/connectors/list-connector-templates": React.lazy(() => import('./views/email-exchange/connectors/ListConnectorTemplates')), + "/email/transport/list-rules": React.lazy(() => import('./views/email-exchange/transport/TransportRules')), + "/email/transport/deploy-rules": React.lazy(() => import('./views/email-exchange/transport/DeployTransport')), + "/email/transport/list-templates": React.lazy(() => import('./views/email-exchange/transport/ListTransportTemplates')), + "/email/transport/add-template": React.lazy(() => import('./views/email-exchange/transport/AddTransportTemplate')), + "/email/spamfilter/list-spamfilter": React.lazy(() => import('./views/email-exchange/spamfilter/Spamfilter')), + "/email/spamfilter/deploy": React.lazy(() => import('./views/email-exchange/spamfilter/DeploySpamfilter')), + "/email/spamfilter/list-templates": React.lazy(() => import('./views/email-exchange/spamfilter/ListSpamfilterTemplates')), + "/email/tools/mailbox-restore-wizard": React.lazy(() => import('./views/email-exchange/tools/MailboxRestoreWizard')), + "/email/tools/mailbox-restores": React.lazy(() => import('./views/email-exchange/tools/MailboxRestores')), + "/email/tools/mail-test": React.lazy(() => import('./views/email-exchange/tools/MailTest')), + "/email/spamfilter/add-template": React.lazy(() => import('./views/email-exchange/spamfilter/AddSpamfilterTemplate')), + "/email/administration/edit-mailbox-permissions": React.lazy(() => import('./views/email-exchange/administration/EditMailboxPermissions')), + "/email/administration/add-shared-mailbox": React.lazy(() => import('./views/email-exchange/administration/AddSharedMailbox')), + "/email/administration/add-contact": React.lazy(() => import('./views/email-exchange/administration/AddContact')), + "/email/administration/edit-calendar-permissions": React.lazy(() => import('./views/email-exchange/administration/EditCalendarPermissions')), + "/email/administration/view-mobile-devices": React.lazy(() => import('./views/email-exchange/administration/ViewMobileDevices')), + "/email/administration/edit-contact": React.lazy(() => import('./views/email-exchange/administration/EditContact')), + "/email/administration/mailboxes": React.lazy(() => import('./views/email-exchange/administration/MailboxesList')), + "/email/administration/mailbox-rules": React.lazy(() => import('./views/email-exchange/administration/MailboxRuleList')), + "/email/administration/Quarantine": React.lazy(() => import('./views/email-exchange/administration/QuarantineList')), + "/email/reports/mailbox-statistics": React.lazy(() => import('./views/email-exchange/reports/MailboxStatisticsList')), + "/email/reports/SharedMailboxEnabledAccount": React.lazy(() => import('./views/email-exchange/reports/SharedMailboxEnabledAccount')), + "/email/reports/mailbox-cas-settings": React.lazy(() => import('./views/email-exchange/reports/MailboxClientAccessSettingsList')), + "/email/reports/message-trace": React.lazy(() => import('./views/email-exchange/reports/MessageTrace')), + "/cipp/user-settings": React.lazy(() => import('./views/cipp/UserSettings')), + "/email/reports/phishing-policies": React.lazy(() => import('./views/email-exchange/reports/PhishingPoliciesList')), + "/security/incidents/list-alerts": React.lazy(() => import('./views/security/incidents/ListAlerts')), + "/security/incidents/list-incidents": React.lazy(() => import('./views/security/incidents/ListIncidents')), + "/security/reports/list-device-compliance": React.lazy(() => import('./views/security/reports/ListDeviceComplianceReport')), + "/license": React.lazy(() => import('./views/pages/license/License')), + "/cipp/settings": React.lazy(() => import('./views/cipp/app-settings/CIPPSettings')), + "/cipp/setup": React.lazy(() => import('./views/cipp/Setup')), + "/tenant/administration/gdap": React.lazy(() => import('./views/tenant/administration/GDAPWizard')), + "/tenant/administration/gdap-invite": React.lazy(() => import('./views/tenant/administration/GDAPInviteWizard')), + "/tenant/administration/gdap-role-wizard": React.lazy(() => import('./views/tenant/administration/GDAPRoleWizard')), + "/tenant/administration/gdap-roles": React.lazy(() => import('./views/tenant/administration/ListGDAPRoles')), + "/tenant/administration/gdap-relationships": React.lazy(() => import('././views/tenant/administration/ListGDAPRelationships')), + "/tenant/administration/appapproval": React.lazy(() => import('./views/cipp/AppApproval')), + "/tenant/administration/gdap-status": React.lazy(() => import('./views/tenant/administration/ListGDAPQueue')), + "/tenant/standards/list-standards": React.lazy(() => import('./views/tenant/standards/ListStandards')), + "/tenant/administration/tenant-offboarding-wizard": React.lazy(() => import('./views/tenant/administration/TenantOffboardingWizard')), + "/tenant/administration/tenant-onboarding-wizard": React.lazy(() => import('./views/tenant/administration/TenantOnboardingWizard')), +} +export default importsMap \ No newline at end of file From 0bd5e954eb7e09be2f647da7259a86e1c7e246b2 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 3 Apr 2024 22:11:30 -0400 Subject: [PATCH 096/133] Allow retry button while running --- .../administration/TenantOnboardingWizard.jsx | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/views/tenant/administration/TenantOnboardingWizard.jsx b/src/views/tenant/administration/TenantOnboardingWizard.jsx index bdd301663507..a6eb19460e55 100644 --- a/src/views/tenant/administration/TenantOnboardingWizard.jsx +++ b/src/views/tenant/administration/TenantOnboardingWizard.jsx @@ -157,20 +157,19 @@ const RelationshipOnboarding = ({ relationship, gdapRoles, autoMapRoles, addMiss })} {onboardingStatus.isSuccess && ( <> - {onboardingStatus.data?.Status != 'running' && - onboardingStatus.data?.Status != 'queued' && ( - - getOnboardingStatus({ - path: '/api/ExecOnboardTenant?Retry=True', - values: { id: relationship.id, gdapRoles, autoMapRoles, addMissingGroups }, - }) - } - className="mb-3 me-2" - > - Retry - - )} + {onboardingStatus.data?.Status != 'queued' && ( + + getOnboardingStatus({ + path: '/api/ExecOnboardTenant?Retry=True', + values: { id: relationship.id, gdapRoles, autoMapRoles, addMissingGroups }, + }) + } + className="mb-3 me-2" + > + Retry + + )} {onboardingStatus.data?.Logs && ( ) } +RelationshipOnboarding.propTypes = { + relationship: PropTypes.object.isRequired, + gdapRoles: PropTypes.array, + autoMapRoles: PropTypes.bool, + addMissingGroups: PropTypes.bool, +} const TenantOnboardingWizard = () => { const tenantDomain = useSelector((state) => state.app.currentTenant.defaultDomainName) From 791e567da878ec3fabb696e7d31f95b329819f74 Mon Sep 17 00:00:00 2001 From: Esco Date: Thu, 4 Apr 2024 13:37:28 +0200 Subject: [PATCH 097/133] DefaultValue Switch and Input --- src/components/forms/RFFComponents.jsx | 9 ++++++++- src/views/tenant/standards/ListAppliedStandards.jsx | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/components/forms/RFFComponents.jsx b/src/components/forms/RFFComponents.jsx index 089a0c6b5226..3e5f42e30b0b 100644 --- a/src/components/forms/RFFComponents.jsx +++ b/src/components/forms/RFFComponents.jsx @@ -102,9 +102,16 @@ export const RFFCFormSwitch = ({ disabled = false, initialValue, onClick, + defaultValue, }) => { return ( - + {({ meta, input }) => ( { )} {component.type === 'AdminRolesMultiSelect' && ( From 8659d9ee1d4d8f7a104f0ac6af2a83df9579ff32 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Mon, 8 Apr 2024 14:38:27 +0200 Subject: [PATCH 098/133] fixes columns not being correct. --- src/components/tables/CippTable.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/tables/CippTable.jsx b/src/components/tables/CippTable.jsx index 3c246cbecb40..f35820d32e2a 100644 --- a/src/components/tables/CippTable.jsx +++ b/src/components/tables/CippTable.jsx @@ -739,7 +739,7 @@ export default function CippTable({ Date: Mon, 8 Apr 2024 14:45:56 +0200 Subject: [PATCH 099/133] set default size to A3, with fit to page enabled for reprinting. --- src/components/buttons/PdfButton.jsx | 2 +- src/components/tables/CippTable.jsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/buttons/PdfButton.jsx b/src/components/buttons/PdfButton.jsx index 4bfda756a7e4..38c00ce6124f 100644 --- a/src/components/buttons/PdfButton.jsx +++ b/src/components/buttons/PdfButton.jsx @@ -9,7 +9,7 @@ import { useSelector } from 'react-redux' function ExportPDFButton(props) { const base64 = useSelector((state) => state.app.reportImage) - const exportPDF = (pdfData, pdfHeaders, pdfSize = 'A4', reportName = 'report') => { + const exportPDF = (pdfData, pdfHeaders, pdfSize = 'A3', reportName = 'report') => { const unit = 'pt' const size = pdfSize // Use A1, A2, A3 or A4 const orientation = 'landscape' // portrait or landscape diff --git a/src/components/tables/CippTable.jsx b/src/components/tables/CippTable.jsx index f35820d32e2a..510aaa3ec9f0 100644 --- a/src/components/tables/CippTable.jsx +++ b/src/components/tables/CippTable.jsx @@ -740,7 +740,7 @@ export default function CippTable({ key="export-pdf-action-visible" pdfData={filtered} pdfHeaders={updatedColumns} - pdfSize="A4" + pdfSize="A3" reportName={reportName} nameText="Export Visible Columns" /> From 5c939cd649843a6d46cdb9a569e97b4961c7edcf Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Mon, 8 Apr 2024 23:33:48 +0200 Subject: [PATCH 100/133] add sort for devices --- src/views/identity/administration/Devices.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/views/identity/administration/Devices.jsx b/src/views/identity/administration/Devices.jsx index b67740e3136d..04d6df19da58 100644 --- a/src/views/identity/administration/Devices.jsx +++ b/src/views/identity/administration/Devices.jsx @@ -159,6 +159,7 @@ const DevicesList = () => { TenantFilter: tenant?.defaultDomainName, Endpoint: 'devices', $format: 'application/json', + sort: 'displayName', }, columns, tableProps: { From 8c765c28d39c071a01deafaf6cce8c9ffb935a96 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Mon, 8 Apr 2024 22:08:02 -0400 Subject: [PATCH 101/133] update footer add augmentt remove netfriends --- public/img/augmentt-dark.png | Bin 0 -> 5798 bytes public/img/augmentt-light.png | Bin 0 -> 34107 bytes public/img/netfriends.png | Bin 3779 -> 0 bytes public/img/netfriends_dark.png | Bin 14343 -> 0 bytes src/components/layout/AppFooter.jsx | 14 +++++++------- 5 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 public/img/augmentt-dark.png create mode 100644 public/img/augmentt-light.png delete mode 100644 public/img/netfriends.png delete mode 100644 public/img/netfriends_dark.png diff --git a/public/img/augmentt-dark.png b/public/img/augmentt-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..949d3eebe8d353af8ea0b5625cb0e125c9dc8b21 GIT binary patch literal 5798 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 literal 0 HcmV?d00001 diff --git a/public/img/netfriends.png b/public/img/netfriends.png deleted file mode 100644 index e53cc963113d98292371277bdf6cb4ac6bfab807..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3779 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 xod35r?IC+3znZFT(@< { const isDark = currentTheme === 'impact' || (currentTheme === 'default' && preferredTheme === 'impact') - const netfriends = isDark ? '/img/netfriends_dark.png' : '/img/netfriends.png' const datto = isDark ? '/img/datto.png' : '/img/datto.png' const huntress = isDark ? '/img/huntress_teal.png' : '/img/huntress_teal.png' const rewst = isDark ? '/img/rewst_dark.png' : '/img/rewst.png' const ninjaone = isDark ? '/img/ninjaone_dark.png' : '/img/ninjaone.png' + const augmentt = isDark ? '/img/augmentt-dark.png' : '/img/augmentt-light.png' return (

    This application is sponsored by - + - + - + - - + + - +

    From f3d2bb9394f9bec7b9e5dec42d607a0e47dfd72f Mon Sep 17 00:00:00 2001 From: John Duprey Date: Mon, 8 Apr 2024 22:08:51 -0400 Subject: [PATCH 102/133] use $orderby and $count for devices --- src/views/identity/administration/Devices.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/views/identity/administration/Devices.jsx b/src/views/identity/administration/Devices.jsx index 04d6df19da58..664f7552757c 100644 --- a/src/views/identity/administration/Devices.jsx +++ b/src/views/identity/administration/Devices.jsx @@ -159,7 +159,8 @@ const DevicesList = () => { TenantFilter: tenant?.defaultDomainName, Endpoint: 'devices', $format: 'application/json', - sort: 'displayName', + $orderby: 'displayName', + $count: true, }, columns, tableProps: { From acf1eeb10aa2acb0562407e5679685f90544b9db Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Tue, 9 Apr 2024 13:22:19 +0200 Subject: [PATCH 103/133] removed unused vars --- src/views/email-exchange/administration/ViewMobileDevices.jsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/views/email-exchange/administration/ViewMobileDevices.jsx b/src/views/email-exchange/administration/ViewMobileDevices.jsx index 78c835647e61..19a58344894a 100644 --- a/src/views/email-exchange/administration/ViewMobileDevices.jsx +++ b/src/views/email-exchange/administration/ViewMobileDevices.jsx @@ -4,9 +4,8 @@ import { CippPageList } from 'src/components/layout' import useQuery from 'src/hooks/useQuery' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { CellTip, cellDateFormatter } from 'src/components/tables' -import { faEye, faEdit, faEllipsisV, faMobileAlt } from '@fortawesome/free-solid-svg-icons' +import { faEllipsisV } from '@fortawesome/free-solid-svg-icons' import { CippActionsOffcanvas } from 'src/components/utilities' -import { Link } from 'react-router-dom' import { CButton } from '@coreui/react' //TODO: Add CellBoolean From 4e5007f185d74fe4365cdbaa001e078b6af66ea4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Tue, 9 Apr 2024 22:35:37 +0200 Subject: [PATCH 104/133] Change to use tenantID for DA --- src/views/tenant/standards/DomainsAnalyser.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/tenant/standards/DomainsAnalyser.jsx b/src/views/tenant/standards/DomainsAnalyser.jsx index 30d830a0ad09..528ba47c4a58 100644 --- a/src/views/tenant/standards/DomainsAnalyser.jsx +++ b/src/views/tenant/standards/DomainsAnalyser.jsx @@ -295,7 +295,7 @@ const DomainsAnalyser = () => { }, ], path: `/api/ListDomainAnalyser`, - params: { tenantFilter: currentTenant.defaultDomainName }, + params: { tenantFilter: currentTenant.customerId }, columns, reportName: 'Domains-Analyzer', tableProps: { From 3b78518028128ae34cd090ee6e048a7dfbe72bf0 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 10 Apr 2024 15:49:09 -0400 Subject: [PATCH 105/133] Update augmentt link --- src/components/layout/AppFooter.jsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/layout/AppFooter.jsx b/src/components/layout/AppFooter.jsx index 2a736bc8439a..6437061d9133 100644 --- a/src/components/layout/AppFooter.jsx +++ b/src/components/layout/AppFooter.jsx @@ -30,7 +30,11 @@ const AppFooter = () => { - + From 33e8eaf2079441a3a1cad779f61df0e9c7ca08b0 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Wed, 10 Apr 2024 21:58:51 +0200 Subject: [PATCH 106/133] json translation prework --- package-lock.json | 14 ++ package.json | 1 + src/_nav.jsx | 5 - src/components/utilities/CippJsonView.jsx | 117 +++++++++++++++++ src/data/translator.json | 152 ++++++++++++++++++++++ src/views/tenant/conditional/DeployCA.jsx | 115 +++++++++++----- 6 files changed, 367 insertions(+), 37 deletions(-) create mode 100644 src/components/utilities/CippJsonView.jsx create mode 100644 src/data/translator.json diff --git a/package-lock.json b/package-lock.json index 2542349cba28..3bf07f84211f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "@rjsf/core": "^5.12.1", "@rjsf/utils": "^5.12.1", "@rjsf/validator-ajv8": "^5.12.1", + "@uiw/react-json-view": "^2.0.0-alpha.23", "axios": "^1.6.2", "buffer": "^6.0.3", "chart.js": "^3.5.1", @@ -1907,6 +1908,19 @@ "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==" }, + "node_modules/@uiw/react-json-view": { + "version": "2.0.0-alpha.23", + "resolved": "https://registry.npmjs.org/@uiw/react-json-view/-/react-json-view-2.0.0-alpha.23.tgz", + "integrity": "sha512-GT0fy/K7+xSsfhvV4PVx2qPRomr/RjzFnerCjglfTYX0oEjFe9S2UwnhqOBaSHrfaCL6ccALZ2c+qV73eqop9Q==", + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@babel/runtime": ">=7.10.0", + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", diff --git a/package.json b/package.json index 042efe701871..2c5978c8a8c1 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "@rjsf/core": "^5.12.1", "@rjsf/utils": "^5.12.1", "@rjsf/validator-ajv8": "^5.12.1", + "@uiw/react-json-view": "^2.0.0-alpha.23", "axios": "^1.6.2", "buffer": "^6.0.3", "chart.js": "^3.5.1", diff --git a/src/_nav.jsx b/src/_nav.jsx index f55c93339bd1..f4ea23a753d9 100644 --- a/src/_nav.jsx +++ b/src/_nav.jsx @@ -254,11 +254,6 @@ const _nav = [ name: 'CA Templates', to: '/tenant/conditional/list-template', }, - { - component: CNavItem, - name: 'Add CA Template', - to: '/tenant/conditional/add-template', - }, { component: CNavItem, name: 'Named Locations', diff --git a/src/components/utilities/CippJsonView.jsx b/src/components/utilities/CippJsonView.jsx new file mode 100644 index 000000000000..635da48a9cdf --- /dev/null +++ b/src/components/utilities/CippJsonView.jsx @@ -0,0 +1,117 @@ +import React from 'react' +import JsonView from '@uiw/react-json-view' +import { useSelector } from 'react-redux' +import { useMediaPredicate } from 'react-media-hook' +import translator from 'src/data/translator.json' +const githubLightTheme = { + '--w-rjv-font-family': 'monospace', + '--w-rjv-color': '#6f42c1', + '--w-rjv-key-string': '#6f42c1', + '--w-rjv-background-color': '#ffffff', + '--w-rjv-line-color': '#ddd', + '--w-rjv-arrow-color': '#6e7781', + '--w-rjv-edit-color': 'var(--w-rjv-color)', + '--w-rjv-info-color': '#0000004d', + '--w-rjv-update-color': '#ebcb8b', + '--w-rjv-copied-color': '#002b36', + '--w-rjv-copied-success-color': '#28a745', + + '--w-rjv-curlybraces-color': '#6a737d', + '--w-rjv-colon-color': '#24292e', + '--w-rjv-brackets-color': '#6a737d', + '--w-rjv-quotes-color': 'var(--w-rjv-key-string)', + '--w-rjv-quotes-string-color': 'var(--w-rjv-type-string-color)', + + '--w-rjv-type-string-color': '#032f62', + '--w-rjv-type-int-color': '#005cc5', + '--w-rjv-type-float-color': '#005cc5', + '--w-rjv-type-bigint-color': '#005cc5', + '--w-rjv-type-boolean-color': '#d73a49', + '--w-rjv-type-date-color': '#005cc5', + '--w-rjv-type-url-color': '#0969da', + '--w-rjv-type-null-color': '#d73a49', + '--w-rjv-type-nan-color': '#859900', + '--w-rjv-type-undefined-color': '#005cc5', +} + +export const githubDarkTheme = { + '--w-rjv-font-family': 'monospace', + '--w-rjv-color': '#79c0ff', + '--w-rjv-key-string': '#79c0ff', + '--w-rjv-background-color': '#0d1117', + '--w-rjv-line-color': '#94949480', + '--w-rjv-arrow-color': '#ccc', + '--w-rjv-edit-color': 'var(--w-rjv-color)', + '--w-rjv-info-color': '#7b7b7b', + '--w-rjv-update-color': '#ebcb8b', + '--w-rjv-copied-color': '#79c0ff', + '--w-rjv-copied-success-color': '#28a745', + + '--w-rjv-curlybraces-color': '#8b949e', + '--w-rjv-colon-color': '#c9d1d9', + '--w-rjv-brackets-color': '#8b949e', + '--w-rjv-quotes-color': 'var(--w-rjv-key-string)', + '--w-rjv-quotes-string-color': 'var(--w-rjv-type-string-color)', + + '--w-rjv-type-string-color': '#a5d6ff', + '--w-rjv-type-int-color': '#79c0ff', + '--w-rjv-type-float-color': '#79c0ff', + '--w-rjv-type-bigint-color': '#79c0ff', + '--w-rjv-type-boolean-color': '#ffab70', + '--w-rjv-type-date-color': '#79c0ff', + '--w-rjv-type-url-color': '#4facff', + '--w-rjv-type-null-color': '#ff7b72', + '--w-rjv-type-nan-color': '#859900', + '--w-rjv-type-undefined-color': '#79c0ff', +} +const matchPattern = (key, patterns) => { + return patterns.some((pattern) => { + if (pattern.includes('*')) { + // Replace * with regex that matches any character sequence and create a RegExp object + const regex = new RegExp(`^${pattern.replace(/\*/g, '.*')}$`, 'i') + return regex.test(key) + } + return pattern.toLowerCase() === key.toLowerCase() + }) +} + +const translateAndRemoveKeys = (obj, removePatterns = []) => { + if (Array.isArray(obj)) { + return obj.map((item) => translateAndRemoveKeys(item, removePatterns)) + } else if (obj !== null && typeof obj === 'object') { + return Object.entries(obj).reduce((acc, [key, value]) => { + // Check if the key matches any removal pattern + if (!matchPattern(key, removePatterns)) { + const translatedKey = + translator[key.toLowerCase()] || + key.replace(/([A-Z])/g, ' $1').replace(/^./, (str) => str.toUpperCase()) + acc[translatedKey] = translateAndRemoveKeys(value, removePatterns) // Recursively process + } + return acc + }, {}) + } + return obj +} + +function CippJsonView({ object, removeKeys = ['*@odata*'] }) { + const currentTheme = useSelector((state) => state.app.currentTheme) + const preferredTheme = useMediaPredicate('(prefers-color-scheme: dark)') ? 'impact' : 'cyberdrain' + const theme = + currentTheme === 'impact' || (currentTheme === preferredTheme) === 'impact' + ? githubDarkTheme + : githubLightTheme + const translatedObject = translateAndRemoveKeys(object, removeKeys) + console.log('translatedObject', translatedObject) + + return ( + + ) +} + +export default CippJsonView diff --git a/src/data/translator.json b/src/data/translator.json new file mode 100644 index 000000000000..6144de6d1a7d --- /dev/null +++ b/src/data/translator.json @@ -0,0 +1,152 @@ +{ + "accessrights": "AccessRights", + "accountenabled": "Enabled", + "acquisitiondate": "Purchased on", + "actions": "Actions", + "activateddatetime": "Activated", + "activationstate": "Activation State", + "activesyncenabled": "ActiveSync Enabled", + "additionalemailaddresses": "Additional Email Addresses", + "affecteddevices": "Affected Devices Names", + "affecteddevicescount": "# Affected Devices", + "allocated": "Allocated (GB)", + "applicationid": "Application ID", + "assignedlicenses": "Licenses", + "assignedto": "Assigned to User", + "autoextendduration": "Auto Extend", + "avgseconds": "Avg (seconds)", + "builtincontrols": "Built-in Controls", + "callcount": "Call Count", + "cippconnectortype": "Type", + "clientapptypes": "Client App Types", + "clienttype": "Client Type", + "clientversion": "Client Version", + "command": "Command", + "comment": "Comment", + "companyname": "Company", + "created": " Created Date (Local)", + "createddatetime": "Created", + "customer/displayname": "Tenant", + "cveid": "CVE ID", + "date": "Date", + "defaultdomainname": "Default Domain", + "desc": "Description", + "deviceaccessstate": "Access State", + "devicefriendlyname": "Friendly Name", + "devicemodel": "Model", + "deviceos": "OS", + "devicetype": "Device Type", + "dkimenabled": "DKIM Enabled", + "dmarcactionpolicy": "DMARC Action Policy", + "dmarcpercentagepass": "DMARC % Pass", + "dmarcpresent": "DMARC Present", + "dnssecpresent": "DNSSec Enabled", + "domain": "Domain", + "ecpenabled": "ECP Enabled", + "enddatetime": "End", + "ewsenabled": "EWS Enabled", + "excludeapplications": "Exclude Applications", + "excluded": "Excluded", + "excludedate": "Exclude Date", + "excludegroups": "Exclude Groups", + "excludelocations": "Exclude Locations", + "excludeplatforms": "Platform Exc", + "excludeuser": "Exclude User", + "excludeusers": "Exclude Users", + "executedtime": "Last executed time", + "execution": "Execute", + "executioncount": "Executions", + "exploitabilitylevel": "Exploit Publicly Available", + "filecount": "File Count (Total)", + "firstsync": "First Sync", + "forwardto": "Forwards To", + "grantcontrolsoperator": "Control Operator", + "guid": "GUID", + "hasarchive": "Archiving Enabled", + "identity": "Identity", + "if": "If", + "imapenabled": "IMAP Enabled", + "includeapplications": "Include Applications", + "includegroups": "Include Groups", + "includelocations": "Include Locations", + "includeplatforms": "Platform Inc", + "includeunknowncountriesandregions": "Include Unknown Countries", + "includeusers": "Include Users", + "isocountrycode": "Country", + "isoperatorconnect": "Operator Connect", + "istransportrulescoped": "Only apply via transport rules", + "itemcount": "Item Count (Total)", + "lastactive": "Last Active", + "lastsuccesssync": "Last Succesfull Sync", + "lastsyncattempt": "Last Sync Attempt", + "mail": "Email", + "mailboxownerid": "Mailbox", + "mailnickname": "Mail nickname", + "mailprovider": "Mail Provider", + "mapienabled": "MAPI Enabled", + "maxseconds": "Max (seconds)", + "meetingcount": "Meeting Count", + "modifieddatetime": "Last Modified", + "mxpasstest": "MX Pass Test", + "numbertype": "Number Type", + "objectid": "Object ID", + "onpremisessyncenabled": "AD Synced", + "osplatform": "Platform", + "owaenabled": "OWA Enabled", + "parameters": "Parameters", + "placename": "Location", + "policyname": "Blocked by Policy", + "popenabled": "POP Enabled", + "postexecution": "Sending to", + "primarysmtpaddress": "Primary E-mail", + "product_display_name": "Display Name", + "quickscanoverdue": "CVSS Score", + "quotagb": "Quota (GB)", + "quotaused": "Quota Used(%)", + "rangeorlocation": "Locations or IPs", + "receivedtime": "Received on", + "recipientaddress": "Recipient", + "recipienttype": "Mailbox Type", + "recipienttypedetails": "Recipient Type Details", + "recurrence": "Recurrence", + "requestdate": "Request Date", + "requestreason": "Reason", + "requeststatus": "Status", + "requestuser": "Requester", + "scheduledtime": "Scheduled Time", + "scope": "Scope (Permissions)", + "scorepercentage": "Security Score", + "securityupdateavailable": "Update Available", + "senderaddress": "Sender", + "senderipaddresses": "Sender IP Addresses", + "service": "Service", + "smarthost": "Smarthost", + "softwarename": "Application Name", + "softwarevendor": "Vendor", + "spfpassall": "SPF Pass Test", + "startat": "Migration Started at", + "starttime": "Permissions Granted (Local)", + "state": "State", + "storageusedinbytes": "Used Space (GB)", + "subject": "Subject", + "tags": "Tags", + "taskstate": "Task State", + "teamschat": "Chat Count", + "telephonenumber": "Phone Number", + "template": "Root Template", + "tenantid": "Tenant ID", + "tenantname": "Tenant Name", + "tlsdomain": "TLS Domain", + "tlssendercertificatename": "Inbound Connector Hostname", + "tlssettings": "TLS Settings", + "totalseconds": "Total (seconds)", + "upn": "UPN", + "url": "URL", + "usedgb": "Used (GB)", + "user": "User", + "userprincipalname": "User Prinicipal Name", + "usertype": "User Type", + "visibility": "Visibility", + "vulnerabilityseveritylevel": "Severity", + "locationinfo": "Location Info" +} diff --git a/src/views/tenant/conditional/DeployCA.jsx b/src/views/tenant/conditional/DeployCA.jsx index f03618ba0bce..34c75c675fb5 100644 --- a/src/views/tenant/conditional/DeployCA.jsx +++ b/src/views/tenant/conditional/DeployCA.jsx @@ -6,9 +6,10 @@ import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons' import { CippWizard } from 'src/components/layout' import { WizardTableField } from 'src/components/tables' import PropTypes from 'prop-types' -import { RFFCFormRadio, RFFCFormSelect, RFFCFormTextarea } from 'src/components/forms' +import { Condition, RFFCFormRadio, RFFCFormSelect, RFFCFormTextarea } from 'src/components/forms' import { useLazyGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app' import { OnChange } from 'react-final-form-listeners' +import CippJsonView from 'src/components/utilities/CippJsonView' const Error = ({ name }) => ( { label: template.displayName, }))} placeholder="Select a template" - label="Please choose a template to apply, or enter the information manually." + label="Please choose a template to apply." /> )} + + {/* always hide the textarea */} + + + + + + - + + + {/* eslint-disable react/prop-types */} + {(props) => { + const json = props.values?.rawjson ? JSON.parse(props.values.rawjson) : {} + return ( + <> + + + ) + }} + - - - - + + + + + + + + + + + + + + + + + +
    From 5889082481037dd3080b4d50c3f8f4ea66ea9237 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 10 Apr 2024 18:06:56 -0400 Subject: [PATCH 107/133] Partner webhooks --- src/views/cipp/app-settings/CIPPSettings.jsx | 24 ++- .../cipp/app-settings/SettingsPartner.jsx | 152 ++++++++++++++++++ 2 files changed, 168 insertions(+), 8 deletions(-) create mode 100644 src/views/cipp/app-settings/SettingsPartner.jsx diff --git a/src/views/cipp/app-settings/CIPPSettings.jsx b/src/views/cipp/app-settings/CIPPSettings.jsx index ff43ad2a5a94..c1e6b9463fd7 100644 --- a/src/views/cipp/app-settings/CIPPSettings.jsx +++ b/src/views/cipp/app-settings/CIPPSettings.jsx @@ -11,6 +11,7 @@ import { SettingsLicenses } from 'src/views/cipp/app-settings/SettingsLicenses.j import { SettingsExtensions } from 'src/views/cipp/app-settings/SettingsExtensions.jsx' import { SettingsMaintenance } from 'src/views/cipp/app-settings/SettingsMaintenance.jsx' import { SettingsExtensionMappings } from 'src/views/cipp/app-settings/SettingsExtensionMappings.jsx' +import { SettingsPartner } from 'src/views/cipp/app-settings/SettingsPartner.jsx' /** * This function returns the settings page content for CIPP. @@ -35,15 +36,18 @@ export default function CIPPSettings() { Notifications setActive(5)} href="#"> - Licenses + Partner Webhooks setActive(6)} href="#"> - Maintenance + Licenses setActive(7)} href="#"> - Extensions + Maintenance setActive(8)} href="#"> + Extensions + + setActive(9)} href="#"> Extension Mappings @@ -68,22 +72,26 @@ export default function CIPPSettings() { - - - + + - + - + + + + + + diff --git a/src/views/cipp/app-settings/SettingsPartner.jsx b/src/views/cipp/app-settings/SettingsPartner.jsx new file mode 100644 index 000000000000..e56b479cc7a2 --- /dev/null +++ b/src/views/cipp/app-settings/SettingsPartner.jsx @@ -0,0 +1,152 @@ +import { useGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app.js' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' +import { + CBadge, + CButton, + CCallout, + CCard, + CCardBody, + CCardHeader, + CCardTitle, + CCol, + CForm, + CRow, + CSpinner, +} from '@coreui/react' +import { Form, useForm } from 'react-final-form' +import { RFFCFormInput, RFFCFormSwitch, RFFSelectSearch } from 'src/components/forms/index.js' +import React, { useEffect, useState } from 'react' +import { CippCallout } from 'src/components/layout/index.js' +import { CippCodeBlock } from 'src/components/utilities' +import { CellDate } from 'src/components/tables' + +/** + * Sets the notification settings. + * @returns {JSX.Element} The notification settings component. + */ +export function SettingsPartner() { + const webhookConfig = useGenericGetRequestQuery({ + path: '/api/ExecPartnerWebhook', + params: { Action: 'ListSubscription' }, + }) + const webhookEvents = useGenericGetRequestQuery({ + path: '/api/ExecPartnerWebhook', + params: { Action: 'ListEventTypes' }, + }) + const [submitWebhook, webhookCreateResult] = useLazyGenericPostRequestQuery() + + const onSubmit = (values) => { + const shippedValues = { + EventType: values?.EventType?.map((event) => event.value), + } + submitWebhook({ + path: '/api/ExecPartnerWebhook?Action=CreateSubscription', + values: shippedValues, + }).then((res) => { + webhookConfig.refetch() + }) + } + + return ( + + + + <> + webhookConfig.refetch()} + className="mb-2" + disabled={webhookConfig.isFetching} + > + {webhookConfig.isFetching ? ( + <> + Loading... + + ) : ( + <> + + Refresh + + )} + + + {!webhookConfig.isFetching && webhookConfig.error && ( + Error loading data + )} + {webhookConfig.isSuccess && ( + <> +

    Webhook Configuration

    + + +

    Webhook URL

    + +
    + +

    Last Updated

    + +
    + +

    Subscribed Events

    + ({ + label: event, + value: event, + })), + }} + render={({ handleSubmit }) => ( + <> + + ({ + name: event, + value: event, + }))} + multi={true} + refreshFunction={() => webhookEvents.refetch()} + helpText="Select the events you want to receive notifications for." + /> + + {webhookCreateResult.isFetching ? ( + <> + + Saving... + + ) : ( + 'Save' + )} + + + + )} + /> + {webhookCreateResult.isSuccess && ( + + {webhookCreateResult?.data?.Results} + + )} +
    +
    + + )} + +
    +
    + ) +} From 9d0cb5b12ba5e7c71ee9f76d190bdd54833dd210 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 11 Apr 2024 00:24:25 +0200 Subject: [PATCH 108/133] removed console logs --- .../utilities/CippActionsOffcanvas.jsx | 2 +- src/components/utilities/CippJsonView.jsx | 117 ++++++++++++++---- .../utilities/CippListOffcanvas.jsx | 2 +- src/components/utilities/CippOffcanvas.jsx | 2 +- src/hooks/useNavFavouriteCheck.jsx | 2 +- src/hooks/useRouteNavCompare.jsx | 2 +- src/views/cipp/UserSettings.jsx | 14 +-- .../applications/ApplicationsAddChocoApp.jsx | 2 +- .../applications/ApplicationsAddWinGet.jsx | 4 +- .../endpoint/intune/MEMListAppProtection.jsx | 2 +- .../administration/ListGDAPRelationships.jsx | 1 - src/views/tenant/administration/Tenants.jsx | 4 +- 12 files changed, 112 insertions(+), 42 deletions(-) diff --git a/src/components/utilities/CippActionsOffcanvas.jsx b/src/components/utilities/CippActionsOffcanvas.jsx index 6bc9d896d71c..c2cab6d24539 100644 --- a/src/components/utilities/CippActionsOffcanvas.jsx +++ b/src/components/utilities/CippActionsOffcanvas.jsx @@ -40,7 +40,7 @@ export default function CippActionsOffcanvas(props) { (modalMessage, modalUrl, modalType = 'GET', modalBody, modalInput, modalDropdown) => { const handlePostConfirm = () => { const selectedValue = inputRef.current.value - console.log(inputRef) + //console.log(inputRef) let additionalFields = {} if (inputRef.current.nodeName === 'SELECT') { diff --git a/src/components/utilities/CippJsonView.jsx b/src/components/utilities/CippJsonView.jsx index 635da48a9cdf..90b7f9fe1fe2 100644 --- a/src/components/utilities/CippJsonView.jsx +++ b/src/components/utilities/CippJsonView.jsx @@ -1,8 +1,23 @@ -import React from 'react' -import JsonView from '@uiw/react-json-view' +import React, { useState } from 'react' import { useSelector } from 'react-redux' import { useMediaPredicate } from 'react-media-hook' -import translator from 'src/data/translator.json' +import JsonView from '@uiw/react-json-view' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { + CAccordion, + CAccordionBody, + CAccordionHeader, + CAccordionItem, + CCard, + CCardBody, + CCardHeader, + CCardTitle, + CCol, + CFormSwitch, + CRow, +} from '@coreui/react' +import translator from 'src/data/translator.json' // Ensure the path to your translator.json is correct + const githubLightTheme = { '--w-rjv-font-family': 'monospace', '--w-rjv-color': '#6f42c1', @@ -64,10 +79,10 @@ export const githubDarkTheme = { '--w-rjv-type-nan-color': '#859900', '--w-rjv-type-undefined-color': '#79c0ff', } + const matchPattern = (key, patterns) => { return patterns.some((pattern) => { if (pattern.includes('*')) { - // Replace * with regex that matches any character sequence and create a RegExp object const regex = new RegExp(`^${pattern.replace(/\*/g, '.*')}$`, 'i') return regex.test(key) } @@ -75,42 +90,100 @@ const matchPattern = (key, patterns) => { }) } +const removeNullOrEmpty = (obj) => { + if (Array.isArray(obj)) { + const filteredArray = obj.filter((item) => item != null).map(removeNullOrEmpty) + return filteredArray.length > 0 ? filteredArray : null + } else if (typeof obj === 'object' && obj !== null) { + const result = Object.entries(obj).reduce((acc, [key, value]) => { + const processedValue = removeNullOrEmpty(value) + if (processedValue != null) { + acc[key] = processedValue + } + return acc + }, {}) + return Object.keys(result).length > 0 ? result : null + } + return obj +} + const translateAndRemoveKeys = (obj, removePatterns = []) => { + obj = removeNullOrEmpty(obj) if (Array.isArray(obj)) { return obj.map((item) => translateAndRemoveKeys(item, removePatterns)) - } else if (obj !== null && typeof obj === 'object') { + } else if (typeof obj === 'object' && obj !== null) { return Object.entries(obj).reduce((acc, [key, value]) => { - // Check if the key matches any removal pattern if (!matchPattern(key, removePatterns)) { const translatedKey = translator[key.toLowerCase()] || key.replace(/([A-Z])/g, ' $1').replace(/^./, (str) => str.toUpperCase()) - acc[translatedKey] = translateAndRemoveKeys(value, removePatterns) // Recursively process + acc[translatedKey] = translateAndRemoveKeys(value, removePatterns) } return acc }, {}) } return obj } +function renderObjectAsColumns(object, level = 0, maxLevel = 4) { + const content = [] + let nextLevelObject = null + + for (const [key, value] of Object.entries(object)) { + if (level < maxLevel && typeof value === 'object' && value !== null && !Array.isArray(value)) { + nextLevelObject = value // Prepare the next level's object for rendering + continue // Skip to avoid rendering this as a separate card + } + + // Render current level key-value pairs + content.push( + + + {key} + {JSON.stringify(value, null, 2)} + + , + ) + } + + return ( + <> + {content} + {nextLevelObject && renderObjectAsColumns(nextLevelObject, level + 1, maxLevel)} + + ) +} -function CippJsonView({ object, removeKeys = ['*@odata*'] }) { - const currentTheme = useSelector((state) => state.app.currentTheme) - const preferredTheme = useMediaPredicate('(prefers-color-scheme: dark)') ? 'impact' : 'cyberdrain' +function CippJsonView({ + jsonData = { 'No Data Selected': 'No Data Selected' }, + removeKeys = ['*@odata*', 'id', 'guid', 'createdDateTime', '*modified*', 'deletedDateTime'], +}) { + const [showRawJson, setShowRawJson] = useState(false) const theme = - currentTheme === 'impact' || (currentTheme === preferredTheme) === 'impact' - ? githubDarkTheme - : githubLightTheme - const translatedObject = translateAndRemoveKeys(object, removeKeys) - console.log('translatedObject', translatedObject) + useSelector((state) => state.app.currentTheme) === 'dark' ? githubDarkTheme : githubLightTheme + const cleanedJsonData = translateAndRemoveKeys(jsonData, removeKeys) return ( - +
    + + + Settings + + setShowRawJson(!showRawJson)} /> + {showRawJson ? ( + + ) : ( + {renderObjectAsColumns(cleanedJsonData)} + )} + + + +
    ) } diff --git a/src/components/utilities/CippListOffcanvas.jsx b/src/components/utilities/CippListOffcanvas.jsx index b27c1ed3dbd4..4fbde6931ce3 100644 --- a/src/components/utilities/CippListOffcanvas.jsx +++ b/src/components/utilities/CippListOffcanvas.jsx @@ -39,7 +39,7 @@ CippListOffcanvas.propTypes = { } export function OffcanvasListSection({ title, items }) { - console.log(items) + //console.log(items) const mappedItems = items.map((item, key) => ({ value: item.content, label: item.heading })) return ( <> diff --git a/src/components/utilities/CippOffcanvas.jsx b/src/components/utilities/CippOffcanvas.jsx index d3eaece82e94..eb20726fbfbe 100644 --- a/src/components/utilities/CippOffcanvas.jsx +++ b/src/components/utilities/CippOffcanvas.jsx @@ -23,7 +23,7 @@ export default function CippOffcanvas(props) { color="link" size="lg" onClick={() => { - console.log('refresh') + //console.log('refresh') props.refreshFunction() }} > diff --git a/src/hooks/useNavFavouriteCheck.jsx b/src/hooks/useNavFavouriteCheck.jsx index 90f710405b18..2045b101ea25 100644 --- a/src/hooks/useNavFavouriteCheck.jsx +++ b/src/hooks/useNavFavouriteCheck.jsx @@ -15,7 +15,7 @@ export const useNavFavouriteCheck = (navigation) => { to: '/favorites', icon: , items: favourites.map((item) => { - console.log(item) + //console.log(item) return { name: item.value.name, to: item.value.to, diff --git a/src/hooks/useRouteNavCompare.jsx b/src/hooks/useRouteNavCompare.jsx index aee23a37474d..27fc1f9a3a14 100644 --- a/src/hooks/useRouteNavCompare.jsx +++ b/src/hooks/useRouteNavCompare.jsx @@ -21,7 +21,7 @@ export const useRouteNavCompare = (navigation) => { ) { return true } else { - console.log('Removing route', item) + //console.log('Removing route', item) return false } }) diff --git a/src/views/cipp/UserSettings.jsx b/src/views/cipp/UserSettings.jsx index 21ab0182287c..955101c02921 100644 --- a/src/views/cipp/UserSettings.jsx +++ b/src/views/cipp/UserSettings.jsx @@ -216,14 +216,12 @@ const UserSettings = () => { multi={true} values={_nav .reduce((acc, val) => acc.concat(val.items), []) - .map( - (item) => ( - console.log(item), - { - name: item?.name, - value: { to: item?.to, name: item?.name }, - } - ), + .map((item) => + // console.log(item), + ({ + name: item?.name, + value: { to: item?.to, name: item?.name }, + }), )} allowCreate={false} refreshFunction={() => diff --git a/src/views/endpoint/applications/ApplicationsAddChocoApp.jsx b/src/views/endpoint/applications/ApplicationsAddChocoApp.jsx index 7d4ef791b391..2995fd32bb16 100644 --- a/src/views/endpoint/applications/ApplicationsAddChocoApp.jsx +++ b/src/views/endpoint/applications/ApplicationsAddChocoApp.jsx @@ -87,7 +87,7 @@ const ApplyStandard = () => { {(value) => { let template = foundPackages.data.Results.filter(function (obj) { - console.log(value) + //console.log(value) return obj.packagename === value }) onChange(template[0][set]) diff --git a/src/views/endpoint/applications/ApplicationsAddWinGet.jsx b/src/views/endpoint/applications/ApplicationsAddWinGet.jsx index dda13eecf7c6..525c39d93799 100644 --- a/src/views/endpoint/applications/ApplicationsAddWinGet.jsx +++ b/src/views/endpoint/applications/ApplicationsAddWinGet.jsx @@ -88,10 +88,10 @@ const AddWinGet = () => { {(value) => { let template = foundPackages.data.filter(function (obj) { - console.log(value) + // console.log(value) return obj.packagename === value }) - console.log(template[0]) + //console.log(template[0]) onChange(template[0][set]) }} diff --git a/src/views/endpoint/intune/MEMListAppProtection.jsx b/src/views/endpoint/intune/MEMListAppProtection.jsx index 9f63b4820fde..b3e59de4c9e7 100644 --- a/src/views/endpoint/intune/MEMListAppProtection.jsx +++ b/src/views/endpoint/intune/MEMListAppProtection.jsx @@ -19,7 +19,7 @@ import { cellBooleanFormatter, cellDateFormatter } from 'src/components/tables' const Actions = (row, rowIndex, formatExtraData) => { const [ocVisible, setOCVisible] = useState(false) - console.log(row) + //console.log(row) const tenant = useSelector((state) => state.app.currentTenant) return ( <> diff --git a/src/views/tenant/administration/ListGDAPRelationships.jsx b/src/views/tenant/administration/ListGDAPRelationships.jsx index e55def41f1ce..c463797c16c9 100644 --- a/src/views/tenant/administration/ListGDAPRelationships.jsx +++ b/src/views/tenant/administration/ListGDAPRelationships.jsx @@ -128,7 +128,6 @@ const Actions = (row, rowIndex, formatExtraData) => { ) } - const GDAPRelationships = () => { const columns = [ { diff --git a/src/views/tenant/administration/Tenants.jsx b/src/views/tenant/administration/Tenants.jsx index 87ab0a9d12da..f4d14335e6cc 100644 --- a/src/views/tenant/administration/Tenants.jsx +++ b/src/views/tenant/administration/Tenants.jsx @@ -11,9 +11,9 @@ import { CippTenantOffcanvasRow } from 'src/components/utilities/CippTenantOffca const TenantsList = () => { const TenantListSelector = useSelector((state) => state.app.TenantListSelector) const tenant = useSelector((state) => state.app.currentTenant) - console.log('TenantListSelector', TenantListSelector) + //console.log('TenantListSelector', TenantListSelector) const [columnOmits, setOmitVisible] = useState(TenantListSelector) - console.log('columnOmits', columnOmits) + //console.log('columnOmits', columnOmits) const generatePortalColumn = (portal) => ({ name: portal.label, omit: columnOmits, From 6ce20e0f1697b55cc82fea5008cdfa13f3ec174f Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 11 Apr 2024 00:42:43 +0200 Subject: [PATCH 109/133] testing new layout --- src/components/utilities/CippJsonView.jsx | 96 ++++++++++++----------- 1 file changed, 49 insertions(+), 47 deletions(-) diff --git a/src/components/utilities/CippJsonView.jsx b/src/components/utilities/CippJsonView.jsx index 90b7f9fe1fe2..87a9d94b221a 100644 --- a/src/components/utilities/CippJsonView.jsx +++ b/src/components/utilities/CippJsonView.jsx @@ -1,8 +1,8 @@ import React, { useState } from 'react' +import JsonView from '@uiw/react-json-view' import { useSelector } from 'react-redux' import { useMediaPredicate } from 'react-media-hook' -import JsonView from '@uiw/react-json-view' -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import translator from 'src/data/translator.json' import { CAccordion, CAccordionBody, @@ -14,9 +14,14 @@ import { CCardTitle, CCol, CFormSwitch, + CListGroup, + CListGroupItem, + CNav, + CNavItem, + CNavLink, CRow, } from '@coreui/react' -import translator from 'src/data/translator.json' // Ensure the path to your translator.json is correct +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' const githubLightTheme = { '--w-rjv-font-family': 'monospace', @@ -79,10 +84,10 @@ export const githubDarkTheme = { '--w-rjv-type-nan-color': '#859900', '--w-rjv-type-undefined-color': '#79c0ff', } - const matchPattern = (key, patterns) => { return patterns.some((pattern) => { if (pattern.includes('*')) { + // Replace * with regex that matches any character sequence and create a RegExp object const regex = new RegExp(`^${pattern.replace(/\*/g, '.*')}$`, 'i') return regex.test(key) } @@ -92,93 +97,90 @@ const matchPattern = (key, patterns) => { const removeNullOrEmpty = (obj) => { if (Array.isArray(obj)) { + // Filter out null or undefined items and apply recursively const filteredArray = obj.filter((item) => item != null).map(removeNullOrEmpty) + // Additionally, remove empty arrays return filteredArray.length > 0 ? filteredArray : null } else if (typeof obj === 'object' && obj !== null) { const result = Object.entries(obj).reduce((acc, [key, value]) => { const processedValue = removeNullOrEmpty(value) if (processedValue != null) { + // Checks for both null and undefined acc[key] = processedValue } return acc }, {}) + // Additionally, remove empty objects return Object.keys(result).length > 0 ? result : null } return obj } const translateAndRemoveKeys = (obj, removePatterns = []) => { - obj = removeNullOrEmpty(obj) + obj = removeNullOrEmpty(obj) // Clean the object first if (Array.isArray(obj)) { return obj.map((item) => translateAndRemoveKeys(item, removePatterns)) } else if (typeof obj === 'object' && obj !== null) { return Object.entries(obj).reduce((acc, [key, value]) => { + // Check if the key matches any removal pattern if (!matchPattern(key, removePatterns)) { const translatedKey = translator[key.toLowerCase()] || key.replace(/([A-Z])/g, ' $1').replace(/^./, (str) => str.toUpperCase()) - acc[translatedKey] = translateAndRemoveKeys(value, removePatterns) + acc[translatedKey] = translateAndRemoveKeys(value, removePatterns) // Recursively process } return acc }, {}) } return obj } -function renderObjectAsColumns(object, level = 0, maxLevel = 4) { - const content = [] - let nextLevelObject = null - - for (const [key, value] of Object.entries(object)) { - if (level < maxLevel && typeof value === 'object' && value !== null && !Array.isArray(value)) { - nextLevelObject = value // Prepare the next level's object for rendering - continue // Skip to avoid rendering this as a separate card - } - - // Render current level key-value pairs - content.push( - - - {key} - {JSON.stringify(value, null, 2)} - - , - ) - } - - return ( - <> - {content} - {nextLevelObject && renderObjectAsColumns(nextLevelObject, level + 1, maxLevel)} - - ) -} - function CippJsonView({ - jsonData = { 'No Data Selected': 'No Data Selected' }, - removeKeys = ['*@odata*', 'id', 'guid', 'createdDateTime', '*modified*', 'deletedDateTime'], + object = { 'No Data Selected': 'No Data Selected' }, + removeKeys = ['*@odata*', 'created*', '*modified*', 'id', 'guid'], }) { - const [showRawJson, setShowRawJson] = useState(false) + const currentTheme = useSelector((state) => state.app.currentTheme) + const preferredTheme = useMediaPredicate('(prefers-color-scheme: dark)') ? 'impact' : 'cyberdrain' const theme = - useSelector((state) => state.app.currentTheme) === 'dark' ? githubDarkTheme : githubLightTheme - const cleanedJsonData = translateAndRemoveKeys(jsonData, removeKeys) - + currentTheme === 'impact' || (currentTheme === preferredTheme) === 'impact' + ? githubDarkTheme + : githubLightTheme + const translatedObject = translateAndRemoveKeys(object, removeKeys) + const [switchRef, setSwitchRef] = useState(false) + console.log(translatedObject) return (
    - - Settings + + + {object.displayName ? `${object.displayName} Settings` : 'Settings'} + - setShowRawJson(!showRawJson)} /> - {showRawJson ? ( + setSwitchRef(!switchRef)} /> + {switchRef ? ( ) : ( - {renderObjectAsColumns(cleanedJsonData)} + + {translatedObject && + Object.keys(translatedObject).map((key) => ( + + + + {key} + + + +
    {JSON.stringify(translatedObject[key], null, 2)}
    +
    +
    +
    + ))} +
    )}
    From ebcc929cd9de1b629a66b44b83c15a6fca399b3d Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 10 Apr 2024 19:58:29 -0400 Subject: [PATCH 110/133] Add webhook testing --- .../cipp/app-settings/SettingsPartner.jsx | 131 ++++++++++++++++-- 1 file changed, 123 insertions(+), 8 deletions(-) diff --git a/src/views/cipp/app-settings/SettingsPartner.jsx b/src/views/cipp/app-settings/SettingsPartner.jsx index e56b479cc7a2..91f45d98c11e 100644 --- a/src/views/cipp/app-settings/SettingsPartner.jsx +++ b/src/views/cipp/app-settings/SettingsPartner.jsx @@ -1,6 +1,9 @@ -import { useGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app.js' +import { + useGenericGetRequestQuery, + useLazyGenericGetRequestQuery, + useLazyGenericPostRequestQuery, +} from 'src/store/api/app.js' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' import { CBadge, CButton, @@ -11,12 +14,13 @@ import { CCardTitle, CCol, CForm, + CLink, CRow, CSpinner, } from '@coreui/react' -import { Form, useForm } from 'react-final-form' -import { RFFCFormInput, RFFCFormSwitch, RFFSelectSearch } from 'src/components/forms/index.js' -import React, { useEffect, useState } from 'react' +import { Form } from 'react-final-form' +import { RFFSelectSearch } from 'src/components/forms/index.js' +import React, { useEffect } from 'react' import { CippCallout } from 'src/components/layout/index.js' import { CippCodeBlock } from 'src/components/utilities' import { CellDate } from 'src/components/tables' @@ -35,6 +39,8 @@ export function SettingsPartner() { params: { Action: 'ListEventTypes' }, }) const [submitWebhook, webhookCreateResult] = useLazyGenericPostRequestQuery() + const [sendTest, sendTestResult] = useLazyGenericGetRequestQuery() + const [checkTest, checkTestResult] = useLazyGenericGetRequestQuery() const onSubmit = (values) => { const shippedValues = { @@ -48,6 +54,25 @@ export function SettingsPartner() { }) } + useEffect(() => { + if ( + sendTestResult.isSuccess && + sendTestResult?.data?.Results?.correlationId && + !checkTestResult?.data?.Results?.results + ) { + setTimeout( + checkTest({ + path: '/api/ExecPartnerWebhook', + params: { + Action: 'ValidateTest', + CorrelationId: sendTestResult?.data?.Results?.correlationId, + }, + }), + 1000, + ) + } + }, [sendTestResult, checkTest, checkTestResult]) + return ( @@ -77,11 +102,25 @@ export function SettingsPartner() { {webhookConfig.isSuccess && ( <>

    Webhook Configuration

    + + + Subscribe to Microsoft Partner center webhooks to enable automatic tenant + onboarding and alerting. Updating the settings will replace any existing webhook + subscription with one pointing to CIPP. Refer to the{' '} + + Microsoft Partner Center documentation + {' '} + for more information on the webhook types. + +

    Webhook URL

    @@ -93,7 +132,7 @@ export function SettingsPartner() { format="short" />
    - +

    Subscribed Events

    {webhookCreateResult.isFetching ? ( @@ -143,6 +182,82 @@ export function SettingsPartner() { )}
    +

    Webhook Test

    + + + + sendTest({ + path: '/api/ExecPartnerWebhook', + params: { Action: 'SendTest' }, + }) + } + > + {sendTestResult.isFetching ? ( + <> + + Running Test... + + ) : ( + 'Start Test' + )} + + {checkTestResult.isFetching && !checkTestResult?.data?.Results?.result && ( + <> + Waiting for results + + )} + + + + {checkTestResult.isSuccess && ( + <> + +

    Status

    + {checkTestResult?.data?.Results.status} +
    + {Array.isArray(checkTestResult?.data?.Results?.results) && ( + <> + +

    Status Code

    + + {checkTestResult?.data?.Results?.results[0].responseCode} +
    + {checkTestResult?.data?.Results?.results[0].responseMessage !== '' && ( + +

    Response Message

    + {checkTestResult.data.Results.results[0].responseMessage} +
    + )} + +

    Date/Time

    + +
    + + )} + + )} +
    )} From a7a172261636ee771604a196f216771e980a6602 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 11 Apr 2024 12:13:29 +0200 Subject: [PATCH 111/133] fixes new json view --- src/components/utilities/CippJsonView.jsx | 75 ++++++++++++++++++----- src/views/tenant/conditional/DeployCA.jsx | 8 ++- 2 files changed, 66 insertions(+), 17 deletions(-) diff --git a/src/components/utilities/CippJsonView.jsx b/src/components/utilities/CippJsonView.jsx index 87a9d94b221a..13110e931011 100644 --- a/src/components/utilities/CippJsonView.jsx +++ b/src/components/utilities/CippJsonView.jsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react' +import React, { useEffect, useState } from 'react' import JsonView from '@uiw/react-json-view' import { useSelector } from 'react-redux' import { useMediaPredicate } from 'react-media-hook' @@ -8,6 +8,7 @@ import { CAccordionBody, CAccordionHeader, CAccordionItem, + CButton, CCard, CCardBody, CCardHeader, @@ -144,13 +145,60 @@ function CippJsonView({ currentTheme === 'impact' || (currentTheme === preferredTheme) === 'impact' ? githubDarkTheme : githubLightTheme - const translatedObject = translateAndRemoveKeys(object, removeKeys) + const [translatedObject, setTranslatedObject] = useState(() => + translateAndRemoveKeys(object, removeKeys), + ) const [switchRef, setSwitchRef] = useState(false) - console.log(translatedObject) + // Adjusting the expanded state to track selections for up to 4 levels + const [expansionPath, setExpansionPath] = useState([{ object: translatedObject }]) + console.log(object) + + useEffect(() => { + const newTranslatedObject = translateAndRemoveKeys(object, removeKeys) + setTranslatedObject(newTranslatedObject) + setExpansionPath([{ object: newTranslatedObject }]) // Reset the expansion path with the new object + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [JSON.stringify(object), JSON.stringify(removeKeys)]) + + // Updated to handle deeper level expansions + const handleExpand = (level, content) => { + const newPath = expansionPath.slice(0, level) + newPath.push({ object: content }) + setExpansionPath(newPath) + } + const renderContent = (content, level = 0) => { + if (Array.isArray(content)) { + return ( +
      + {content.map((item, index) => ( +
    • {JSON.stringify(item, null, 2)}
    • + ))} +
    + ) + } else if (typeof content === 'object') { + return Object.entries(content).map(([key, value]) => ( +
    + {key}: + {typeof value === 'object' ? ( + handleExpand(level + 1, value)} variant="ghost"> + + Show More + + ) : ( + ` ${value}` + )} +
    + )) + } else if (typeof content === 'string') { + return content.replace(/(^"|"$)/g, '') // Remove quotes + } + return String(content) + } + return (
    - + {object.displayName ? `${object.displayName} Settings` : 'Settings'} @@ -166,20 +214,19 @@ function CippJsonView({ /> ) : ( - {translatedObject && - Object.keys(translatedObject).map((key) => ( - - + {expansionPath.map((expansion, index) => ( + + {Object.entries(expansion.object).map(([key, value]) => ( + {key} - + - -
    {JSON.stringify(translatedObject[key], null, 2)}
    -
    + {renderContent(value, index)}
    -
    - ))} + ))} +
    + ))}
    )} diff --git a/src/views/tenant/conditional/DeployCA.jsx b/src/views/tenant/conditional/DeployCA.jsx index 34c75c675fb5..cf30e97a342a 100644 --- a/src/views/tenant/conditional/DeployCA.jsx +++ b/src/views/tenant/conditional/DeployCA.jsx @@ -161,7 +161,7 @@ const AddPolicy = () => { {/* eslint-disable react/prop-types */} {(props) => { - const json = props.values?.rawjson ? JSON.parse(props.values.rawjson) : {} + const json = props.values?.rawjson ? JSON.parse(props.values.rawjson) : undefined return ( <> @@ -238,6 +238,8 @@ const AddPolicy = () => { {/* eslint-disable react/prop-types */} {(props) => { + const json = props.values?.rawjson ? JSON.parse(props.values.rawjson) : undefined + return ( <> @@ -251,8 +253,8 @@ const AddPolicy = () => { ))} -
    Rule Settings
    - {props.values.rawjson} +
    Rule Settings
    +
    From 490710abfe2c3805c705878a850c4eb862af14af Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 11 Apr 2024 12:20:59 +0200 Subject: [PATCH 112/133] add displayName sort if available. --- src/components/utilities/CippJsonView.jsx | 25 +++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/components/utilities/CippJsonView.jsx b/src/components/utilities/CippJsonView.jsx index 13110e931011..4a738c33a600 100644 --- a/src/components/utilities/CippJsonView.jsx +++ b/src/components/utilities/CippJsonView.jsx @@ -151,10 +151,31 @@ function CippJsonView({ const [switchRef, setSwitchRef] = useState(false) // Adjusting the expanded state to track selections for up to 4 levels const [expansionPath, setExpansionPath] = useState([{ object: translatedObject }]) - console.log(object) useEffect(() => { - const newTranslatedObject = translateAndRemoveKeys(object, removeKeys) + const sortObject = (obj) => { + const order = ['displayName', 'name', 'state'] // Define the desired order + const sortedKeys = Object.keys(obj).sort((a, b) => { + const indexA = order.indexOf(a) + const indexB = order.indexOf(b) + if (indexA === -1 && indexB === -1) { + return 0 // If both keys are not in the order array, maintain the original order + } else if (indexA === -1) { + return 1 // If only key A is not in the order array, move key B to a higher position + } else if (indexB === -1) { + return -1 // If only key B is not in the order array, move key A to a higher position + } else { + return indexA - indexB // Sort based on the index in the order array + } + }) + const sortedObject = {} + sortedKeys.forEach((key) => { + sortedObject[key] = obj[key] + }) + return sortedObject + } + + const newTranslatedObject = sortObject(translateAndRemoveKeys(sortObject(object), removeKeys)) setTranslatedObject(newTranslatedObject) setExpansionPath([{ object: newTranslatedObject }]) // Reset the expansion path with the new object // eslint-disable-next-line react-hooks/exhaustive-deps From db636c17b9c8b4e3316462fa7c88642ddd1f0850 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 11 Apr 2024 12:51:34 +0200 Subject: [PATCH 113/133] replaces json overview --- src/views/endpoint/intune/MEMAddPolicy.jsx | 54 +++++++++++----------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/src/views/endpoint/intune/MEMAddPolicy.jsx b/src/views/endpoint/intune/MEMAddPolicy.jsx index 9ab14f4840ca..161b0134665f 100644 --- a/src/views/endpoint/intune/MEMAddPolicy.jsx +++ b/src/views/endpoint/intune/MEMAddPolicy.jsx @@ -15,6 +15,7 @@ import { } from 'src/components/forms' import { useLazyGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app' import { OnChange } from 'react-final-form-listeners' +import CippJsonView from 'src/components/utilities/CippJsonView' const Error = ({ name }) => ( {

    Step 2

    -
    - Enter the raw JSON for this policy. See{' '} - - this - {' '} - information. -
    +
    Enter the information for this policy

    @@ -155,25 +150,27 @@ const AddPolicy = () => { label: template.Displayname, }))} placeholder="Select a template" - label="Please choose a template to apply, or enter the information manually." + label="Please choose a template to apply." /> )} - + + + @@ -198,18 +195,23 @@ const AddPolicy = () => { - + + + {(props) => { + console.log(props.values.RAWJson) + const json = props.values?.RAWJson ? JSON.parse(props.values.RAWJson) : undefined return ( <> + {props.values.RAWJson?.match('%.*%') && From d973469eab372a49a338f7a468f7f7ce931fd8f0 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 11 Apr 2024 13:34:18 +0200 Subject: [PATCH 114/133] prettification --- src/views/tenant/conditional/DeployCA.jsx | 37 ++++++++++++++++++----- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/views/tenant/conditional/DeployCA.jsx b/src/views/tenant/conditional/DeployCA.jsx index cf30e97a342a..46de880a02da 100644 --- a/src/views/tenant/conditional/DeployCA.jsx +++ b/src/views/tenant/conditional/DeployCA.jsx @@ -6,7 +6,13 @@ import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons' import { CippWizard } from 'src/components/layout' import { WizardTableField } from 'src/components/tables' import PropTypes from 'prop-types' -import { Condition, RFFCFormRadio, RFFCFormSelect, RFFCFormTextarea } from 'src/components/forms' +import { + Condition, + RFFCFormRadio, + RFFCFormSelect, + RFFCFormSwitch, + RFFCFormTextarea, +} from 'src/components/forms' import { useLazyGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app' import { OnChange } from 'react-final-form-listeners' import CippJsonView from 'src/components/utilities/CippJsonView' @@ -174,26 +180,37 @@ const AddPolicy = () => { + + + + + Warning: This will remove all exclusions and apply to all users. You might be + locked out of your tenant if you have not not excluded any roles. Please make sure + this is the action you want to perform. + + + @@ -224,7 +241,11 @@ const AddPolicy = () => { > - + + + + +
    From f8b3f37085f0c28f75663174db10a539c3019295 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 11 Apr 2024 15:26:51 +0200 Subject: [PATCH 115/133] null safe edit user --- src/views/identity/administration/EditUser.jsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/views/identity/administration/EditUser.jsx b/src/views/identity/administration/EditUser.jsx index 4f2aef34773e..3cfc21641997 100644 --- a/src/views/identity/administration/EditUser.jsx +++ b/src/views/identity/administration/EditUser.jsx @@ -137,10 +137,12 @@ const EditUser = () => { }, license: precheckedLicenses, //if currentSettings.defaultAttributes exists. Set each of the keys inside of currentSettings.defaultAttributes.label to the value of the user attribute found in the user object. - defaultAttributes: currentSettings?.userSettingsDefaults?.defaultAttributes.reduce( - (o, key) => Object.assign(o, { [key.label]: { Value: user[key.label] } }), - {}, - ), + defaultAttributes: currentSettings?.userSettingsDefaults?.defaultAttributes + ? currentSettings?.userSettingsDefaults?.defaultAttributes.reduce( + (o, key) => Object.assign(o, { [key.label]: { Value: user[key.label] } }), + {}, + ) + : [], } const formDisabled = queryError === true || !!userError || !user || Object.keys(user).length === 0 @@ -410,7 +412,7 @@ const EditUser = () => { <> - {currentSettings?.userSettingsDefaults?.defaultAttributes.map( + {currentSettings?.userSettingsDefaults?.defaultAttributes?.map( (attribute, idx) => ( From e4e581b7b39cf700d8abe372e9a52acdad2d9d69 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 11 Apr 2024 15:28:00 +0200 Subject: [PATCH 116/133] null safe adduser --- src/views/identity/administration/AddUser.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/identity/administration/AddUser.jsx b/src/views/identity/administration/AddUser.jsx index f35d42385b9d..96186c358ed9 100644 --- a/src/views/identity/administration/AddUser.jsx +++ b/src/views/identity/administration/AddUser.jsx @@ -330,7 +330,7 @@ const AddUser = () => { <> - {currentSettings?.userSettingsDefaults?.defaultAttributes.map( + {currentSettings?.userSettingsDefaults?.defaultAttributes?.map( (attribute, idx) => ( From 4a03aac31599c67623c7bd09ba31fde52f566b55 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Thu, 11 Apr 2024 09:59:30 -0400 Subject: [PATCH 117/133] update augmentt logo --- public/img/augmentt-dark.png | Bin 5798 -> 1566 bytes public/img/augmentt-light.png | Bin 34107 -> 3682 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/img/augmentt-dark.png b/public/img/augmentt-dark.png index 949d3eebe8d353af8ea0b5625cb0e125c9dc8b21..c10f55697569f7a50bafc85eaa835663f71d9411 100644 GIT binary patch delta 1562 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 Zif7mVcgaf=dZ#l6Fw!^EtI@$d{4XbOl~Diy literal 34107 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 From 5651726ab8972feffe5ed4cf4bf20091185620d4 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 11 Apr 2024 18:29:03 +0200 Subject: [PATCH 118/133] added option to create templates for standards. --- .../tenant/standards/ListAppliedStandards.jsx | 181 +++++++++++++----- 1 file changed, 128 insertions(+), 53 deletions(-) diff --git a/src/views/tenant/standards/ListAppliedStandards.jsx b/src/views/tenant/standards/ListAppliedStandards.jsx index f6647dac2bc2..ccbde72fa071 100644 --- a/src/views/tenant/standards/ListAppliedStandards.jsx +++ b/src/views/tenant/standards/ListAppliedStandards.jsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react' +import React, { useRef, useState } from 'react' import { CButton, CCallout, @@ -12,8 +12,9 @@ import { CAccordionItem, CWidgetStatsB, CBadge, + CFormInput, } from '@coreui/react' -import { Form } from 'react-final-form' +import { Form, FormSpy } from 'react-final-form' import { Condition, RFFCFormInput, @@ -37,54 +38,12 @@ import { CippTable, cellBooleanFormatter } from 'src/components/tables' import allStandardsList from 'src/data/standards' import CippCodeOffCanvas from 'src/components/utilities/CippCodeOffcanvas' import GDAPRoles from 'src/data/GDAPRoles' +import Select from 'react-select' -const RefreshAction = () => { - const [execStandards, execStandardsResults] = useLazyGenericGetRequestQuery() - const tenantDomain = useSelector((state) => state.app.currentTenant.defaultDomainName) - const showModal = (selectedTenant) => - ModalService.confirm({ - body: ( -
    - Are you sure you want to run the standards now?
    - Please note: this runs every three hours automatically. -
    - ), - onConfirm: () => - execStandards({ path: `api/ExecStandardsRun?Tenantfilter=${selectedTenant}` }), - }) - - return ( - <> - {execStandardsResults.data?.Results === - 'Already running. Please wait for the current instance to finish' && ( -
    {execStandardsResults.data?.Results}
    - )} -

    - showModal('AllTenants')} size="sm" className="m-1"> - {execStandardsResults.isLoading && } - {execStandardsResults.error && ( - - )} - {execStandardsResults.isSuccess && } - Run Standards Now (All Tenants) - - showModal(tenantDomain)} size="sm" className="m-1"> - {execStandardsResults.isLoading && } - {execStandardsResults.error && ( - - )} - {execStandardsResults.isSuccess && } - Run Standards Now (Selected Tenant) - -

    - - ) -} const DeleteAction = () => { const tenantDomain = useSelector((state) => state.app.currentTenant.defaultDomainName) const [execStandards, execStandardsResults] = useLazyGenericGetRequestQuery() - const showModal = () => ModalService.confirm({ body:
    Are you sure you want to delete this standard?
    , @@ -109,8 +68,107 @@ const DeleteAction = () => { ) } const ApplyNewStandard = () => { + const [templateStandard, setTemplateStandard] = useState() + console.log(templateStandard) + const RefreshAction = () => { + const [execStandards, execStandardsResults] = useLazyGenericGetRequestQuery() + const { + data: listStandardTemplates = [], + isFetching, + isSuccess, + isError, + } = useGenericGetRequestQuery({ + path: 'api/listStandardTemplates', + }) + const tenantDomain = useSelector((state) => state.app.currentTenant.defaultDomainName) + const showModal = (selectedTenant) => + ModalService.confirm({ + body: ( +
    + Are you sure you want to run the standards now?
    + Please note: this runs every three hours automatically. +
    + ), + onConfirm: () => + execStandards({ path: `api/ExecStandardsRun?Tenantfilter=${selectedTenant}` }), + }) + const ourRef = useRef() + const TemplateModal = () => + ModalService.open({ + body: ( +
    + {isFetching && } + {isError && 'Something went wrong loading your templates'} + {isSuccess && ( +