diff --git a/.github/workflows/automated-tests.yml b/.github/workflows/automated-tests.yml index 92866167fe..396258f6bf 100644 --- a/.github/workflows/automated-tests.yml +++ b/.github/workflows/automated-tests.yml @@ -257,24 +257,73 @@ jobs: apt --purge -y remove apache2-bin ' - name: Install BBB - uses: nick-fields/retry@v3 env: NODE_EXTRA_CA_CERTS: /usr/local/share/ca-certificates/bbb-dev/bbb-dev-ca.crt ACTIONS_RUNNER_DEBUG: true - with: - timeout_minutes: 25 - max_attempts: 2 - retry_on: any - command: | - sudo -i < /etc/apt/sources.list.d/bigbluebutton.list||g" | bash -s -- -v jammy-30-dev -s bbb-ci.test -j -d /certs/ - bbb-conf --salt bbbci - sed -i "s/\"minify\": true,/\"minify\": false,/" /usr/share/etherpad-lite/settings.json - sudo yq e -i '.log_level = "TRACE"' /usr/share/bbb-graphql-middleware/config.yml - bbb-conf --restart - EOF + run: | + sudo -i <<'EOF' + set -e + cd /root/ + wget -nv https://raw.githubusercontent.com/bigbluebutton/bbb-install/v3.0.x-release--no-mongo/bbb-install.sh -O bbb-install.sh + sed -i "s|> /etc/apt/sources.list.d/bigbluebutton.list||g" bbb-install.sh + chmod +x bbb-install.sh + + COMMAND="./bbb-install.sh -v jammy-30-dev -s bbb-ci.test -j -d /certs/" + TIMEOUT=1500 # 25 minutes + MAX_RETRIES=3 + RETRY_INTERVAL=60 + RETRY_COUNT=0 + SUCCESS=0 + + while [[ $RETRY_COUNT -lt $MAX_RETRIES ]]; do + echo "Attempt $((RETRY_COUNT + 1)) of $MAX_RETRIES to install BBB..." + + # Run the command with timeout and handle its exit code + # Capture both stdout and stderr + COMMAND_EXIT_CODE=0 + timeout $TIMEOUT $COMMAND || COMMAND_EXIT_CODE=$? + + if [[ $COMMAND_EXIT_CODE -eq 0 ]]; then + SUCCESS=1 + break + elif [[ $COMMAND_EXIT_CODE -eq 124 ]]; then + echo "Installation timed out after ${TIMEOUT} seconds. Retrying..." + else + echo "Installation failed with exit code $COMMAND_EXIT_CODE" + echo "Retrying installation within $RETRY_INTERVAL seconds..." + sleep $RETRY_INTERVAL + fi + echo "Stop any ongoing processes related to apt-get or dpkg that might be stuck" + # Use -q to suppress "no process found" messages + killall -q apt-get || true + killall -q dpkg || true + + echo "Remove the lock files that may have been left behind" + # Group lock file removal for better readability + rm -f /var/lib/dpkg/lock-frontend + rm -f /var/lib/dpkg/lock + rm -f /var/cache/apt/archives/lock + + echo "Reconfigure the package manager" + dpkg --configure -a + + echo "Clean up any partially installed packages" + apt-get clean + apt-get autoremove + + RETRY_COUNT=$((RETRY_COUNT + 1)) + done + + if [[ $SUCCESS -eq 0 ]]; then + echo "All attempts to install BBB failed." + exit 1 + fi + + bbb-conf --salt bbbci + sed -i "s/\"minify\": true,/\"minify\": false,/" /usr/share/etherpad-lite/settings.json + sudo yq e -i '.log_level = "TRACE"' /usr/share/bbb-graphql-middleware/config.yml + bbb-conf --restart + EOF - name: List systemctl services timeout-minutes: 1 run: | diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutApp2x.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutApp2x.scala index 27c048fc9d..7afba64534 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutApp2x.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutApp2x.scala @@ -63,13 +63,23 @@ object BreakoutRoomsUtil extends SystemConfiguration { checksum(apiCall.concat(baseString).concat(sharedSecret)) } - def joinParams(username: String, userId: String, isBreakout: Boolean, breakoutMeetingId: String, - password: String): (collection.immutable.Map[String, String], collection.immutable.Map[String, String]) = { + def joinParams( + username: String, + userId: String, + isBreakout: Boolean, + breakoutMeetingId: String, + avatarURL: String, + role: String, + password: String + ): (collection.immutable.Map[String, String], collection.immutable.Map[String, String]) = { + val moderator = role == "MODERATOR" val params = collection.immutable.HashMap( "fullName" -> urlEncode(username), "userID" -> urlEncode(userId), "isBreakout" -> urlEncode(isBreakout.toString()), "meetingID" -> urlEncode(breakoutMeetingId), + "avatarURL" -> urlEncode(avatarURL), + "userdata-bbb_parent_room_moderator" -> urlEncode(moderator.toString()), "password" -> urlEncode(password), "redirect" -> urlEncode("true") ) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutHdlrHelpers.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutHdlrHelpers.scala index ad22dd79f7..bb2e9d807e 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutHdlrHelpers.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/BreakoutHdlrHelpers.scala @@ -41,8 +41,15 @@ object BreakoutHdlrHelpers extends SystemConfiguration { for { user <- Users2x.findWithIntId(liveMeeting.users2x, userId) apiCall = "join" - (redirectParams, redirectToHtml5Params) = BreakoutRoomsUtil.joinParams(user.name, userId + "-" + roomSequence, true, - externalMeetingId, liveMeeting.props.password.moderatorPass) + (redirectParams, redirectToHtml5Params) = BreakoutRoomsUtil.joinParams( + user.name, + userId + "-" + roomSequence, + true, + externalMeetingId, + user.avatar, + user.role, + liveMeeting.props.password.moderatorPass + ) // We generate a first url with redirect -> true redirectBaseString = BreakoutRoomsUtil.createBaseString(redirectParams) redirectJoinURL = BreakoutRoomsUtil.createJoinURL(bbbWebAPI, apiCall, redirectBaseString, diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/CreateBreakoutRoomsCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/CreateBreakoutRoomsCmdMsgHdlr.scala index 5401ece7ba..5a07d42aff 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/CreateBreakoutRoomsCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/breakout/CreateBreakoutRoomsCmdMsgHdlr.scala @@ -99,6 +99,7 @@ trait CreateBreakoutRoomsCmdMsgHdlr extends RightsManagementTrait { breakout.captureSlides, breakout.captureNotesFilename, breakout.captureSlidesFilename, + pluginProp = liveMeeting.props.pluginProp, ) val event = buildCreateBreakoutRoomSysCmdMsg(liveMeeting.props.meetingProp.intId, roomDetail) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/groupchats/DeleteGroupChatMessageReactionReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/groupchats/DeleteGroupChatMessageReactionReqMsgHdlr.scala index c286746bf9..634aff5860 100644 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/groupchats/DeleteGroupChatMessageReactionReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/groupchats/DeleteGroupChatMessageReactionReqMsgHdlr.scala @@ -52,9 +52,9 @@ trait DeleteGroupChatMessageReactionReqMsgHdlr extends HandlerHelpers { val userIsAParticipant = groupChat.users.exists(u => u.id == user.intId) if ((chatIsPrivate && userIsAParticipant) || !chatIsPrivate) { - val event = buildGroupChatMessageReactionDeletedEvtMsg(liveMeeting.props.meetingProp.intId, msg.header.userId, msg.body.chatId, gcMessage.id, msg.body.reactionEmoji) + val event = buildGroupChatMessageReactionDeletedEvtMsg(liveMeeting.props.meetingProp.intId, msg.header.userId, msg.body.chatId, gcMessage.id, msg.body.reactionEmoji, msg.body.reactionEmojiId) bus.outGW.send(event) - ChatMessageReactionDAO.delete(liveMeeting.props.meetingProp.intId, gcMessage.id, msg.header.userId, msg.body.reactionEmoji) + ChatMessageReactionDAO.delete(liveMeeting.props.meetingProp.intId, gcMessage.id, msg.header.userId, msg.body.reactionEmoji, msg.body.reactionEmojiId) } else { val reason = "User isn't a participant of the chat" PermissionCheck.ejectUserForFailedPermission(msg.header.meetingId, msg.header.userId, reason, bus.outGW, liveMeeting) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/groupchats/DeleteGroupChatMessageReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/groupchats/DeleteGroupChatMessageReqMsgHdlr.scala index 088dd2386c..d0c690976f 100644 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/groupchats/DeleteGroupChatMessageReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/groupchats/DeleteGroupChatMessageReqMsgHdlr.scala @@ -27,7 +27,7 @@ trait DeleteGroupChatMessageReqMsgHdlr extends HandlerHelpers { chatLockedForUser = true } - val userIsModerator = user.role != Roles.MODERATOR_ROLE + val userIsModerator = user.role == Roles.MODERATOR_ROLE if (!userIsModerator && user.locked) { val permissions = MeetingStatus2x.getPermissions(liveMeeting.status) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/groupchats/EditGroupChatMessageReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/groupchats/EditGroupChatMessageReqMsgHdlr.scala index bccba1678a..5662ae4540 100644 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/groupchats/EditGroupChatMessageReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/groupchats/EditGroupChatMessageReqMsgHdlr.scala @@ -27,7 +27,7 @@ trait EditGroupChatMessageReqMsgHdlr extends HandlerHelpers { chatLockedForUser = true } - val userIsModerator = user.role != Roles.MODERATOR_ROLE + val userIsModerator = user.role == Roles.MODERATOR_ROLE if (!userIsModerator && user.locked) { val permissions = MeetingStatus2x.getPermissions(liveMeeting.status) @@ -45,7 +45,7 @@ trait EditGroupChatMessageReqMsgHdlr extends HandlerHelpers { } } - if (!chatDisabled && editChatMessageDisabled && !(applyPermissionCheck && chatLocked) && !chatLockedForUser) { + if (!chatDisabled && !editChatMessageDisabled && !(applyPermissionCheck && chatLocked) && !chatLockedForUser) { for { gcMessage <- groupChat.msgs.find(gcm => gcm.id == msg.body.messageId) } yield { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/groupchats/SendGroupChatMessageReactionReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/groupchats/SendGroupChatMessageReactionReqMsgHdlr.scala index 128ebe65be..300cb5ac5b 100644 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/groupchats/SendGroupChatMessageReactionReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/groupchats/SendGroupChatMessageReactionReqMsgHdlr.scala @@ -26,7 +26,7 @@ trait SendGroupChatMessageReactionReqMsgHdlr extends HandlerHelpers { chatLockedForUser = true } - val userIsModerator = user.role != Roles.MODERATOR_ROLE + val userIsModerator = user.role == Roles.MODERATOR_ROLE if (!userIsModerator && user.locked) { val permissions = MeetingStatus2x.getPermissions(liveMeeting.status) @@ -52,9 +52,9 @@ trait SendGroupChatMessageReactionReqMsgHdlr extends HandlerHelpers { val userIsAParticipant = groupChat.users.exists(u => u.id == user.intId) if ((chatIsPrivate && userIsAParticipant) || !chatIsPrivate) { - val event = buildGroupChatMessageReactionSentEvtMsg(liveMeeting.props.meetingProp.intId, msg.header.userId, msg.body.chatId, gcMessage.id, msg.body.reactionEmoji) + val event = buildGroupChatMessageReactionSentEvtMsg(liveMeeting.props.meetingProp.intId, msg.header.userId, msg.body.chatId, gcMessage.id, msg.body.reactionEmoji, msg.body.reactionEmojiId) bus.outGW.send(event) - ChatMessageReactionDAO.insert(liveMeeting.props.meetingProp.intId, gcMessage.id, msg.header.userId, msg.body.reactionEmoji) + ChatMessageReactionDAO.insert(liveMeeting.props.meetingProp.intId, gcMessage.id, msg.header.userId, msg.body.reactionEmoji, msg.body.reactionEmojiId) } else { val reason = "User isn't a participant of the chat" PermissionCheck.ejectUserForFailedPermission(msg.header.meetingId, msg.header.userId, reason, bus.outGW, liveMeeting) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginDataChannelDeleteEntryMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginDataChannelDeleteEntryMsgHdlr.scala index 2cc9f5104c..10803dd51e 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginDataChannelDeleteEntryMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginDataChannelDeleteEntryMsgHdlr.scala @@ -1,62 +1,29 @@ package org.bigbluebutton.core.apps.plugin -import org.bigbluebutton.ClientSettings import org.bigbluebutton.common2.msgs.PluginDataChannelDeleteEntryMsg +import org.bigbluebutton.core.apps.plugin.PluginHdlrHelpers.{ checkPermission, dataChannelCheckingLogic, defaultCreatorCheck } import org.bigbluebutton.core.db.PluginDataChannelEntryDAO import org.bigbluebutton.core.domain.MeetingState2x -import org.bigbluebutton.core.models.{ Roles, Users2x } import org.bigbluebutton.core.running.{ HandlerHelpers, LiveMeeting } trait PluginDataChannelDeleteEntryMsgHdlr extends HandlerHelpers { def handle(msg: PluginDataChannelDeleteEntryMsg, state: MeetingState2x, liveMeeting: LiveMeeting): Unit = { - val pluginsDisabled: Boolean = liveMeeting.props.meetingProp.disabledFeatures.contains("plugins") - val meetingId = liveMeeting.props.meetingProp.intId - - for { - _ <- if (!pluginsDisabled) Some(()) else None - user <- Users2x.findWithIntId(liveMeeting.users2x, msg.header.userId) - } yield { - val pluginsConfig = ClientSettings.getPluginsFromConfig(ClientSettings.clientSettingsFromFile) - - if (!pluginsConfig.contains(msg.body.pluginName)) { - println(s"Plugin '${msg.body.pluginName}' not found.") - } else if (!pluginsConfig(msg.body.pluginName).dataChannels.contains(msg.body.channelName)) { - println(s"Data channel '${msg.body.channelName}' not found in plugin '${msg.body.pluginName}'.") + dataChannelCheckingLogic(liveMeeting, msg.header.userId, msg.body.pluginName, msg.body.channelName, (user, dc, meetingId) => { + val hasPermission = checkPermission(user, dc.replaceOrDeletePermission, defaultCreatorCheck( + meetingId, msg.body, msg.header.userId + )) + if (!hasPermission.contains(true)) { + println(s"No permission to delete in plugin: '${msg.body.pluginName}', data channel: '${msg.body.channelName}'.") } else { - val hasPermission = for { - replaceOrDeletePermission <- pluginsConfig(msg.body.pluginName).dataChannels(msg.body.channelName).replaceOrDeletePermission - } yield { - replaceOrDeletePermission.toLowerCase match { - case "all" => true - case "moderator" => user.role == Roles.MODERATOR_ROLE - case "presenter" => user.presenter - case "creator" => { - val creatorUserId = PluginDataChannelEntryDAO.getEntryCreator( - meetingId, - msg.body.pluginName, - msg.body.channelName, - msg.body.subChannelName, - msg.body.entryId - ) - creatorUserId == msg.header.userId - } - case _ => false - } - } - - if (!hasPermission.contains(true)) { - println(s"No permission to delete in plugin: '${msg.body.pluginName}', data channel: '${msg.body.channelName}'.") - } else { - PluginDataChannelEntryDAO.delete( - meetingId, - msg.body.pluginName, - msg.body.channelName, - msg.body.subChannelName, - msg.body.entryId - ) - } + PluginDataChannelEntryDAO.delete( + meetingId, + msg.body.pluginName, + msg.body.channelName, + msg.body.subChannelName, + msg.body.entryId + ) } - } + }) } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginDataChannelPushEntryMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginDataChannelPushEntryMsgHdlr.scala index fc6b8c4c45..e83b867412 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginDataChannelPushEntryMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginDataChannelPushEntryMsgHdlr.scala @@ -1,55 +1,30 @@ package org.bigbluebutton.core.apps.plugin import org.bigbluebutton.common2.msgs.PluginDataChannelPushEntryMsg -import org.bigbluebutton.ClientSettings +import org.bigbluebutton.core.apps.plugin.PluginHdlrHelpers.{ checkPermission, dataChannelCheckingLogic, defaultCreatorCheck } import org.bigbluebutton.core.db.PluginDataChannelEntryDAO import org.bigbluebutton.core.domain.MeetingState2x -import org.bigbluebutton.core.models.{ Roles, Users2x } import org.bigbluebutton.core.running.{ HandlerHelpers, LiveMeeting } trait PluginDataChannelPushEntryMsgHdlr extends HandlerHelpers { def handle(msg: PluginDataChannelPushEntryMsg, state: MeetingState2x, liveMeeting: LiveMeeting): Unit = { - val pluginsDisabled: Boolean = liveMeeting.props.meetingProp.disabledFeatures.contains("plugins") - val meetingId = liveMeeting.props.meetingProp.intId - - for { - _ <- if (!pluginsDisabled) Some(()) else None - user <- Users2x.findWithIntId(liveMeeting.users2x, msg.header.userId) - } yield { - val pluginsConfig = ClientSettings.getPluginsFromConfig(ClientSettings.clientSettingsFromFile) - - if (!pluginsConfig.contains(msg.body.pluginName)) { - println(s"Plugin '${msg.body.pluginName}' not found.") - } else if (!pluginsConfig(msg.body.pluginName).dataChannels.contains(msg.body.channelName)) { - println(s"Data channel '${msg.body.channelName}' not found in plugin '${msg.body.pluginName}'.") + dataChannelCheckingLogic(liveMeeting, msg.header.userId, msg.body.pluginName, msg.body.channelName, (user, dc, meetingId) => { + val hasPermission = checkPermission(user, dc.pushPermission) + if (!hasPermission.contains(true)) { + println(s"No permission to write in plugin: '${msg.body.pluginName}', data channel: '${msg.body.channelName}'.") } else { - val hasPermission = for { - pushPermission <- pluginsConfig(msg.body.pluginName).dataChannels(msg.body.channelName).pushPermission - } yield { - pushPermission.toLowerCase match { - case "all" => true - case "moderator" => user.role == Roles.MODERATOR_ROLE - case "presenter" => user.presenter - case _ => false - } - } - - if (!hasPermission.contains(true)) { - println(s"No permission to write in plugin: '${msg.body.pluginName}', data channel: '${msg.body.channelName}'.") - } else { - PluginDataChannelEntryDAO.insert( - meetingId, - msg.body.pluginName, - msg.body.channelName, - msg.body.subChannelName, - msg.header.userId, - msg.body.payloadJson, - msg.body.toRoles, - msg.body.toUserIds - ) - } + PluginDataChannelEntryDAO.insert( + meetingId, + msg.body.pluginName, + msg.body.channelName, + msg.body.subChannelName, + msg.header.userId, + msg.body.payloadJson, + msg.body.toRoles, + msg.body.toUserIds + ) } - } + }) } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginDataChannelReplaceEntryMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginDataChannelReplaceEntryMsgHdlr.scala index 453f64587d..b216353f55 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginDataChannelReplaceEntryMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginDataChannelReplaceEntryMsgHdlr.scala @@ -1,63 +1,31 @@ package org.bigbluebutton.core.apps.plugin -import org.bigbluebutton.ClientSettings import org.bigbluebutton.common2.msgs.PluginDataChannelReplaceEntryMsg +import org.bigbluebutton.core.apps.plugin.PluginHdlrHelpers.{checkPermission, dataChannelCheckingLogic, defaultCreatorCheck} import org.bigbluebutton.core.db.{JsonUtils, PluginDataChannelEntryDAO} import org.bigbluebutton.core.domain.MeetingState2x -import org.bigbluebutton.core.models.{Roles, Users2x} import org.bigbluebutton.core.running.{HandlerHelpers, LiveMeeting} trait PluginDataChannelReplaceEntryMsgHdlr extends HandlerHelpers { def handle(msg: PluginDataChannelReplaceEntryMsg, state: MeetingState2x, liveMeeting: LiveMeeting): Unit = { - val pluginsDisabled: Boolean = liveMeeting.props.meetingProp.disabledFeatures.contains("plugins") - val meetingId = liveMeeting.props.meetingProp.intId - for { - _ <- if (!pluginsDisabled) Some(()) else None - user <- Users2x.findWithIntId(liveMeeting.users2x, msg.header.userId) - } yield { - val pluginsConfig = ClientSettings.getPluginsFromConfig(ClientSettings.clientSettingsFromFile) + dataChannelCheckingLogic(liveMeeting, msg.header.userId, msg.body.pluginName, msg.body.channelName, (user, dc, meetingId) => { + val hasPermission = checkPermission(user, dc.replaceOrDeletePermission, defaultCreatorCheck( + meetingId, msg.body, msg.header.userId)) - if (!pluginsConfig.contains(msg.body.pluginName)) { - println(s"Plugin '${msg.body.pluginName}' not found.") - } else if (!pluginsConfig(msg.body.pluginName).dataChannels.contains(msg.body.channelName)) { - println(s"Data channel '${msg.body.channelName}' not found in plugin '${msg.body.pluginName}'.") + if (!hasPermission.contains(true)) { + println(s"No permission to write in plugin: '${msg.body.pluginName}', data channel: '${msg.body.channelName}'.") } else { - val hasPermission = for { - replaceOrDeletePermission <- pluginsConfig(msg.body.pluginName).dataChannels(msg.body.channelName).replaceOrDeletePermission - } yield { - replaceOrDeletePermission.toLowerCase match { - case "all" => true - case "moderator" => user.role == Roles.MODERATOR_ROLE - case "presenter" => user.presenter - case "creator" => { - val creatorUserId = PluginDataChannelEntryDAO.getEntryCreator( - meetingId, - msg.body.pluginName, - msg.body.channelName, - msg.body.subChannelName, - msg.body.entryId - ) - creatorUserId == msg.header.userId - } - case _ => false - } - } - - if (!hasPermission.contains(true)) { - println(s"No permission to write in plugin: '${msg.body.pluginName}', data channel: '${msg.body.channelName}'.") - } else { - PluginDataChannelEntryDAO.replace( - msg.header.meetingId, - msg.body.pluginName, - msg.body.channelName, - msg.body.subChannelName, - msg.body.entryId, - JsonUtils.mapToJson(msg.body.payloadJson), - ) - } + PluginDataChannelEntryDAO.replace( + msg.header.meetingId, + msg.body.pluginName, + msg.body.channelName, + msg.body.subChannelName, + msg.body.entryId, + JsonUtils.mapToJson(msg.body.payloadJson), + ) } - } + }) } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginDataChannelResetMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginDataChannelResetMsgHdlr.scala index 32a403f862..61dcfec982 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginDataChannelResetMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginDataChannelResetMsgHdlr.scala @@ -1,51 +1,27 @@ package org.bigbluebutton.core.apps.plugin -import org.bigbluebutton.ClientSettings import org.bigbluebutton.common2.msgs.PluginDataChannelResetMsg +import org.bigbluebutton.core.apps.plugin.PluginHdlrHelpers.{ checkPermission, dataChannelCheckingLogic } import org.bigbluebutton.core.db.PluginDataChannelEntryDAO import org.bigbluebutton.core.domain.MeetingState2x -import org.bigbluebutton.core.models.{ Roles, Users2x } import org.bigbluebutton.core.running.{ HandlerHelpers, LiveMeeting } trait PluginDataChannelResetMsgHdlr extends HandlerHelpers { def handle(msg: PluginDataChannelResetMsg, state: MeetingState2x, liveMeeting: LiveMeeting): Unit = { - val pluginsDisabled: Boolean = liveMeeting.props.meetingProp.disabledFeatures.contains("plugins") - val meetingId = liveMeeting.props.meetingProp.intId + dataChannelCheckingLogic(liveMeeting, msg.header.userId, msg.body.pluginName, msg.body.channelName, (user, dc, meetingId) => { + val hasPermission = checkPermission(user, dc.replaceOrDeletePermission) - for { - _ <- if (!pluginsDisabled) Some(()) else None - user <- Users2x.findWithIntId(liveMeeting.users2x, msg.header.userId) - } yield { - val pluginsConfig = ClientSettings.getPluginsFromConfig(ClientSettings.clientSettingsFromFile) - - if (!pluginsConfig.contains(msg.body.pluginName)) { - println(s"Plugin '${msg.body.pluginName}' not found.") - } else if (!pluginsConfig(msg.body.pluginName).dataChannels.contains(msg.body.channelName)) { - println(s"Data channel '${msg.body.channelName}' not found in plugin '${msg.body.pluginName}'.") + if (!hasPermission.contains(true)) { + println(s"No permission to delete (reset) in plugin: '${msg.body.pluginName}', data channel: '${msg.body.channelName}'.") } else { - val hasPermission = for { - replaceOrDeletePermission <- pluginsConfig(msg.body.pluginName).dataChannels(msg.body.channelName).replaceOrDeletePermission - } yield { - replaceOrDeletePermission.toLowerCase match { - case "all" => true - case "moderator" => user.role == Roles.MODERATOR_ROLE - case "presenter" => user.presenter - case _ => false - } - } - - if (!hasPermission.contains(true)) { - println(s"No permission to delete (reset) in plugin: '${msg.body.pluginName}', data channel: '${msg.body.channelName}'.") - } else { - PluginDataChannelEntryDAO.reset( - meetingId, - msg.body.pluginName, - msg.body.channelName, - msg.body.subChannelName - ) - } + PluginDataChannelEntryDAO.reset( + meetingId, + msg.body.pluginName, + msg.body.channelName, + msg.body.subChannelName + ) } - } + }) } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginHdlrHelpers.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginHdlrHelpers.scala new file mode 100644 index 0000000000..68bed194e1 --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/plugin/PluginHdlrHelpers.scala @@ -0,0 +1,50 @@ +package org.bigbluebutton.core.apps.plugin + +import org.bigbluebutton.common2.msgs.PluginDataChannelReplaceOrDeleteBaseBody +import org.bigbluebutton.core.db.PluginDataChannelEntryDAO +import org.bigbluebutton.core.models.{ DataChannel, PluginModel, Roles, UserState, Users2x } +import org.bigbluebutton.core.running.LiveMeeting + +object PluginHdlrHelpers { + def checkPermission(user: UserState, permissionType: List[String], creatorCheck: => Boolean = false): List[Boolean] = { + permissionType.map(_.toLowerCase).map { + case "all" => true + case "moderator" => user.role == Roles.MODERATOR_ROLE + case "presenter" => user.presenter + case "creator" => creatorCheck + case _ => false + } + } + def defaultCreatorCheck[T <: PluginDataChannelReplaceOrDeleteBaseBody](meetingId: String, msgBody: T, userId: String): Boolean = { + val creatorUserId = PluginDataChannelEntryDAO.getEntryCreator( + meetingId, + msgBody.pluginName, + msgBody.channelName, + msgBody.subChannelName, + msgBody.entryId + ) + creatorUserId == userId + } + + def dataChannelCheckingLogic(liveMeeting: LiveMeeting, userId: String, + pluginName: String, channelName: String, + caseSomeDataChannelAndPlugin: (UserState, DataChannel, String) => Unit): Option[Unit] = { + val pluginsDisabled: Boolean = liveMeeting.props.meetingProp.disabledFeatures.contains("plugins") + val meetingId = liveMeeting.props.meetingProp.intId + + for { + _ <- if (!pluginsDisabled) Some(()) else None + user <- Users2x.findWithIntId(liveMeeting.users2x, userId) + } yield { + PluginModel.getPluginByName(liveMeeting.plugins, pluginName) match { + case Some(p) => + p.manifest.content.dataChannels.getOrElse(List()).find(dc => dc.name == channelName) match { + case Some(dc) => + caseSomeDataChannelAndPlugin(user, dc, meetingId) + case None => println(s"Data channel '${channelName}' not found in plugin '${pluginName}'.") + } + case None => println(s"Plugin '${pluginName}' not found.") + } + } + } +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/EjectUserFromMeetingCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/EjectUserFromMeetingCmdMsgHdlr.scala index d81af4a297..1a276c0b61 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/EjectUserFromMeetingCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/EjectUserFromMeetingCmdMsgHdlr.scala @@ -26,7 +26,7 @@ trait EjectUserFromMeetingCmdMsgHdlr extends RightsManagementTrait { PermissionCheck.VIEWER_LEVEL, liveMeeting.users2x, msg.header.userId - ) || liveMeeting.props.meetingProp.isBreakout) { + )) { val reason = "No permission to eject user from meeting." PermissionCheck.ejectUserForFailedPermission(meetingId, msg.header.userId, reason, outGW, liveMeeting) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/RegisterUserReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/RegisterUserReqMsgHdlr.scala index 6e4269fd73..21e69dea0e 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/RegisterUserReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/RegisterUserReqMsgHdlr.scala @@ -59,8 +59,8 @@ trait RegisterUserReqMsgHdlr { val regUser = RegisteredUsers.create(liveMeeting.props.meetingProp.intId, msg.body.intUserId, msg.body.extUserId, msg.body.name, msg.body.role, msg.body.authToken, Vector(msg.body.sessionToken), - msg.body.avatarURL, msg.body.webcamBackgroundURL, ColorPicker.nextColor(liveMeeting.props.meetingProp.intId), msg.body.guest, msg.body.authed, - guestStatus, msg.body.excludeFromDashboard, msg.body.enforceLayout, msg.body.userMetadata, false) + msg.body.avatarURL, msg.body.webcamBackgroundURL, ColorPicker.nextColor(liveMeeting.props.meetingProp.intId), msg.body.bot, + msg.body.guest, msg.body.authed, guestStatus, msg.body.excludeFromDashboard, msg.body.enforceLayout, msg.body.userMetadata, false) checkUserConcurrentAccesses(regUser) RegisteredUsers.add(liveMeeting.registeredUsers, regUser, liveMeeting.props.meetingProp.intId) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/SetRecordingStatusCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/SetRecordingStatusCmdMsgHdlr.scala index 2e9e5f51ba..f7cda39d01 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/SetRecordingStatusCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/SetRecordingStatusCmdMsgHdlr.scala @@ -9,6 +9,7 @@ import org.bigbluebutton.core.apps.{ PermissionCheck, RightsManagementTrait } import org.bigbluebutton.core2.message.senders.MsgBuilder import org.bigbluebutton.core.apps.voice.VoiceApp import org.bigbluebutton.core.db.{ MeetingRecordingDAO, NotificationDAO } +import org.bigbluebutton.core.models.{ Users2x } trait SetRecordingStatusCmdMsgHdlr extends RightsManagementTrait { this: UsersApp => @@ -29,9 +30,19 @@ trait SetRecordingStatusCmdMsgHdlr extends RightsManagementTrait { BbbCommonEnvCoreMsg(envelope, event) } - if (permissionFailed(PermissionCheck.MOD_LEVEL, PermissionCheck.VIEWER_LEVEL, liveMeeting.users2x, msg.header.userId)) { + // Retrieve custom record permission from metadata + val customRecordPermission: Option[Boolean] = Users2x.findWithIntId(liveMeeting.users2x, msg.header.userId).flatMap { user => + user.userMetadata.get("bbb_record_permission").map(_.toBoolean) + } + + // Determine final permission using metadata or fallback + val hasPermission: Boolean = customRecordPermission.getOrElse { + !permissionFailed(PermissionCheck.MOD_LEVEL, PermissionCheck.VIEWER_LEVEL, liveMeeting.users2x, msg.header.userId) + } + + if (!hasPermission) { val meetingId = liveMeeting.props.meetingProp.intId - val reason = "No permission to clear chat in meeting." + val reason = "No permission to set recording status in meeting." PermissionCheck.ejectUserForFailedPermission(meetingId, msg.header.userId, reason, outGW, liveMeeting) state } else { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserJoinMeetingReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserJoinMeetingReqMsgHdlr.scala index eee0edcede..527f232e10 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserJoinMeetingReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UserJoinMeetingReqMsgHdlr.scala @@ -83,7 +83,7 @@ trait UserJoinMeetingReqMsgHdlr extends HandlerHelpers { if (maxParticipants > 0 && //0 = no limit RegisteredUsers.numUniqueJoinedUsers(liveMeeting.registeredUsers) >= maxParticipants && - !userHasJoinedAlready) { + !userHasJoinedAlready && !regUser.bot) { Left(("The maximum number of participants allowed for this meeting has been reached.", EjectReasonCode.MAX_PARTICIPANTS)) } else { Right(()) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserJoinedVoiceConfEvtMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserJoinedVoiceConfEvtMsgHdlr.scala index 427f3f506c..33b01e3849 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserJoinedVoiceConfEvtMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserJoinedVoiceConfEvtMsgHdlr.scala @@ -33,7 +33,7 @@ trait UserJoinedVoiceConfEvtMsgHdlr extends SystemConfiguration { def registerUserInRegisteredUsers() = { val regUser = RegisteredUsers.create(liveMeeting.props.meetingProp.intId, msg.body.intId, msg.body.voiceUserId, - msg.body.callerIdName, Roles.VIEWER_ROLE, msg.body.intId, Vector(""), "", "", userColor, + msg.body.callerIdName, Roles.VIEWER_ROLE, msg.body.intId, Vector(""), "", "", userColor, false, true, true, GuestStatus.WAIT, true, "", Map(), false) RegisteredUsers.add(liveMeeting.registeredUsers, regUser, liveMeeting.props.meetingProp.intId) } @@ -45,6 +45,7 @@ trait UserJoinedVoiceConfEvtMsgHdlr extends SystemConfiguration { meetingId = liveMeeting.props.meetingProp.intId, name = msg.body.callerIdName, role = Roles.VIEWER_ROLE, + bot = false, guest = true, authed = true, guestStatus = GuestStatus.WAIT, diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/ChatMessageReactionDAO.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/ChatMessageReactionDAO.scala index 7bff668739..78696cb8e7 100644 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/ChatMessageReactionDAO.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/ChatMessageReactionDAO.scala @@ -4,11 +4,12 @@ import slick.jdbc.PostgresProfile.api._ import slick.lifted.{ ProvenShape } case class ChatMessageReactionDbModel( - meetingId: String, - messageId: String, - userId: String, - reactionEmoji: String, - createdAt: java.sql.Timestamp + meetingId: String, + messageId: String, + userId: String, + reactionEmoji: String, + reactionEmojiId: String, + createdAt: java.sql.Timestamp ) class ChatMessageReactionDbTableDef(tag: Tag) extends Table[ChatMessageReactionDbModel](tag, "chat_message_reaction") { @@ -16,13 +17,14 @@ class ChatMessageReactionDbTableDef(tag: Tag) extends Table[ChatMessageReactionD val messageId = column[String]("messageId", O.PrimaryKey) val userId = column[String]("userId", O.PrimaryKey) val reactionEmoji = column[String]("reactionEmoji", O.PrimaryKey) + val reactionEmojiId = column[String]("reactionEmojiId") val createdAt = column[java.sql.Timestamp]("createdAt") - override def * : ProvenShape[ChatMessageReactionDbModel] = (meetingId, messageId, userId, reactionEmoji, createdAt) <> (ChatMessageReactionDbModel.tupled, ChatMessageReactionDbModel.unapply) + override def * : ProvenShape[ChatMessageReactionDbModel] = (meetingId, messageId, userId, reactionEmoji, reactionEmojiId, createdAt) <> (ChatMessageReactionDbModel.tupled, ChatMessageReactionDbModel.unapply) } object ChatMessageReactionDAO { - def insert(meetingId: String, messageId: String, userId: String, reactionEmoji: String) = { + def insert(meetingId: String, messageId: String, userId: String, reactionEmoji: String, reactionEmojiId: String) = { DatabaseConnection.enqueue( TableQuery[ChatMessageReactionDbTableDef].forceInsert( ChatMessageReactionDbModel( @@ -30,19 +32,21 @@ object ChatMessageReactionDAO { messageId = messageId, userId = userId, reactionEmoji = reactionEmoji, + reactionEmojiId = reactionEmojiId, createdAt = new java.sql.Timestamp(System.currentTimeMillis()) ) ) ) } - def delete(meetingId: String, messageId: String, userId: String, reactionEmoji: String) = { + def delete(meetingId: String, messageId: String, userId: String, reactionEmoji: String, reactionEmojiId: String) = { DatabaseConnection.enqueue( TableQuery[ChatMessageReactionDbTableDef] .filter(_.meetingId === meetingId) .filter(_.messageId === messageId) .filter(_.userId === userId) .filter(_.reactionEmoji === reactionEmoji) + .filter(_.reactionEmojiId === reactionEmojiId) .delete ) } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/MeetingDAO.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/MeetingDAO.scala index 7b20dc3e14..e148332a6a 100644 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/MeetingDAO.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/MeetingDAO.scala @@ -3,6 +3,7 @@ package org.bigbluebutton.core.db import org.bigbluebutton.common2.domain.DefaultProps import PostgresProfile.api._ import org.bigbluebutton.core.apps.groupchats.GroupChatApp +import org.bigbluebutton.core.models.PluginModel case class MeetingSystemColumnsDbModel( loginUrl: Option[String], @@ -85,7 +86,7 @@ class MeetingDbTableDef(tag: Tag) extends Table[MeetingDbModel](tag, None, "meet } object MeetingDAO { - def insert(meetingProps: DefaultProps, clientSettings: Map[String, Object]) = { + def insert(meetingProps: DefaultProps, clientSettings: Map[String, Object], pluginProps: PluginModel) = { DatabaseConnection.enqueue( TableQuery[MeetingDbTableDef].forceInsert( MeetingDbModel( @@ -148,6 +149,7 @@ object MeetingDAO { MeetingBreakoutDAO.insert(meetingProps.meetingProp.intId, meetingProps.breakoutProps) LayoutDAO.insert(meetingProps.meetingProp.intId, meetingProps.usersProp.meetingLayout) MeetingClientSettingsDAO.insert(meetingProps.meetingProp.intId, JsonUtils.mapToJson(clientSettings)) + PluginModel.persistPluginsForClient(pluginProps, meetingProps.meetingProp.intId) } def updateMeetingDurationByParentMeeting(parentMeetingId: String, newDurationInSeconds: Int) = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/PluginDAO.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/PluginDAO.scala new file mode 100644 index 0000000000..dc7fa869f9 --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/PluginDAO.scala @@ -0,0 +1,33 @@ +package org.bigbluebutton.core.db + +import PostgresProfile.api._ + +case class PluginDbModel( + meetingId: String, + name: String, + javascriptEntrypointUrl: String, + javascriptEntrypointIntegrity: String +) + +class PluginDbTableDef(tag: Tag) extends Table[PluginDbModel](tag, None, "plugin") { + val meetingId = column[String]("meetingId", O.PrimaryKey) + val name = column[String]("name", O.PrimaryKey) + val javascriptEntrypointUrl = column[String]("javascriptEntrypointUrl") + val javascriptEntrypointIntegrity = column[String]("javascriptEntrypointIntegrity") + override def * = (meetingId, name, javascriptEntrypointUrl, javascriptEntrypointIntegrity) <> (PluginDbModel.tupled, PluginDbModel.unapply) +} + +object PluginDAO { + def insert(meetingId: String, name: String, javascriptEntrypointUrl: String, javascriptEntrypointIntegrity: String) = { + DatabaseConnection.enqueue( + TableQuery[PluginDbTableDef].forceInsert( + PluginDbModel( + meetingId = meetingId, + name = name, + javascriptEntrypointUrl = javascriptEntrypointUrl, + javascriptEntrypointIntegrity = javascriptEntrypointIntegrity, + ) + ) + ) + } +} \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/UserDAO.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/UserDAO.scala index b9d7d427be..73a9efd545 100644 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/UserDAO.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/UserDAO.scala @@ -18,6 +18,7 @@ case class UserDbModel( joinErrorCode: Option[String], banned: Boolean = false, loggedOut: Boolean = false, + bot: Boolean, guest: Boolean, guestStatus: String, registeredOn: Long, @@ -30,7 +31,7 @@ case class UserDbModel( class UserDbTableDef(tag: Tag) extends Table[UserDbModel](tag, None, "user") { override def * = ( meetingId,userId,extId,name,role,avatar,webcamBackground,color, authToken, authed,joined,joinErrorCode, - joinErrorMessage, banned,loggedOut,guest,guestStatus,registeredOn,excludeFromDashboard, enforceLayout) <> (UserDbModel.tupled, UserDbModel.unapply) + joinErrorMessage, banned,loggedOut,bot, guest,guestStatus,registeredOn,excludeFromDashboard, enforceLayout) <> (UserDbModel.tupled, UserDbModel.unapply) val meetingId = column[String]("meetingId", O.PrimaryKey) val userId = column[String]("userId", O.PrimaryKey) val extId = column[String]("extId") @@ -46,6 +47,7 @@ class UserDbTableDef(tag: Tag) extends Table[UserDbModel](tag, None, "user") { val joinErrorMessage = column[Option[String]]("joinErrorMessage") val banned = column[Boolean]("banned") val loggedOut = column[Boolean]("loggedOut") + val bot = column[Boolean]("bot") val guest = column[Boolean]("guest") val guestStatus = column[String]("guestStatus") val registeredOn = column[Long]("registeredOn") @@ -73,6 +75,7 @@ object UserDAO { joinErrorMessage = None, banned = regUser.banned, loggedOut = regUser.loggedOut, + bot = regUser.bot, guest = regUser.guest, guestStatus = regUser.guestStatus, registeredOn = regUser.registeredOn, diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Plugins.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Plugins.scala new file mode 100644 index 0000000000..852153b13a --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Plugins.scala @@ -0,0 +1,103 @@ +package org.bigbluebutton.core.models + +import com.fasterxml.jackson.annotation.{ JsonIgnoreProperties, JsonProperty } +import com.fasterxml.jackson.core.JsonProcessingException +import com.fasterxml.jackson.databind.{ JsonMappingException, ObjectMapper } +import com.fasterxml.jackson.module.scala.DefaultScalaModule +import org.bigbluebutton.core.db.PluginDAO + +import java.util + +case class RateLimiting( + messagesAllowedPerSecond: Int, + messagesAllowedPerMinute: Int +) + +case class EventPersistence( + isEnabled: Boolean, + maximumPayloadSizeInBytes: Int, + rateLimiting: RateLimiting +) + +case class DataChannel( + name: String, + pushPermission: List[String], + replaceOrDeletePermission: List[String] +) + +case class RemoteDataSource( + name: String, + url: String, + fetchMode: String, + permissions: List[String] +) + +case class PluginManifestContent( + requiredSdkVersion: String, + name: String, + javascriptEntrypointUrl: String, + javascriptEntrypointIntegrity: Option[String] = None, + localesBaseUrl: Option[String] = None, + eventPersistence: Option[EventPersistence] = None, + dataChannels: Option[List[DataChannel]] = None, + remoteDataSources: Option[List[RemoteDataSource]] = None +) + +case class PluginManifest( + url: String, + content: PluginManifestContent +) + +case class Plugin( + manifest: PluginManifest +) + +object PluginModel { + val objectMapper: ObjectMapper = new ObjectMapper() + objectMapper.registerModule(new DefaultScalaModule()) + def getPluginByName(instance: PluginModel, pluginName: String): Option[Plugin] = { + instance.plugins.get(pluginName) + } + def getPlugins(instance: PluginModel): Map[String, Plugin] = { + instance.plugins + } + def replaceRelativeJavascriptEntrypoint(plugin: Plugin): Plugin = { + val jsEntrypoint = plugin.manifest.content.javascriptEntrypointUrl + if (jsEntrypoint.startsWith("http://") || jsEntrypoint.startsWith("https://")) { + plugin + } else { + val baseUrl = plugin.manifest.url.substring(0, plugin.manifest.url.lastIndexOf('/') + 1) + val absoluteJavascriptEntrypoint = baseUrl + jsEntrypoint + val newPluginManifestContent = plugin.manifest.content.copy(javascriptEntrypointUrl = absoluteJavascriptEntrypoint) + val newPluginManifest = plugin.manifest.copy(content = newPluginManifestContent) + plugin.copy(manifest = newPluginManifest) + } + } + def createPluginModelFromJson(json: util.Map[String, AnyRef]): PluginModel = { + val instance = new PluginModel() + var pluginsMap: Map[String, Plugin] = Map.empty[String, Plugin] + json.forEach { case (pluginName, plugin) => + try { + val pluginObject = objectMapper.readValue(objectMapper.writeValueAsString(plugin), classOf[Plugin]) + val pluginObjectWithAbsoluteJavascriptEntrypoint = replaceRelativeJavascriptEntrypoint(pluginObject) + pluginsMap = pluginsMap + (pluginName -> pluginObjectWithAbsoluteJavascriptEntrypoint) + } catch { + case err @ (_: JsonProcessingException | _: JsonMappingException) => println("Error while processing plugin " + + pluginName + ": ", err) + } + } + instance.plugins = pluginsMap + instance + } + def persistPluginsForClient(instance: PluginModel, meetingId: String): Unit = { + instance.plugins.foreach { case (_, plugin) => + PluginDAO.insert(meetingId, plugin.manifest.content.name, plugin.manifest.content.javascriptEntrypointUrl, + plugin.manifest.content.javascriptEntrypointIntegrity.getOrElse("")) + } + } +} + +class PluginModel { + private var plugins: Map[String, Plugin] = Map() +} + diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/RegisteredUsers.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/RegisteredUsers.scala index 1dc3a789fd..c1ac74f71c 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/RegisteredUsers.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/RegisteredUsers.scala @@ -6,8 +6,8 @@ import org.bigbluebutton.core.domain.BreakoutRoom2x object RegisteredUsers { def create(meetingId: String, userId: String, extId: String, name: String, roles: String, - authToken: String, sessionToken: Vector[String], avatar: String, webcamBackground: String, color: String, guest: Boolean, authenticated: Boolean, - guestStatus: String, excludeFromDashboard: Boolean, enforceLayout: String, + authToken: String, sessionToken: Vector[String], avatar: String, webcamBackground: String, color: String, bot: Boolean, + guest: Boolean, authenticated: Boolean, guestStatus: String, excludeFromDashboard: Boolean, enforceLayout: String, userMetadata: Map[String, String], loggedOut: Boolean): RegisteredUser = { new RegisteredUser( userId, @@ -20,6 +20,7 @@ object RegisteredUsers { avatar, webcamBackground, color, + bot, guest, authenticated, guestStatus, @@ -256,6 +257,7 @@ case class RegisteredUser( avatarURL: String, webcamBackgroundURL: String, color: String, + bot: Boolean, guest: Boolean, authed: Boolean, guestStatus: String, diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Users2x.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Users2x.scala index d0b14e326d..134bc94b12 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Users2x.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Users2x.scala @@ -67,7 +67,7 @@ object Users2x { } def numUsers(users: Users2x): Int = { - users.toVector.length + users.toVector.filter(u => !u.bot).length } def numActiveModerators(users: Users2x): Int = { @@ -432,6 +432,7 @@ case class UserState( meetingId: String, name: String, role: String, + bot: Boolean, guest: Boolean, pin: Boolean, mobile: Boolean, diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/HandlerHelpers.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/HandlerHelpers.scala index 1b2bcb527d..cb1987d4d4 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/HandlerHelpers.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/HandlerHelpers.scala @@ -48,6 +48,7 @@ trait HandlerHelpers extends SystemConfiguration { meetingId = regUser.meetingId, name = regUser.name, role = regUser.role, + bot = regUser.bot, guest = regUser.guest, authed = regUser.authed, guestStatus = regUser.guestStatus, @@ -327,20 +328,20 @@ trait HandlerHelpers extends SystemConfiguration { BbbCommonEnvCoreMsg(envelope, event) } - def buildGroupChatMessageReactionSentEvtMsg(meetingId: String, userId: String, chatId: String, messageId: String, reactionEmoji: String): BbbCommonEnvCoreMsg = { + def buildGroupChatMessageReactionSentEvtMsg(meetingId: String, userId: String, chatId: String, messageId: String, reactionEmoji: String, reactionEmojiId: String): BbbCommonEnvCoreMsg = { val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, userId) val envelope = BbbCoreEnvelope(GroupChatMessageReactionSentEvtMsg.NAME, routing) val header = BbbClientMsgHeader(GroupChatMessageReactionSentEvtMsg.NAME, meetingId, userId) - val body = GroupChatMessageReactionSentEvtMsgBody(chatId, messageId, reactionEmoji) + val body = GroupChatMessageReactionSentEvtMsgBody(chatId, messageId, reactionEmoji, reactionEmojiId) val event = GroupChatMessageReactionSentEvtMsg(header, body) BbbCommonEnvCoreMsg(envelope, event) } - def buildGroupChatMessageReactionDeletedEvtMsg(meetingId: String, userId: String, chatId: String, messageId: String, reactionEmoji: String): BbbCommonEnvCoreMsg = { + def buildGroupChatMessageReactionDeletedEvtMsg(meetingId: String, userId: String, chatId: String, messageId: String, reactionEmoji: String, reactionEmojiId: String): BbbCommonEnvCoreMsg = { val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, userId) val envelope = BbbCoreEnvelope(GroupChatMessageReactionDeletedEvtMsg.NAME, routing) val header = BbbClientMsgHeader(GroupChatMessageReactionDeletedEvtMsg.NAME, meetingId, userId) - val body = GroupChatMessageReactionDeletedEvtMsgBody(chatId, messageId, reactionEmoji) + val body = GroupChatMessageReactionDeletedEvtMsgBody(chatId, messageId, reactionEmoji, reactionEmojiId) val event = GroupChatMessageReactionDeletedEvtMsg(header, body) BbbCommonEnvCoreMsg(envelope, event) } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/LiveMeeting.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/LiveMeeting.scala index 01aa16fcde..418eafce25 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/LiveMeeting.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/LiveMeeting.scala @@ -27,4 +27,5 @@ class LiveMeeting( val users2x: Users2x, val guestsWaiting: GuestsWaiting, val clientSettings: Map[String, Object], + val plugins: PluginModel, ) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala index 0c3811adad..e701ca6375 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala @@ -172,7 +172,7 @@ class MeetingActor( outGW.send(msgEvent) //Insert meeting into the database - MeetingDAO.insert(liveMeeting.props, liveMeeting.clientSettings) + MeetingDAO.insert(liveMeeting.props, liveMeeting.clientSettings, liveMeeting.plugins) // Create a default public group chat state = groupChatApp.handleCreateDefaultPublicGroupChat(state, liveMeeting, msgBus) @@ -1134,7 +1134,7 @@ class MeetingActor( val hasActivityAfterWarning = u.lastInactivityInspect < u.lastActivityTime val hasActivityRecently = (lastUsersInactivityInspection - expiryTracker.userInactivityThresholdInMs) < u.lastActivityTime - if (hasActivityAfterWarning && !hasActivityRecently) { + if (hasActivityAfterWarning && !hasActivityRecently && !u.bot) { log.info("User has been inactive for " + TimeUnit.MILLISECONDS.toMinutes(expiryTracker.userInactivityThresholdInMs) + " minutes. Sending inactivity warning. meetingId=" + props.meetingProp.intId + " userId=" + u.intId + " user=" + u) val secsToDisconnect = TimeUnit.MILLISECONDS.toSeconds(expiryTracker.userActivitySignResponseDelayInMs); diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/RunningMeeting.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/RunningMeeting.scala index 16bdd59e68..96bdef6a97 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/RunningMeeting.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/RunningMeeting.scala @@ -2,13 +2,11 @@ package org.bigbluebutton.core.running import org.apache.pekko.actor.ActorContext import org.bigbluebutton.ClientSettings -import org.bigbluebutton.ClientSettings.{getConfigPropertyValueByPathAsBooleanOrElse, getConfigPropertyValueByPathAsStringOrElse} import org.bigbluebutton.common2.domain.DefaultProps import org.bigbluebutton.core.apps._ import org.bigbluebutton.core.bus._ import org.bigbluebutton.core.models._ import org.bigbluebutton.core.OutMessageGateway -import org.bigbluebutton.core.apps.pads.PadslHdlrHelpers import org.bigbluebutton.core2.MeetingStatus2x object RunningMeeting { @@ -19,9 +17,9 @@ object RunningMeeting { class RunningMeeting(val props: DefaultProps, outGW: OutMessageGateway, eventBus: InternalEventBus)(implicit val context: ActorContext) { - private val externalVideoModel = new ExternalVideoModel() private val chatModel = new ChatModel() + private val plugins = PluginModel.createPluginModelFromJson(props.pluginProp) private val layouts = new Layouts() private val pads = new Pads() private val wbModel = new WhiteboardModel() @@ -45,7 +43,7 @@ class RunningMeeting(val props: DefaultProps, outGW: OutMessageGateway, // easy to test. private val liveMeeting = new LiveMeeting(props, meetingStatux2x, deskshareModel, audioCaptions, timerModel, chatModel, externalVideoModel, layouts, pads, registeredUsers, polls2x, wbModel, presModel, captionModel, - webcams, voiceUsers, users2x, guestsWaiting, clientSettings) + webcams, voiceUsers, users2x, guestsWaiting, clientSettings, plugins) GuestsWaiting.setGuestPolicy( liveMeeting.props.meetingProp.intId, diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/UserJoinedMeetingEvtMsgBuilder.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/UserJoinedMeetingEvtMsgBuilder.scala index c79d0abe52..24c770bea2 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/UserJoinedMeetingEvtMsgBuilder.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/UserJoinedMeetingEvtMsgBuilder.scala @@ -9,7 +9,7 @@ object UserJoinedMeetingEvtMsgBuilder { val envelope = BbbCoreEnvelope(UserJoinedMeetingEvtMsg.NAME, routing) val body = UserJoinedMeetingEvtMsgBody(intId = userState.intId, extId = userState.extId, name = userState.name, - role = userState.role, guest = userState.guest, authed = userState.authed, + role = userState.role, bot = userState.bot, guest = userState.guest, authed = userState.authed, guestStatus = userState.guestStatus, reactionEmoji = userState.reactionEmoji, raiseHand = userState.raiseHand, diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeTestData.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeTestData.scala index 2b73e0ba84..9972804541 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeTestData.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeTestData.scala @@ -9,21 +9,21 @@ import org.bigbluebutton.core.running.LiveMeeting trait FakeTestData { def createFakeUsers(liveMeeting: LiveMeeting): Unit = { - val mod1 = createUserVoiceAndCam(liveMeeting, Roles.MODERATOR_ROLE, false, false, CallingWith.WEBRTC, muted = false, + val mod1 = createUserVoiceAndCam(liveMeeting, Roles.MODERATOR_ROLE, bot = false, false, false, CallingWith.WEBRTC, muted = false, talking = true, listenOnly = false) Users2x.add(liveMeeting.users2x, mod1) - val mod2 = createUserVoiceAndCam(liveMeeting, Roles.MODERATOR_ROLE, guest = false, authed = true, CallingWith.WEBRTC, muted = false, + val mod2 = createUserVoiceAndCam(liveMeeting, Roles.MODERATOR_ROLE, bot = false, guest = false, authed = true, CallingWith.WEBRTC, muted = false, talking = false, listenOnly = false) Users2x.add(liveMeeting.users2x, mod2) - val guest1 = createUserVoiceAndCam(liveMeeting, Roles.VIEWER_ROLE, guest = true, authed = true, CallingWith.WEBRTC, muted = false, + val guest1 = createUserVoiceAndCam(liveMeeting, Roles.VIEWER_ROLE, bot = false, guest = true, authed = true, CallingWith.WEBRTC, muted = false, talking = false, listenOnly = false) Users2x.add(liveMeeting.users2x, guest1) val guestWait1 = GuestWaiting(guest1.intId, guest1.name, guest1.role, guest1.guest, "", "", "#ff6242", guest1.authed, System.currentTimeMillis()) GuestsWaiting.add(liveMeeting.guestsWaiting, guestWait1) - val guest2 = createUserVoiceAndCam(liveMeeting, Roles.VIEWER_ROLE, guest = true, authed = true, CallingWith.FLASH, muted = false, + val guest2 = createUserVoiceAndCam(liveMeeting, Roles.VIEWER_ROLE, bot = false, guest = true, authed = true, CallingWith.FLASH, muted = false, talking = false, listenOnly = false) Users2x.add(liveMeeting.users2x, guest2) val guestWait2 = GuestWaiting(guest2.intId, guest2.name, guest2.role, guest2.guest, "", "", "#ff6242", guest2.authed, System.currentTimeMillis()) @@ -44,16 +44,16 @@ trait FakeTestData { VoiceUsers.add(liveMeeting.voiceUsers, vu5) for (i <- 1 to 50) { - val guser = createUserVoiceAndCam(liveMeeting, Roles.MODERATOR_ROLE, guest = false, authed = true, CallingWith.WEBRTC, muted = false, + val guser = createUserVoiceAndCam(liveMeeting, Roles.MODERATOR_ROLE, bot = false, guest = false, authed = true, CallingWith.WEBRTC, muted = false, talking = false, listenOnly = false) Users2x.add(liveMeeting.users2x, guser) } } - def createUserVoiceAndCam(liveMeeting: LiveMeeting, role: String, guest: Boolean, authed: Boolean, callingWith: String, + def createUserVoiceAndCam(liveMeeting: LiveMeeting, role: String, bot: Boolean, guest: Boolean, authed: Boolean, callingWith: String, muted: Boolean, talking: Boolean, listenOnly: Boolean): UserState = { - val ruser1 = FakeUserGenerator.createFakeRegisteredUser(liveMeeting.registeredUsers, Roles.MODERATOR_ROLE, true, false, liveMeeting.props.meetingProp.intId) + val ruser1 = FakeUserGenerator.createFakeRegisteredUser(liveMeeting.registeredUsers, Roles.MODERATOR_ROLE, bot = false, true, false, liveMeeting.props.meetingProp.intId) val vuser1 = FakeUserGenerator.createFakeVoiceUser(ruser1, "webrtc", muted = false, talking = true, listenOnly = false) VoiceUsers.add(liveMeeting.voiceUsers, vuser1) @@ -70,7 +70,7 @@ trait FakeTestData { def createFakeUser(liveMeeting: LiveMeeting, regUser: RegisteredUser): UserState = { UserState(intId = regUser.id, extId = regUser.externId, meetingId = regUser.meetingId, name = regUser.name, role = regUser.role, pin = false, - mobile = false, guest = regUser.guest, authed = regUser.authed, guestStatus = regUser.guestStatus, + mobile = false, bot = regUser.bot, guest = regUser.guest, authed = regUser.authed, guestStatus = regUser.guestStatus, reactionEmoji = "none", raiseHand = false, away = false, locked = false, presenter = false, avatar = regUser.avatarURL, webcamBackground = regUser.webcamBackgroundURL, color = "#ff6242", clientType = "unknown", userLeftFlag = UserLeftFlag(false, 0)) } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeUserGenerator.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeUserGenerator.scala index 8db030a58c..f3a5460b9b 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeUserGenerator.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeUserGenerator.scala @@ -45,7 +45,7 @@ object FakeUserGenerator { private def getRandomElement(list: Seq[String], random: Random): String = list(random.nextInt(list.length)) - def createFakeRegisteredUser(users: RegisteredUsers, role: String, guest: Boolean, authed: Boolean, meetingId: String): RegisteredUser = { + def createFakeRegisteredUser(users: RegisteredUsers, role: String, bot: Boolean, guest: Boolean, authed: Boolean, meetingId: String): RegisteredUser = { val name = getRandomElement(firstNames, random) + " " + getRandomElement(lastNames, random) val id = "w_" + RandomStringGenerator.randomAlphanumericString(16) val extId = RandomStringGenerator.randomAlphanumericString(16) @@ -58,7 +58,8 @@ object FakeUserGenerator { val color = "#ff6242" val ru = RegisteredUsers.create(meetingId, userId = id, extId, name, role, - authToken, Vector(sessionToken), avatarURL, webcamBackgroundURL, color, guest, authed, guestStatus = GuestStatus.ALLOW, false, "", Map(), false) + authToken, Vector(sessionToken), avatarURL, webcamBackgroundURL, color, bot, + guest, authed, guestStatus = GuestStatus.ALLOW, false, "", Map(), false) RegisteredUsers.add(users, ru, meetingId) ru } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/endpoint/redis/LearningDashboardActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/endpoint/redis/LearningDashboardActor.scala index 3c0f7b45f6..079ab92d05 100644 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/endpoint/redis/LearningDashboardActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/endpoint/redis/LearningDashboardActor.scala @@ -21,6 +21,7 @@ case class Meeting( extId: String, name: String, downloadSessionDataEnabled: Boolean, + other: Map[String, String] = Map(), users: Map[String, User] = Map(), genericDataTitles: Vector[String], polls: Map[String, Poll] = Map(), @@ -50,9 +51,13 @@ case class User( case class UserId( intId: String, + sessions: Vector[UserSession] = Vector(UserSession()), + userLeftFlag: Boolean = false, +) + +case class UserSession( registeredOn: Long = System.currentTimeMillis(), leftOn: Long = 0, - userLeftFlag: Boolean = false, ) case class Poll( @@ -286,12 +291,12 @@ class LearningDashboardActor( } private def findUserByIntId(meeting: Meeting, intId: String): Option[User] = { - meeting.users.values.find(u => u.currentIntId == intId || (u.currentIntId == null && u.intIds.exists(uId => uId._2.intId == intId && uId._2.leftOn == 0))) + meeting.users.values.find(u => u.currentIntId == intId || (u.currentIntId == null && u.intIds.exists(uId => uId._2.intId == intId && uId._2.sessions.last.leftOn == 0))) } private def findUserByExtId(meeting: Meeting, extId: String, filterUserLeft: Boolean = false): Option[User] = { meeting.users.values.find(u => { - u.extId == extId && (filterUserLeft == false || !u.intIds.exists(uId => uId._2.leftOn == 0 && uId._2.userLeftFlag == false)) + u.extId == extId && (filterUserLeft == false || !u.intIds.exists(uId => uId._2.sessions.last.leftOn == 0 && uId._2.userLeftFlag == false)) }) } @@ -309,14 +314,21 @@ class LearningDashboardActor( for { userId <- user.intIds.get(msg.body.userId) } yield { - val updatedUser = user.copy(currentIntId = userId.intId, intIds = user.intIds + (userId.intId -> userId.copy(leftOn = 0, userLeftFlag = false))) + val updatedUserId = userId.copy( + sessions = userId.sessions.init :+ userId.sessions.last.copy(leftOn = 0), + userLeftFlag = false + ) + val updatedUser = user.copy( + currentIntId = userId.intId, + intIds = user.intIds + (userId.intId -> updatedUserId) + ) val updatedMeeting = meeting.copy(users = meeting.users + (updatedUser.userKey -> updatedUser)) meetings += (updatedMeeting.intId -> updatedMeeting) } } else { val userLeftFlagged = meeting.users.values.filter(u => u.intIds.exists(uId => { - uId._2.intId == msg.body.userId && uId._2.userLeftFlag == true && uId._2.leftOn == 0 + uId._2.intId == msg.body.userId && uId._2.userLeftFlag == true && uId._2.sessions.last.leftOn == 0 })) //Flagged user must be reactivated, once UserJoinedMeetingEvtMsg won't be sent @@ -353,12 +365,17 @@ class LearningDashboardActor( private def handleUserLeftMeetingEvtMsg(msg: UserLeftMeetingEvtMsg): Unit = { for { meeting <- meetings.values.find(m => m.intId == msg.header.meetingId) - user <- meeting.users.values.find(u => u.intIds.exists(uId => uId._2.intId == msg.body.intId && uId._2.leftOn == 0)) + user <- meeting.users.values.find(u => u.intIds.exists(uId => uId._2.intId == msg.body.intId && uId._2.sessions.last.leftOn == 0)) userId <- user.intIds.get(msg.body.intId) } yield { + val updatedSessions = userId.sessions.init :+ userId.sessions.last.copy(leftOn = System.currentTimeMillis()) + val updatedUserId = userId.copy( + userLeftFlag = true, + sessions = updatedSessions + ) val updatedUser = user.copy( currentIntId = if(user.currentIntId == userId.intId) null else user.currentIntId, - intIds = user.intIds + (userId.intId -> userId.copy(leftOn = System.currentTimeMillis())) + intIds = user.intIds + (userId.intId -> updatedUserId) ) val updatedMeeting = meeting.copy(users = meeting.users + (updatedUser.userKey -> updatedUser)) @@ -478,7 +495,11 @@ class LearningDashboardActor( endUserTalk(meeting, user) if(user.isDialIn) { - val updatedUser = user.copy(intIds = user.intIds + (userId.intId -> userId.copy(leftOn = System.currentTimeMillis()))) + val updatedSessions = userId.sessions.init :+ userId.sessions.last.copy(leftOn = System.currentTimeMillis()) + val updatedUserId = userId.copy( + sessions = updatedSessions + ) + val updatedUser = user.copy(intIds = user.intIds + (userId.intId -> updatedUserId)) val updatedMeeting = meeting.copy(users = meeting.users + (updatedUser.userKey -> updatedUser)) meetings += (updatedMeeting.intId -> updatedMeeting) @@ -606,7 +627,11 @@ class LearningDashboardActor( msg.body.props.meetingProp.extId, msg.body.props.meetingProp.name, downloadSessionDataEnabled = !msg.body.props.meetingProp.disabledFeatures.contains("learningDashboardDownloadSessionData"), - genericDataTitles = Vector() + genericDataTitles = Vector(), + other = Map( + "learning-dashboard-learn-more-link" -> msg.body.props.metadataProp.metadata.get("learning-dashboard-learn-more-link").getOrElse(""), + "learning-dashboard-feedback-link" -> msg.body.props.metadataProp.metadata.get("learning-dashboard-feedback-link").getOrElse("") + ), ) meetings += (newMeeting.intId -> newMeeting) @@ -653,9 +678,15 @@ class LearningDashboardActor( user.copy( currentIntId = null, intIds = user.intIds.map(uId => { - if(uId._2.leftOn > 0) (uId._1 -> uId._2) + if(uId._2.sessions.last.leftOn > 0) (uId._1 -> uId._2) else if(forceFlaggedIdsToLeft == false && uId._2.userLeftFlag == true) (uId._1 -> uId._2) - else (uId._1 -> uId._2.copy(leftOn = endedOn)) + else { + val updatedSessions = uId._2.sessions.init :+ uId._2.sessions.last.copy(leftOn = endedOn) + val updatedUserId = uId._2.copy( + sessions = updatedSessions + ) + (uId._1 -> updatedUserId) + } }), talk = user.talk.copy( totalTime = user.talk.totalTime + (if (user.talk.lastTalkStartedOn > 0) (endedOn - user.talk.lastTalkStartedOn) else 0), @@ -691,20 +722,25 @@ class LearningDashboardActor( ) , currentTime, false) + val currentUserId = user.intIds.get(intId).getOrElse(UserId(intId, sessions = Vector())) + meetings += (meeting.intId -> meeting.copy( //Set leftOn to same intId in past user records users = meeting.users.map(u => { (u._1 -> u._2.copy( intIds = u._2.intIds.map(uId => { (uId._1 -> { - if (uId._2.intId == intId && uId._2.leftOn == 0) uId._2.copy(leftOn = currentTime) + if (uId._2.intId == intId && uId._2.sessions.last.leftOn == 0) { + val updatedSessions = uId._2.sessions.init :+ uId._2.sessions.last.copy(leftOn = currentTime) + uId._2.copy(sessions = updatedSessions) + } else uId._2 }) }))) }) + (user.userKey -> user.copy( currentIntId = intId, - intIds = user.intIds + (intId -> user.intIds.get(intId).getOrElse(UserId(intId, currentTime)).copy( - leftOn = 0, + intIds = user.intIds + (intId -> currentUserId.copy( + sessions = currentUserId.sessions :+ UserSession(currentTime), userLeftFlag = false )) )) diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core2/testdata/TestDataGen.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core2/testdata/TestDataGen.scala index e266f7839a..67fac93dac 100755 --- a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core2/testdata/TestDataGen.scala +++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core2/testdata/TestDataGen.scala @@ -6,7 +6,7 @@ import org.bigbluebutton.core.util.RandomStringGenerator object TestDataGen { def createRegisteredUser(meetingId: String, users: RegisteredUsers, name: String, role: String, - guest: Boolean, authed: Boolean, waitForApproval: Boolean): RegisteredUser = { + bot: Boolean, guest: Boolean, authed: Boolean, waitForApproval: Boolean): RegisteredUser = { val id = "w_" + RandomStringGenerator.randomAlphanumericString(16) val extId = RandomStringGenerator.randomAlphanumericString(16) val authToken = RandomStringGenerator.randomAlphanumericString(16) @@ -18,7 +18,8 @@ object TestDataGen { val color = "#ff6242" val ru = RegisteredUsers.create(meetingId, userId = id, extId, name, role, - authToken, Vector(sessionToken), avatarURL, webcamBackgroundURL, color, guest, authed, GuestStatus.ALLOW, false, "", Map(), false) + authToken, Vector(sessionToken), avatarURL, webcamBackgroundURL, color, bot, + guest, authed, GuestStatus.ALLOW, false, "", Map(), false) RegisteredUsers.add(users, ru, meetingId = "test") ru @@ -76,7 +77,7 @@ object TestDataGen { def createUserFor(liveMeeting: LiveMeeting, regUser: RegisteredUser, presenter: Boolean): UserState = { val u = UserState(intId = regUser.id, extId = regUser.externId, meetingId = regUser.meetingId, name = regUser.name, - role = regUser.role, guest = regUser.guest, authed = regUser.authed, guestStatus = regUser.guestStatus, + role = regUser.role,bot = regUser.bot, guest = regUser.guest, authed = regUser.authed, guestStatus = regUser.guestStatus, reactionEmoji = "none", raiseHand = false, away = false, pin = false, mobile = false, locked = false, presenter = false, avatar = regUser.avatarURL, regUser.webcamBackgroundURL, color = "#ff6242", clientType = "unknown", userLeftFlag = UserLeftFlag(false, 0)) diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Meeting2x.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Meeting2x.scala index 2e2c9dd904..8b41b7288f 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Meeting2x.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Meeting2x.scala @@ -1,5 +1,7 @@ package org.bigbluebutton.common2.domain +import java.util + case class DurationProps(duration: Int, createdTime: Long, createdDate: String, meetingExpireIfNoUserJoinedInMinutes: Int, meetingExpireWhenLastUserLeftInMinutes: Int, userInactivityInspectTimerInMinutes: Int, userInactivityThresholdInMinutes: Int, @@ -85,6 +87,7 @@ case class GroupProps( ) case class DefaultProps( + pluginProp: util.Map[String, AnyRef], meetingProp: MeetingProp, breakoutProps: BreakoutProps, durationProps: DurationProps, @@ -118,7 +121,7 @@ case class AnswerVO(id: Int, key: String, text: Option[String], responders: Opti case class QuestionVO(id: Int, questionType: String, multiResponse: Boolean, questionText: Option[String], answers: Option[Array[AnswerVO]]) case class PollVO(id: String, questions: Array[QuestionVO], title: Option[String], started: Boolean, stopped: Boolean, showResult: Boolean, isSecret: Boolean) -case class UserVO(id: String, externalId: String, name: String, role: String, +case class UserVO(id: String, externalId: String, name: String, role: String, bot: Boolean, guest: Boolean, authed: Boolean, guestStatus: String, emojiStatus: String, presenter: Boolean, hasStream: Boolean, locked: Boolean, webcamStreams: Set[String], phoneUser: Boolean, voiceUser: VoiceUserVO, listenOnly: Boolean, avatarURL: String, diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/BreakoutMsgs.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/BreakoutMsgs.scala index 1783e4cbc3..774d8c9d02 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/BreakoutMsgs.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/BreakoutMsgs.scala @@ -1,5 +1,7 @@ package org.bigbluebutton.common2.msgs +import java.util + object BreakoutRoomEndedEvtMsg { val NAME = "BreakoutRoomEndedEvtMsg" } case class BreakoutRoomEndedEvtMsg(header: BbbClientMsgHeader, body: BreakoutRoomEndedEvtMsgBody) extends BbbCoreMsg case class BreakoutRoomEndedEvtMsgBody(parentId: String, breakoutId: String) @@ -56,6 +58,7 @@ case class BreakoutRoomDetail( captureSlides: Boolean, captureNotesFilename: String, captureSlidesFilename: String, + pluginProp: util.Map[String, AnyRef], ) /** diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/GroupChatMsg.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/GroupChatMsg.scala index a3d7043539..deac7281df 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/GroupChatMsg.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/GroupChatMsg.scala @@ -137,19 +137,19 @@ case class GroupChatMessageDeletedEvtMsgBody(chatId: String, messageId: String) object SendGroupChatMessageReactionReqMsg { val NAME = "SendGroupChatMessageReactionReqMsg" } case class SendGroupChatMessageReactionReqMsg(header: BbbClientMsgHeader, body: SendGroupChatMessageReactionReqMsgBody) extends StandardMsg -case class SendGroupChatMessageReactionReqMsgBody(chatId: String, messageId: String, reactionEmoji: String) +case class SendGroupChatMessageReactionReqMsgBody(chatId: String, messageId: String, reactionEmoji: String, reactionEmojiId: String) object GroupChatMessageReactionSentEvtMsg { val NAME = "GroupChatMessageReactionSentEvtMsg" } case class GroupChatMessageReactionSentEvtMsg(header: BbbClientMsgHeader, body: GroupChatMessageReactionSentEvtMsgBody) extends BbbCoreMsg -case class GroupChatMessageReactionSentEvtMsgBody(chatId: String, messageId: String, reactionEmoji: String) +case class GroupChatMessageReactionSentEvtMsgBody(chatId: String, messageId: String, reactionEmoji: String, reactionEmojiId: String) object DeleteGroupChatMessageReactionReqMsg { val NAME = "DeleteGroupChatMessageReactionReqMsg" } case class DeleteGroupChatMessageReactionReqMsg(header: BbbClientMsgHeader, body: DeleteGroupChatMessageReactionReqMsgBody) extends StandardMsg -case class DeleteGroupChatMessageReactionReqMsgBody(chatId: String, messageId: String, reactionEmoji: String) +case class DeleteGroupChatMessageReactionReqMsgBody(chatId: String, messageId: String, reactionEmoji: String, reactionEmojiId: String) object GroupChatMessageReactionDeletedEvtMsg { val NAME = "GroupChatMessageReactionDeletedEvtMsg" } case class GroupChatMessageReactionDeletedEvtMsg(header: BbbClientMsgHeader, body: GroupChatMessageReactionDeletedEvtMsgBody) extends BbbCoreMsg -case class GroupChatMessageReactionDeletedEvtMsgBody(chatId: String, messageId: String, reactionEmoji: String) +case class GroupChatMessageReactionDeletedEvtMsgBody(chatId: String, messageId: String, reactionEmoji: String, reactionEmojiId: String) object UserTypingPubMsg { val NAME = "UserTypingPubMsg" } case class UserTypingPubMsg(header: BbbClientMsgHeader, body: UserTypingPubMsgBody) extends StandardMsg diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/PluginMsgs.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/PluginMsgs.scala index 7fe61c9d8b..53c67031c4 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/PluginMsgs.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/PluginMsgs.scala @@ -7,6 +7,14 @@ import org.bigbluebutton.common2.domain.PluginLearningAnalyticsDashboardGenericD /** * Sent from graphql-actions to bbb-akka */ + +trait PluginDataChannelReplaceOrDeleteBaseBody{ + val pluginName: String + val channelName: String + val subChannelName: String + val entryId: String +} + object PluginDataChannelPushEntryMsg { val NAME = "PluginDataChannelPushEntryMsg" } case class PluginDataChannelPushEntryMsg(header: BbbClientMsgHeader, body: PluginDataChannelPushEntryMsgBody) extends StandardMsg case class PluginDataChannelPushEntryMsgBody( @@ -20,13 +28,13 @@ case class PluginDataChannelPushEntryMsgBody( object PluginDataChannelReplaceEntryMsg { val NAME = "PluginDataChannelReplaceEntryMsg" } case class PluginDataChannelReplaceEntryMsg(header: BbbClientMsgHeader, body: PluginDataChannelReplaceEntryMsgBody) extends StandardMsg -case class PluginDataChannelReplaceEntryMsgBody( +case class PluginDataChannelReplaceEntryMsgBody ( pluginName: String, channelName: String, subChannelName: String, payloadJson: Map[String, Any], entryId: String, - ) + ) extends PluginDataChannelReplaceOrDeleteBaseBody object PluginDataChannelDeleteEntryMsg { val NAME = "PluginDataChannelDeleteEntryMsg" } case class PluginDataChannelDeleteEntryMsg(header: BbbClientMsgHeader, body: PluginDataChannelDeleteEntryMsgBody) extends StandardMsg @@ -35,7 +43,7 @@ case class PluginDataChannelDeleteEntryMsgBody( subChannelName: String, channelName: String, entryId: String - ) + ) extends PluginDataChannelReplaceOrDeleteBaseBody object PluginDataChannelResetMsg { val NAME = "PluginDataChannelResetMsg" } diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/UsersMsgs.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/UsersMsgs.scala index 1bbf8a2ee1..8ca73abc91 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/UsersMsgs.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/UsersMsgs.scala @@ -7,8 +7,9 @@ case class RegisterUserReqMsg( ) extends BbbCoreMsg case class RegisterUserReqMsgBody(meetingId: String, intUserId: String, name: String, role: String, extUserId: String, authToken: String, sessionToken: String, avatarURL: String, - webcamBackgroundURL: String, guest: Boolean, authed: Boolean, guestStatus: String, - excludeFromDashboard: Boolean, enforceLayout: String, userMetadata: Map[String, String]) + webcamBackgroundURL: String, bot: Boolean, guest: Boolean, authed: Boolean, + guestStatus: String, excludeFromDashboard: Boolean, enforceLayout: String, + userMetadata: Map[String, String]) object UserRegisteredRespMsg { val NAME = "UserRegisteredRespMsg" } case class UserRegisteredRespMsg( @@ -88,6 +89,7 @@ case class UserJoinedMeetingEvtMsgBody( extId: String, name: String, role: String, + bot: Boolean, guest: Boolean, authed: Boolean, guestStatus: String, diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/ApiParams.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/ApiParams.java index 2de1966241..89aa44c244 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/api/ApiParams.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/ApiParams.java @@ -73,6 +73,7 @@ public class ApiParams { public static final String ROLE = "role"; public static final String GROUPS = "groups"; public static final String DISABLED_FEATURES = "disabledFeatures"; + public static final String PLUGIN_MANIFESTS = "pluginManifests"; public static final String DISABLED_FEATURES_EXCLUDE = "disabledFeaturesExclude"; public static final String NOTIFY_RECORDING_IS_ON = "notifyRecordingIsOn"; diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java index 386b176573..5d885dad9f 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java @@ -19,7 +19,11 @@ package org.bigbluebutton.api; import java.io.File; +import java.io.InputStream; import java.net.URI; +import java.net.URL; +import java.security.DigestInputStream; +import java.security.MessageDigest; import java.util.*; import java.util.Map.Entry; import java.util.concurrent.BlockingQueue; @@ -29,7 +33,11 @@ import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.JsonObject; +import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; import org.apache.http.client.utils.URIBuilder; import org.bigbluebutton.api.domain.*; @@ -57,6 +65,8 @@ import com.google.gson.Gson; import java.io.BufferedReader; import java.io.InputStreamReader; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.springframework.data.domain.*; @@ -97,6 +107,8 @@ public class MeetingService implements MessageListener { private HashMap uploadAuthzTokens; + ObjectMapper objectMapper = new ObjectMapper(); + public MeetingService() { meetings = new ConcurrentHashMap(8, 0.9f, 1); sessions = new ConcurrentHashMap(8, 0.9f, 1); @@ -122,12 +134,12 @@ public class MeetingService implements MessageListener { public void registerUser(String meetingID, String internalUserId, String fullname, String role, String externUserID, - String authToken, String sessionToken, String avatarURL, String webcamBackgroundURL, Boolean guest, - Boolean authed, String guestStatus, Boolean excludeFromDashboard, Boolean leftGuestLobby, + String authToken, String sessionToken, String avatarURL, String webcamBackgroundURL, Boolean bot, + Boolean guest, Boolean authed, String guestStatus, Boolean excludeFromDashboard, Boolean leftGuestLobby, String enforceLayout, Map userMetadata) { handle( new RegisterUser(meetingID, internalUserId, fullname, role, - externUserID, authToken, sessionToken, avatarURL, webcamBackgroundURL, guest, authed, guestStatus, + externUserID, authToken, sessionToken, avatarURL, webcamBackgroundURL, bot, guest, authed, guestStatus, excludeFromDashboard, leftGuestLobby, enforceLayout, userMetadata ) ); @@ -190,7 +202,10 @@ public class MeetingService implements MessageListener { UserSessionBasicData removedUser = new UserSessionBasicData(); removedUser.meetingId = us.meetingID; + removedUser.extMeetingId = us.externMeetingID; removedUser.userId = us.internalUserId; + removedUser.extUserId = us.externUserID; + removedUser.userFullName = us.fullname; removedUser.sessionToken = us.authToken; removedUser.role = us.role; removedSessions.put(token, removedUser); @@ -352,13 +367,124 @@ public class MeetingService implements MessageListener { : Collections.unmodifiableCollection(sessions.values()); } + public String replaceMetaParametersIntoManifestTemplate(String manifestContent, Map metadata) + throws NoSuchFieldException { + // Pattern to match ${variable} in the input string + Pattern pattern = Pattern.compile("\\$\\{([\\w\\-]+)\\}"); + + Matcher matcher = pattern.matcher(manifestContent); + + StringBuilder result = new StringBuilder(); + + // Iterate over all matches + while (matcher.find()) { + + String variableName = matcher.group(1); + if (variableName.startsWith("meta_") && variableName.length() > 5) { + // Remove "meta_" and convert to lower case + variableName = variableName.substring(5).toLowerCase(); + } else { + throw new NoSuchFieldException("Metadata " + variableName + " is malformed, please provide a valid one"); + } + + String replacement; + if (metadata.containsKey(variableName)) + replacement = metadata.get(variableName); + else throw new NoSuchFieldException("Metadata " + variableName + " not found in URL parameters"); + + // Replace the placeholder with the value from the map + matcher.appendReplacement(result, Matcher.quoteReplacement(replacement)); + } + matcher.appendTail(result); + + return result.toString(); + } + public Map requestPluginManifests(Meeting m) { + Map urlContents = new HashMap<>(); + Map metadata = m.getMetadata(); + + // Fetch content for each URL and store in the map + for (PluginManifest pluginManifest : m.getPluginManifests()) { + try { + + String urlString = pluginManifest.getUrl(); + URL url = new URL(urlString); + StringBuilder content = new StringBuilder(); + try (BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) { + String inputLine; + while ((inputLine = in.readLine()) != null) { + content.append(inputLine).append("\n"); + } + } + + // Parse the JSON content + JsonNode jsonNode = objectMapper.readTree(content.toString()); + + // Validate checksum if any: + String paramChecksum = pluginManifest.getChecksum(); + if (!StringUtils.isEmpty(paramChecksum)) { + String hash = DigestUtils.sha256Hex(content.toString()); + if (!paramChecksum.equals(hash)) { + log.info("Plugin's manifest.json checksum mismatch with that of the URL parameter for {}.", + pluginManifest.getUrl() + ); + log.info("Plugin {} is not going to be loaded", + pluginManifest.getUrl() + ); + continue; + } + } + + // Get the "name" field + String name; + if (jsonNode.has("name")) { + name = jsonNode.get("name").asText(); + } else { + throw new NoSuchFieldException("For url " + urlString + "there is no name field configured."); + } + + String pluginKey = name; + HashMap manifestObject = new HashMap<>(); + manifestObject.put("url", urlString); + String manifestContent = replaceMetaParametersIntoManifestTemplate(content.toString(), metadata); + + Map mappedManifestContent = objectMapper.readValue(manifestContent, new TypeReference<>() {}); + + manifestObject.put("content", mappedManifestContent); + Map manifestWrapper = new HashMap(); + manifestWrapper.put( + "manifest", manifestObject + ); + urlContents.put(pluginKey, manifestWrapper); + } catch(Exception e) { + log.error("Failed with the following plugin manifest URL: {}. Error: ", + pluginManifest.getUrl(), e); + log.error("Therefore this plugin will not be loaded"); + } + } + return urlContents; + } + public synchronized boolean createMeeting(Meeting m) { + Map pluginsMap = new HashMap<>(); + return createMeeting(m, pluginsMap); + } + + public synchronized boolean createMeeting(Meeting m, Map plugins) { String internalMeetingId = paramsProcessorUtil.convertToInternalMeetingId(m.getExternalId()); Meeting existingId = getNotEndedMeetingWithId(internalMeetingId); Meeting existingTelVoice = getNotEndedMeetingWithTelVoice(m.getTelVoice()); Meeting existingWebVoice = getNotEndedMeetingWithWebVoice(m.getWebVoice()); if (existingId == null && existingTelVoice == null && existingWebVoice == null) { meetings.put(m.getInternalId(), m); + Map pluginsMap; + if (m.isBreakout()) { + pluginsMap = plugins; + } else { + pluginsMap = requestPluginManifests(m); + } + + m.setPlugins(pluginsMap); handle(new CreateMeeting(m)); return true; } @@ -444,7 +570,7 @@ public class MeetingService implements MessageListener { m.getMuteOnStart(), m.getAllowModsToUnmuteUsers(), m.getAllowModsToEjectCameras(), m.getMeetingKeepEvents(), m.breakoutRoomsParams, m.lockSettingsParams, m.getLoginUrl(), m.getLogoutUrl(), m.getCustomLogoURL(), m.getCustomDarkLogoURL(), m.getBannerText(), m.getBannerColor(), m.getGroups(), m.getDisabledFeatures(), m.getNotifyRecordingIsOn(), - m.getPresentationUploadExternalDescription(), m.getPresentationUploadExternalUrl(), + m.getPresentationUploadExternalDescription(), m.getPresentationUploadExternalUrl(), m.getPlugins(), m.getOverrideClientSettings()); } @@ -459,8 +585,8 @@ public class MeetingService implements MessageListener { private void processRegisterUser(RegisterUser message) { gw.registerUser(message.meetingID, message.internalUserId, message.fullname, message.role, - message.externUserID, message.authToken, message.sessionToken, message.avatarURL, message.webcamBackgroundURL, message.guest, - message.authed, message.guestStatus, message.excludeFromDashboard, message.enforceLayout, message.userMetadata); + message.externUserID, message.authToken, message.sessionToken, message.avatarURL, message.webcamBackgroundURL, message.bot, + message.guest, message.authed, message.guestStatus, message.excludeFromDashboard, message.enforceLayout, message.userMetadata); } private void processRegisterUserSessionToken(RegisterUserSessionToken message) { @@ -694,7 +820,7 @@ public class MeetingService implements MessageListener { Meeting breakout = paramsProcessorUtil.processCreateParams(params); - createMeeting(breakout); + createMeeting(breakout, message.pluginProp); presDownloadService.extractPresentationPage(message.parentMeetingId, message.sourcePresentationId, @@ -960,10 +1086,10 @@ public class MeetingService implements MessageListener { } User user = new User(message.userId, message.externalUserId, - message.name, message.role, message.locked, message.avatarURL, message.webcamBackgroundURL, message.guest, message.guestStatus, - message.clientType); + message.name, message.role, message.locked, message.avatarURL, message.webcamBackgroundURL, message.bot, + message.guest, message.guestStatus, message.clientType); - if(m.getMaxUsers() > 0 && m.countUniqueExtIds() >= m.getMaxUsers()) { + if(m.getMaxUsers() > 0 && m.countUniqueExtIds() >= m.getMaxUsers() && !user.isBot()) { m.removeEnteredUser(user.getInternalUserId()); return; } @@ -983,6 +1109,7 @@ public class MeetingService implements MessageListener { logData.put("externalUserId", user.getExternalUserId()); logData.put("username", user.getFullname()); logData.put("role", user.getRole()); + logData.put("bot", user.isBot()); logData.put("guest", user.isGuest()); logData.put("guestStatus", user.getGuestStatus()); logData.put("logCode", "user_joined_message"); @@ -1079,9 +1206,10 @@ public class MeetingService implements MessageListener { user.setVoiceJoined(true); } else { if (message.userId.startsWith("v_")) { + Boolean bot = false; // A dial-in user joined the meeting. Dial-in users by convention has userId that starts with "v_". User vuser = new User(message.userId, message.userId, message.name, "DIAL-IN-USER", true, "", "", - true, GuestPolicy.ALLOW, "DIAL-IN"); + bot, true, GuestPolicy.ALLOW, "DIAL-IN"); vuser.setVoiceJoined(true); m.userJoined(vuser); } diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/ParamsProcessorUtil.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/ParamsProcessorUtil.java index 7464048efc..1fee79df50 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/api/ParamsProcessorUtil.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/ParamsProcessorUtil.java @@ -26,10 +26,9 @@ import java.nio.charset.StandardCharsets; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; + +import com.google.gson.*; +import org.bigbluebutton.api.domain.*; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.safety.Safelist; @@ -39,10 +38,6 @@ import org.jsoup.select.Elements; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; -import org.bigbluebutton.api.domain.BreakoutRoomsParams; -import org.bigbluebutton.api.domain.LockSettingsParams; -import org.bigbluebutton.api.domain.Meeting; -import org.bigbluebutton.api.domain.Group; import org.bigbluebutton.api.service.ServiceUtils; import org.bigbluebutton.api.util.ParamsUtil; import org.slf4j.Logger; @@ -82,6 +77,7 @@ public class ParamsProcessorUtil { private Integer defaultHttpSessionTimeout = 14400; private Boolean useDefaultAvatar = false; private String defaultAvatarURL; + private String defaultBotAvatarURL; private Boolean useDefaultWebcamBackground = false; private String defaultWebcamBackgroundURL; private String defaultGuestPolicy; @@ -104,6 +100,7 @@ public class ParamsProcessorUtil { private boolean defaultAllowModsToUnmuteUsers = false; private boolean defaultAllowModsToEjectCameras = false; private String defaultDisabledFeatures; + private String defaultPluginManifests; private boolean defaultNotifyRecordingIsOn = false; private boolean defaultKeepEvents = false; private Boolean useDefaultLogo; @@ -432,6 +429,33 @@ public class ParamsProcessorUtil { return groups; } + private ArrayList processPluginManifests(String pluginManifestsParam) { + ArrayList pluginManifests = new ArrayList(); + JsonElement pluginManifestsJsonElement = new Gson().fromJson(pluginManifestsParam, JsonElement.class); + try { + if (pluginManifestsJsonElement != null && pluginManifestsJsonElement.isJsonArray()) { + JsonArray pluginManifestsJson = pluginManifestsJsonElement.getAsJsonArray(); + for (JsonElement pluginManifestJson : pluginManifestsJson) { + if (pluginManifestJson.isJsonObject()) { + JsonObject pluginManifestJsonObj = pluginManifestJson.getAsJsonObject(); + if (pluginManifestJsonObj.has("url")) { + String url = pluginManifestJsonObj.get("url").getAsString(); + PluginManifest newPlugin = new PluginManifest(url); + if (pluginManifestJsonObj.has("checksum")) { + newPlugin.setChecksum(pluginManifestJsonObj.get("checksum").getAsString()); + } + pluginManifests.add(newPlugin); + } + } + } + } + } catch(JsonSyntaxException err){ + log.error("Error in pluginManifests URL parameter's json structure."); + } + + return pluginManifests; + } + public Meeting processCreateParams(Map params) { String meetingName = params.get(ApiParams.NAME); @@ -550,6 +574,22 @@ public class ParamsProcessorUtil { listOfDisabledFeatures.removeAll(Arrays.asList(disabledFeaturesExcludeParam.split(","))); } + // Parse Plugins Manifests from config and param + ArrayList listOfPluginManifests = new ArrayList(); + if (!isBreakout){ + //Process plugins from config + if (defaultPluginManifests != null && !defaultPluginManifests.isEmpty()) { + ArrayList pluginManifestsFromConfig = processPluginManifests(defaultPluginManifests); + listOfPluginManifests.addAll(pluginManifestsFromConfig); + } + //Process plugins from /create param + String pluginManifestsParam = params.get(ApiParams.PLUGIN_MANIFESTS); + if (!StringUtils.isEmpty(pluginManifestsParam)) { + ArrayList pluginManifestsFromParam = processPluginManifests(pluginManifestsParam); + listOfPluginManifests.addAll(pluginManifestsFromParam); + } + } + // Check if VirtualBackgrounds is disabled if (!StringUtils.isEmpty(params.get(ApiParams.VIRTUAL_BACKGROUNDS_DISABLED))) { boolean virtualBackgroundsDisabled = Boolean.valueOf(params.get(ApiParams.VIRTUAL_BACKGROUNDS_DISABLED)); @@ -746,6 +786,7 @@ public class ParamsProcessorUtil { } String avatarURL = useDefaultAvatar ? defaultAvatarURL : ""; + String botAvatarURL = defaultBotAvatarURL; String webcamBackgroundURL = useDefaultWebcamBackground ? defaultWebcamBackgroundURL : ""; if(defaultAllowDuplicateExtUserid == false) { @@ -766,6 +807,7 @@ public class ParamsProcessorUtil { .withTelVoice(telVoice).withWebVoice(webVoice) .withDialNumber(dialNumber) .withDefaultAvatarURL(avatarURL) + .withDefaultBotAvatarURL(botAvatarURL) .withDefaultWebcamBackgroundURL(webcamBackgroundURL) .withAutoStartRecording(autoStartRec) .withAllowStartStopRecording(allowStartStoptRec) @@ -790,6 +832,7 @@ public class ParamsProcessorUtil { .withLearningDashboardCleanupDelayInMinutes(learningDashboardCleanupMins) .withLearningDashboardAccessToken(learningDashboardAccessToken) .withGroups(groups) + .withPluginManifests(listOfPluginManifests) .withDisabledFeatures(listOfDisabledFeatures) .withNotifyRecordingIsOn(notifyRecordingIsOn) .withPresentationUploadExternalDescription(presentationUploadExternalDescription) @@ -1355,6 +1398,10 @@ public class ParamsProcessorUtil { this.defaultAvatarURL = url; } + public void setDefaultBotAvatarURL(String url) { + this.defaultBotAvatarURL = url; + } + public void setUseDefaultWebcamBackground(Boolean value) { this.useDefaultWebcamBackground = value; } @@ -1574,36 +1621,40 @@ public class ParamsProcessorUtil { this.defaultEndWhenNoModerator = val; } - public void setEndWhenNoModeratorDelayInMinutes(Integer value) { - this.defaultEndWhenNoModeratorDelayInMinutes = value; - } + public void setEndWhenNoModeratorDelayInMinutes(Integer value) { + this.defaultEndWhenNoModeratorDelayInMinutes = value; + } - public void setDisabledFeatures(String disabledFeatures) { - this.defaultDisabledFeatures = disabledFeatures; - } + public void setDisabledFeatures(String disabledFeatures) { + this.defaultDisabledFeatures = disabledFeatures; + } - public void setNotifyRecordingIsOn(Boolean notifyRecordingIsOn) { - this.defaultNotifyRecordingIsOn = notifyRecordingIsOn; - } + public void setPluginManifests(String pluginManifests) { + this.defaultPluginManifests = pluginManifests; + } - public void setPresentationUploadExternalDescription(String presentationUploadExternalDescription) { - this.defaultPresentationUploadExternalDescription = presentationUploadExternalDescription; - } + public void setNotifyRecordingIsOn(Boolean notifyRecordingIsOn) { + this.defaultNotifyRecordingIsOn = notifyRecordingIsOn; + } - public void setPresentationUploadExternalUrl(String presentationUploadExternalUrl) { - this.defaultPresentationUploadExternalUrl = presentationUploadExternalUrl; - } + public void setPresentationUploadExternalDescription(String presentationUploadExternalDescription) { + this.defaultPresentationUploadExternalDescription = presentationUploadExternalDescription; + } - public void setBbbVersion(String version) { + public void setPresentationUploadExternalUrl(String presentationUploadExternalUrl) { + this.defaultPresentationUploadExternalUrl = presentationUploadExternalUrl; + } + + public void setBbbVersion(String version) { this.bbbVersion = this.allowRevealOfBBBVersion ? version : ""; - } + } - public void setAllowRevealOfBBBVersion(Boolean allowVersion) { - this.allowRevealOfBBBVersion = allowVersion; - } + public void setAllowRevealOfBBBVersion(Boolean allowVersion) { + this.allowRevealOfBBBVersion = allowVersion; + } - public void setAllowOverrideClientSettingsOnCreateCall(Boolean allowOverrideClientSettingsOnCreateCall) { - this.allowOverrideClientSettingsOnCreateCall = allowOverrideClientSettingsOnCreateCall; - } + public void setAllowOverrideClientSettingsOnCreateCall(Boolean allowOverrideClientSettingsOnCreateCall) { + this.allowOverrideClientSettingsOnCreateCall = allowOverrideClientSettingsOnCreateCall; + } } diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/Meeting.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/Meeting.java index 8564361a29..db3a640f50 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/Meeting.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/Meeting.java @@ -77,7 +77,10 @@ public class Meeting { private Integer maxPinnedCameras = 0; private String dialNumber; private String defaultAvatarURL; + private String defaultBotAvatarURL; private String defaultWebcamBackgroundURL; + private Map plugins; + private ArrayList pluginManifests; private String guestPolicy = GuestPolicy.ASK_MODERATOR; private String guestLobbyMessage = ""; private Map usersWithGuestLobbyMessages; @@ -128,6 +131,7 @@ public class Meeting { extMeetingId = builder.externalId; intMeetingId = builder.internalId; disabledFeatures = builder.disabledFeatures; + pluginManifests = builder.pluginManifests; notifyRecordingIsOn = builder.notifyRecordingIsOn; presentationUploadExternalDescription = builder.presentationUploadExternalDescription; presentationUploadExternalUrl = builder.presentationUploadExternalUrl; @@ -150,7 +154,8 @@ public class Meeting { logoutUrl = builder.logoutUrl; logoutTimer = builder.logoutTimer; defaultAvatarURL = builder.defaultAvatarURL; - defaultWebcamBackgroundURL = builder.defaultWebcamBackgroundURL; + defaultBotAvatarURL = builder.defaultBotAvatarURL; + defaultWebcamBackgroundURL = builder.defaultWebcamBackgroundURL; record = builder.record; autoStartRecording = builder.autoStartRecording; allowStartStopRecording = builder.allowStartStopRecording; @@ -441,6 +446,17 @@ public class Meeting { public ArrayList getDisabledFeatures() { return disabledFeatures; } + public Map getPlugins() { + return plugins; + } + + public void setPlugins(Map p) { + plugins = p; + } + + public ArrayList getPluginManifests() { + return pluginManifests; + } public Boolean getNotifyRecordingIsOn() { return notifyRecordingIsOn; @@ -465,6 +481,10 @@ public class Meeting { return defaultAvatarURL; } + public String getDefaultBotAvatarURL() { + return defaultBotAvatarURL; + } + public String getDefaultWebcamBackgroundURL() { return defaultWebcamBackgroundURL; } @@ -929,6 +949,7 @@ public class Meeting { private int learningDashboardCleanupDelayInMinutes; private String learningDashboardAccessToken; private ArrayList disabledFeatures; + private ArrayList pluginManifests; private Boolean notifyRecordingIsOn; private String presentationUploadExternalDescription; private String presentationUploadExternalUrl; @@ -945,6 +966,7 @@ public class Meeting { private Map metadata; private String dialNumber; private String defaultAvatarURL; + private String defaultBotAvatarURL; private String defaultWebcamBackgroundURL; private long createdTime; private boolean isBreakout; @@ -1063,6 +1085,11 @@ public class Meeting { return this; } + public Builder withPluginManifests(ArrayList map) { + this.pluginManifests = map; + return this; + } + public Builder withNotifyRecordingIsOn(Boolean b) { this.notifyRecordingIsOn = b; return this; @@ -1093,6 +1120,11 @@ public class Meeting { return this; } + public Builder withDefaultBotAvatarURL(String w) { + defaultBotAvatarURL = w; + return this; + } + public Builder withDefaultWebcamBackgroundURL(String w) { defaultWebcamBackgroundURL = w; return this; diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/PluginManifest.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/PluginManifest.java new file mode 100644 index 0000000000..d7d43c8fba --- /dev/null +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/PluginManifest.java @@ -0,0 +1,33 @@ +package org.bigbluebutton.api.domain; + +public class PluginManifest { + + private String url = ""; + private String checksum = ""; + public PluginManifest( + String url, + String checksum) { + this.url = url; + this.checksum = checksum; + } + public PluginManifest( + String url) { + this.url = url; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getChecksum() { + return checksum; + } + + public void setChecksum(String checksum) { + this.checksum = checksum; + } +} \ No newline at end of file diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/User.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/User.java index 83fb978d7d..4892c5fbb2 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/User.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/User.java @@ -34,6 +34,7 @@ public class User { private String avatarURL; private String webcamBackgroundURL; private Map status; + private Boolean bot; private Boolean guest; private String guestStatus; private Boolean listeningOnly = false; @@ -49,6 +50,7 @@ public class User { Boolean locked, String avatarURL, String webcamBackgroundURL, + Boolean bot, Boolean guest, String guestStatus, String clientType) { @@ -59,6 +61,7 @@ public class User { this.locked = locked; this.avatarURL = avatarURL; this.webcamBackgroundURL = webcamBackgroundURL; + this.bot = bot; this.guest = guest; this.guestStatus = guestStatus; this.status = new ConcurrentHashMap<>(); @@ -81,6 +84,14 @@ public class User { this.externalUserId = externalUserId; } + public void setBot(Boolean bot) { + this.bot = bot; + } + + public Boolean isBot() { + return this.bot; + } + public void setGuest(Boolean guest) { this.guest = guest; } diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/UserSession.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/UserSession.java index 09aa775016..f4ad37e69b 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/UserSession.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/UserSession.java @@ -32,6 +32,7 @@ public class UserSession { public String role = null; public String conference = null; public String room = null; + public Boolean bot = false; public Boolean guest = false; public Boolean authed = false; public String voicebridge = null; diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/UserSessionBasicData.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/UserSessionBasicData.java index a845a3869b..459ad9869f 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/UserSessionBasicData.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/domain/UserSessionBasicData.java @@ -22,7 +22,10 @@ package org.bigbluebutton.api.domain; public class UserSessionBasicData { public String sessionToken = null; public String userId = null; + public String extUserId = null; public String meetingId = null; + public String extMeetingId = null; + public String userFullName = null; public String role = null; public Boolean isModerator() { diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/messaging/messages/CreateBreakoutRoom.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/messaging/messages/CreateBreakoutRoom.java index b2989e30c2..b147fb033a 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/api/messaging/messages/CreateBreakoutRoom.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/messaging/messages/CreateBreakoutRoom.java @@ -1,5 +1,7 @@ package org.bigbluebutton.api.messaging.messages; +import java.util.Map; + public class CreateBreakoutRoom implements IMessage { public final String meetingId; @@ -23,6 +25,7 @@ public class CreateBreakoutRoom implements IMessage { public final Boolean captureSlides; // Upload annotated breakout slides to main room after breakout room end public final String captureNotesFilename; public final String captureSlidesFilename; + public final Map pluginProp; public CreateBreakoutRoom(String meetingId, String parentMeetingId, @@ -43,7 +46,8 @@ public class CreateBreakoutRoom implements IMessage { Boolean captureNotes, Boolean captureSlides, String captureNotesFilename, - String captureSlidesFilename) { + String captureSlidesFilename, + Map pluginProp) { this.meetingId = meetingId; this.parentMeetingId = parentMeetingId; this.name = name; @@ -64,5 +68,6 @@ public class CreateBreakoutRoom implements IMessage { this.captureSlides = captureSlides; this.captureNotesFilename = captureNotesFilename; this.captureSlidesFilename = captureSlidesFilename; + this.pluginProp = pluginProp; } } diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/messaging/messages/RegisterUser.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/messaging/messages/RegisterUser.java index 24d0c4ecf4..f637a392e3 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/api/messaging/messages/RegisterUser.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/messaging/messages/RegisterUser.java @@ -14,6 +14,7 @@ public class RegisterUser implements IMessage { public final String sessionToken; public final String avatarURL; public final String webcamBackgroundURL; + public final Boolean bot; public final Boolean guest; public final Boolean authed; public final String guestStatus; @@ -23,7 +24,7 @@ public class RegisterUser implements IMessage { public final Map userMetadata; public RegisterUser(String meetingID, String internalUserId, String fullname, String role, String externUserID, - String authToken, String sessionToken, String avatarURL, String webcamBackgroundURL, Boolean guest, + String authToken, String sessionToken, String avatarURL, String webcamBackgroundURL, Boolean bot, Boolean guest, Boolean authed, String guestStatus, Boolean excludeFromDashboard, Boolean leftGuestLobby, String enforceLayout, Map userMetadata) { this.meetingID = meetingID; @@ -35,6 +36,7 @@ public class RegisterUser implements IMessage { this.sessionToken = sessionToken; this.avatarURL = avatarURL; this.webcamBackgroundURL = webcamBackgroundURL; + this.bot = bot; this.guest = guest; this.authed = authed; this.guestStatus = guestStatus; diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/messaging/messages/UserJoined.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/messaging/messages/UserJoined.java index eb74c31674..f55d665722 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/api/messaging/messages/UserJoined.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/messaging/messages/UserJoined.java @@ -9,6 +9,7 @@ public class UserJoined implements IMessage { public final Boolean locked; public final String avatarURL; public final String webcamBackgroundURL; + public final Boolean bot; public final Boolean guest; public final String guestStatus; public final String clientType; @@ -22,6 +23,7 @@ public class UserJoined implements IMessage { Boolean locked, String avatarURL, String webcamBackgroundURL, + Boolean bot, Boolean guest, String guestStatus, String clientType) { @@ -33,6 +35,7 @@ public class UserJoined implements IMessage { this.locked = locked; this.avatarURL = avatarURL; this.webcamBackgroundURL = webcamBackgroundURL; + this.bot = bot; this.guest = guest; this.guestStatus = guestStatus; this.clientType = clientType; diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/pub/IPublisherService.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/pub/IPublisherService.java index 27b782a7f3..d0fa561cb5 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/api/pub/IPublisherService.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/pub/IPublisherService.java @@ -22,8 +22,8 @@ public interface IPublisherService { void endMeeting(String meetingId); void send(String channel, String message); void registerUser(String meetingID, String internalUserId, String fullname, String role, String externUserID, - String authToken, String avatarURL, String webcamBackgroundURL, Boolean guest, Boolean excludeFromDashboard, - String enforceLayout, Boolean authed); + String authToken, String avatarURL, String webcamBackgroundURL, Boolean bot, Boolean guest, + Boolean excludeFromDashboard, String enforceLayout, Boolean authed); void sendKeepAlive(String system, Long bbbWebTimestamp, Long akkaAppsTimestamp); void sendStunTurnInfo(String meetingId, String internalUserId, Set stuns, Set turns); } diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api2/IBbbWebApiGWApp.java b/bbb-common-web/src/main/java/org/bigbluebutton/api2/IBbbWebApiGWApp.java index c71d79ad8d..3059fa9e28 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/api2/IBbbWebApiGWApp.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/api2/IBbbWebApiGWApp.java @@ -69,11 +69,12 @@ public interface IBbbWebApiGWApp { Boolean notifyRecordingIsOn, String presentationUploadExternalDescription, String presentationUploadExternalUrl, + Map plugins, String overrideClientSettings); void registerUser(String meetingID, String internalUserId, String fullname, String role, String externUserID, String authToken, String sessionToken, String avatarURL, String webcamBackgroundURL, - Boolean guest, Boolean authed, String guestStatus, Boolean excludeFromDashboard, + Boolean bot, Boolean guest, Boolean authed, String guestStatus, Boolean excludeFromDashboard, String enforceLayout, Map userMetadata); void registerUserSessionToken(String meetingID, String internalUserId, String sessionToken, String replaceSessionToken, String enforceLayout, Map userSessionMetadata); diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/PresentationUrlDownloadService.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/PresentationUrlDownloadService.java index ae32313836..a2dab7c3e0 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/PresentationUrlDownloadService.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/PresentationUrlDownloadService.java @@ -41,6 +41,7 @@ public class PresentationUrlDownloadService { private String defaultUploadedPresentation; private List insertDocumentSupportedProtocols; private List insertDocumentBlockedHosts; + private int presDownloadReadTimeoutInMs = 60000; private ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3); @@ -194,7 +195,7 @@ public class PresentationUrlDownloadService { HttpURLConnection conn; try { conn = (HttpURLConnection) presUrl.openConnection(); - conn.setReadTimeout(60000); + conn.setReadTimeout(presDownloadReadTimeoutInMs); conn.addRequestProperty("Accept-Language", "en-US,en;q=0.8"); conn.addRequestProperty("User-Agent", "Mozilla"); conn.setInstanceFollowRedirects(false); @@ -372,4 +373,7 @@ public class PresentationUrlDownloadService { this.insertDocumentBlockedHosts = new ArrayList<>(Arrays.asList(insertDocumentBlockedHosts.split(","))); } + public void setPresDownloadReadTimeoutInMs(int presDownloadReadTimeoutInMs) { + this.presDownloadReadTimeoutInMs = presDownloadReadTimeoutInMs; + } } diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/ImageResizerImp.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/ImageResizerImp.java index 96917228af..8ece081cbf 100644 --- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/ImageResizerImp.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/ImageResizerImp.java @@ -33,7 +33,7 @@ import com.zaxxer.nuprocess.NuProcessBuilder; public class ImageResizerImp implements ImageResizer { private static Logger log = LoggerFactory.getLogger(ImageResizerImp.class); - private static int waitForSec = 7; + private int wait = 7; public boolean resize(UploadedPresentation pres, String ratio) { Boolean conversionSuccess = true; @@ -47,7 +47,7 @@ public class ImageResizerImp implements ImageResizer { NuProcess process = imgResize.start(); try { - process.waitFor(waitForSec, TimeUnit.SECONDS); + process.waitFor(wait, TimeUnit.SECONDS); } catch (InterruptedException e) { log.error(e.getMessage()); conversionSuccess = false; @@ -56,4 +56,7 @@ public class ImageResizerImp implements ImageResizer { return conversionSuccess; } + public void setWait(int wait) { + this.wait = wait; + } } diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/OfficeDocumentValidator2.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/OfficeDocumentValidator2.java index 0f274ec675..361e9db0d9 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/OfficeDocumentValidator2.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/OfficeDocumentValidator2.java @@ -16,15 +16,18 @@ public class OfficeDocumentValidator2 { private String presCheckExec; + private int presCheckTimeout = 20; + private long execTimeout = 25000; + public boolean isValid(UploadedPresentation pres) { boolean valid = true; if (FilenameUtils.isExtension(pres.getUploadedFile().getName(), FileTypeConstants.PPTX)) { - String COMMAND = "timeout 20 " + presCheckExec + " " + pres.getUploadedFile().getAbsolutePath(); + String COMMAND = "timeout " + presCheckTimeout + " " + presCheckExec + " " + pres.getUploadedFile().getAbsolutePath(); log.info("Running pres check " + COMMAND); - boolean done = new ExternalProcessExecutor().exec(COMMAND, 25000); + boolean done = new ExternalProcessExecutor().exec(COMMAND, execTimeout); if (done) { return true; @@ -49,4 +52,11 @@ public class OfficeDocumentValidator2 { this.presCheckExec = path; } + public void setPresCheckTimeout(int presCheckTimeout) { + this.presCheckTimeout = presCheckTimeout; + } + + public void setExecTimeout(long execTimeout) { + this.execTimeout = execTimeout; + } } diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PageExtractorImp.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PageExtractorImp.java index 334d072e65..cc66b94d1c 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PageExtractorImp.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PageExtractorImp.java @@ -29,11 +29,16 @@ public class PageExtractorImp implements PageExtractor { private static Logger log = LoggerFactory.getLogger(PageExtractorImp.class); private static final String SPACE = " "; - private static final long extractTimeout = 10000; // 10sec + + private long extractTimeoutInMs = 10000; // 10sec public boolean extractPage(File presentationFile, File output, int page) { String COMMAND = "pdfseparate -f " + page + " -l " + page + SPACE + presentationFile.getAbsolutePath() + SPACE + output.getAbsolutePath(); - return new ExternalProcessExecutor().exec(COMMAND, extractTimeout); + return new ExternalProcessExecutor().exec(COMMAND, extractTimeoutInMs); + } + + public void setExtractTimeoutInMs(long extractTimeoutInMs) { + this.extractTimeoutInMs = extractTimeoutInMs; } } diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PdfPageCounter.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PdfPageCounter.java index af5e748ded..6bf0059926 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PdfPageCounter.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PdfPageCounter.java @@ -34,7 +34,7 @@ import com.zaxxer.nuprocess.NuProcessBuilder; public class PdfPageCounter implements PageCounter { private static Logger log = LoggerFactory.getLogger(PdfPageCounter.class); - private static int waitForSec = 5; + private int wait = 5; public int countNumberOfPages(File presentationFile) { int numPages = 0; // total numbers of this pdf @@ -47,7 +47,7 @@ public class PdfPageCounter implements PageCounter { NuProcess process = pdfInfo.start(); try { - process.waitFor(waitForSec, TimeUnit.SECONDS); + process.waitFor(wait, TimeUnit.SECONDS); } catch (InterruptedException e) { log.error("InterruptedException while counting PDF pages {}", presentationFile.getName(), e); } @@ -56,4 +56,7 @@ public class PdfPageCounter implements PageCounter { return numPages; } + public void setWait(int wait) { + this.wait = wait; + } } diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PdfPageDownscaler.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PdfPageDownscaler.java index fa5c95b12e..3f0cc43f97 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PdfPageDownscaler.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PdfPageDownscaler.java @@ -5,6 +5,8 @@ import java.io.File; public class PdfPageDownscaler { private static final String SPACE = " "; + private long execTimeout = 10000; + public boolean downscale(File source,File dest) { String COMMAND = "gs -sDEVICE=pdfwrite -dNOPAUSE -dQUIET -dBATCH -dFirstPage=1 -dLastPage=1 -sOutputFile=" + dest.getAbsolutePath() + SPACE @@ -13,6 +15,10 @@ public class PdfPageDownscaler { //System.out.println("DOWNSCALING " + COMMAND); - return new ExternalProcessExecutor().exec(COMMAND, 10000); + return new ExternalProcessExecutor().exec(COMMAND, execTimeout); + } + + public void setExecTimeout(long execTimeout) { + this.execTimeout = execTimeout; } } diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PngCreatorImp.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PngCreatorImp.java index cb2c54f76c..63961f45b7 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PngCreatorImp.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PngCreatorImp.java @@ -45,8 +45,9 @@ public class PngCreatorImp implements PngCreator { private String BLANK_PNG; private int slideWidth = 800; - private String convTimeout = "7s"; - private int WAIT_FOR_SEC = 7; + private int convTimeout = 7; + private int wait = 7; + private long execTimeout = 10000; private static final String TEMP_PNG_NAME = "temp-png"; @@ -93,14 +94,14 @@ public class PngCreatorImp implements PngCreator { dest = pngsDir.getAbsolutePath() + File.separator + "slide-1.pdf"; NuProcessBuilder convertImgToSvg = new NuProcessBuilder( - Arrays.asList("timeout", convTimeout, "convert", source, "-auto-orient", dest)); + Arrays.asList("timeout", convTimeout + "s", "convert", source, "-auto-orient", dest)); Png2SvgConversionHandler pHandler = new Png2SvgConversionHandler(); convertImgToSvg.setProcessListener(pHandler); NuProcess process = convertImgToSvg.start(); try { - process.waitFor(WAIT_FOR_SEC, TimeUnit.SECONDS); + process.waitFor(wait, TimeUnit.SECONDS); } catch (InterruptedException e) { log.error("InterruptedException while converting to PDF {}", dest, e); return false; @@ -116,7 +117,7 @@ public class PngCreatorImp implements PngCreator { //System.out.println("********* CREATING PNGs " + COMMAND); - boolean done = new ExternalProcessExecutor().exec(COMMAND, 10000); + boolean done = new ExternalProcessExecutor().exec(COMMAND, execTimeout); if (done) { return true; @@ -214,4 +215,15 @@ public class PngCreatorImp implements PngCreator { slideWidth = width; } + public void setConvTimeout(int convTimeout) { + this.convTimeout = convTimeout; + } + + public void setWait(int wait) { + this.wait = wait; + } + + public void setExecTimeout(long execTimeout) { + this.execTimeout = execTimeout; + } } diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/SvgImageCreatorImp.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/SvgImageCreatorImp.java index 97d176993c..a1b31f3cca 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/SvgImageCreatorImp.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/SvgImageCreatorImp.java @@ -368,6 +368,7 @@ public class SvgImageCreatorImp implements SvgImageCreator { } + public void setBlankSvg(String blankSvg) { BLANK_SVG = blankSvg; } diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/TextFileCreatorImp.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/TextFileCreatorImp.java index 7fabc20697..0af9645c73 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/TextFileCreatorImp.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/TextFileCreatorImp.java @@ -38,6 +38,8 @@ import com.google.gson.Gson; public class TextFileCreatorImp implements TextFileCreator { private static Logger log = LoggerFactory.getLogger(TextFileCreatorImp.class); + private long execTimeout = 60000; + @Override public boolean createTextFile(UploadedPresentation pres, int page) { boolean success = false; @@ -97,7 +99,7 @@ public class TextFileCreatorImp implements TextFileCreator { //System.out.println(COMMAND); - boolean done = new ExternalProcessExecutor().exec(COMMAND, 60000); + boolean done = new ExternalProcessExecutor().exec(COMMAND, execTimeout); if (!done) { success = false; @@ -130,4 +132,7 @@ public class TextFileCreatorImp implements TextFileCreator { } } + public void setExecTimeout(long execTimeout) { + this.execTimeout = execTimeout; + } } diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/ThumbnailCreatorImp.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/ThumbnailCreatorImp.java index 4408f73a5c..caaedf3089 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/ThumbnailCreatorImp.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/ThumbnailCreatorImp.java @@ -46,6 +46,8 @@ public class ThumbnailCreatorImp implements ThumbnailCreator { private String BLANK_THUMBNAIL; + private long execTimeout = 10000; + @Override public boolean createThumbnail(UploadedPresentation pres, int page, File pageFile) { boolean success = false; @@ -88,7 +90,7 @@ public class ThumbnailCreatorImp implements ThumbnailCreator { //System.out.println(COMMAND); - boolean done = new ExternalProcessExecutor().exec(COMMAND, 10000); + boolean done = new ExternalProcessExecutor().exec(COMMAND, execTimeout); if (done) { return true; @@ -194,4 +196,7 @@ public class ThumbnailCreatorImp implements ThumbnailCreator { BLANK_THUMBNAIL = blankThumbnail; } + public void setExecTimeout(long execTimeout) { + this.execTimeout = execTimeout; + } } diff --git a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/BbbWebApiGWApp.scala b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/BbbWebApiGWApp.scala index 827d49be14..b6b43fba04 100755 --- a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/BbbWebApiGWApp.scala +++ b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/BbbWebApiGWApp.scala @@ -18,6 +18,8 @@ import scala.concurrent.duration._ import org.bigbluebutton.common2.redis._ import org.bigbluebutton.common2.bus._ +import java.util + class BbbWebApiGWApp( val oldMessageReceivedGW: OldMessageReceivedGW, redisHost: String, @@ -165,6 +167,7 @@ class BbbWebApiGWApp( notifyRecordingIsOn: java.lang.Boolean, presentationUploadExternalDescription: String, presentationUploadExternalUrl: String, + plugins: util.Map[String, AnyRef], overrideClientSettings: String): Unit = { val disabledFeaturesAsVector: Vector[String] = disabledFeatures.asScala.toVector @@ -262,6 +265,7 @@ class BbbWebApiGWApp( val groupsAsVector: Vector[GroupProps] = groups.asScala.toVector.map(g => GroupProps(g.getGroupId(), g.getName(), g.getUsersExtId().asScala.toVector)) val defaultProps = DefaultProps( + plugins, meetingProp, breakoutProps, durationProps, @@ -286,8 +290,8 @@ class BbbWebApiGWApp( def registerUser(meetingId: String, intUserId: String, name: String, role: String, extUserId: String, authToken: String, sessionToken: String, - avatarURL: String, webcamBackgroundURL: String, guest: java.lang.Boolean, authed: java.lang.Boolean, - guestStatus: String, excludeFromDashboard: java.lang.Boolean, + avatarURL: String, webcamBackgroundURL: String, bot: java.lang.Boolean, guest: java.lang.Boolean, + authed: java.lang.Boolean, guestStatus: String, excludeFromDashboard: java.lang.Boolean, enforceLayout: String, userMetadata: java.util.Map[String, String]): Unit = { // meetingManagerActorRef ! new RegisterUser(meetingId = meetingId, intUserId = intUserId, name = name, @@ -296,9 +300,9 @@ class BbbWebApiGWApp( val regUser = new RegisterUser(meetingId = meetingId, intUserId = intUserId, name = name, role = role, extUserId = extUserId, authToken = authToken, sessionToken = sessionToken, - avatarURL = avatarURL, webcamBackgroundURL = webcamBackgroundURL, guest = guest.booleanValue(), authed = authed.booleanValue(), - guestStatus = guestStatus, excludeFromDashboard = excludeFromDashboard, enforceLayout = enforceLayout, - userMetadata = (userMetadata).asScala.toMap) + avatarURL = avatarURL, webcamBackgroundURL = webcamBackgroundURL, bot = bot.booleanValue(), guest = guest.booleanValue(), + authed = authed.booleanValue(), guestStatus = guestStatus, excludeFromDashboard = excludeFromDashboard, + enforceLayout = enforceLayout, userMetadata = (userMetadata).asScala.toMap) val event = MsgBuilder.buildRegisterUserRequestToAkkaApps(regUser) msgToAkkaAppsEventBus.publish(MsgToAkkaApps(toAkkaAppsChannel, event)) diff --git a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/MsgBuilder.scala b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/MsgBuilder.scala index f7461eb5c3..a82427c162 100755 --- a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/MsgBuilder.scala +++ b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/MsgBuilder.scala @@ -50,8 +50,9 @@ object MsgBuilder { val header = BbbCoreHeaderWithMeetingId(RegisterUserReqMsg.NAME, msg.meetingId) val body = RegisterUserReqMsgBody(meetingId = msg.meetingId, intUserId = msg.intUserId, name = msg.name, role = msg.role, extUserId = msg.extUserId, authToken = msg.authToken, sessionToken = msg.sessionToken, - avatarURL = msg.avatarURL, webcamBackgroundURL = msg.webcamBackgroundURL, guest = msg.guest, authed = msg.authed, guestStatus = msg.guestStatus, - excludeFromDashboard = msg.excludeFromDashboard, enforceLayout = msg.enforceLayout, userMetadata = msg.userMetadata) + avatarURL = msg.avatarURL, webcamBackgroundURL = msg.webcamBackgroundURL, bot = msg.bot, guest = msg.guest, authed = msg.authed, + guestStatus = msg.guestStatus, excludeFromDashboard = msg.excludeFromDashboard, enforceLayout = msg.enforceLayout, + userMetadata = msg.userMetadata) val req = RegisterUserReqMsg(header, body) BbbCommonEnvCoreMsg(envelope, req) } diff --git a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/MeetingsManagerActor.scala b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/MeetingsManagerActor.scala index a883b2f2df..2d27282d57 100755 --- a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/MeetingsManagerActor.scala +++ b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/MeetingsManagerActor.scala @@ -17,7 +17,7 @@ case class CreateBreakoutRoomMsg(meetingId: String, parentMeetingId: String, case class AddUserSession(token: String, session: UserSession) case class RegisterUser(meetingId: String, intUserId: String, name: String, role: String, extUserId: String, authToken: String, sessionToken: String, avatarURL: String, webcamBackgroundURL: String, - guest: Boolean, authed: Boolean, guestStatus: String, excludeFromDashboard: Boolean, + bot: Boolean, guest: Boolean, authed: Boolean, guestStatus: String, excludeFromDashboard: Boolean, enforceLayout: String, userMetadata: Map[String, String]) case class CreateMeetingMsg(defaultProps: DefaultProps) diff --git a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/OldMeetingMsgHdlrActor.scala b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/OldMeetingMsgHdlrActor.scala index 66f1501b41..4c2d283629 100755 --- a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/OldMeetingMsgHdlrActor.scala +++ b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/OldMeetingMsgHdlrActor.scala @@ -127,6 +127,7 @@ class OldMeetingMsgHdlrActor(val olgMsgGW: OldMessageReceivedGW) msg.body.room.captureSlides, msg.body.room.captureNotesFilename, msg.body.room.captureSlidesFilename, + msg.body.room.pluginProp, )) } @@ -143,7 +144,7 @@ class OldMeetingMsgHdlrActor(val olgMsgGW: OldMessageReceivedGW) def handleUserJoinedMeetingEvtMsg(msg: UserJoinedMeetingEvtMsg): Unit = { olgMsgGW.handle(new UserJoined(msg.header.meetingId, msg.body.intId, msg.body.extId, msg.body.name, msg.body.role, msg.body.locked, msg.body.avatar, msg.body.webcamBackground, - msg.body.guest, msg.body.guestStatus, msg.body.clientType)) + msg.body.bot, msg.body.guest, msg.body.guestStatus, msg.body.clientType)) } def handlePresenterUnassignedEvtMsg(msg: PresenterUnassignedEvtMsg): Unit = { diff --git a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/ToAkkaAppsSendersTrait.scala b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/ToAkkaAppsSendersTrait.scala index 5b32026ac4..03c5fa24af 100755 --- a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/ToAkkaAppsSendersTrait.scala +++ b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/ToAkkaAppsSendersTrait.scala @@ -28,8 +28,8 @@ trait ToAkkaAppsSendersTrait extends SystemConfiguration { val header = BbbCoreHeaderWithMeetingId(RegisterUserReqMsg.NAME, msg.meetingId) val body = RegisterUserReqMsgBody(meetingId = msg.meetingId, intUserId = msg.intUserId, name = msg.name, role = msg.role, extUserId = msg.extUserId, authToken = msg.authToken, - sessionToken = msg.sessionToken, avatarURL = msg.avatarURL, webcamBackgroundURL = msg.webcamBackgroundURL, guest = msg.guest, authed = msg.authed, - guestStatus = msg.guestStatus, excludeFromDashboard = msg.excludeFromDashboard, + sessionToken = msg.sessionToken, avatarURL = msg.avatarURL, webcamBackgroundURL = msg.webcamBackgroundURL, bot = msg.bot, + guest = msg.guest, authed = msg.authed, guestStatus = msg.guestStatus, excludeFromDashboard = msg.excludeFromDashboard, enforceLayout = msg.enforceLayout, userMetadata = msg.userMetadata) val req = RegisterUserReqMsg(header, body) val message = BbbCommonEnvCoreMsg(envelope, req) diff --git a/bbb-graphql-actions/package-lock.json b/bbb-graphql-actions/package-lock.json index 3d4ac97737..29f2e8e28f 100644 --- a/bbb-graphql-actions/package-lock.json +++ b/bbb-graphql-actions/package-lock.json @@ -13,7 +13,7 @@ "@types/node": "^20.7.0", "@types/redis": "^4.0.11", "axios": "^1.7.4", - "express": "^5.0.0", + "express": "^5.0.1", "redis": "^4.6.10" }, "devDependencies": { @@ -27,7 +27,6 @@ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -36,28 +35,25 @@ } }, "node_modules/@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==", + "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==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -67,16 +63,14 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", - "license": "MIT", "peerDependencies": { "@redis/client": "^1.0.0" } }, "node_modules/@redis/client": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.0.tgz", - "integrity": "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==", - "license": "MIT", + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.11.tgz", + "integrity": "sha512-cV7yHcOAtNQ5x/yQl7Yw1xf53kO0FNDTdDU6bFIMbW6ljB7U7ns0YRM+QIkpoqTAt6zK5k9Fq0QWlUbLcq9AvA==", "dependencies": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", @@ -87,93 +81,82 @@ } }, "node_modules/@redis/graph": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", - "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", - "license": "MIT", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", + "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", "peerDependencies": { "@redis/client": "^1.0.0" } }, "node_modules/@redis/json": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz", - "integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==", - "license": "MIT", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.6.tgz", + "integrity": "sha512-rcZO3bfQbm2zPRpqo82XbW8zg4G/w4W3tI7X8Mqleq9goQjAGLL7q/1n1ZX4dXEAmORVZ4s1+uKLaUOg7LrUhw==", "peerDependencies": { "@redis/client": "^1.0.0" } }, "node_modules/@redis/search": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz", - "integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==", - "license": "MIT", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.5.tgz", + "integrity": "sha512-hPP8w7GfGsbtYEJdn4n7nXa6xt6hVZnnDktKW4ArMaFQ/m/aR7eFvsLQmG/mn1Upq99btPJk+F27IQ2dYpCoUg==", "peerDependencies": { "@redis/client": "^1.0.0" } }, "node_modules/@redis/time-series": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz", - "integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==", - "license": "MIT", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.5.tgz", + "integrity": "sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg==", "peerDependencies": { "@redis/client": "^1.0.0" } }, "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, - "license": "MIT" + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "license": "MIT", + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.3.tgz", + "integrity": "sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==", "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "license": "MIT", + "version": "4.17.18", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.18.tgz", + "integrity": "sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -182,10 +165,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", - "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", - "license": "MIT", + "version": "4.17.37", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz", + "integrity": "sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -194,69 +176,64 @@ } }, "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "license": "MIT" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.2.tgz", + "integrity": "sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==" }, "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "license": "MIT" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.3.tgz", + "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==" }, "node_modules/@types/node": { - "version": "20.16.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", - "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" }, "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", - "license": "MIT" + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" }, "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.5.tgz", + "integrity": "sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==" }, "node_modules/@types/redis": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/@types/redis/-/redis-4.0.11.tgz", "integrity": "sha512-bI+gth8La8Wg/QCR1+V1fhrL9+LZUSWfcqpOj2Kc80ZQ4ffbdL173vQd5wovmoV9i071FU9oP2g6etLuEwb6Rg==", "deprecated": "This is a stub types definition. redis provides its own type definitions, so you do not need this installed.", - "license": "MIT", "dependencies": { "redis": "*" } }, "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "license": "MIT", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.2.tgz", + "integrity": "sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==", "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "license": "MIT", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.3.tgz", + "integrity": "sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==", "dependencies": { "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" + "@types/mime": "*", + "@types/node": "*" } }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -289,11 +266,10 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -302,14 +278,10 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, "engines": { "node": ">=0.4.0" } @@ -319,7 +291,6 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -332,8 +303,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/array-flatten": { "version": "3.0.0", @@ -343,14 +313,12 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", - "license": "MIT", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -361,20 +329,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/body-parser": { @@ -436,7 +399,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -447,7 +409,6 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -459,7 +420,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -468,7 +428,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -484,11 +443,16 @@ } }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -501,9 +465,6 @@ "engines": { "node": ">= 8.10.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -512,7 +473,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "license": "Apache-2.0", "engines": { "node": ">=0.10.0" } @@ -521,7 +481,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -533,8 +492,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/content-disposition": { "version": "1.0.0", @@ -551,16 +509,14 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "license": "MIT", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "engines": { "node": ">= 0.6" } @@ -577,8 +533,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/debug": { "version": "4.3.6", @@ -600,7 +555,6 @@ "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==", - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -617,7 +571,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -626,7 +579,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -635,7 +587,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -646,7 +597,6 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -654,14 +604,12 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -670,7 +618,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -682,7 +629,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -690,28 +636,26 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/express": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.0.0.tgz", - "integrity": "sha512-V4UkHQc+B7ldh1YC84HCXHwf60M4BOMvp9rkvTUWCK5apqDC1Esnbid4wm6nFyVuDy8XMfETsJw5lsIGBWyo0A==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.0.1.tgz", + "integrity": "sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ==", "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.0.1", "content-disposition": "^1.0.0", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "^1.2.1", "debug": "4.3.6", "depd": "2.0.0", @@ -776,7 +720,6 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -815,16 +758,15 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/follow-redirects": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.8.tgz", - "integrity": "sha512-xgrmBhBToVKay1q2Tao5LI26B83UhrB/vM1avwVSDzt8rx3rO6AizBAaF46EgksTVr+rFTQaqZZ9MVBfUe4nig==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -838,7 +780,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -852,7 +793,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -871,7 +811,6 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -884,7 +823,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -893,7 +831,6 @@ "version": "3.9.0", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", - "license": "MIT", "engines": { "node": ">= 4" } @@ -902,7 +839,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -922,7 +858,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -934,7 +869,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -947,7 +881,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -956,7 +889,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -968,7 +900,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -980,7 +911,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -992,7 +922,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -1004,7 +933,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -1031,20 +959,17 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", "engines": { "node": ">= 0.10" } @@ -1054,7 +979,6 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -1067,7 +991,6 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1077,7 +1000,6 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -1090,7 +1012,6 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -1104,8 +1025,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/media-typer": { "version": "1.1.0", @@ -1130,7 +1050,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1139,7 +1058,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1148,7 +1066,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -1161,7 +1078,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1183,14 +1099,13 @@ } }, "node_modules/nodemon": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", - "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", "dev": true, - "license": "MIT", "dependencies": { "chokidar": "^3.5.2", - "debug": "^4", + "debug": "^3.2.7", "ignore-by-default": "^1.0.1", "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", @@ -1212,36 +1127,40 @@ } }, "node_modules/nodemon/node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "ms": "^2.1.1" } }, "node_modules/nodemon/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", "dev": true, - "license": "MIT" + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1261,7 +1180,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -1281,15 +1199,14 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/path-to-regexp": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.1.0.tgz", - "integrity": "sha512-Bqn3vc8CMHty6zuD+tG23s6v2kwxslHEhTj4eYaVKGIEB+YX/2wd0/rgXLFD9G9id9KCtbVy/3ZgmvZjpa0UdQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", "engines": { "node": ">=16" } @@ -1299,7 +1216,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -1311,7 +1227,6 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -1323,15 +1238,13 @@ "node_modules/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==", - "license": "MIT" + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/qs": { "version": "6.13.0", @@ -1351,7 +1264,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1386,7 +1298,6 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -1395,20 +1306,16 @@ } }, "node_modules/redis": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.0.tgz", - "integrity": "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==", - "license": "MIT", - "workspaces": [ - "./packages/*" - ], + "version": "4.6.10", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.10.tgz", + "integrity": "sha512-mmbyhuKgDiJ5TWUhiKhBssz+mjsuSI/lSZNPI9QvZOYzWvYGejtb+W3RlDDf8LD6Bdl5/mZeG8O1feUGhXTxEg==", "dependencies": { "@redis/bloom": "1.2.0", - "@redis/client": "1.6.0", - "@redis/graph": "1.1.1", - "@redis/json": "1.0.7", - "@redis/search": "1.2.0", - "@redis/time-series": "1.1.0" + "@redis/client": "1.5.11", + "@redis/graph": "1.1.0", + "@redis/json": "1.0.6", + "@redis/search": "1.1.5", + "@redis/time-series": "1.0.5" } }, "node_modules/router": { @@ -1445,21 +1352,18 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -1508,8 +1412,7 @@ "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serve-static": { "version": "2.1.0", @@ -1537,7 +1440,6 @@ "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==", - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -1553,14 +1455,12 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/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==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -1579,7 +1479,6 @@ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -1591,7 +1490,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -1601,7 +1499,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -1614,7 +1511,6 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -1626,27 +1522,27 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", "dev": true, - "license": "ISC", + "dependencies": { + "nopt": "~1.0.10" + }, "bin": { "nodetouch": "bin/nodetouch.js" } }, "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, - "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -1718,11 +1614,10 @@ } }, "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -1735,20 +1630,12 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "license": "MIT" + "dev": true }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -1757,7 +1644,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -1766,14 +1652,12 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -1786,15 +1670,13 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } diff --git a/bbb-graphql-actions/package.json b/bbb-graphql-actions/package.json index 3a90bcb06e..eb55a8c852 100644 --- a/bbb-graphql-actions/package.json +++ b/bbb-graphql-actions/package.json @@ -29,7 +29,7 @@ "@types/node": "^20.7.0", "@types/redis": "^4.0.11", "axios": "^1.7.4", - "express": "^5.0.0", + "express": "^5.0.1", "redis": "^4.6.10" }, "devDependencies": { diff --git a/bbb-graphql-actions/src/actions/chatDeleteMessageReaction.ts b/bbb-graphql-actions/src/actions/chatDeleteMessageReaction.ts index 124aa14b36..0b97463226 100644 --- a/bbb-graphql-actions/src/actions/chatDeleteMessageReaction.ts +++ b/bbb-graphql-actions/src/actions/chatDeleteMessageReaction.ts @@ -7,6 +7,7 @@ export default function buildRedisMessage(sessionVariables: Record, input: Record): RedisMessage { - throwErrorIfNotModerator(sessionVariables); throwErrorIfInvalidInput(input, - [ - {name: 'recording', type: 'boolean', required: true}, - ] + [ + { name: 'recording', type: 'boolean', required: true }, + ] ) const eventName = 'SetRecordingStatusCmdMsg'; diff --git a/bbb-graphql-client-test/package-lock.json b/bbb-graphql-client-test/package-lock.json index 7fd8987c9a..1cca522909 100644 --- a/bbb-graphql-client-test/package-lock.json +++ b/bbb-graphql-client-test/package-lock.json @@ -26,14 +26,12 @@ "node_modules/@adobe/css-tools": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", - "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==", - "license": "MIT" + "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==" }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -45,7 +43,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -55,10 +52,9 @@ } }, "node_modules/@apollo/client": { - "version": "3.11.8", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.11.8.tgz", - "integrity": "sha512-CgG1wbtMjsV2pRGe/eYITmV5B8lXUCYljB2gB/6jWTFQcrvirUVvKg7qtFdjYkQSFbIffU1IDyxgeaN81eTjbA==", - "license": "MIT", + "version": "3.10.8", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.10.8.tgz", + "integrity": "sha512-UaaFEitRrPRWV836wY2L7bd3HRCfbMie1jlYMcmazFAK23MVhz/Uq7VG1nwbotPb5xzFsw5RF4Wnp2G3dWPM3g==", "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", @@ -78,8 +74,8 @@ "peerDependencies": { "graphql": "^15.0.0 || ^16.0.0", "graphql-ws": "^5.5.5", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" }, "peerDependenciesMeta": { @@ -101,7 +97,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "license": "MIT", "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" @@ -111,30 +106,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", - "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -153,16 +146,14 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/eslint-parser": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz", - "integrity": "sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.7.tgz", + "integrity": "sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA==", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -180,7 +171,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "license": "Apache-2.0", "engines": { "node": ">=10" } @@ -189,18 +179,16 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", "dependencies": { - "@babel/types": "^7.25.6", + "@babel/types": "^7.24.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -213,7 +201,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" }, @@ -225,7 +212,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", - "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -235,14 +221,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -254,23 +239,23 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", - "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", + "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.25.0", + "@babel/helper-replace-supers": "^7.24.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/traverse": "^7.25.4", + "@babel/helper-split-export-declaration": "^7.24.7", "semver": "^6.3.1" }, "engines": { @@ -284,16 +269,14 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", - "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", + "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "regexpu-core": "^5.3.1", @@ -310,7 +293,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -319,7 +301,6 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", - "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -331,14 +312,47 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", - "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", - "license": "MIT", + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", "dependencies": { - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8" + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", + "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -348,7 +362,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -358,15 +371,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -379,7 +392,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", - "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" }, @@ -388,23 +400,21 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", - "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", + "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-wrap-function": "^7.25.0", - "@babel/traverse": "^7.25.0" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -414,14 +424,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", - "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", + "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -434,7 +443,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -447,7 +455,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", - "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -456,11 +463,21 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", "engines": { "node": ">=6.9.0" } @@ -469,42 +486,39 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", - "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", + "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", - "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", + "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -514,7 +528,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", @@ -529,7 +542,6 @@ "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==", - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -541,7 +553,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -555,7 +566,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -563,14 +573,12 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -579,7 +587,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", "engines": { "node": ">=4" } @@ -588,7 +595,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -597,13 +603,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.6" - }, + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -612,28 +614,12 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", - "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", + "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", - "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -643,12 +629,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", - "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", + "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -661,7 +646,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", @@ -675,13 +659,12 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", - "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", + "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.0" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -695,7 +678,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", - "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -711,7 +693,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.7.tgz", "integrity": "sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ==", - "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", @@ -729,7 +710,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -746,7 +726,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -763,7 +742,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", @@ -781,7 +759,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", - "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -797,7 +774,6 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "license": "MIT", "engines": { "node": ">=6.9.0" }, @@ -809,7 +785,6 @@ "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -821,7 +796,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -833,7 +807,6 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -845,7 +818,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -860,7 +832,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz", "integrity": "sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -875,7 +846,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -887,7 +857,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -899,7 +868,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz", "integrity": "sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -911,12 +879,11 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz", - "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -926,12 +893,11 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", - "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -944,7 +910,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -956,7 +921,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -968,7 +932,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -983,7 +946,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -995,7 +957,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1007,7 +968,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1019,7 +979,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1031,7 +990,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1043,7 +1001,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1055,7 +1012,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1070,7 +1026,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1082,12 +1037,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", - "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1100,7 +1054,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1116,7 +1069,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -1128,15 +1080,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz", - "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", + "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-remap-async-to-generator": "^7.25.0", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/traverse": "^7.25.4" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" @@ -1149,7 +1100,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", - "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", @@ -1166,7 +1116,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -1178,12 +1127,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", - "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", + "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1193,13 +1141,12 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", - "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.4", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1212,7 +1159,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", - "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", @@ -1226,16 +1172,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", - "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", + "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/traverse": "^7.25.4", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", "globals": "^11.1.0" }, "engines": { @@ -1249,7 +1196,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/template": "^7.24.7" @@ -1262,12 +1208,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", - "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", + "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1280,7 +1225,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", - "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -1296,7 +1240,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -1307,27 +1250,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", - "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -1343,7 +1269,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", - "license": "MIT", "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -1359,7 +1284,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -1372,12 +1296,11 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz", - "integrity": "sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.7.tgz", + "integrity": "sha512-cjRKJ7FobOH2eakx7Ja+KpJRj8+y+/SiB3ooYm/n2UJfxu0oEaOoxOinitkJcPqv9KxS0kxTGPUaR7L2XcXDXA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-flow": "^7.24.7" }, "engines": { @@ -1391,7 +1314,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" @@ -1404,14 +1326,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", - "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", + "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.1" + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1424,7 +1345,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -1437,12 +1357,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", - "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", + "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1455,7 +1374,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -1471,7 +1389,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -1486,7 +1403,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", - "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -1499,13 +1415,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", - "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", + "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-simple-access": "^7.24.7" }, "engines": { @@ -1516,15 +1431,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", - "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", + "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", "dependencies": { - "@babel/helper-module-transforms": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1537,7 +1451,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", - "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -1553,7 +1466,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", - "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -1569,7 +1481,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -1584,7 +1495,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -1600,7 +1510,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -1616,7 +1525,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", - "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", @@ -1634,7 +1542,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-replace-supers": "^7.24.7" @@ -1650,7 +1557,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -1663,12 +1569,11 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", - "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", + "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1683,7 +1588,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -1695,13 +1599,12 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", - "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.4", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1714,7 +1617,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", - "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-create-class-features-plugin": "^7.24.7", @@ -1732,7 +1634,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -1744,12 +1645,11 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.1.tgz", - "integrity": "sha512-SLV/giH/V4SmloZ6Dt40HjTGTAIkxn33TVIHxNGNvo8ezMhrxBkzisj4op1KZYPIOHFLqhv60OHvX+YRu4xbmQ==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.7.tgz", + "integrity": "sha512-7LidzZfUXyfZ8/buRW6qIIHBY8wAZ1OrY9c/wTr8YhZ6vMPo+Uc/CVFLYY1spZrEQlD4w5u8wjqk5NQ3OVqQKA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1762,7 +1662,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -1774,16 +1673,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", - "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz", + "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/types": "^7.25.2" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1796,7 +1694,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", - "license": "MIT", "dependencies": { "@babel/plugin-transform-react-jsx": "^7.24.7" }, @@ -1811,7 +1708,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz", "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==", - "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -1827,7 +1723,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "regenerator-transform": "^0.15.2" @@ -1843,7 +1738,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -1855,15 +1749,14 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.4.tgz", - "integrity": "sha512-8hsyG+KUYGY0coX6KUCDancA0Vw225KJ2HJO0yCNr1vq5r+lJTleDaJf0K7iOhjw4SWhu03TMBzYTJ9krmzULQ==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz", + "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==", "dependencies": { "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.7", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-corejs3": "^0.10.1", "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, @@ -1878,7 +1771,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -1887,7 +1779,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -1902,7 +1793,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" @@ -1918,7 +1808,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -1933,7 +1822,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -1945,12 +1833,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", - "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", + "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1960,15 +1847,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz", - "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz", + "integrity": "sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-typescript": "^7.24.7" }, "engines": { @@ -1982,7 +1867,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -1997,7 +1881,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", - "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -2013,7 +1896,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", - "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -2026,13 +1908,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", - "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2042,20 +1923,18 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz", - "integrity": "sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", + "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", "dependencies": { - "@babel/compat-data": "^7.25.4", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", + "@babel/compat-data": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -2076,30 +1955,29 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-generator-functions": "^7.24.7", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.24.7", "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-classes": "^7.24.7", "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-destructuring": "^7.24.7", "@babel/plugin-transform-dotall-regex": "^7.24.7", "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", "@babel/plugin-transform-dynamic-import": "^7.24.7", "@babel/plugin-transform-exponentiation-operator": "^7.24.7", "@babel/plugin-transform-export-namespace-from": "^7.24.7", "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-function-name": "^7.24.7", "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-literals": "^7.24.7", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-member-expression-literals": "^7.24.7", "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-modules-systemjs": "^7.25.0", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-modules-systemjs": "^7.24.7", "@babel/plugin-transform-modules-umd": "^7.24.7", "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", "@babel/plugin-transform-new-target": "^7.24.7", @@ -2108,9 +1986,9 @@ "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-object-super": "^7.24.7", "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-optional-chaining": "^7.24.7", "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.25.4", + "@babel/plugin-transform-private-methods": "^7.24.7", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-property-literals": "^7.24.7", "@babel/plugin-transform-regenerator": "^7.24.7", @@ -2119,16 +1997,16 @@ "@babel/plugin-transform-spread": "^7.24.7", "@babel/plugin-transform-sticky-regex": "^7.24.7", "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.8", + "@babel/plugin-transform-typeof-symbol": "^7.24.7", "@babel/plugin-transform-unicode-escapes": "^7.24.7", "@babel/plugin-transform-unicode-property-regex": "^7.24.7", "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.4", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-corejs3": "^0.10.4", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.37.1", + "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, "engines": { @@ -2142,7 +2020,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -2151,7 +2028,6 @@ "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -2165,7 +2041,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz", "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-validator-option": "^7.24.7", @@ -2185,7 +2060,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-validator-option": "^7.24.7", @@ -2203,14 +2077,12 @@ "node_modules/@babel/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "license": "MIT" + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2219,30 +2091,31 @@ } }, "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", - "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.6", - "@babel/parser": "^7.25.6", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2251,12 +2124,11 @@ } }, "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-string-parser": "^7.24.7", "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, @@ -2267,20 +2139,17 @@ "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "license": "MIT" + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, "node_modules/@csstools/normalize.css": { "version": "12.1.1", "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", - "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==", - "license": "CC0-1.0" + "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==" }, "node_modules/@csstools/postcss-cascade-layers": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", - "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.2", "postcss-selector-parser": "^6.0.10" @@ -2300,7 +2169,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", - "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -2320,7 +2188,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2339,7 +2206,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2358,7 +2224,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", - "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -2378,7 +2243,6 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", - "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.0", "postcss-selector-parser": "^6.0.10" @@ -2398,7 +2262,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2417,7 +2280,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2436,7 +2298,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", - "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -2456,7 +2317,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2471,7 +2331,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2490,7 +2349,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2509,7 +2367,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2528,7 +2385,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" }, @@ -2544,7 +2400,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", - "license": "CC0-1.0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -2560,7 +2415,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -2575,7 +2429,6 @@ "version": "4.11.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -2584,7 +2437,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -2606,14 +2458,12 @@ "node_modules/@eslint/eslintrc/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -2628,7 +2478,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -2640,7 +2489,6 @@ "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==", - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -2652,7 +2500,6 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -2661,7 +2508,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", - "license": "MIT", "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } @@ -2671,7 +2517,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "deprecated": "Use @eslint/config-array instead", - "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -2685,7 +2530,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -2698,14 +2542,12 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "license": "BSD-3-Clause" + "deprecated": "Use @eslint/object-schema instead" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -2722,7 +2564,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -2734,7 +2575,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -2746,7 +2586,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -2763,7 +2602,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -2778,7 +2616,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -2795,7 +2632,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -2811,7 +2647,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -2820,7 +2655,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "license": "MIT", "engines": { "node": ">=8" } @@ -2829,7 +2663,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -2846,7 +2679,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -2862,7 +2694,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -2871,7 +2702,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", @@ -2891,7 +2721,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -2908,7 +2737,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", - "license": "MIT", "dependencies": { "@jest/console": "^27.5.1", "@jest/reporters": "^27.5.1", @@ -2955,7 +2783,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -2971,7 +2798,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -2980,7 +2806,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", @@ -3000,7 +2825,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -3017,7 +2841,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "license": "MIT", "dependencies": { "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", @@ -3032,7 +2855,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -3048,7 +2870,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -3057,7 +2878,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -3069,7 +2889,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", @@ -3086,7 +2905,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -3102,7 +2920,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -3111,7 +2928,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", @@ -3131,7 +2947,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -3148,7 +2963,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", - "license": "MIT", "dependencies": { "@jest/environment": "^27.5.1", "@jest/types": "^27.5.1", @@ -3162,7 +2976,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -3178,7 +2991,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -3187,7 +2999,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "license": "MIT", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -3196,7 +3007,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", @@ -3211,7 +3021,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", @@ -3226,7 +3035,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "license": "MIT", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -3235,7 +3043,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^27.5.1", @@ -3250,7 +3057,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", @@ -3270,7 +3076,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", - "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^27.5.1", @@ -3314,7 +3119,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -3330,7 +3134,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -3339,7 +3142,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -3356,7 +3158,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -3365,7 +3166,6 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -3377,7 +3177,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", - "license": "MIT", "dependencies": { "callsites": "^3.0.0", "graceful-fs": "^4.2.9", @@ -3391,7 +3190,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -3400,7 +3198,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", - "license": "MIT", "dependencies": { "@jest/console": "^27.5.1", "@jest/types": "^27.5.1", @@ -3415,7 +3212,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -3431,7 +3227,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -3440,7 +3235,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", - "license": "MIT", "dependencies": { "@jest/test-result": "^27.5.1", "graceful-fs": "^4.2.9", @@ -3455,7 +3249,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", - "license": "MIT", "dependencies": { "@babel/core": "^7.1.0", "@jest/types": "^27.5.1", @@ -3481,7 +3274,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -3497,7 +3289,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -3505,14 +3296,12 @@ "node_modules/@jest/transform/node_modules/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==", - "license": "MIT" + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/@jest/transform/node_modules/jest-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -3529,7 +3318,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -3538,7 +3326,6 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -3555,7 +3342,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -3569,7 +3355,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -3578,7 +3363,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -3587,23 +3371,20 @@ "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==", - "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@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==", - "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -3612,14 +3393,12 @@ "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "license": "MIT" + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "license": "MIT", "dependencies": { "eslint-scope": "5.1.1" } @@ -3628,7 +3407,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -3641,7 +3419,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -3650,7 +3427,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3663,7 +3439,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", "engines": { "node": ">= 8" } @@ -3672,7 +3447,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3685,7 +3459,6 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -3695,7 +3468,6 @@ "version": "0.5.15", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz", "integrity": "sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==", - "license": "MIT", "dependencies": { "ansi-html": "^0.0.9", "core-js-pure": "^3.23.3", @@ -3743,7 +3515,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.10.4", "@rollup/pluginutils": "^3.1.0" @@ -3766,7 +3537,6 @@ "version": "11.2.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.1.0", "@types/resolve": "1.17.1", @@ -3786,7 +3556,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.1.0", "magic-string": "^0.25.7" @@ -3799,7 +3568,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "license": "MIT", "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", @@ -3815,32 +3583,22 @@ "node_modules/@rollup/pluginutils/node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "license": "MIT" - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "license": "MIT" + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" }, "node_modules/@rushstack/eslint-patch": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", - "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", - "license": "MIT" + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz", + "integrity": "sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "license": "MIT" + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" }, "node_modules/@sinonjs/commons": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } @@ -3849,7 +3607,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^1.7.0" } @@ -3858,7 +3615,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", - "license": "Apache-2.0", "dependencies": { "ejs": "^3.1.6", "json5": "^2.2.0", @@ -3870,7 +3626,6 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -3883,7 +3638,6 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -3896,7 +3650,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -3909,7 +3662,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -3922,7 +3674,6 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -3935,7 +3686,6 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -3948,7 +3698,6 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -3961,7 +3710,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -3974,7 +3722,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", - "license": "MIT", "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", @@ -3997,7 +3744,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", - "license": "MIT", "dependencies": { "@svgr/plugin-jsx": "^5.5.0", "camelcase": "^6.2.0", @@ -4015,7 +3761,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", - "license": "MIT", "dependencies": { "@babel/types": "^7.12.6" }, @@ -4031,7 +3776,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "license": "MIT", "dependencies": { "@babel/core": "^7.12.3", "@svgr/babel-preset": "^5.5.0", @@ -4050,7 +3794,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", - "license": "MIT", "dependencies": { "cosmiconfig": "^7.0.0", "deepmerge": "^4.2.2", @@ -4068,7 +3811,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", - "license": "MIT", "dependencies": { "@babel/core": "^7.12.3", "@babel/plugin-transform-react-constant-elements": "^7.12.1", @@ -4088,10 +3830,9 @@ } }, "node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", - "license": "MIT", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.3.0.tgz", + "integrity": "sha512-pT/TYB2+IyMYkkB6lqpkzD7VFbsR0JBJtflK3cS68sCNWxmOhWwRm1XvVHlseNEorsNcxkYsb4sRDV3aNIpttg==", "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", @@ -4111,7 +3852,6 @@ "version": "5.17.0", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", - "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.0.1", "@babel/runtime": "^7.9.2", @@ -4133,7 +3873,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4146,7 +3885,6 @@ "version": "13.4.0", "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "@testing-library/dom": "^8.5.0", @@ -4164,7 +3902,6 @@ "version": "8.20.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -4183,7 +3920,6 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "license": "Apache-2.0", "dependencies": { "deep-equal": "^2.0.5" } @@ -4192,7 +3928,6 @@ "version": "13.5.0", "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" }, @@ -4208,7 +3943,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "license": "MIT", "engines": { "node": ">= 6" } @@ -4217,7 +3951,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "license": "ISC", "engines": { "node": ">=10.13.0" } @@ -4225,14 +3958,12 @@ "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "license": "MIT" + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" }, "node_modules/@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==", - "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -4245,7 +3976,6 @@ "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==", - "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } @@ -4254,7 +3984,6 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -4264,7 +3993,6 @@ "version": "7.20.6", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } @@ -4273,7 +4001,6 @@ "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -4283,7 +4010,6 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -4292,7 +4018,6 @@ "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -4301,17 +4026,15 @@ "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "license": "MIT", "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" } }, "node_modules/@types/eslint": { - "version": "8.56.12", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", - "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", - "license": "MIT", + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -4320,14 +4043,12 @@ "node_modules/@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==", - "license": "MIT" + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/express": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -4339,7 +4060,6 @@ "version": "4.19.5", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", - "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -4351,7 +4071,6 @@ "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -4359,20 +4078,17 @@ "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "license": "MIT" + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" }, "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "license": "MIT" + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" }, "node_modules/@types/http-proxy": { - "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", - "license": "MIT", + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dependencies": { "@types/node": "*" } @@ -4380,14 +4096,12 @@ "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "license": "MIT" + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -4396,7 +4110,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } @@ -4405,7 +4118,6 @@ "version": "29.5.12", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", - "license": "MIT", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -4415,7 +4127,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -4427,7 +4138,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -4440,41 +4150,35 @@ "node_modules/@types/jest/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/@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==", - "license": "MIT" + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "license": "MIT" + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "license": "MIT" + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" }, "node_modules/@types/node": { - "version": "22.5.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz", - "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", - "license": "MIT", + "version": "20.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", + "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~5.26.4" } }, "node_modules/@types/node-forge": { "version": "1.3.11", "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -4482,44 +4186,37 @@ "node_modules/@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==", - "license": "MIT" + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, "node_modules/@types/prettier": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "license": "MIT" + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" }, "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "license": "MIT" + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/q": { "version": "1.5.8", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", - "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", - "license": "MIT" + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" }, "node_modules/@types/qs": { "version": "6.9.15", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", - "license": "MIT" + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT" + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, "node_modules/@types/react": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.5.tgz", - "integrity": "sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==", - "license": "MIT", + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -4529,7 +4226,6 @@ "version": "18.3.0", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", - "license": "MIT", "dependencies": { "@types/react": "*" } @@ -4538,7 +4234,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -4546,20 +4241,17 @@ "node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "license": "MIT" + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, "node_modules/@types/semver": { "version": "7.5.8", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "license": "MIT" + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==" }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -4569,7 +4261,6 @@ "version": "1.9.4", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "license": "MIT", "dependencies": { "@types/express": "*" } @@ -4578,7 +4269,6 @@ "version": "1.15.7", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", @@ -4589,7 +4279,6 @@ "version": "0.3.36", "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -4597,14 +4286,12 @@ "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "license": "MIT" + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" }, "node_modules/@types/testing-library__jest-dom": { "version": "5.14.9", "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", - "license": "MIT", "dependencies": { "@types/jest": "*" } @@ -4612,23 +4299,20 @@ "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT" + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" }, "node_modules/@types/ws": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", - "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", - "license": "MIT", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "license": "MIT", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dependencies": { "@types/yargs-parser": "*" } @@ -4636,14 +4320,12 @@ "node_modules/@types/yargs-parser": { "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "license": "MIT" + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", @@ -4677,7 +4359,6 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", - "license": "MIT", "dependencies": { "@typescript-eslint/utils": "5.62.0" }, @@ -4696,7 +4377,6 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -4723,7 +4403,6 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0" @@ -4740,7 +4419,6 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "5.62.0", "@typescript-eslint/utils": "5.62.0", @@ -4767,7 +4445,6 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4780,7 +4457,6 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0", @@ -4807,7 +4483,6 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", @@ -4833,7 +4508,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -4846,7 +4520,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -4855,7 +4528,6 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" @@ -4871,14 +4543,12 @@ "node_modules/@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==", - "license": "ISC" + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@webassemblyjs/ast": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -4887,26 +4557,22 @@ "node_modules/@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==", - "license": "MIT" + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "node_modules/@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==", - "license": "MIT" + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "license": "MIT" + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -4916,14 +4582,12 @@ "node_modules/@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==", - "license": "MIT" + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-buffer": "1.12.1", @@ -4935,7 +4599,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -4944,7 +4607,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } @@ -4952,14 +4614,12 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "license": "MIT" + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-buffer": "1.12.1", @@ -4975,7 +4635,6 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -4988,7 +4647,6 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-buffer": "1.12.1", @@ -5000,7 +4658,6 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", @@ -5014,7 +4671,6 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" @@ -5024,7 +4680,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@wry/caches/-/caches-1.0.1.tgz", "integrity": "sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -5036,7 +4691,6 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.7.4.tgz", "integrity": "sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -5048,7 +4702,6 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.7.tgz", "integrity": "sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -5060,7 +4713,6 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.5.0.tgz", "integrity": "sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -5071,27 +4723,23 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "node_modules/@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==", - "license": "Apache-2.0" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "license": "BSD-3-Clause" + "deprecated": "Use your platform's native atob() and btoa() methods instead" }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -5101,10 +4749,9 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "license": "MIT", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", "bin": { "acorn": "bin/acorn" }, @@ -5116,7 +4763,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "license": "MIT", "dependencies": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" @@ -5126,7 +4772,6 @@ "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -5138,7 +4783,6 @@ "version": "1.9.5", "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "license": "MIT", "peerDependencies": { "acorn": "^8" } @@ -5147,7 +4791,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -5156,7 +4799,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -5165,7 +4807,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -5174,7 +4815,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" @@ -5187,7 +4827,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", "dependencies": { "debug": "4" }, @@ -5199,7 +4838,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -5215,7 +4853,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -5229,15 +4866,14 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dependencies": { "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -5247,14 +4883,12 @@ "node_modules/ajv-formats/node_modules/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==", - "license": "MIT" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } @@ -5263,7 +4897,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -5281,7 +4914,6 @@ "engines": [ "node >= 0.8.0" ], - "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } @@ -5293,7 +4925,6 @@ "engines": [ "node >= 0.8.0" ], - "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } @@ -5302,7 +4933,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", "engines": { "node": ">=8" } @@ -5311,7 +4941,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -5325,14 +4954,12 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -5344,14 +4971,12 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -5360,7 +4985,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "license": "Apache-2.0", "dependencies": { "dequal": "^2.0.3" } @@ -5369,7 +4993,6 @@ "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==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" @@ -5384,14 +5007,12 @@ "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/array-includes": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5411,7 +5032,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "license": "MIT", "engines": { "node": ">=8" } @@ -5420,7 +5040,6 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5440,7 +5059,6 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5460,7 +5078,6 @@ "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==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -5478,7 +5095,6 @@ "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==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -5496,7 +5112,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz", "integrity": "sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5513,11 +5128,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/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==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, "node_modules/array.prototype.tosorted": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5533,7 +5158,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", @@ -5554,40 +5178,35 @@ "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "license": "MIT" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "license": "MIT" + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" }, "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "license": "ISC", "engines": { "node": ">= 4.0.0" } }, "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", "funding": [ { "type": "opencollective", @@ -5602,13 +5221,12 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", + "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -5625,7 +5243,6 @@ "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==", - "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -5637,28 +5254,25 @@ } }, "node_modules/axe-core": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", - "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", - "license": "MPL-2.0", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", + "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==", "engines": { "node": ">=4" } }, "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dependencies": { + "deep-equal": "^2.0.5" } }, "node_modules/babel-jest": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", - "license": "MIT", "dependencies": { "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", @@ -5680,7 +5294,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -5696,7 +5309,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -5705,7 +5317,6 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", - "license": "MIT", "dependencies": { "find-cache-dir": "^3.3.1", "loader-utils": "^2.0.0", @@ -5724,7 +5335,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", @@ -5742,7 +5352,6 @@ "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -5758,7 +5367,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", - "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -5773,7 +5381,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -5788,7 +5395,6 @@ "version": "0.3.8", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "license": "MIT", "peerDependencies": { "@babel/core": "^7.1.0" } @@ -5797,7 +5403,6 @@ "version": "0.4.11", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", - "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", "@babel/helper-define-polyfill-provider": "^0.6.2", @@ -5811,19 +5416,17 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", - "license": "MIT", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -5833,7 +5436,6 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", - "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.2" }, @@ -5844,30 +5446,25 @@ "node_modules/babel-plugin-transform-react-remove-prop-types": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", - "license": "MIT" + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", - "license": "MIT", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" + "@babel/plugin-syntax-top-level-await": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -5877,7 +5474,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", - "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "^27.5.1", "babel-preset-current-node-syntax": "^1.0.0" @@ -5893,7 +5489,6 @@ "version": "10.0.1", "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", - "license": "MIT", "dependencies": { "@babel/core": "^7.16.0", "@babel/plugin-proposal-class-properties": "^7.16.0", @@ -5916,26 +5511,22 @@ "node_modules/backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==", - "license": "MIT" + "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==" }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "license": "MIT" + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" }, "node_modules/bfj": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", - "license": "MIT", "dependencies": { "bluebird": "^3.7.2", "check-types": "^11.2.3", @@ -5951,7 +5542,6 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "license": "MIT", "engines": { "node": "*" } @@ -5960,7 +5550,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -5971,8 +5560,7 @@ "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/body-parser": { "version": "1.20.3", @@ -6001,7 +5589,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6010,7 +5597,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -6019,7 +5605,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -6030,14 +5615,12 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/bonjour-service": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" @@ -6046,14 +5629,12 @@ "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6063,7 +5644,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -6074,13 +5654,12 @@ "node_modules/browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "license": "BSD-2-Clause" + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", "funding": [ { "type": "opencollective", @@ -6095,12 +5674,11 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" }, "bin": { "browserslist": "cli.js" @@ -6113,7 +5691,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } @@ -6121,14 +5698,12 @@ "node_modules/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==", - "license": "MIT" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "license": "MIT", "engines": { "node": ">=6" }, @@ -6140,7 +5715,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6149,7 +5723,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -6168,7 +5741,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", "engines": { "node": ">=6" } @@ -6177,7 +5749,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "license": "MIT", "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -6187,7 +5758,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -6199,7 +5769,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "license": "MIT", "engines": { "node": ">= 6" } @@ -6208,7 +5777,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "license": "MIT", "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", @@ -6217,9 +5785,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001657", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001657.tgz", - "integrity": "sha512-DPbJAlP8/BAXy3IgiWmZKItubb3TYGP0WscQQlVGIfT4s/YlFYVuJgyOsQNP7rJRChx/qdMeLJQJP0Sgg2yjNA==", + "version": "1.0.30001639", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001639.tgz", + "integrity": "sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==", "funding": [ { "type": "opencollective", @@ -6233,14 +5801,12 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", - "license": "MIT", "engines": { "node": ">=4" } @@ -6249,7 +5815,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6265,7 +5830,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "license": "MIT", "engines": { "node": ">=10" } @@ -6273,14 +5837,12 @@ "node_modules/check-types": { "version": "11.2.3", "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", - "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==", - "license": "MIT" + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==" }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -6304,7 +5866,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -6316,7 +5877,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "license": "MIT", "engines": { "node": ">=6.0" } @@ -6331,22 +5891,19 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/cjs-module-lexer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.0.tgz", - "integrity": "sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g==", - "license": "MIT" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==" }, "node_modules/clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "license": "MIT", "dependencies": { "source-map": "~0.6.0" }, @@ -6358,7 +5915,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -6367,7 +5923,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -6378,7 +5933,6 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -6388,7 +5942,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "license": "MIT", "dependencies": { "@types/q": "^1.5.1", "chalk": "^2.4.1", @@ -6402,7 +5955,6 @@ "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==", - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -6414,7 +5966,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -6428,7 +5979,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -6436,14 +5986,12 @@ "node_modules/coa/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/coa/node_modules/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==", - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -6452,7 +6000,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", "engines": { "node": ">=4" } @@ -6461,7 +6008,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -6472,14 +6018,12 @@ "node_modules/collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "license": "MIT" + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" }, "node_modules/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==", - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -6490,26 +6034,22 @@ "node_modules/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==", - "license": "MIT" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "license": "MIT" + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "license": "MIT" + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -6521,7 +6061,6 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", "engines": { "node": ">= 12" } @@ -6530,7 +6069,6 @@ "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -6538,14 +6076,12 @@ "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "license": "MIT" + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -6557,7 +6093,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "license": "MIT", "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -6575,7 +6110,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -6583,32 +6117,27 @@ "node_modules/compression/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/compression/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "license": "MIT" + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "license": "MIT", "engines": { "node": ">=0.8" } @@ -6617,7 +6146,6 @@ "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -6629,7 +6157,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6637,14 +6164,12 @@ "node_modules/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==", - "license": "MIT" + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "license": "MIT", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "engines": { "node": ">= 0.6" } @@ -6652,27 +6177,24 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/core-js": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", - "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", + "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", "hasInstallScript": true, - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-js-compat": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", - "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", - "license": "MIT", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dependencies": { - "browserslist": "^4.23.3" + "browserslist": "^4.23.0" }, "funding": { "type": "opencollective", @@ -6680,11 +6202,10 @@ } }, "node_modules/core-js-pure": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.1.tgz", - "integrity": "sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.1.tgz", + "integrity": "sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==", "hasInstallScript": true, - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -6693,14 +6214,12 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -6716,7 +6235,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6730,7 +6248,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "license": "MIT", "engines": { "node": ">=8" } @@ -6739,7 +6256,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -6757,7 +6273,6 @@ "version": "6.4.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", - "license": "ISC", "engines": { "node": "^10 || ^12 || >=14" }, @@ -6769,7 +6284,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -6787,7 +6301,6 @@ "version": "6.11.0", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", - "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", @@ -6822,7 +6335,6 @@ "version": "3.4.1", "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", - "license": "MIT", "dependencies": { "cssnano": "^5.0.6", "jest-worker": "^27.0.2", @@ -6860,7 +6372,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -6869,7 +6380,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "license": "CC0-1.0", "bin": { "css-prefers-color-scheme": "dist/cli.cjs" }, @@ -6884,7 +6394,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -6899,14 +6408,12 @@ "node_modules/css-select-base-adapter": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "license": "MIT" + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" }, "node_modules/css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "license": "MIT", "dependencies": { "mdn-data": "2.0.4", "source-map": "^0.6.1" @@ -6919,7 +6426,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -6928,7 +6434,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -6939,8 +6444,7 @@ "node_modules/css.escape": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "license": "MIT" + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" }, "node_modules/cssdb": { "version": "7.11.2", @@ -6955,14 +6459,12 @@ "type": "github", "url": "https://github.com/sponsors/csstools" } - ], - "license": "CC0-1.0" + ] }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -6974,7 +6476,6 @@ "version": "5.1.15", "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", - "license": "MIT", "dependencies": { "cssnano-preset-default": "^5.2.14", "lilconfig": "^2.0.3", @@ -6995,7 +6496,6 @@ "version": "5.2.14", "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "license": "MIT", "dependencies": { "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", @@ -7038,7 +6538,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -7050,7 +6549,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "license": "MIT", "dependencies": { "css-tree": "^1.1.2" }, @@ -7062,7 +6560,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "license": "MIT", "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -7074,14 +6571,12 @@ "node_modules/csso/node_modules/mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "license": "CC0-1.0" + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, "node_modules/csso/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -7089,14 +6584,12 @@ "node_modules/cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "license": "MIT" + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" }, "node_modules/cssstyle": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "license": "MIT", "dependencies": { "cssom": "~0.3.6" }, @@ -7107,26 +6600,22 @@ "node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "license": "MIT" + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "license": "BSD-2-Clause" + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" }, "node_modules/data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "license": "MIT", "dependencies": { "abab": "^2.0.3", "whatwg-mimetype": "^2.3.0", @@ -7140,7 +6629,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -7157,7 +6645,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -7174,7 +6661,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -7188,10 +6674,9 @@ } }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "license": "MIT", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dependencies": { "ms": "2.1.2" }, @@ -7207,20 +6692,17 @@ "node_modules/decimal.js": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "license": "MIT" + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "license": "MIT" + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" }, "node_modules/deep-equal": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.5", @@ -7251,14 +6733,12 @@ "node_modules/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==", - "license": "MIT" + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/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==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7267,7 +6747,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "license": "BSD-2-Clause", "dependencies": { "execa": "^5.0.0" }, @@ -7279,7 +6758,6 @@ "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==", - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -7296,7 +6774,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "license": "MIT", "engines": { "node": ">=8" } @@ -7305,7 +6782,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -7322,7 +6798,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -7331,7 +6806,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -7340,7 +6814,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -7349,7 +6822,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -7359,7 +6831,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "license": "MIT", "engines": { "node": ">=8" } @@ -7367,14 +6838,12 @@ "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT" + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "node_modules/detect-port-alt": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "license": "MIT", "dependencies": { "address": "^1.0.1", "debug": "^2.6.0" @@ -7391,7 +6860,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -7399,20 +6867,17 @@ "node_modules/detect-port-alt/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "license": "Apache-2.0" + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -7421,7 +6886,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -7432,14 +6896,12 @@ "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "license": "MIT" + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -7451,7 +6913,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -7462,14 +6923,12 @@ "node_modules/dom-accessibility-api": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "license": "MIT" + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "license": "MIT", "dependencies": { "utila": "~0.4" } @@ -7478,7 +6937,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -7497,15 +6955,13 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "license": "BSD-2-Clause" + ] }, "node_modules/domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "deprecated": "Use your platform's native DOMException instead", - "license": "MIT", "dependencies": { "webidl-conversions": "^5.0.0" }, @@ -7517,7 +6973,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "license": "BSD-2-Clause", "engines": { "node": ">=8" } @@ -7526,7 +6981,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" }, @@ -7541,7 +6995,6 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -7555,7 +7008,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -7565,7 +7017,6 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "license": "BSD-2-Clause", "engines": { "node": ">=10" } @@ -7573,32 +7024,27 @@ "node_modules/dotenv-expand": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "license": "BSD-2-Clause" + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -7610,16 +7056,14 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.14", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.14.tgz", - "integrity": "sha512-bEfPECb3fJ15eaDnu9LEJ2vPGD6W1vt7vZleSVyFhYuMIKm3vz/g9lt7IvEzgdwj58RjbPKUF2rXTCN/UW47tQ==", - "license": "ISC" + "version": "1.4.816", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz", + "integrity": "sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==" }, "node_modules/emittery": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -7630,14 +7074,12 @@ "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "license": "MIT", "engines": { "node": ">= 4" } @@ -7646,7 +7088,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -7655,7 +7096,6 @@ "version": "5.17.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -7668,7 +7108,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -7677,7 +7116,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -7686,7 +7124,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "license": "MIT", "dependencies": { "stackframe": "^1.3.4" } @@ -7695,7 +7132,6 @@ "version": "1.23.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", @@ -7754,14 +7190,12 @@ "node_modules/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==", - "license": "MIT" + "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==", - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -7773,7 +7207,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -7782,7 +7215,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -7802,7 +7234,6 @@ "version": "1.0.19", "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -7826,14 +7257,12 @@ "node_modules/es-module-lexer": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "license": "MIT" + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, "node_modules/es-object-atoms": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -7845,7 +7274,6 @@ "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==", - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", @@ -7859,7 +7287,6 @@ "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==", - "license": "MIT", "dependencies": { "hasown": "^2.0.0" } @@ -7868,7 +7295,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -7882,10 +7308,9 @@ } }, "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -7893,14 +7318,12 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/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==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -7912,7 +7335,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -7933,7 +7355,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -7943,7 +7364,6 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -7998,7 +7418,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", - "license": "MIT", "dependencies": { "@babel/core": "^7.16.0", "@babel/eslint-parser": "^7.16.3", @@ -8026,7 +7445,6 @@ "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==", - "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -8037,16 +7455,14 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-module-utils": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.9.0.tgz", - "integrity": "sha512-McVbYmwA3NEKwRQY5g4aWMdcZE5xZxV8i8l7CqJSrameuGSQJtSWaL/LxTEzSKKaCcOhlpDR8XEfYXWPrdo/ZQ==", - "license": "MIT", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dependencies": { "debug": "^3.2.7" }, @@ -8063,7 +7479,6 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -8072,7 +7487,6 @@ "version": "8.0.3", "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", - "license": "BSD-3-Clause", "dependencies": { "lodash": "^4.17.21", "string-natural-compare": "^3.0.1" @@ -8087,27 +7501,25 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", - "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", - "license": "MIT", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", + "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.9.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", + "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.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", "semver": "^6.3.1", "tsconfig-paths": "^3.15.0" }, @@ -8122,7 +7534,6 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -8131,7 +7542,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -8143,7 +7553,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -8152,7 +7561,6 @@ "version": "25.7.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", - "license": "MIT", "dependencies": { "@typescript-eslint/experimental-utils": "^5.0.0" }, @@ -8173,17 +7581,16 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz", - "integrity": "sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==", - "license": "MIT", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", + "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", "dependencies": { "aria-query": "~5.1.3", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", + "axe-core": "^4.9.1", + "axobject-query": "~3.1.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "es-iterator-helpers": "^1.0.19", @@ -8199,55 +7606,52 @@ "node": ">=4.0" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "license": "Apache-2.0", "dependencies": { "deep-equal": "^2.0.5" } }, "node_modules/eslint-plugin-react": { - "version": "7.35.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.2.tgz", - "integrity": "sha512-Rbj2R9zwP2GYNcIak4xoAMV57hrBh3hTaR0k7hVjwCQgryE/pw5px4b13EYjduOI0hfXyZhwBxaGpOTbWSGzKQ==", - "license": "MIT", + "version": "7.34.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", + "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", - "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.8", "object.fromentries": "^2.0.8", + "object.hasown": "^1.1.4", "object.values": "^1.2.0", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", - "string.prototype.repeat": "^1.0.0" + "string.prototype.matchall": "^4.0.11" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, "node_modules/eslint-plugin-react-hooks": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -8259,7 +7663,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -8271,7 +7674,6 @@ "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -8288,7 +7690,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -8297,7 +7698,6 @@ "version": "5.11.1", "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", - "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^5.58.0" }, @@ -8313,7 +7713,6 @@ "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -8329,7 +7728,6 @@ "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==", - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -8341,7 +7739,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", - "license": "MIT", "dependencies": { "@types/eslint": "^7.29.0 || ^8.4.1", "jest-worker": "^28.0.2", @@ -8365,7 +7762,6 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -8379,7 +7775,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8393,14 +7788,12 @@ "node_modules/eslint/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/eslint/node_modules/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==", - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -8416,7 +7809,6 @@ "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -8431,7 +7823,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -8443,7 +7834,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -8458,7 +7848,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -8473,7 +7862,6 @@ "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==", - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -8488,7 +7876,6 @@ "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==", - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -8500,7 +7887,6 @@ "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -8517,7 +7903,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -8527,10 +7912,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "license": "BSD-3-Clause", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dependencies": { "estraverse": "^5.1.0" }, @@ -8542,7 +7926,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -8554,7 +7937,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -8562,14 +7944,12 @@ "node_modules/estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "license": "MIT" + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -8578,7 +7958,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -8586,14 +7965,12 @@ "node_modules/eventemitter3": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", - "license": "MIT" + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -8602,7 +7979,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -8633,7 +8009,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -8646,16 +8021,16 @@ } }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -8690,7 +8065,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -8706,20 +8080,17 @@ "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/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==", - "license": "MIT" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/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==", - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -8735,7 +8106,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -8746,32 +8116,22 @@ "node_modules/fast-json-patch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", - "license": "MIT" + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" }, "node_modules/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==", - "license": "MIT" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "license": "MIT" + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -8780,7 +8140,6 @@ "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -8792,7 +8151,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" } @@ -8801,7 +8159,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -8813,7 +8170,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -8833,7 +8189,6 @@ "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==", - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -8851,7 +8206,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } @@ -8860,7 +8214,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -8869,7 +8222,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8881,7 +8233,6 @@ "version": "8.0.7", "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "license": "BSD-3-Clause", "engines": { "node": ">= 0.4.0" } @@ -8890,7 +8241,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -8919,7 +8269,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -8935,14 +8284,12 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -8959,7 +8306,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -8972,7 +8318,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -8985,20 +8330,18 @@ "node_modules/flatted": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "license": "ISC" + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" }, "node_modules/follow-redirects": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.8.tgz", - "integrity": "sha512-xgrmBhBToVKay1q2Tao5LI26B83UhrB/vM1avwVSDzt8rx3rO6AizBAaF46EgksTVr+rFTQaqZZ9MVBfUe4nig==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -9012,16 +8355,14 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } }, "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "license": "ISC", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -9037,7 +8378,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", "engines": { "node": ">=14" }, @@ -9049,7 +8389,6 @@ "version": "6.5.3", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -9088,7 +8427,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -9104,7 +8442,6 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -9119,7 +8456,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.4", "ajv": "^6.12.2", @@ -9137,7 +8473,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -9146,7 +8481,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -9160,7 +8494,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -9169,7 +8502,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "license": "MIT", "engines": { "node": "*" }, @@ -9182,7 +8514,6 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -9191,7 +8522,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -9204,21 +8534,18 @@ "node_modules/fs-monkey": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", - "license": "Unlicense" + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==" }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -9231,7 +8558,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9240,7 +8566,6 @@ "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==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -9258,7 +8583,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9267,7 +8591,6 @@ "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==", - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -9276,7 +8599,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -9285,7 +8607,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -9303,14 +8624,12 @@ "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "license": "ISC" + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -9319,7 +8638,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -9331,7 +8649,6 @@ "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==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", @@ -9349,7 +8666,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9369,7 +8685,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -9380,14 +8695,12 @@ "node_modules/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==", - "license": "BSD-2-Clause" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "license": "MIT", "dependencies": { "global-prefix": "^3.0.0" }, @@ -9399,7 +8712,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "license": "MIT", "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -9413,7 +8725,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -9425,7 +8736,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "license": "MIT", "engines": { "node": ">=4" } @@ -9434,7 +8744,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -9450,7 +8759,6 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -9470,7 +8778,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -9481,20 +8788,17 @@ "node_modules/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==", - "license": "ISC" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "license": "MIT" + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" }, "node_modules/graphql": { "version": "16.9.0", "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -9503,7 +8807,6 @@ "version": "2.12.6", "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", - "license": "MIT", "dependencies": { "tslib": "^2.1.0" }, @@ -9518,7 +8821,6 @@ "version": "5.16.0", "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.16.0.tgz", "integrity": "sha512-Ju2RCU2dQMgSKtArPbEtsK5gNLnsQyTNIo/T7cZNp96niC1x0KdJNZV0TIoilceBPQwfb5itrGl8pkFeOUMl4A==", - "license": "MIT", "workspaces": [ "website" ], @@ -9533,7 +8835,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "license": "MIT", "dependencies": { "duplexer": "^0.1.2" }, @@ -9547,20 +8848,17 @@ "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "license": "MIT" + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, "node_modules/harmony-reflect": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", - "license": "(Apache-2.0 OR MPL-1.1)" + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" }, "node_modules/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==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9569,7 +8867,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", "engines": { "node": ">=8" } @@ -9578,7 +8875,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -9590,7 +8886,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9602,7 +8897,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9614,7 +8908,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -9629,7 +8922,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -9641,7 +8933,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "license": "MIT", "bin": { "he": "bin/he" } @@ -9650,7 +8941,6 @@ "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==", - "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } @@ -9659,7 +8949,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", - "license": "MIT", "engines": { "node": ">= 6.0.0" } @@ -9668,7 +8957,6 @@ "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -9679,14 +8967,12 @@ "node_modules/hpack.js/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -9700,14 +8986,12 @@ "node_modules/hpack.js/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -9716,7 +9000,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "license": "MIT", "dependencies": { "whatwg-encoding": "^1.0.5" }, @@ -9737,20 +9020,17 @@ "type": "patreon", "url": "https://patreon.com/mdevils" } - ], - "license": "MIT" + ] }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "license": "MIT" + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, "node_modules/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "license": "MIT", "dependencies": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", @@ -9771,7 +9051,6 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", - "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -9810,7 +9089,6 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", @@ -9821,14 +9099,12 @@ "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "license": "MIT" + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -9843,14 +9119,12 @@ "node_modules/http-parser-js": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "license": "MIT" + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -9864,7 +9138,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "license": "MIT", "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -9875,10 +9148,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "license": "MIT", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -9901,14 +9173,12 @@ "node_modules/http-proxy/node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -9921,7 +9191,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } @@ -9930,7 +9199,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -9942,7 +9210,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -9953,14 +9220,12 @@ "node_modules/idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "license": "ISC" + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" }, "node_modules/identity-obj-proxy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", - "license": "MIT", "dependencies": { "harmony-reflect": "^1.4.6" }, @@ -9969,10 +9234,9 @@ } }, "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "engines": { "node": ">= 4" } @@ -9981,7 +9245,6 @@ "version": "9.0.21", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -9991,7 +9254,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -10007,16 +9269,14 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "license": "MIT", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -10035,7 +9295,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -10044,7 +9303,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "license": "MIT", "engines": { "node": ">=8" } @@ -10054,7 +9312,6 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -10063,20 +9320,17 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/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==", - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", @@ -10090,7 +9344,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", - "license": "MIT", "engines": { "node": ">= 10" } @@ -10099,7 +9352,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -10115,7 +9367,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" @@ -10130,14 +9381,12 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/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==", - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -10152,7 +9401,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -10164,7 +9412,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -10176,7 +9423,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -10192,7 +9438,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -10201,10 +9446,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "license": "MIT", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", "dependencies": { "hasown": "^2.0.2" }, @@ -10219,7 +9463,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "license": "MIT", "dependencies": { "is-typed-array": "^1.1.13" }, @@ -10234,7 +9477,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -10249,7 +9491,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -10264,7 +9505,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10273,7 +9513,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -10285,7 +9524,6 @@ "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==", - "license": "MIT", "engines": { "node": ">=8" } @@ -10294,7 +9532,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "license": "MIT", "engines": { "node": ">=6" } @@ -10303,7 +9540,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -10318,7 +9554,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -10330,7 +9565,6 @@ "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==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -10341,14 +9575,12 @@ "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "license": "MIT" + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" }, "node_modules/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==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -10360,7 +9592,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -10369,7 +9600,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -10384,7 +9614,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10393,7 +9622,6 @@ "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==", - "license": "MIT", "engines": { "node": ">=8" } @@ -10402,7 +9630,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -10413,14 +9640,12 @@ "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "license": "MIT" + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, "node_modules/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==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -10436,7 +9661,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10445,7 +9669,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -10454,7 +9677,6 @@ "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==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -10466,7 +9688,6 @@ "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==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7" }, @@ -10481,7 +9702,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -10493,7 +9713,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -10508,7 +9727,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -10523,7 +9741,6 @@ "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==", - "license": "MIT", "dependencies": { "which-typed-array": "^1.1.14" }, @@ -10537,14 +9754,12 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "license": "MIT" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/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==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -10556,7 +9771,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -10568,7 +9782,6 @@ "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==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4" @@ -10584,7 +9797,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -10595,20 +9807,17 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "license": "BSD-3-Clause", "engines": { "node": ">=8" } @@ -10617,7 +9826,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -10633,7 +9841,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -10642,7 +9849,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -10656,7 +9862,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -10671,7 +9876,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -10685,7 +9889,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -10694,7 +9897,6 @@ "version": "3.1.7", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -10706,14 +9908,12 @@ "node_modules/iterall": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", - "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==", - "license": "MIT" + "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" }, "node_modules/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==", - "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "get-intrinsic": "^1.2.1", @@ -10723,13 +9923,15 @@ } }, "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", "dependencies": { "@isaacs/cliui": "^8.0.2" }, + "engines": { + "node": ">=14" + }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -10738,10 +9940,9 @@ } }, "node_modules/jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "license": "Apache-2.0", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -10759,7 +9960,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", - "license": "MIT", "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", @@ -10784,7 +9984,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "execa": "^5.0.0", @@ -10798,7 +9997,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -10814,7 +10012,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -10823,7 +10020,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", - "license": "MIT", "dependencies": { "@jest/environment": "^27.5.1", "@jest/test-result": "^27.5.1", @@ -10853,7 +10049,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -10869,7 +10064,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -10878,7 +10072,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "license": "MIT", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -10887,7 +10080,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", @@ -10902,7 +10094,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", @@ -10917,7 +10108,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "license": "MIT", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -10926,7 +10116,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^27.5.1", @@ -10941,7 +10130,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", @@ -10961,7 +10149,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -10978,7 +10165,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "license": "MIT", "dependencies": { "@jest/core": "^27.5.1", "@jest/test-result": "^27.5.1", @@ -11012,7 +10198,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -11028,7 +10213,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -11037,7 +10221,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -11054,7 +10237,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "license": "MIT", "dependencies": { "@babel/core": "^7.8.0", "@jest/test-sequencer": "^27.5.1", @@ -11097,7 +10279,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -11113,7 +10294,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -11122,7 +10302,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "license": "MIT", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -11131,7 +10310,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -11148,7 +10326,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -11163,7 +10340,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -11175,7 +10351,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -11188,14 +10363,12 @@ "node_modules/jest-diff/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/jest-docblock": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", - "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, @@ -11207,7 +10380,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "chalk": "^4.0.0", @@ -11223,7 +10395,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -11239,7 +10410,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -11248,7 +10418,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "license": "MIT", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -11257,7 +10426,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -11274,7 +10442,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", - "license": "MIT", "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", @@ -11292,7 +10459,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -11308,7 +10474,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -11317,7 +10482,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -11334,7 +10498,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", - "license": "MIT", "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", @@ -11351,7 +10514,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -11367,7 +10529,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -11376,7 +10537,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -11393,7 +10553,6 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -11402,7 +10561,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", @@ -11428,7 +10586,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -11444,7 +10601,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -11453,7 +10609,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -11470,7 +10625,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "license": "MIT", "dependencies": { "@jest/environment": "^27.5.1", "@jest/source-map": "^27.5.1", @@ -11498,7 +10652,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -11514,7 +10667,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -11523,7 +10675,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "license": "MIT", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -11532,7 +10683,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", @@ -11547,7 +10697,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", @@ -11562,7 +10711,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "license": "MIT", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -11571,7 +10719,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^27.5.1", @@ -11586,7 +10733,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", @@ -11606,7 +10752,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -11623,7 +10768,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", - "license": "MIT", "dependencies": { "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" @@ -11636,7 +10780,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "license": "MIT", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -11645,7 +10788,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -11660,7 +10802,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -11672,7 +10813,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -11685,14 +10825,12 @@ "node_modules/jest-matcher-utils/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/jest-message-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -11712,7 +10850,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -11724,7 +10861,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -11737,14 +10873,12 @@ "node_modules/jest-message-util/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/jest-mock": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" @@ -11757,7 +10891,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -11773,7 +10906,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -11782,7 +10914,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "license": "MIT", "engines": { "node": ">=6" }, @@ -11799,7 +10930,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "license": "MIT", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -11808,7 +10938,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "chalk": "^4.0.0", @@ -11829,7 +10958,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "jest-regex-util": "^27.5.1", @@ -11843,7 +10971,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -11859,7 +10986,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -11868,7 +10994,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -11884,7 +11009,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -11893,7 +11017,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -11910,7 +11033,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", - "license": "MIT", "dependencies": { "@jest/console": "^27.5.1", "@jest/environment": "^27.5.1", @@ -11942,7 +11064,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -11958,7 +11079,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -11967,7 +11087,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", @@ -11987,7 +11106,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -12004,7 +11122,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "license": "MIT", "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", @@ -12037,7 +11154,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -12053,7 +11169,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -12062,7 +11177,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", @@ -12082,7 +11196,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -12099,7 +11212,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "license": "MIT", "dependencies": { "@types/node": "*", "graceful-fs": "^4.2.9" @@ -12112,7 +11224,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "license": "MIT", "dependencies": { "@babel/core": "^7.7.2", "@babel/generator": "^7.7.2", @@ -12145,7 +11256,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -12161,7 +11271,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -12170,7 +11279,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "license": "MIT", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -12179,7 +11287,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", @@ -12194,7 +11301,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", @@ -12209,7 +11315,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "license": "MIT", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -12218,7 +11323,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^27.5.1", @@ -12233,7 +11337,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", @@ -12253,7 +11356,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -12270,7 +11372,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -12287,7 +11388,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "camelcase": "^6.2.0", @@ -12304,7 +11404,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -12320,7 +11419,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -12329,7 +11427,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "license": "MIT", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -12338,7 +11435,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", - "license": "MIT", "dependencies": { "ansi-escapes": "^4.3.1", "chalk": "^4.0.0", @@ -12359,7 +11455,6 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "license": "MIT", "dependencies": { "@jest/types": "^28.1.3", "@types/node": "*", @@ -12376,7 +11471,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", "engines": { "node": ">=8" } @@ -12385,7 +11479,6 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", - "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.24.1" }, @@ -12397,7 +11490,6 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "license": "MIT", "dependencies": { "@jest/console": "^28.1.3", "@jest/types": "^28.1.3", @@ -12412,7 +11504,6 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "license": "MIT", "dependencies": { "@jest/schemas": "^28.1.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -12428,14 +11519,12 @@ "node_modules/jest-watch-typeahead/node_modules/@sinclair/typebox": { "version": "0.24.51", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", - "license": "MIT" + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" }, "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -12447,7 +11536,6 @@ "version": "0.10.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -12459,7 +11547,6 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^28.1.3", @@ -12479,7 +11566,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", "engines": { "node": ">=8" } @@ -12488,7 +11574,6 @@ "version": "28.0.2", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "license": "MIT", "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } @@ -12497,7 +11582,6 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", - "license": "MIT", "dependencies": { "@jest/types": "^28.1.3", "@types/node": "*", @@ -12514,7 +11598,6 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", - "license": "MIT", "dependencies": { "@jest/test-result": "^28.1.3", "@jest/types": "^28.1.3", @@ -12533,7 +11616,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -12546,7 +11628,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -12558,7 +11639,6 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", - "license": "MIT", "dependencies": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -12572,14 +11652,12 @@ "node_modules/jest-watch-typeahead/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/jest-watch-typeahead/node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -12591,7 +11669,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", - "license": "MIT", "dependencies": { "char-regex": "^2.0.0", "strip-ansi": "^7.0.1" @@ -12607,7 +11684,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", - "license": "MIT", "engines": { "node": ">=12.20" } @@ -12616,7 +11692,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -12631,7 +11706,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -12643,7 +11717,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", - "license": "MIT", "dependencies": { "@jest/test-result": "^27.5.1", "@jest/types": "^27.5.1", @@ -12661,7 +11734,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -12677,7 +11749,6 @@ "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -12686,7 +11757,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -12703,7 +11773,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -12717,7 +11786,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -12732,7 +11800,6 @@ "version": "1.21.6", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "license": "MIT", "bin": { "jiti": "bin/jiti.js" } @@ -12740,14 +11807,12 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -12760,7 +11825,6 @@ "version": "16.7.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "license": "MIT", "dependencies": { "abab": "^2.0.5", "acorn": "^8.2.4", @@ -12806,7 +11870,6 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -12817,38 +11880,32 @@ "node_modules/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==", - "license": "MIT" + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "node_modules/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==", - "license": "MIT" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/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==", - "license": "MIT" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/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==", - "license": "MIT" + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -12860,7 +11917,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -12872,7 +11928,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", - "license": "MIT", "dependencies": { "esprima": "1.2.2", "static-eval": "2.0.2", @@ -12895,7 +11950,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12904,7 +11958,6 @@ "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", @@ -12919,7 +11972,6 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -12928,7 +11980,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12937,7 +11988,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "license": "MIT", "engines": { "node": ">=6" } @@ -12946,7 +11996,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "license": "MIT", "engines": { "node": ">= 8" } @@ -12954,14 +12003,12 @@ "node_modules/language-subtag-registry": { "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", - "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "license": "CC0-1.0" + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==" }, "node_modules/language-tags": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "license": "MIT", "dependencies": { "language-subtag-registry": "^0.3.20" }, @@ -12970,10 +12017,9 @@ } }, "node_modules/launch-editor": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", - "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", - "license": "MIT", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz", + "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==", "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" @@ -12983,7 +12029,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "license": "MIT", "engines": { "node": ">=6" } @@ -12992,7 +12037,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -13005,7 +12049,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "license": "MIT", "engines": { "node": ">=10" } @@ -13013,14 +12056,12 @@ "node_modules/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==", - "license": "MIT" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/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==", - "license": "MIT", "engines": { "node": ">=6.11.5" } @@ -13029,7 +12070,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -13043,7 +12083,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -13054,44 +12093,37 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "license": "MIT" + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "node_modules/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==", - "license": "MIT" + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" }, "node_modules/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==", - "license": "MIT" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "license": "MIT" + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "license": "MIT" + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, "node_modules/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==", - "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -13103,7 +12135,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "license": "MIT", "dependencies": { "tslib": "^2.0.3" } @@ -13112,7 +12143,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -13121,7 +12151,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "license": "MIT", "bin": { "lz-string": "bin/bin.js" } @@ -13130,7 +12159,6 @@ "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "license": "MIT", "dependencies": { "sourcemap-codec": "^1.4.8" } @@ -13139,7 +12167,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -13154,7 +12181,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -13163,7 +12189,6 @@ "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } @@ -13171,14 +12196,12 @@ "node_modules/mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "license": "CC0-1.0" + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -13187,7 +12210,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "license": "Unlicense", "dependencies": { "fs-monkey": "^1.0.4" }, @@ -13206,14 +12228,12 @@ "node_modules/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==", - "license": "MIT" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", "engines": { "node": ">= 8" } @@ -13222,7 +12242,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -13231,7 +12250,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -13244,7 +12262,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", "bin": { "mime": "cli.js" }, @@ -13256,7 +12273,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -13265,7 +12281,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -13277,7 +12292,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -13286,16 +12300,14 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/mini-css-extract-plugin": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.1.tgz", - "integrity": "sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ==", - "license": "MIT", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", + "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" @@ -13314,14 +12326,12 @@ "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -13333,7 +12343,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13342,7 +12351,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -13351,7 +12359,6 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -13362,14 +12369,12 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "license": "MIT", "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -13382,7 +12387,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "license": "MIT", "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -13399,7 +12403,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -13410,20 +12413,17 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "license": "MIT" + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/natural-compare-lite": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "license": "MIT" + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -13431,14 +12431,12 @@ "node_modules/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==", - "license": "MIT" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "license": "MIT", "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" @@ -13448,7 +12446,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } @@ -13456,20 +12453,17 @@ "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "license": "MIT" + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "license": "MIT" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13478,7 +12472,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13487,7 +12480,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -13499,7 +12491,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -13511,7 +12502,6 @@ "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==", - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -13520,16 +12510,14 @@ } }, "node_modules/nwsapi": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", - "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", - "license": "MIT" + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", + "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==" }, "node_modules/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==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13538,7 +12526,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "license": "MIT", "engines": { "node": ">= 6" } @@ -13547,7 +12534,6 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -13559,7 +12545,6 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1" @@ -13575,7 +12560,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -13584,7 +12568,6 @@ "version": "4.1.5", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -13602,7 +12585,6 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -13616,7 +12598,6 @@ "version": "2.0.8", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -13634,7 +12615,6 @@ "version": "2.1.8", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", - "license": "MIT", "dependencies": { "array.prototype.reduce": "^1.0.6", "call-bind": "^1.0.7", @@ -13655,7 +12635,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -13665,11 +12644,26 @@ "node": ">= 0.4" } }, + "node_modules/object.hasown": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", + "dependencies": { + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object.values": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -13685,14 +12679,12 @@ "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT" + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -13704,7 +12696,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -13713,7 +12704,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", "dependencies": { "wrappy": "1" } @@ -13722,7 +12712,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -13737,7 +12726,6 @@ "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -13754,7 +12742,6 @@ "version": "0.18.0", "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.18.0.tgz", "integrity": "sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ==", - "license": "MIT", "dependencies": { "@wry/caches": "^1.0.0", "@wry/context": "^0.7.0", @@ -13766,7 +12753,6 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.4.3.tgz", "integrity": "sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -13778,7 +12764,6 @@ "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -13795,7 +12780,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -13810,7 +12794,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -13822,7 +12805,6 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "license": "MIT", "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" @@ -13835,7 +12817,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", "engines": { "node": ">=6" } @@ -13843,14 +12824,12 @@ "node_modules/package-json-from-dist": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "license": "BlueOak-1.0.0" + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -13860,7 +12839,6 @@ "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==", - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -13872,7 +12850,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -13889,14 +12866,12 @@ "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "license": "MIT" + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -13905,7 +12880,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -13915,7 +12889,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", "engines": { "node": ">=8" } @@ -13924,7 +12897,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13933,7 +12905,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", "engines": { "node": ">=8" } @@ -13941,14 +12912,12 @@ "node_modules/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==", - "license": "MIT" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -13961,10 +12930,12 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", + "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", + "engines": { + "node": "14 || >=16.14" + } }, "node_modules/path-to-regexp": { "version": "0.1.10", @@ -13975,7 +12946,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", "engines": { "node": ">=8" } @@ -13983,20 +12953,17 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "license": "MIT" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "license": "ISC" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -14008,7 +12975,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -14017,7 +12983,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "license": "MIT", "engines": { "node": ">= 6" } @@ -14026,7 +12991,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -14038,7 +13002,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "license": "MIT", "dependencies": { "find-up": "^3.0.0" }, @@ -14050,7 +13013,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "license": "MIT", "dependencies": { "locate-path": "^3.0.0" }, @@ -14062,7 +13024,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "license": "MIT", "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -14075,7 +13036,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "license": "MIT", "dependencies": { "p-limit": "^2.0.0" }, @@ -14087,7 +13047,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "license": "MIT", "engines": { "node": ">=4" } @@ -14096,15 +13055,14 @@ "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==", - "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.4.45", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", - "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "funding": [ { "type": "opencollective", @@ -14119,7 +13077,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.1", @@ -14133,7 +13090,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -14152,7 +13108,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", - "license": "CC0-1.0", "engines": { "node": ">=8" }, @@ -14165,7 +13120,6 @@ "version": "8.2.4", "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.9", "postcss-value-parser": "^4.2.0" @@ -14178,7 +13132,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14193,7 +13146,6 @@ "version": "4.2.4", "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14212,7 +13164,6 @@ "version": "8.0.4", "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14231,7 +13182,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14250,7 +13200,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", @@ -14268,7 +13217,6 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" @@ -14284,7 +13232,6 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14303,7 +13250,6 @@ "version": "12.1.11", "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14322,7 +13268,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -14341,7 +13286,6 @@ "version": "6.0.5", "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -14360,7 +13304,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -14372,7 +13315,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -14384,7 +13326,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -14396,7 +13337,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -14408,7 +13348,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -14428,7 +13367,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14443,7 +13381,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "license": "MIT", "peerDependencies": { "postcss": "^8.1.4" } @@ -14452,7 +13389,6 @@ "version": "6.0.4", "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -14467,7 +13403,6 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -14482,7 +13417,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "license": "MIT", "peerDependencies": { "postcss": "^8.1.0" } @@ -14491,7 +13425,6 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" }, @@ -14507,7 +13440,6 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14526,7 +13458,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -14543,7 +13474,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "license": "MIT", "peerDependencies": { "postcss": "^8.0.0" } @@ -14552,7 +13482,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" }, @@ -14571,7 +13500,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -14601,7 +13529,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" @@ -14626,7 +13553,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "license": "MIT", "engines": { "node": ">=14" }, @@ -14635,10 +13561,9 @@ } }, "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", - "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", - "license": "ISC", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", "bin": { "yaml": "bin.mjs" }, @@ -14650,7 +13575,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", - "license": "MIT", "dependencies": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", @@ -14672,7 +13596,6 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" }, @@ -14684,7 +13607,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -14696,7 +13618,6 @@ "version": "5.1.7", "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.1" @@ -14712,7 +13633,6 @@ "version": "5.1.4", "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", @@ -14730,7 +13650,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14745,7 +13664,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "license": "MIT", "dependencies": { "colord": "^2.9.1", "cssnano-utils": "^3.1.0", @@ -14762,7 +13680,6 @@ "version": "5.1.4", "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", @@ -14779,7 +13696,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.5" }, @@ -14794,7 +13710,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -14806,7 +13721,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", - "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -14823,7 +13737,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", - "license": "ISC", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -14838,7 +13751,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, @@ -14850,26 +13762,19 @@ } }, "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", "dependencies": { - "postcss-selector-parser": "^6.1.1" + "postcss-selector-parser": "^6.0.11" }, "engines": { "node": ">=12.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, "peerDependencies": { "postcss": "^8.2.14" } @@ -14878,7 +13783,6 @@ "version": "10.2.0", "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.0", "postcss-selector-parser": "^6.0.10" @@ -14898,7 +13802,6 @@ "version": "10.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", - "license": "CC0-1.0", "dependencies": { "@csstools/normalize.css": "*", "postcss-browser-comments": "^4", @@ -14916,7 +13819,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -14928,7 +13830,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14943,7 +13844,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14958,7 +13858,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14973,7 +13872,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14988,7 +13886,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -15003,7 +13900,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" @@ -15019,7 +13915,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "license": "MIT", "dependencies": { "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" @@ -15035,7 +13930,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -15060,7 +13954,6 @@ "url": "https://liberapay.com/mrcgrtz" } ], - "license": "MIT", "engines": { "node": "^12 || ^14 || >=16" }, @@ -15072,7 +13965,6 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "license": "MIT", "dependencies": { "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" @@ -15088,7 +13980,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -15107,7 +13998,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "license": "MIT", "peerDependencies": { "postcss": "^8" } @@ -15116,7 +14006,6 @@ "version": "7.0.5", "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -15135,7 +14024,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", - "license": "CC0-1.0", "dependencies": { "@csstools/postcss-cascade-layers": "^1.1.1", "@csstools/postcss-color-function": "^1.1.1", @@ -15202,7 +14090,6 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -15221,7 +14108,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" @@ -15237,7 +14123,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -15252,7 +14137,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "license": "MIT", "peerDependencies": { "postcss": "^8.0.3" } @@ -15261,7 +14145,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -15277,10 +14160,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -15293,7 +14175,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^2.7.0" @@ -15309,7 +14190,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", "engines": { "node": ">= 10" } @@ -15318,7 +14198,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "license": "MIT", "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -15330,14 +14209,12 @@ "node_modules/postcss-svgo/node_modules/mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "license": "CC0-1.0" + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, "node_modules/postcss-svgo/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -15346,7 +14223,6 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "license": "MIT", "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", @@ -15367,7 +14243,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.5" }, @@ -15381,14 +14256,12 @@ "node_modules/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==", - "license": "MIT" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -15397,7 +14270,6 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "license": "MIT", "engines": { "node": ">=6" }, @@ -15409,7 +14281,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "license": "MIT", "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" @@ -15419,7 +14290,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -15433,7 +14303,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -15444,20 +14313,17 @@ "node_modules/pretty-format/node_modules/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==", - "license": "MIT" + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "license": "MIT", "dependencies": { "asap": "~2.0.6" } @@ -15466,7 +14332,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -15479,7 +14344,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -15490,7 +14354,6 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -15503,7 +14366,6 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", "engines": { "node": ">= 0.10" } @@ -15511,14 +14373,12 @@ "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "license": "MIT" + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -15528,7 +14388,6 @@ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "license": "MIT", "engines": { "node": ">=0.6.0", "teleport": ">=0.2.0" @@ -15551,8 +14410,7 @@ "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "license": "MIT" + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -15571,14 +14429,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "license": "MIT", "dependencies": { "performance-now": "^2.1.0" } @@ -15587,7 +14443,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -15596,7 +14451,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -15605,7 +14459,6 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -15620,7 +14473,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -15629,7 +14481,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -15641,7 +14492,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -15653,7 +14503,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", - "license": "MIT", "dependencies": { "core-js": "^3.19.2", "object-assign": "^4.1.1", @@ -15669,14 +14518,12 @@ "node_modules/react-app-polyfill/node_modules/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==", - "license": "MIT" + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", @@ -15711,7 +14558,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -15727,7 +14573,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", - "license": "MIT", "engines": { "node": ">= 12.13.0" } @@ -15736,7 +14581,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -15751,7 +14595,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -15766,7 +14609,6 @@ "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==", - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -15781,7 +14623,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -15793,20 +14634,17 @@ "node_modules/react-error-overlay": { "version": "6.0.11", "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", - "license": "MIT" + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, "node_modules/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==", - "license": "MIT" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -15815,7 +14653,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", - "license": "MIT", "dependencies": { "@babel/core": "^7.16.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", @@ -15888,7 +14725,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "license": "MIT", "dependencies": { "pify": "^2.3.0" } @@ -15897,7 +14733,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -15911,7 +14746,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -15923,7 +14757,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "license": "MIT", "dependencies": { "minimatch": "^3.0.5" }, @@ -15935,7 +14768,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "license": "MIT", "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" @@ -15948,7 +14780,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -15968,14 +14799,12 @@ "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "license": "MIT" + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "node_modules/regenerate-unicode-properties": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -15986,14 +14815,12 @@ "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regenerator-transform": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.4" } @@ -16001,14 +14828,12 @@ "node_modules/regex-parser": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", - "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", - "license": "MIT" + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==" }, "node_modules/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==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "define-properties": "^1.2.1", @@ -16026,7 +14851,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "license": "MIT", "dependencies": { "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", @@ -16043,7 +14867,6 @@ "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "license": "BSD-2-Clause", "dependencies": { "jsesc": "~0.5.0" }, @@ -16063,7 +14886,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/rehackt/-/rehackt-0.1.0.tgz", "integrity": "sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw==", - "license": "MIT", "peerDependencies": { "@types/react": "*", "react": "*" @@ -16081,7 +14903,6 @@ "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "license": "MIT", "engines": { "node": ">= 0.10" } @@ -16090,7 +14911,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "license": "MIT", "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -16103,7 +14923,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -16112,7 +14931,6 @@ "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==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -16120,14 +14938,12 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -16144,7 +14960,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -16156,7 +14971,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", "engines": { "node": ">=8" } @@ -16165,7 +14979,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", - "license": "MIT", "dependencies": { "adjust-sourcemap-loader": "^4.0.0", "convert-source-map": "^1.7.0", @@ -16192,20 +15005,17 @@ "node_modules/resolve-url-loader/node_modules/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==", - "license": "MIT" + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/resolve-url-loader/node_modules/picocolors": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "license": "ISC" + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" }, "node_modules/resolve-url-loader/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "license": "MIT", "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" @@ -16222,7 +15032,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -16231,7 +15040,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", - "license": "MIT", "engines": { "node": ">=10" } @@ -16240,7 +15048,6 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/response-iterator/-/response-iterator-0.2.6.tgz", "integrity": "sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==", - "license": "MIT", "engines": { "node": ">=0.8" } @@ -16249,7 +15056,6 @@ "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", "engines": { "node": ">= 4" } @@ -16258,7 +15064,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -16269,7 +15074,6 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -16299,7 +15103,6 @@ "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.10.4", "jest-worker": "^26.2.1", @@ -16314,7 +15117,6 @@ "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -16328,7 +15130,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -16351,7 +15152,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -16360,7 +15160,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4", @@ -16391,14 +15190,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/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==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -16414,20 +15211,17 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sanitize.css": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", - "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==", - "license": "CC0-1.0" + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" }, "node_modules/sass-loader": { "version": "12.6.0", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", - "license": "MIT", "dependencies": { "klona": "^2.0.4", "neo-async": "^2.6.2" @@ -16464,14 +15258,12 @@ "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "license": "ISC" + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" }, @@ -16483,7 +15275,6 @@ "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } @@ -16492,7 +15283,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -16508,15 +15298,14 @@ } }, "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dependencies": { "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -16527,7 +15316,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -16538,20 +15326,17 @@ "node_modules/schema-utils/node_modules/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==", - "license": "MIT" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "license": "MIT" + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" }, "node_modules/selfsigned": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "license": "MIT", "dependencies": { "@types/node-forge": "^1.3.0", "node-forge": "^1" @@ -16561,10 +15346,9 @@ } }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "bin": { "semver": "bin/semver.js" }, @@ -16599,7 +15383,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -16607,20 +15390,17 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -16629,7 +15409,6 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "license": "MIT", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -16647,7 +15426,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -16656,7 +15434,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -16665,7 +15442,6 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -16679,26 +15455,22 @@ "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "license": "ISC" + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "license": "ISC" + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -16729,7 +15501,6 @@ "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==", - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -16746,7 +15517,6 @@ "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==", - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -16760,14 +15530,12 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/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==", - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -16779,7 +15547,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", "engines": { "node": ">=8" } @@ -16788,7 +15555,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -16797,7 +15563,6 @@ "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==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -16814,20 +15579,17 @@ "node_modules/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==", - "license": "ISC" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", "engines": { "node": ">=8" } @@ -16836,7 +15598,6 @@ "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -16846,14 +15607,12 @@ "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "license": "MIT" + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" }, "node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "license": "BSD-3-Clause", "engines": { "node": ">= 8" } @@ -16862,7 +15621,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -16871,7 +15629,6 @@ "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==", - "license": "MIT", "dependencies": { "abab": "^2.0.5", "iconv-lite": "^0.6.3", @@ -16892,7 +15649,6 @@ "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==", - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -16902,7 +15658,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -16911,14 +15666,12 @@ "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "license": "MIT" + "deprecated": "Please use @jridgewell/sourcemap-codec instead" }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -16934,7 +15687,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -16947,21 +15699,18 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "license": "MIT" + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -16973,7 +15722,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "license": "MIT", "engines": { "node": ">=8" } @@ -16981,14 +15729,12 @@ "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "license": "MIT" + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" }, "node_modules/static-eval": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", - "license": "MIT", "dependencies": { "escodegen": "^1.8.1" } @@ -16997,7 +15743,6 @@ "version": "1.14.3", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^4.2.0", @@ -17019,7 +15764,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -17028,7 +15772,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -17041,7 +15784,6 @@ "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "license": "MIT", "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -17066,7 +15808,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -17076,7 +15817,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2" }, @@ -17088,7 +15828,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -17097,7 +15836,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "license": "MIT", "dependencies": { "internal-slot": "^1.0.4" }, @@ -17109,7 +15847,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } @@ -17118,7 +15855,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -17130,14 +15866,12 @@ "node_modules/string-natural-compare": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", - "license": "MIT" + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" }, "node_modules/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==", - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -17152,7 +15886,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -17165,20 +15898,17 @@ "node_modules/string-width-cjs/node_modules/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==", - "license": "MIT" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/string-width/node_modules/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==", - "license": "MIT" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/string.prototype.includes": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", - "license": "MIT", "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" @@ -17188,7 +15918,6 @@ "version": "4.0.11", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -17210,21 +15939,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, "node_modules/string.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -17242,7 +15960,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -17256,7 +15973,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -17273,7 +15989,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "license": "BSD-2-Clause", "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", @@ -17287,7 +16002,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -17300,7 +16014,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -17312,7 +16025,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "license": "MIT", "engines": { "node": ">=8" } @@ -17321,7 +16033,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", - "license": "MIT", "engines": { "node": ">=10" } @@ -17330,7 +16041,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -17339,7 +16049,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "license": "MIT", "dependencies": { "min-indent": "^1.0.0" }, @@ -17351,7 +16060,6 @@ "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==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -17363,7 +16071,6 @@ "version": "3.3.4", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", - "license": "MIT", "engines": { "node": ">= 12.13.0" }, @@ -17379,7 +16086,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" @@ -17396,7 +16102,6 @@ "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.11.0.tgz", "integrity": "sha512-8D4C6DIH5tGiAIpp5I0wD/xRlNiZAPGHygzCe7VzyzUoxHtawzjNAY9SUTXU05/EY2NMY9/9GF0ycizkXr1CWQ==", "deprecated": "The `subscriptions-transport-ws` package is no longer maintained. We recommend you use `graphql-ws` instead. For help migrating Apollo software to `graphql-ws`, see https://www.apollographql.com/docs/apollo-server/data/subscriptions/#switching-from-subscriptions-transport-ws For general help using `graphql-ws`, see https://github.com/enisdenjo/graphql-ws/blob/master/README.md", - "license": "MIT", "dependencies": { "backo2": "^1.0.2", "eventemitter3": "^3.1.0", @@ -17412,7 +16117,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -17421,7 +16125,6 @@ "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -17443,7 +16146,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -17452,16 +16154,14 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -17473,6 +16173,9 @@ "bin": { "glob": "dist/esm/bin.mjs" }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -17481,7 +16184,6 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -17496,7 +16198,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -17508,7 +16209,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "license": "MIT", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -17521,7 +16221,6 @@ "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==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -17532,15 +16231,13 @@ "node_modules/svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "license": "MIT" + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" }, "node_modules/svgo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", - "license": "MIT", "dependencies": { "chalk": "^2.4.1", "coa": "^2.0.2", @@ -17567,7 +16264,6 @@ "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==", - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -17579,7 +16275,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -17593,7 +16288,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -17601,14 +16295,12 @@ "node_modules/svgo/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/svgo/node_modules/css-select": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^3.2.1", @@ -17620,7 +16312,6 @@ "version": "3.4.2", "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -17632,7 +16323,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "entities": "^2.0.0" @@ -17642,7 +16332,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "0", "domelementtype": "1" @@ -17651,14 +16340,12 @@ "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "license": "BSD-2-Clause" + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" }, "node_modules/svgo/node_modules/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==", - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -17667,7 +16354,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", "engines": { "node": ">=4" } @@ -17676,7 +16362,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "license": "BSD-2-Clause", "dependencies": { "boolbase": "~1.0.0" } @@ -17685,7 +16370,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -17697,7 +16381,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "license": "MIT", "engines": { "node": ">=0.10" } @@ -17705,14 +16388,12 @@ "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "license": "MIT" + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "node_modules/tailwindcss": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz", - "integrity": "sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==", - "license": "MIT", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", + "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -17749,7 +16430,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "license": "MIT", "engines": { "node": ">=6" } @@ -17758,7 +16438,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "license": "MIT", "engines": { "node": ">=8" } @@ -17767,7 +16446,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", - "license": "MIT", "dependencies": { "is-stream": "^2.0.0", "temp-dir": "^2.0.0", @@ -17785,7 +16463,6 @@ "version": "0.16.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -17797,7 +16474,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -17810,10 +16486,9 @@ } }, "node_modules/terser": { - "version": "5.31.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", - "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", - "license": "BSD-2-Clause", + "version": "5.31.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", + "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -17831,7 +16506,6 @@ "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==", - "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -17865,7 +16539,6 @@ "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==", - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -17882,14 +16555,12 @@ "node_modules/terser/node_modules/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==", - "license": "MIT" + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -17902,14 +16573,12 @@ "node_modules/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==", - "license": "MIT" + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "license": "MIT", "dependencies": { "any-promise": "^1.0.0" } @@ -17918,7 +16587,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -17929,26 +16597,22 @@ "node_modules/throat": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", - "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", - "license": "MIT" + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==" }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "license": "MIT" + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "license": "BSD-3-Clause" + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" }, "node_modules/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==", - "license": "MIT", "engines": { "node": ">=4" } @@ -17957,7 +16621,6 @@ "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==", - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -17969,7 +16632,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", "engines": { "node": ">=0.6" } @@ -17978,7 +16640,6 @@ "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -17993,7 +16654,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "license": "MIT", "engines": { "node": ">= 4.0.0" } @@ -18002,7 +16662,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "license": "MIT", "dependencies": { "punycode": "^2.1.1" }, @@ -18013,20 +16672,17 @@ "node_modules/tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", - "license": "MIT" + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "license": "Apache-2.0" + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "node_modules/ts-invariant": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz", "integrity": "sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==", - "license": "MIT", "dependencies": { "tslib": "^2.1.0" }, @@ -18038,7 +16694,6 @@ "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -18050,7 +16705,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -18062,22 +16716,19 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "license": "0BSD" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -18091,14 +16742,12 @@ "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -18110,7 +16759,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "license": "MIT", "engines": { "node": ">=4" } @@ -18119,7 +16767,6 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -18131,7 +16778,6 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -18144,7 +16790,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -18158,7 +16803,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -18177,7 +16821,6 @@ "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==", - "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -18197,7 +16840,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -18217,30 +16859,27 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "license": "Apache-2.0", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=14.17" + "node": ">=4.2.0" } }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -18254,20 +16893,17 @@ "node_modules/underscore": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", - "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", - "license": "MIT" + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "license": "MIT" + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "license": "MIT", "engines": { "node": ">=4" } @@ -18276,7 +16912,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -18289,7 +16924,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "license": "MIT", "engines": { "node": ">=4" } @@ -18298,7 +16932,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "license": "MIT", "engines": { "node": ">=4" } @@ -18307,7 +16940,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "license": "MIT", "dependencies": { "crypto-random-string": "^2.0.0" }, @@ -18319,7 +16951,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -18328,7 +16959,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -18336,23 +16966,21 @@ "node_modules/unquote": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", - "license": "MIT" + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" }, "node_modules/upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "license": "MIT", "engines": { "node": ">=4", "yarn": "*" } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "funding": [ { "type": "opencollective", @@ -18367,7 +16995,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.1.2", "picocolors": "^1.0.1" @@ -18383,7 +17010,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -18392,7 +17018,6 @@ "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "license": "MIT", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -18401,14 +17026,12 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/util.promisify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "license": "MIT", "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.2", @@ -18422,14 +17045,12 @@ "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "license": "MIT" + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -18438,7 +17059,6 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -18447,7 +17067,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "license": "ISC", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0", @@ -18460,14 +17079,12 @@ "node_modules/v8-to-istanbul/node_modules/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==", - "license": "MIT" + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -18477,7 +17094,6 @@ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "license": "MIT", "dependencies": { "browser-process-hrtime": "^1.0.0" } @@ -18486,7 +17102,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "license": "MIT", "dependencies": { "xml-name-validator": "^3.0.0" }, @@ -18498,16 +17113,14 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" } }, "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", - "license": "MIT", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -18520,7 +17133,6 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -18528,14 +17140,12 @@ "node_modules/web-vitals": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", - "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==", - "license": "Apache-2.0" + "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==" }, "node_modules/webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "license": "BSD-2-Clause", "engines": { "node": ">=10.4" } @@ -18544,7 +17154,6 @@ "version": "5.94.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", - "license": "MIT", "dependencies": { "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", @@ -18590,7 +17199,6 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", - "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -18613,7 +17221,6 @@ "version": "4.15.2", "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", - "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -18669,10 +17276,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "license": "MIT", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "engines": { "node": ">=10.0.0" }, @@ -18693,7 +17299,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", - "license": "MIT", "dependencies": { "tapable": "^2.0.0", "webpack-sources": "^2.2.0" @@ -18709,7 +17314,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -18718,7 +17322,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", - "license": "MIT", "dependencies": { "source-list-map": "^2.0.1", "source-map": "^0.6.1" @@ -18731,7 +17334,6 @@ "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==", - "license": "MIT", "engines": { "node": ">=10.13.0" } @@ -18740,7 +17342,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -18753,7 +17354,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -18762,7 +17362,6 @@ "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==", - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -18780,7 +17379,6 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -18794,7 +17392,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } @@ -18803,7 +17400,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "license": "MIT", "dependencies": { "iconv-lite": "0.4.24" } @@ -18812,7 +17408,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -18823,20 +17418,17 @@ "node_modules/whatwg-fetch": { "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "license": "MIT" + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" }, "node_modules/whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "license": "MIT" + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" }, "node_modules/whatwg-url": { "version": "8.7.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "license": "MIT", "dependencies": { "lodash": "^4.7.0", "tr46": "^2.1.0", @@ -18850,7 +17442,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -18865,7 +17456,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -18878,13 +17468,12 @@ } }, "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", - "license": "MIT", + "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==", "dependencies": { - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", + "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", @@ -18893,8 +17482,8 @@ "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" @@ -18907,7 +17496,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -18925,7 +17513,6 @@ "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==", - "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -18944,7 +17531,6 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -18953,7 +17539,6 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", - "license": "MIT", "dependencies": { "idb": "^7.0.1", "workbox-core": "6.6.0" @@ -18963,7 +17548,6 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", - "license": "MIT", "dependencies": { "workbox-core": "6.6.0" } @@ -18972,7 +17556,6 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", - "license": "MIT", "dependencies": { "@apideck/better-ajv-errors": "^0.3.1", "@babel/core": "^7.11.1", @@ -19020,7 +17603,6 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "license": "MIT", "dependencies": { "json-schema": "^0.4.0", "jsonpointer": "^5.0.0", @@ -19034,15 +17616,14 @@ } }, "node_modules/workbox-build/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dependencies": { "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -19053,7 +17634,6 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -19067,14 +17647,12 @@ "node_modules/workbox-build/node_modules/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==", - "license": "MIT" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/workbox-build/node_modules/source-map": { "version": "0.8.0-beta.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "license": "BSD-3-Clause", "dependencies": { "whatwg-url": "^7.0.0" }, @@ -19086,7 +17664,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "license": "MIT", "dependencies": { "punycode": "^2.1.0" } @@ -19094,14 +17671,12 @@ "node_modules/workbox-build/node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "license": "BSD-2-Clause" + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, "node_modules/workbox-build/node_modules/whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "license": "MIT", "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -19113,7 +17688,6 @@ "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", "deprecated": "workbox-background-sync@6.6.0", - "license": "MIT", "dependencies": { "workbox-core": "6.6.0" } @@ -19121,14 +17695,12 @@ "node_modules/workbox-core": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", - "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==", - "license": "MIT" + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==" }, "node_modules/workbox-expiration": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", - "license": "MIT", "dependencies": { "idb": "^7.0.1", "workbox-core": "6.6.0" @@ -19139,7 +17711,6 @@ "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", - "license": "MIT", "dependencies": { "workbox-background-sync": "6.6.0", "workbox-core": "6.6.0", @@ -19151,7 +17722,6 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", - "license": "MIT", "dependencies": { "workbox-core": "6.6.0" } @@ -19160,7 +17730,6 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", - "license": "MIT", "dependencies": { "workbox-core": "6.6.0", "workbox-routing": "6.6.0", @@ -19171,7 +17740,6 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", - "license": "MIT", "dependencies": { "workbox-core": "6.6.0" } @@ -19180,7 +17748,6 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", - "license": "MIT", "dependencies": { "workbox-cacheable-response": "6.6.0", "workbox-core": "6.6.0", @@ -19194,7 +17761,6 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", - "license": "MIT", "dependencies": { "workbox-core": "6.6.0" } @@ -19203,7 +17769,6 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", - "license": "MIT", "dependencies": { "workbox-core": "6.6.0" } @@ -19212,7 +17777,6 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", - "license": "MIT", "dependencies": { "workbox-core": "6.6.0", "workbox-routing": "6.6.0" @@ -19221,14 +17785,12 @@ "node_modules/workbox-sw": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", - "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==", - "license": "MIT" + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==" }, "node_modules/workbox-webpack-plugin": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", - "license": "MIT", "dependencies": { "fast-json-stable-stringify": "^2.1.0", "pretty-bytes": "^5.4.1", @@ -19247,7 +17809,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -19256,7 +17817,6 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "license": "MIT", "dependencies": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -19266,7 +17826,6 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", - "license": "MIT", "dependencies": { "@types/trusted-types": "^2.0.2", "workbox-core": "6.6.0" @@ -19276,7 +17835,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -19294,7 +17852,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -19310,14 +17867,12 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -19329,7 +17884,6 @@ "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -19349,20 +17903,17 @@ "node_modules/xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "license": "Apache-2.0" + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "license": "MIT" + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", "engines": { "node": ">=10" } @@ -19370,14 +17921,12 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", "engines": { "node": ">= 6" } @@ -19386,7 +17935,6 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -19404,7 +17952,6 @@ "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", "engines": { "node": ">=10" } @@ -19413,7 +17960,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -19424,14 +17970,12 @@ "node_modules/zen-observable": { "version": "0.8.15", "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", - "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==", - "license": "MIT" + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" }, "node_modules/zen-observable-ts": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz", "integrity": "sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==", - "license": "MIT", "dependencies": { "zen-observable": "0.8.15" } diff --git a/bbb-graphql-middleware/cmd/bbb-graphql-middleware/main.go b/bbb-graphql-middleware/cmd/bbb-graphql-middleware/main.go index bcfc77855d..42029da608 100644 --- a/bbb-graphql-middleware/cmd/bbb-graphql-middleware/main.go +++ b/bbb-graphql-middleware/cmd/bbb-graphql-middleware/main.go @@ -40,6 +40,9 @@ func main() { log.Infof("Json Patch Disabled!") } + // Routine to check for idle connections and close them + go websrv.InvalidateIdleBrowserConnectionsRoutine() + // Websocket listener rateLimiter := common.NewCustomRateLimiter(cfg.Server.MaxConnectionsPerSecond) diff --git a/bbb-graphql-middleware/config/Config.go b/bbb-graphql-middleware/config/Config.go index 8b4e8ac1c9..c4bb4a2ee1 100644 --- a/bbb-graphql-middleware/config/Config.go +++ b/bbb-graphql-middleware/config/Config.go @@ -29,6 +29,7 @@ type Config struct { JsonPatchDisabled bool `yaml:"json_patch_disabled"` SubscriptionAllowedList string `yaml:"subscriptions_allowed_list"` SubscriptionsDeniedList string `yaml:"subscriptions_denied_list"` + WebsocketIdleTimeoutSeconds int `yaml:"websocket_idle_timeout_seconds"` } `yaml:"server"` Redis struct { Host string `yaml:"host"` diff --git a/bbb-graphql-middleware/config/config.yml b/bbb-graphql-middleware/config/config.yml index 0cda076e7c..3f0ecadaae 100644 --- a/bbb-graphql-middleware/config/config.yml +++ b/bbb-graphql-middleware/config/config.yml @@ -12,6 +12,7 @@ server: json_patch_disabled: false subscriptions_allowed_list: subscriptions_denied_list: + websocket_idle_timeout_seconds: 60 redis: host: 127.0.0.1 port: 6379 diff --git a/bbb-graphql-middleware/internal/common/CustomCache.go b/bbb-graphql-middleware/internal/common/CustomCache.go index ad5ff752ec..282fa28b00 100644 --- a/bbb-graphql-middleware/internal/common/CustomCache.go +++ b/bbb-graphql-middleware/internal/common/CustomCache.go @@ -2,6 +2,7 @@ package common import ( "sync" + "time" ) var GlobalCacheLocks = NewCacheLocks() @@ -32,6 +33,17 @@ func (c *CacheLocks) Unlock(id uint32) { c.mutex.Lock() if mtx, exists := c.locks[id]; exists { mtx.Unlock() + go c.RemoveLockId(id, 30) + } + c.mutex.Unlock() +} + +func (c *CacheLocks) RemoveLockId(id uint32, delayInSecs time.Duration) { + time.Sleep(delayInSecs * time.Second) + + c.mutex.Lock() + if _, exists := c.locks[id]; exists { + delete(c.locks, id) } c.mutex.Unlock() } diff --git a/bbb-graphql-middleware/internal/common/SafeChannelByte.go b/bbb-graphql-middleware/internal/common/SafeChannelByte.go index 41d8034dfe..03297f8ef2 100644 --- a/bbb-graphql-middleware/internal/common/SafeChannelByte.go +++ b/bbb-graphql-middleware/internal/common/SafeChannelByte.go @@ -45,6 +45,10 @@ func (s *SafeChannelByte) Closed() bool { } func (s *SafeChannelByte) Close() { + if s.Frozen() { + s.UnfreezeChannel() + } + s.mux.Lock() defer s.mux.Unlock() diff --git a/bbb-graphql-middleware/internal/common/types.go b/bbb-graphql-middleware/internal/common/types.go index 86852ea617..ead7ca1c09 100644 --- a/bbb-graphql-middleware/internal/common/types.go +++ b/bbb-graphql-middleware/internal/common/types.go @@ -6,6 +6,7 @@ import ( "github.com/sirupsen/logrus" "net/http" "sync" + "time" "nhooyr.io/websocket" ) @@ -56,6 +57,8 @@ type BrowserConnection struct { FromBrowserToHasuraChannel *SafeChannelByte // channel to transmit messages from Browser to Hasura FromBrowserToGqlActionsChannel *SafeChannelByte // channel to transmit messages from Browser to Graphq-Actions FromHasuraToBrowserChannel *SafeChannelByte // channel to transmit messages from Hasura/GqlActions to Browser + LastBrowserMessageTime time.Time // stores the time of the last message to control browser idleness + LastBrowserMessageTimeMutex sync.RWMutex // mutex for LastBrowserMessageTime Logger *logrus.Entry // connection logger populated with connection info } diff --git a/bbb-graphql-middleware/internal/hasura/client.go b/bbb-graphql-middleware/internal/hasura/client.go index bdba48c6ae..ae0c8c7c7d 100644 --- a/bbb-graphql-middleware/internal/hasura/client.go +++ b/bbb-graphql-middleware/internal/hasura/client.go @@ -70,6 +70,7 @@ func HasuraClient( defer func() { //When Hasura sends an CloseError, it will forward the error to the browser and close the connection if thisConnection.WebsocketCloseError != nil { + browserConnection.Logger.Infof("Closing browser connection because Hasura connection was closed, reason: %s", thisConnection.WebsocketCloseError.Reason) browserConnection.Websocket.Close(thisConnection.WebsocketCloseError.Code, thisConnection.WebsocketCloseError.Reason) browserConnection.ContextCancelFunc() } diff --git a/bbb-graphql-middleware/internal/websrv/connhandler.go b/bbb-graphql-middleware/internal/websrv/connhandler.go index 125ba6171a..744f9c52f1 100644 --- a/bbb-graphql-middleware/internal/websrv/connhandler.go +++ b/bbb-graphql-middleware/internal/websrv/connhandler.go @@ -98,6 +98,7 @@ func ConnectionHandler(w http.ResponseWriter, r *http.Request) { FromBrowserToHasuraChannel: common.NewSafeChannelByte(bufferSize), FromBrowserToGqlActionsChannel: common.NewSafeChannelByte(bufferSize), FromHasuraToBrowserChannel: common.NewSafeChannelByte(bufferSize), + LastBrowserMessageTime: time.Now(), Logger: connectionLogger, } @@ -494,3 +495,27 @@ func disconnectWithError( return } + +var websocketIdleTimeoutSeconds = config.GetConfig().Server.WebsocketIdleTimeoutSeconds + +func InvalidateIdleBrowserConnectionsRoutine() { + for { + time.Sleep(15 * time.Second) + + BrowserConnectionsMutex.RLock() + for _, browserConnection := range BrowserConnections { + browserConnection.LastBrowserMessageTimeMutex.RLock() + browserIdleSince := time.Since(browserConnection.LastBrowserMessageTime) + browserConnection.LastBrowserMessageTimeMutex.RUnlock() + + if browserIdleSince > time.Duration(websocketIdleTimeoutSeconds)*time.Second { + browserConnection.Logger.Info("Closing browser connection, reason: idle timeout") + errCloseWs := browserConnection.Websocket.Close(websocket.StatusNormalClosure, "idle timeout") + if errCloseWs != nil { + browserConnection.Logger.Debugf("Error on close websocket: %v", errCloseWs) + } + } + } + BrowserConnectionsMutex.RUnlock() + } +} diff --git a/bbb-graphql-middleware/internal/websrv/reader/reader.go b/bbb-graphql-middleware/internal/websrv/reader/reader.go index a5f2fd9c0c..5d3b66d565 100644 --- a/bbb-graphql-middleware/internal/websrv/reader/reader.go +++ b/bbb-graphql-middleware/internal/websrv/reader/reader.go @@ -35,6 +35,7 @@ func BrowserConnectionReader( for { messageType, message, err := browserConnection.Websocket.Read(browserConnection.Context) + if err != nil { if errors.Is(err, context.Canceled) { browserConnection.Logger.Debugf("Closing Browser ws connection as Context was cancelled!") @@ -45,6 +46,9 @@ func BrowserConnectionReader( } browserConnection.Logger.Tracef("received from browser: %s", string(message)) + browserConnection.LastBrowserMessageTimeMutex.Lock() + browserConnection.LastBrowserMessageTime = time.Now() + browserConnection.LastBrowserMessageTimeMutex.Unlock() if messageType != websocket.MessageText { browserConnection.Logger.Warnf("received non-text message: %v", messageType) diff --git a/bbb-graphql-server/bbb_schema.sql b/bbb-graphql-server/bbb_schema.sql index 941b6b5491..44b143aef4 100644 --- a/bbb-graphql-server/bbb_schema.sql +++ b/bbb-graphql-server/bbb_schema.sql @@ -173,8 +173,8 @@ SELECT "meeting_usersPolicies"."meetingId", create table "meeting_metadata" ( "meetingId" varchar(100) references "meeting"("meetingId") ON DELETE CASCADE, - "name" varchar(100), - "value" varchar(100), + "name" varchar(255), + "value" varchar(1000), CONSTRAINT "meeting_metadata_pkey" PRIMARY KEY ("meetingId","name") ); create index "idx_meeting_metadata_meetingId" on "meeting_metadata"("meetingId"); @@ -272,10 +272,12 @@ CREATE TABLE "user" ( "authToken" varchar(16), "authed" bool, "joined" bool, + "firstJoinedAt" timestamp with time zone, "joinErrorCode" varchar(50), "joinErrorMessage" varchar(400), "banned" bool, "loggedOut" bool, -- when user clicked Leave meeting button + "bot" bool, -- used to flag au "guest" bool, --used for dialIn "guestStatus" varchar(50), "registeredOn" bigint, @@ -315,6 +317,32 @@ create index "idx_user_pk_reverse" on "user" ("userId", "meetingId"); CREATE INDEX "idx_user_meetingId" ON "user"("meetingId"); CREATE INDEX "idx_user_extId" ON "user"("meetingId", "extId"); +-- user (on update raiseHand or away: set new time) +CREATE OR REPLACE FUNCTION update_user_raiseHand_away_time_trigger_func() +RETURNS TRIGGER AS $$ +BEGIN + IF NEW."raiseHand" IS DISTINCT FROM OLD."raiseHand" THEN + IF NEW."raiseHand" is false THEN + NEW."raiseHandTime" := NULL; + ELSE + NEW."raiseHandTime" := NOW(); + END IF; + END IF; + IF NEW."away" IS DISTINCT FROM OLD."away" THEN + IF NEW."away" is false THEN + NEW."awayTime" := NULL; + ELSE + NEW."awayTime" := NOW(); + END IF; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER update_user_raiseHand_away_time_trigger BEFORE UPDATE OF "raiseHand", "away" ON "user" + FOR EACH ROW EXECUTE FUNCTION update_user_raiseHand_away_time_trigger_func(); + + --hasDrawPermissionOnCurrentPage is necessary to improve the performance of the order by of userlist COMMENT ON COLUMN "user"."hasDrawPermissionOnCurrentPage" IS 'This column is dynamically populated by triggers of tables: user, pres_presentation, pres_page, pres_page_writers'; COMMENT ON COLUMN "user"."disconnected" IS 'This column is set true when the user closes the window or his with the server is over'; @@ -329,6 +357,28 @@ ALTER TABLE "user" ADD COLUMN "isDenied" boolean GENERATED ALWAYS AS ("guestStat ALTER TABLE "user" ADD COLUMN "registeredAt" timestamp with time zone GENERATED ALWAYS AS (to_timestamp("registeredOn"::double precision / 1000)) STORED; +--Populate column `firstJoinedAt` to register if the user has joined in the meeting (once column `joined` turn false when user leaves) +CREATE OR REPLACE FUNCTION "set_user_firstJoinedAt_trigger_func"() +RETURNS TRIGGER AS $$ +BEGIN + IF NEW."joined" is true AND NEW."firstJoinedAt" IS NULL THEN + NEW."firstJoinedAt" := NOW(); + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER "set_user_firstJoinedAt_ins_trigger" +BEFORE INSERT ON "user" +FOR EACH ROW +EXECUTE FUNCTION "set_user_firstJoinedAt_trigger_func"(); + +CREATE TRIGGER "set_user_firstJoinedAt_upd_trigger" +BEFORE UPDATE ON "user" +FOR EACH ROW +WHEN (OLD."joined" IS DISTINCT FROM NEW."joined") +EXECUTE FUNCTION "set_user_firstJoinedAt_trigger_func"(); + --Used to sort the Userlist ALTER TABLE "user" ADD COLUMN "nameSortable" varchar(255) GENERATED ALWAYS AS (trim(remove_emojis(immutable_lower_unaccent("name")))) STORED; @@ -359,6 +409,7 @@ AS SELECT "user"."userId", "user"."raiseHandTime", "user"."reactionEmoji", "user"."reactionEmojiTime", + "user"."bot", "user"."guest", "user"."guestStatus", "user"."mobile", @@ -506,11 +557,22 @@ AS SELECT "user"."currentlyInMeeting" FROM "user"; +--Provide users that have joined in the meeting, either who is currently in meeting or has left +CREATE OR REPLACE VIEW "v_user_presenceLog" +AS SELECT + "user"."meetingId", + "user"."userId", + "user"."extId", + CASE WHEN "user"."role" = 'MODERATOR' THEN true ELSE false END "isModerator", + "user"."currentlyInMeeting" +FROM "user" +where "firstJoinedAt" is not null; + create table "user_metadata"( "meetingId" varchar(100), "userId" varchar(50), "parameter" varchar(255), - "value" varchar(255), + "value" varchar(1000), CONSTRAINT "user_metadata_pkey" PRIMARY KEY ("meetingId", "userId","parameter"), FOREIGN KEY ("meetingId", "userId") REFERENCES "user"("meetingId","userId") ON DELETE CASCADE ); @@ -1140,6 +1202,7 @@ CREATE TABLE "chat_message_reaction" ( "messageId" varchar(100) REFERENCES "chat_message"("messageId") ON DELETE CASCADE, "userId" varchar(100) not null, "reactionEmoji" varchar(25), + "reactionEmojiId" varchar(50), "createdAt" timestamp with time zone, CONSTRAINT chat_message_reaction_pk PRIMARY KEY ("messageId", "userId", "reactionEmoji"), FOREIGN KEY ("meetingId", "userId") REFERENCES "user"("meetingId","userId") ON DELETE CASCADE @@ -1561,6 +1624,7 @@ FROM poll JOIN v_user u ON u."meetingId" = poll."meetingId" AND "isDialIn" IS FALSE AND presenter IS FALSE LEFT JOIN poll_response r ON r."pollId" = poll."pollId" AND r."userId" = u."userId" LEFT JOIN poll_option o ON o."pollId" = r."pollId" AND o."optionId" = r."optionId" +WHERE u."bot" IS FALSE GROUP BY poll."pollId", u."meetingId", u."userId"; CREATE VIEW "v_poll" AS SELECT * FROM "poll"; @@ -2063,6 +2127,18 @@ and n."createdAt" > current_timestamp - '5 seconds'::interval; create index idx_notification on notification("meetingId","userId","role","createdAt"); +-- ========== Plugin tables + +create table "plugin" ( + "meetingId" varchar(100), + "name" varchar(100), + "javascriptEntrypointUrl" varchar(500), + "javascriptEntrypointIntegrity" varchar(500), + CONSTRAINT "plugin_pk" PRIMARY KEY ("meetingId","name"), + FOREIGN KEY ("meetingId") REFERENCES "meeting"("meetingId") ON DELETE CASCADE +); + +create view "v_plugin" as select * from "plugin"; -------------------------------- ---Plugins Data Channel diff --git a/bbb-graphql-server/metadata/actions.graphql b/bbb-graphql-server/metadata/actions.graphql index 9b8cdce870..9fdacb3fc4 100644 --- a/bbb-graphql-server/metadata/actions.graphql +++ b/bbb-graphql-server/metadata/actions.graphql @@ -114,6 +114,7 @@ type Mutation { chatId: String! messageId: String! reactionEmoji: String! + reactionEmojiId: String! ): Boolean } @@ -149,6 +150,7 @@ type Mutation { chatId: String! messageId: String! reactionEmoji: String! + reactionEmojiId: String! ): Boolean } diff --git a/bbb-graphql-server/metadata/databases/BigBlueButton/tables/public_v_chat_message_reaction.yaml b/bbb-graphql-server/metadata/databases/BigBlueButton/tables/public_v_chat_message_reaction.yaml index 5c77a11d1a..76ef54cc3f 100644 --- a/bbb-graphql-server/metadata/databases/BigBlueButton/tables/public_v_chat_message_reaction.yaml +++ b/bbb-graphql-server/metadata/databases/BigBlueButton/tables/public_v_chat_message_reaction.yaml @@ -23,6 +23,7 @@ select_permissions: columns: - createdAt - reactionEmoji + - reactionEmojiId - userId filter: meetingId: diff --git a/bbb-graphql-server/metadata/databases/BigBlueButton/tables/public_v_plugin.yaml b/bbb-graphql-server/metadata/databases/BigBlueButton/tables/public_v_plugin.yaml new file mode 100644 index 0000000000..2862b820dd --- /dev/null +++ b/bbb-graphql-server/metadata/databases/BigBlueButton/tables/public_v_plugin.yaml @@ -0,0 +1,29 @@ +table: + name: v_plugin + schema: public +configuration: + column_config: {} + custom_column_names: {} + custom_name: plugin + custom_root_fields: {} +select_permissions: + - role: bbb_client + permission: + columns: + - javascriptEntrypointIntegrity + - javascriptEntrypointUrl + - name + filter: + meetingId: + _eq: X-Hasura-MeetingId + comment: "" + - role: bbb_client_not_in_meeting + permission: + columns: + - javascriptEntrypointIntegrity + - javascriptEntrypointUrl + - name + filter: + meetingId: + _eq: X-Hasura-MeetingId + comment: "" diff --git a/bbb-graphql-server/metadata/databases/BigBlueButton/tables/public_v_user.yaml b/bbb-graphql-server/metadata/databases/BigBlueButton/tables/public_v_user.yaml index b549789786..8386a3e0a1 100644 --- a/bbb-graphql-server/metadata/databases/BigBlueButton/tables/public_v_user.yaml +++ b/bbb-graphql-server/metadata/databases/BigBlueButton/tables/public_v_user.yaml @@ -88,6 +88,7 @@ select_permissions: - disconnected - expired - extId + - bot - guest - guestStatus - hasDrawPermissionOnCurrentPage diff --git a/bbb-graphql-server/metadata/databases/BigBlueButton/tables/public_v_user_presenceLog.yaml b/bbb-graphql-server/metadata/databases/BigBlueButton/tables/public_v_user_presenceLog.yaml new file mode 100644 index 0000000000..bac23a9a41 --- /dev/null +++ b/bbb-graphql-server/metadata/databases/BigBlueButton/tables/public_v_user_presenceLog.yaml @@ -0,0 +1,26 @@ +table: + name: v_user_presenceLog + schema: public +configuration: + column_config: {} + custom_column_names: {} + custom_name: user_presenceLog + custom_root_fields: {} +select_permissions: + - role: bbb_client + permission: + columns: + - currentlyInMeeting + - extId + - isModerator + - userId + filter: + _and: + - meetingId: + _eq: X-Hasura-MeetingId + - _or: + - isModerator: + _eq: true + - meetingId: + _eq: X-Hasura-UserListNotLockedInMeeting + comment: "" diff --git a/bbb-graphql-server/metadata/databases/BigBlueButton/tables/tables.yaml b/bbb-graphql-server/metadata/databases/BigBlueButton/tables/tables.yaml index 4503ba1e3f..8950a03875 100644 --- a/bbb-graphql-server/metadata/databases/BigBlueButton/tables/tables.yaml +++ b/bbb-graphql-server/metadata/databases/BigBlueButton/tables/tables.yaml @@ -26,6 +26,7 @@ - "!include public_v_meeting_usersPolicies.yaml" - "!include public_v_meeting_voiceSettings.yaml" - "!include public_v_notification.yaml" +- "!include public_v_plugin.yaml" - "!include public_v_pluginDataChannelEntry.yaml" - "!include public_v_poll.yaml" - "!include public_v_poll_option.yaml" @@ -55,6 +56,7 @@ - "!include public_v_user_guest.yaml" - "!include public_v_user_lockSettings.yaml" - "!include public_v_user_metadata.yaml" +- "!include public_v_user_presenceLog.yaml" - "!include public_v_user_reaction.yaml" - "!include public_v_user_ref.yaml" - "!include public_v_user_transcriptionError.yaml" diff --git a/bbb-learning-dashboard/package-lock.json b/bbb-learning-dashboard/package-lock.json index 1264120559..2fcceca57f 100644 --- a/bbb-learning-dashboard/package-lock.json +++ b/bbb-learning-dashboard/package-lock.json @@ -5393,9 +5393,9 @@ } }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "engines": { "node": ">= 0.6" } @@ -7013,16 +7013,16 @@ } }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -8039,8 +8039,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "license": "MIT", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -19150,9 +19151,9 @@ } }, "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==" }, "cookie-signature": { "version": "1.0.6" @@ -20131,16 +20132,16 @@ } }, "express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -20773,7 +20774,9 @@ } }, "http-proxy-middleware": { - "version": "2.0.6", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "requires": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", diff --git a/bbb-learning-dashboard/src/App.js b/bbb-learning-dashboard/src/App.js index fb26182df4..c8eaa749f8 100644 --- a/bbb-learning-dashboard/src/App.js +++ b/bbb-learning-dashboard/src/App.js @@ -25,6 +25,8 @@ const TABS = { TIMELINE: 2, POLLING: 3, }; +const LEARNING_DASHBOARD_LEARN_MORE_LINK = 'learning-dashboard-learn-more-link'; +const LEARNING_DASHBOARD_FEEDBACK_LINK = 'learning-dashboard-feedback-link'; class App extends React.Component { constructor(props) { @@ -168,12 +170,28 @@ class App extends React.Component { learningDashboardAccessToken, meetingId, sessionToken, invalidSessionCount, } = this.state; + // adjust user sessions to be compatible with old json + const convertUserUsessionsFormat = (activitiesJson) => { + const newActivivies = activitiesJson; + Object.values(newActivivies.users).forEach((user) => { + Object.values(user.intIds).forEach((intId) => { + if (!intId?.sessions && intId?.registeredOn) { + const newIntId = intId; + newIntId.sessions = [ + { registeredOn: intId.registeredOn, leftOn: intId.leftOn }, + ]; + } + }); + }); + return newActivivies; + }; + if (learningDashboardAccessToken !== '') { fetch(`${meetingId}/${learningDashboardAccessToken}/learning_dashboard_data.json`) .then((response) => response.json()) .then((json) => { this.setState({ - activitiesJson: json, + activitiesJson: convertUserUsessionsFormat(json), loading: false, invalidSessionCount: 0, lastUpdated: Date.now(), @@ -254,13 +272,17 @@ class App extends React.Component { ]), []); const minTime = Object.values(usersTimes || {}).reduce((prevVal, elem) => { - if (prevVal === 0 || elem.registeredOn < prevVal) return elem.registeredOn; + if (prevVal === 0 || elem.sessions[0].registeredOn < prevVal) { + return elem.sessions[0].registeredOn; + } return prevVal; }, 0); const maxTime = Object.values(usersTimes || {}).reduce((prevVal, elem) => { - if (elem.leftOn === 0) return (new Date()).getTime(); - if (elem.leftOn > prevVal) return elem.leftOn; + if (elem.sessions[elem.sessions.length - 1].leftOn === 0) return (new Date()).getTime(); + if (elem.sessions[elem.sessions.length - 1].leftOn > prevVal) { + return elem.sessions[elem.sessions.length - 1].leftOn; + } return prevVal; }, 0); @@ -341,7 +363,7 @@ class App extends React.Component { return (
-

+

{ ldAccessTokenCopied === true @@ -353,6 +375,27 @@ class App extends React.Component { : null }
+ { activitiesJson?.other + && activitiesJson.other[LEARNING_DASHBOARD_LEARN_MORE_LINK] !== '' + && ( + <> + + {intl.formatMessage({ id: 'app.learningDashboard.learnMore', defaultMessage: 'Learn more about the use of the Dashboard in {0} from our Knowledge Base.' }, { + 0: ( + + {intl.formatMessage({ id: 'app.learningDashboard.learnMoreLinkText', defaultMessage: 'this article' })} + + ), + })} + +
+ + )} {activitiesJson.name || ''}

@@ -609,6 +652,27 @@ class App extends React.Component {
+ { activitiesJson?.other + && activitiesJson.other[LEARNING_DASHBOARD_FEEDBACK_LINK] !== '' + && ( + <> +
+ { intl.formatMessage({ id: 'app.learningDashboard.feedback', defaultMessage: 'How has your experience been with this feature? We would love to hear your opinion and even suggestions on how we can improve it. Share with us by clicking {0}.' }, { + 0: ( + + {intl.formatMessage({ id: 'app.learningDashboard.feedbackLinkText', defaultMessage: 'here' })} + + ), + })} +
+
+ + )}

diff --git a/bbb-learning-dashboard/src/components/StatusTable.jsx b/bbb-learning-dashboard/src/components/StatusTable.jsx index 56c19cf813..16e85e29fa 100644 --- a/bbb-learning-dashboard/src/components/StatusTable.jsx +++ b/bbb-learning-dashboard/src/components/StatusTable.jsx @@ -66,29 +66,39 @@ class StatusTable extends React.Component { Object.values(allUsers || {}).forEach((user) => { usersPeriods[user.userKey] = []; Object.values(user.intIds || {}).forEach((intId, index, intIdsArray) => { - let { leftOn } = intId; - const nextPeriod = intIdsArray[index + 1]; - if (nextPeriod && Math.abs(leftOn - nextPeriod.registeredOn) <= 30000) { - leftOn = nextPeriod.leftOn; - intIdsArray.splice(index + 1, 1); - } - usersPeriods[user.userKey].push({ - registeredOn: intId.registeredOn, - leftOn, + intId.sessions.forEach((session, sessionIndex, sessionArray) => { + let { leftOn } = session; + const nextSession = sessionArray[sessionIndex + 1]; + if (nextSession && Math.abs(leftOn - nextSession.registeredOn) <= 30000) { + leftOn = nextSession.leftOn; + sessionArray.splice(sessionIndex + 1, 1); + } + if (!nextSession) { + const nextPeriod = intIdsArray[index + 1]; + if (nextPeriod && Math.abs(leftOn - nextPeriod.sessions[0].registeredOn) <= 30000) { + leftOn = nextPeriod.sessions[0].leftOn; + intIdsArray.splice(index + 1, 1); + } + } + usersPeriods[user.userKey].push({ + registeredOn: session.registeredOn, + leftOn, + }); }); }); }); const usersRegisteredTimes = Object .values(allUsers || {}) - .map((user) => Object.values(user.intIds).map((intId) => intId.registeredOn)) + .map((user) => Object.values(user.intIds) + .map((intId) => intId.sessions.map((session) => session.registeredOn)).flat()) .flat(); const usersLeftTimes = Object .values(allUsers || {}) - .map((user) => Object.values(user.intIds).map((intId) => { - if (intId.leftOn === 0) return (new Date()).getTime(); - return intId.leftOn; - })) + .map((user) => Object.values(user.intIds).map((intId) => intId.sessions.map((session) => { + if (session.leftOn === 0) return (new Date()).getTime(); + return session.leftOn; + })).flat()) .flat(); const firstRegisteredOnTime = Math.min(...usersRegisteredTimes); diff --git a/bbb-learning-dashboard/src/components/UserDetails/component.jsx b/bbb-learning-dashboard/src/components/UserDetails/component.jsx index 73c181325f..f0b4484586 100644 --- a/bbb-learning-dashboard/src/components/UserDetails/component.jsx +++ b/bbb-learning-dashboard/src/components/UserDetails/component.jsx @@ -53,11 +53,14 @@ const UserDatailsComponent = (props) => { const currTime = () => new Date().getTime(); // Join and left times. - const registeredTimes = Object.values(user.intIds).map((intId) => intId.registeredOn); - const leftTimes = Object.values(user.intIds).map((intId) => intId.leftOn); + const registeredTimes = Object.values(user.intIds) + .map((intId) => intId.sessions.map((session) => session.registeredOn)).flat(); + const leftTimes = Object.values(user.intIds) + .map((intId) => intId.sessions.map((session) => session.leftOn)).flat(); const joinTime = Math.min(...registeredTimes); const leftTime = Math.max(...leftTimes); - const currentlyInMeeting = Object.values(user.intIds).some((intId) => intId.leftOn === 0); + const currentlyInMeeting = Object.values(user.intIds) + .some((intId) => intId.sessions.some((session) => session.leftOn === 0)); // Used in the calculation of the online loader. const sessionDuration = (endedOn || currTime()) - createdOn; diff --git a/bbb-learning-dashboard/src/components/UsersTable.jsx b/bbb-learning-dashboard/src/components/UsersTable.jsx index 38f3ea0209..b14773742f 100644 --- a/bbb-learning-dashboard/src/components/UsersTable.jsx +++ b/bbb-learning-dashboard/src/components/UsersTable.jsx @@ -100,15 +100,17 @@ class UsersTable extends React.Component { }, onlineTimeOrder(a, b) { const onlineTimeA = Object.values(a.intIds).reduce((prev, intId) => ( - prev + ((intId.leftOn > 0 - ? intId.leftOn - : (new Date()).getTime()) - intId.registeredOn) + prev + intId.sessions.reduce((prev2, session) => ( + prev2 + (session.leftOn > 0 + ? session.leftOn + : (new Date()).getTime()) - session.registeredOn), 0) ), 0); const onlineTimeB = Object.values(b.intIds).reduce((prev, intId) => ( - prev + ((intId.leftOn > 0 - ? intId.leftOn - : (new Date()).getTime()) - intId.registeredOn) + prev + intId.sessions.reduce((prev2, session) => ( + prev2 + (session.leftOn > 0 + ? session.leftOn + : (new Date()).getTime()) - session.registeredOn), 0) ), 0); if (onlineTimeA < onlineTimeB) { @@ -251,68 +253,70 @@ class UsersTable extends React.Component { > {user.name} - { Object.values(user.intIds || {}).map((intId, index) => ( - <> -

- - - - -

- { intId.leftOn > 0 - ? ( -

- - - - - intId.sessions + .map((session, sessionIndex) => ( + <> +

+ + -

- ) - : null } - { index === Object.values(user.intIds).length - 1 - ? null - : ( -
- ) } - - )) } + + +

+ { session.leftOn > 0 + ? ( +

+ + + + + +

+ ) + : null } + { index === Object.values(user.intIds).length - 1 + && sessionIndex === intId?.sessions.length - 1 + ? null + : ( +
+ ) } + + ))) }
@@ -332,16 +336,17 @@ class UsersTable extends React.Component {   { tsToHHmmss(Object.values(user.intIds).reduce((prev, intId) => ( - prev + ((intId.leftOn > 0 - ? intId.leftOn - : (new Date()).getTime()) - intId.registeredOn) - ), 0)) } + prev + intId.sessions.reduce((prev2, session) => ((session.leftOn > 0 + ? prev2 + session.leftOn + : prev2 + (new Date()).getTime()) - session.registeredOn), 0)), 0)) }
{ (function getPercentage() { const { intIds } = user; const percentage = Object.values(intIds || {}).reduce((prev, intId) => ( - prev + getOnlinePercentage(intId.registeredOn, intId.leftOn) + prev + intId.sessions.reduce((prev2, session) => ( + prev2 + getOnlinePercentage(session.registeredOn, session.leftOn) + ), 0) ), 0); return ( @@ -475,7 +480,8 @@ class UsersTable extends React.Component { } { - Object.values(user.intIds)[Object.values(user.intIds).length - 1].leftOn > 0 + Object.values(user.intIds)[Object.values(user.intIds).length - 1] + .sessions.slice(-1)[0].leftOn > 0 ? ( diff --git a/bbb-learning-dashboard/src/index.js b/bbb-learning-dashboard/src/index.js index 230bb791e4..c915338081 100644 --- a/bbb-learning-dashboard/src/index.js +++ b/bbb-learning-dashboard/src/index.js @@ -7,6 +7,24 @@ import { UserDetailsProvider } from './components/UserDetails/context'; const RTL_LANGUAGES = ['ar', 'dv', 'fa', 'he']; +function isValidLocale(locale) { + try { + const intl = new Intl.Locale(locale); + return !!intl; + } catch (error) { + return false; + } +} + +function normalizeLocale(lang) { + const lParts = lang.split('-'); + + // 'pt' returns 'pt' + // 'pt-br' and 'pt-BR' return 'pt_BR' + // 'pt_BR' returns 'pt_BR' + return lParts.length > 1 ? `${lParts[0]}_${lParts[1].toUpperCase()}` : lang; +} + function getLanguage() { let { language } = navigator; @@ -34,7 +52,7 @@ class Dashboard extends React.Component { setMessages() { const fetchMessages = (lang) => new Promise((resolve, reject) => { - const url = `/html5client/locales/${lang.replace('-', '_')}.json`; + const url = `/html5client/locales/${normalizeLocale(lang)}.json`; fetch(url).then((response) => { if (!response.ok) return reject(); return resolve(response.json()); @@ -70,9 +88,11 @@ class Dashboard extends React.Component { render() { const { intlLocale, intlMessages } = this.state; + const locale = isValidLocale(intlLocale) ? intlLocale : undefined; + return ( - + diff --git a/bbb-learning-dashboard/src/services/UserService.js b/bbb-learning-dashboard/src/services/UserService.js index 516600820d..7c80df6fff 100644 --- a/bbb-learning-dashboard/src/services/UserService.js +++ b/bbb-learning-dashboard/src/services/UserService.js @@ -46,6 +46,14 @@ export function getActivityScore(user, allUsers, totalOfPolls) { export function getSumOfTime(eventsArr) { return eventsArr.reduce((prevVal, elem) => { + if (elem?.sessions) { + return prevVal + elem.sessions.reduce((prevVal2, session) => { + if (session.leftOn > 0) { + return prevVal2 + (session.leftOn - session.registeredOn); + } + return prevVal2 + (new Date().getTime() - session.registeredOn); + }, 0); + } if ((elem.stoppedOn || elem.leftOn) > 0) { return prevVal + ((elem.stoppedOn || elem.leftOn) - (elem.startedOn || elem.registeredOn)); } @@ -55,8 +63,8 @@ export function getSumOfTime(eventsArr) { export function getJoinTime(eventsArr) { return eventsArr.reduce((prevVal, elem) => { - if (prevVal === 0 || elem.registeredOn < prevVal) { - return elem.registeredOn; + if (prevVal === 0 || elem.sessions[0].registeredOn < prevVal) { + return elem.sessions[0].registeredOn; } return prevVal; }, 0); @@ -64,8 +72,8 @@ export function getJoinTime(eventsArr) { export function getLeaveTime(eventsArr) { return eventsArr.reduce((prevVal, elem) => { - if (elem.leftOn > prevVal) { - return elem.leftOn; + if (elem.sessions[elem.sessions.length - 1].leftOn > prevVal) { + return elem.sessions[elem.sessions.length - 1].leftOn; } return prevVal; }, 0); @@ -203,8 +211,8 @@ export function makeUserCSVData(users, polls, intl) { } for (let i = 0; i < pollValues.length; i += 1) { - // Add the poll question headers - header += `,${pollValues[i].question || `Poll ${i + 1}`}`; + // Add the poll question headers (remove spaces and line breaks) + header += `,${pollValues[i].question.replace(/\s+/g, ' ').trim() || `Poll ${i + 1}`}`; // Add the anonymous answers anonymousRecord += `,"${pollValues[i].anonymousAnswers.join('\r\n')}"`; diff --git a/bigbluebutton-config/bigbluebutton-release b/bigbluebutton-config/bigbluebutton-release index 25ea812564..6ddb66d9f3 100644 --- a/bigbluebutton-config/bigbluebutton-release +++ b/bigbluebutton-config/bigbluebutton-release @@ -1 +1 @@ -BIGBLUEBUTTON_RELEASE=3.0.0-beta.3 +BIGBLUEBUTTON_RELEASE=3.0.0-beta.4 diff --git a/bigbluebutton-html5/client/main.tsx b/bigbluebutton-html5/client/main.tsx index 65a798a797..f7c8cb924b 100644 --- a/bigbluebutton-html5/client/main.tsx +++ b/bigbluebutton-html5/client/main.tsx @@ -3,17 +3,15 @@ import ConnectionManager from '/imports/ui/components/connection-manager/compone import { createRoot } from 'react-dom/client'; import SettingsLoader from '/imports/ui/components/settings-loader/component'; import ErrorBoundary from '/imports/ui/components/common/error-boundary/component'; -import { ErrorScreen } from '/imports/ui/components/error-screen/component'; +import ErrorScreen from '/imports/ui/components/error-screen/component'; import PresenceManager from '/imports/ui/components/join-handler/presenceManager/component'; import LoadingScreenHOC from '/imports/ui/components/common/loading-screen/loading-screen-HOC/component'; import IntlLoaderContainer from '/imports/startup/client/intlLoader'; -import LocatedErrorBoundary from '/imports/ui/components/common/error-boundary/located-error-boundary/component'; import CustomUsersSettings from '/imports/ui/components/join-handler/custom-users-settings/component'; import MeetingClient from '/client/meetingClient'; import CustomStyles from '/imports/ui/components/custom-styles/component'; const STARTUP_CRASH_METADATA = { logCode: 'app_startup_crash', logMessage: 'Possible startup crash' }; -const APP_CRASH_METADATA = { logCode: 'app_crash', logMessage: 'Possible app crash' }; /* eslint-disable */ if ( process.env.NODE_ENV === 'production' @@ -40,30 +38,23 @@ const Main: React.FC = () => { return ( - - - - - {/* from there the error messages are located */} - - - - - - - - - - - + + + + + + + + + + + + + ); diff --git a/bigbluebutton-html5/client/meetingClient.jsx b/bigbluebutton-html5/client/meetingClient.jsx index 1718c9e364..4e7267a4f9 100755 --- a/bigbluebutton-html5/client/meetingClient.jsx +++ b/bigbluebutton-html5/client/meetingClient.jsx @@ -31,6 +31,8 @@ import { LoadingContext } from '/imports/ui/components/common/loading-screen/loa import IntlAdapter from '/imports/startup/client/intlAdapter'; import PresenceAdapter from '../imports/ui/components/presence-adapter/component'; import CustomUsersSettings from '/imports/ui/components/join-handler/custom-users-settings/component'; +import createUseSubscription from '/imports/ui/core/hooks/createUseSubscription'; +import PLUGIN_CONFIGURATION_QUERY from '/imports/ui/components/plugins-engine/query'; // eslint-disable-next-line import/prefer-default-export const Startup = () => { @@ -60,11 +62,14 @@ const Startup = () => { }, message); }); + const { data: pluginConfig } = createUseSubscription( + PLUGIN_CONFIGURATION_QUERY, + )((obj) => obj); return ( - + diff --git a/bigbluebutton-html5/imports/api/audio/client/bridge/sfu-audio-bridge.js b/bigbluebutton-html5/imports/api/audio/client/bridge/sfu-audio-bridge.js index deda52f716..a18d7afa16 100755 --- a/bigbluebutton-html5/imports/api/audio/client/bridge/sfu-audio-bridge.js +++ b/bigbluebutton-html5/imports/api/audio/client/bridge/sfu-audio-bridge.js @@ -362,7 +362,7 @@ export default class SFUAudioBridge extends BaseAudioBridge { const handleInitError = (_error) => { mapErrorCode(_error); - if (RETRYABLE_ERRORS.includes(_error?.errorCode) + if (!RETRYABLE_ERRORS.includes(_error?.errorCode) || !RETRY_THROUGH_RELAY || this.reconnecting) { reject(_error); diff --git a/bigbluebutton-html5/imports/startup/client/intlAdapter.tsx b/bigbluebutton-html5/imports/startup/client/intlAdapter.tsx index d0ad1d0032..3773f1146d 100644 --- a/bigbluebutton-html5/imports/startup/client/intlAdapter.tsx +++ b/bigbluebutton-html5/imports/startup/client/intlAdapter.tsx @@ -34,7 +34,7 @@ const IntlAdapter: React.FC = ({ useEffect(() => { intlHolder.setIntl(intl); - }, [currentLocale]); + }, [intl]); const sendUiDataToPlugins = () => { window.dispatchEvent(new CustomEvent(PluginSdk.IntlLocaleUiDataNames.CURRENT_LOCALE, { diff --git a/bigbluebutton-html5/imports/ui/Types/meetingClientSettings.ts b/bigbluebutton-html5/imports/ui/Types/meetingClientSettings.ts index 2c1f834ae4..d49ad15f85 100644 --- a/bigbluebutton-html5/imports/ui/Types/meetingClientSettings.ts +++ b/bigbluebutton-html5/imports/ui/Types/meetingClientSettings.ts @@ -526,6 +526,7 @@ export interface Chat { emojiPicker: EmojiPicker disableEmojis: string[] allowedElements: string[] + toolbar: string[] } export interface SystemMessagesKeys { diff --git a/bigbluebutton-html5/imports/ui/Types/message.ts b/bigbluebutton-html5/imports/ui/Types/message.ts index 7e2b582a40..e10d6c6ad4 100644 --- a/bigbluebutton-html5/imports/ui/Types/message.ts +++ b/bigbluebutton-html5/imports/ui/Types/message.ts @@ -5,6 +5,11 @@ export interface Message { chatId: string; correlationId: string; createdAt: string; + editedAt: string | null; + deletedAt: string | null; + deletedBy: { + name: string; + } | null; meetingId: string; message: string; messageType: string; @@ -15,4 +20,28 @@ export interface Message { messageMetadata: string; recipientHasSeen: string; user: User; + messageSequence: number; + replyToMessage: { + editedAt: string | null; + deletedAt: string | null; + deletedBy: { + name: string; + } | null; + messageSequence: number; + message: string | null; + chatEmphasizedText: boolean; + user: { + name: string; + color: string; + }; + } | null; + reactions: { + createdAt: string; + reactionEmoji: string; + reactionEmojiId: string; + user: { + name: string; + userId: string; + } + }[]; } diff --git a/bigbluebutton-html5/imports/ui/Types/user.ts b/bigbluebutton-html5/imports/ui/Types/user.ts index 98ec803251..321a173d72 100644 --- a/bigbluebutton-html5/imports/ui/Types/user.ts +++ b/bigbluebutton-html5/imports/ui/Types/user.ts @@ -89,6 +89,7 @@ export interface User { reactionEmoji: string; presenter?: boolean; pinned?: boolean; + bot?: boolean; guest?: boolean; guestStatus: string; joinErrorCode: string; diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/actions-dropdown/container.jsx b/bigbluebutton-html5/imports/ui/components/actions-bar/actions-dropdown/container.jsx index 24d96c54bf..4c0b435e0c 100644 --- a/bigbluebutton-html5/imports/ui/components/actions-bar/actions-dropdown/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/actions-bar/actions-dropdown/container.jsx @@ -34,7 +34,9 @@ const ActionsDropdownContainer = (props) => { let actionButtonDropdownItems = []; if (pluginsExtensibleAreasAggregatedState.actionButtonDropdownItems) { - actionButtonDropdownItems = [...pluginsExtensibleAreasAggregatedState.actionButtonDropdownItems]; + actionButtonDropdownItems = [ + ...pluginsExtensibleAreasAggregatedState.actionButtonDropdownItems, + ]; } const openActions = useShortcut('openActions'); diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/component.jsx b/bigbluebutton-html5/imports/ui/components/actions-bar/component.jsx index efb679ab53..40690a4a1c 100755 --- a/bigbluebutton-html5/imports/ui/components/actions-bar/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/actions-bar/component.jsx @@ -12,6 +12,7 @@ import Button from '/imports/ui/components/common/button/component'; import { getSettingsSingletonInstance } from '/imports/ui/services/settings'; import { LAYOUT_TYPE } from '../layout/enums'; import ReactionsButtonContainer from '/imports/ui/components/actions-bar/reactions-button/container'; +import RaiseHandButtonContainer from '/imports/ui/components/actions-bar/raise-hand-button/container'; const intlMessages = defineMessages({ actionsBarLabel: { @@ -180,6 +181,7 @@ class ActionsBar extends PureComponent { /> )} {this.renderReactionsButton()} + {this.renderPluginsActionBarItems(ActionsBarPosition.RIGHT)} diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/raise-hand-button/component.jsx b/bigbluebutton-html5/imports/ui/components/actions-bar/raise-hand-button/component.jsx new file mode 100644 index 0000000000..30d1206a10 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/actions-bar/raise-hand-button/component.jsx @@ -0,0 +1,77 @@ +import React from 'react'; +import { defineMessages } from 'react-intl'; +import PropTypes from 'prop-types'; +import data from '@emoji-mart/data'; +import withShortcutHelper from '/imports/ui/components/shortcut-help/service'; +import { init } from 'emoji-mart'; +import { SET_RAISE_HAND } from '/imports/ui/core/graphql/mutations/userMutations'; +import { useMutation } from '@apollo/client'; +import Styled from './styles'; + +const RaiseHandButton = (props) => { + const { + intl, + userId, + raiseHand, + shortcuts, + } = props; + + // initialize emoji-mart data, need for the new version + init({ data }); + + const [setRaiseHand] = useMutation(SET_RAISE_HAND); + + const intlMessages = defineMessages({ + raiseHandLabel: { + id: 'app.actionsBar.reactions.raiseHand', + description: 'raise Hand Label', + }, + notRaiseHandLabel: { + id: 'app.actionsBar.reactions.lowHand', + description: 'not Raise Hand Label', + }, + }); + + const handleRaiseHandButtonClick = () => { + setRaiseHand({ + variables: { + userId, + raiseHand: !raiseHand, + }, + }); + document.activeElement.blur(); + }; + + const label = raiseHand ? intlMessages.notRaiseHandLabel : intlMessages.raiseHandLabel; + + return ( + { }} + onClick={() => handleRaiseHandButtonClick()} + color={raiseHand ? 'primary' : 'default'} + accessKey={shortcuts.raisehand} + hideLabel + circle + size="lg" + /> + ); +}; + +const propTypes = { + intl: PropTypes.shape({ + formatMessage: PropTypes.func.isRequired, + }).isRequired, + userId: PropTypes.string.isRequired, + raiseHand: PropTypes.bool, + shortcuts: PropTypes.shape({ + raisehand: PropTypes.string, + }).isRequired, +}; + +RaiseHandButton.propTypes = propTypes; + +export default withShortcutHelper(RaiseHandButton, ['raiseHand']); diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/raise-hand-button/container.jsx b/bigbluebutton-html5/imports/ui/components/actions-bar/raise-hand-button/container.jsx new file mode 100644 index 0000000000..4926363310 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/actions-bar/raise-hand-button/container.jsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { injectIntl } from 'react-intl'; +import RaiseHandButton from './component'; +import Auth from '/imports/ui/services/auth'; +import useCurrentUser from '/imports/ui/core/hooks/useCurrentUser'; + +const RaiseHandButtonContainer = ({ ...props }) => { + const { data: currentUserData } = useCurrentUser((user) => ({ + raiseHand: user.raiseHand, + })); + + const currentUser = { + userId: Auth.userID, + raiseHand: currentUserData?.raiseHand, + }; + + return ( + + ); +}; + +export default injectIntl(RaiseHandButtonContainer); diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/raise-hand-button/styles.js b/bigbluebutton-html5/imports/ui/components/actions-bar/raise-hand-button/styles.js new file mode 100644 index 0000000000..feb776b104 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/actions-bar/raise-hand-button/styles.js @@ -0,0 +1,21 @@ +import styled from 'styled-components'; +import { colorWhite } from '/imports/ui/stylesheets/styled-components/palette'; +import Button from '/imports/ui/components/common/button/component'; + +const RaiseHandButton = styled(Button)` +${({ ghost }) => ghost && ` + & > span { + box-shadow: none; + background-color: transparent !important; + border-color: ${colorWhite} !important; + } + `} + + & span i { + left: -.05rem; + } +`; + +export default { + RaiseHandButton, +}; diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/reactions-button/component.jsx b/bigbluebutton-html5/imports/ui/components/actions-bar/reactions-button/component.jsx index bd736bbb5e..568056aa3e 100644 --- a/bigbluebutton-html5/imports/ui/components/actions-bar/reactions-button/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/actions-bar/reactions-button/component.jsx @@ -4,28 +4,16 @@ import PropTypes from 'prop-types'; import BBBMenu from '/imports/ui/components/common/menu/component'; import { convertRemToPixels } from '/imports/utils/dom-utils'; import data from '@emoji-mart/data'; -import withShortcutHelper from '/imports/ui/components/shortcut-help/service'; import { init } from 'emoji-mart'; -import { SET_RAISE_HAND, SET_REACTION_EMOJI } from '/imports/ui/core/graphql/mutations/userMutations'; -import { SET_AWAY } from '/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/user-actions/mutations'; +import { SET_REACTION_EMOJI } from '/imports/ui/core/graphql/mutations/userMutations'; import { useMutation } from '@apollo/client'; -import Toggle from '/imports/ui/components/common/switch/component'; -import useToggleVoice from '/imports/ui/components/audio/audio-graphql/hooks/useToggleVoice'; -import { - muteAway, -} from '/imports/ui/components/audio/audio-graphql/audio-controls/input-stream-live-selector/service'; import Styled from './styles'; const ReactionsButton = (props) => { const { intl, actionsBarRef, - userId, - raiseHand, - away, - muted, isMobile, - shortcuts, currentUserReaction, autoCloseReactionsBar, } = props; @@ -35,35 +23,15 @@ const ReactionsButton = (props) => { // initialize emoji-mart data, need for the new version init({ data }); - const [setRaiseHand] = useMutation(SET_RAISE_HAND); - const [setAway] = useMutation(SET_AWAY); const [setReactionEmoji] = useMutation(SET_REACTION_EMOJI); const [showEmojiPicker, setShowEmojiPicker] = useState(false); - const voiceToggle = useToggleVoice(); - const intlMessages = defineMessages({ reactionsLabel: { id: 'app.actionsBar.reactions.reactionsButtonLabel', description: 'reactions Label', }, - raiseHandLabel: { - id: 'app.actionsBar.reactions.raiseHand', - description: 'raise Hand Label', - }, - notRaiseHandLabel: { - id: 'app.actionsBar.reactions.lowHand', - description: 'not Raise Hand Label', - }, - setAwayLabel: { - id: 'app.actionsBar.reactions.setAway', - description: 'setAway Label', - }, - setActiveLabel: { - id: 'app.actionsBar.reactions.setActive', - description: 'setActive Label', - }, }); const handleClose = () => { @@ -77,37 +45,6 @@ const ReactionsButton = (props) => { setReactionEmoji({ variables: { reactionEmoji: reaction } }); }; - const handleRaiseHandButtonClick = () => { - setRaiseHand({ - variables: { - userId, - raiseHand: !raiseHand, - }, - }); - document.activeElement.blur(); - }; - - const handleToggleAFK = () => { - muteAway(muted, away, voiceToggle); - setAway({ - variables: { - away: !away, - }, - }); - }; - - const ToggleAFKLabel = () => (away - ? intl.formatMessage(intlMessages.setActiveLabel) - : intl.formatMessage(intlMessages.setAwayLabel)); - - const RaiseHandButtonLabel = () => { - if (isMobile) return null; - - return raiseHand - ? intl.formatMessage(intlMessages.notRaiseHandLabel) - : intl.formatMessage(intlMessages.raiseHandLabel); - }; - const customStyles = { top: '-1rem', borderRadius: '1.7rem', @@ -125,16 +62,6 @@ const ReactionsButton = (props) => { padding: '4px', }; - const handReaction = { - id: 'hand', - native: '✋', - }; - - const awayReaction = { - id: 'clock7', - native: '⏰', - }; - let actions = []; REACTIONS.forEach(({ id, native }) => { @@ -146,67 +73,20 @@ const ReactionsButton = (props) => { }); }); - actions.push({ - label: - {isMobile ? ( -
- {ToggleAFKLabel()} - -
- ) : ( - <> - - {ToggleAFKLabel()} - - )} -
, - key: 'none', - isToggle: true, - customStyles: { ...actionCustomStyles, width: 'auto' }, - }); - - actions.push({ - label: {RaiseHandButtonLabel()}, - key: 'hand', - onClick: () => handleRaiseHandButtonClick(), - customStyles: { ...actionCustomStyles, width: 'auto' }, - }); - - const svgIcon = !raiseHand && !away && currentUserReaction === 'none' ? 'reactions' : null; + const svgIcon = currentUserReaction === 'none' ? 'reactions' : null; const currentUserReactionEmoji = REACTIONS.find(({ native }) => native === currentUserReaction); let customIcon = null; - if (raiseHand) { - customIcon = ; - } else { - if (!svgIcon) { - customIcon = ; - } - } - - if (away) { - customIcon = ; + if (!svgIcon) { + customIcon = ; } return ( - { isHorizontal={!isMobile} isMobile={isMobile} isEmoji - roundButtons={true} + roundButtons keepOpen={!autoCloseReactionsBar} opts={{ id: 'reactions-dropdown-menu', @@ -253,9 +133,8 @@ const propTypes = { userId: PropTypes.string.isRequired, sidebarContentPanel: PropTypes.string.isRequired, layoutContextDispatch: PropTypes.func.isRequired, - muted: PropTypes.bool.isRequired, }; ReactionsButton.propTypes = propTypes; -export default withShortcutHelper(ReactionsButton, ['raiseHand']); +export default ReactionsButton; diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/reactions-button/container.jsx b/bigbluebutton-html5/imports/ui/components/actions-bar/reactions-button/container.jsx index 51c5807252..f07deb6e42 100644 --- a/bigbluebutton-html5/imports/ui/components/actions-bar/reactions-button/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/actions-bar/reactions-button/container.jsx @@ -7,7 +7,6 @@ import Auth from '/imports/ui/services/auth'; import useCurrentUser from '/imports/ui/core/hooks/useCurrentUser'; import useSettings from '/imports/ui/services/settings/hooks/useSettings'; import { SETTINGS } from '/imports/ui/services/settings/enums'; -import useWhoIsUnmuted from '/imports/ui/core/hooks/useWhoIsUnmuted'; const ReactionsButtonContainer = ({ ...props }) => { const layoutContextDispatch = layoutDispatch(); @@ -18,19 +17,8 @@ const ReactionsButtonContainer = ({ ...props }) => { const isMobile = browserWidth <= SMALL_VIEWPORT_BREAKPOINT; const { data: currentUserData } = useCurrentUser((user) => ({ - raiseHand: user.raiseHand, - away: user.away, - voice: user.voice, reactionEmoji: user.reactionEmoji, })); - const { data: unmutedUsers } = useWhoIsUnmuted(); - - const currentUser = { - userId: Auth.userID, - raiseHand: currentUserData?.raiseHand, - away: currentUserData?.away, - muted: !unmutedUsers[Auth.userID], - }; const { autoCloseReactionsBar } = useSettings(SETTINGS.APPLICATION); @@ -41,7 +29,7 @@ const ReactionsButtonContainer = ({ ...props }) => { sidebarContentPanel, isMobile, autoCloseReactionsBar, - ...currentUser, + userId: Auth.userID, ...props, }} /> diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/reactions-button/styles.js b/bigbluebutton-html5/imports/ui/components/actions-bar/reactions-button/styles.js index 177dac7461..aa3d55e09e 100644 --- a/bigbluebutton-html5/imports/ui/components/actions-bar/reactions-button/styles.js +++ b/bigbluebutton-html5/imports/ui/components/actions-bar/reactions-button/styles.js @@ -9,7 +9,7 @@ import { btnPrimaryActiveBg, } from '/imports/ui/stylesheets/styled-components/palette'; -const RaiseHandButton = styled(Button)` +const ReactionsButton = styled(Button)` ${({ ghost }) => ghost && ` & > span { box-shadow: none; @@ -57,7 +57,7 @@ const ButtonWrapper = styled.div` `} `; -const RaiseHandButtonWrapper = styled(ButtonWrapper)` +const ReactionsButtonWrapper = styled(ButtonWrapper)` width: 2.5rem; border-radius: 1.7rem; @@ -94,9 +94,9 @@ const ToggleButtonWrapper = styled(ButtonWrapper)` `; export default { - RaiseHandButton, + ReactionsButton, ReactionsDropdown, ButtonWrapper, - RaiseHandButtonWrapper, + ReactionsButtonWrapper, ToggleButtonWrapper, }; diff --git a/bigbluebutton-html5/imports/ui/components/app/component.jsx b/bigbluebutton-html5/imports/ui/components/app/component.jsx index f68e89a081..fed48cff88 100644 --- a/bigbluebutton-html5/imports/ui/components/app/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/app/component.jsx @@ -107,6 +107,7 @@ const intlMessages = defineMessages({ const propTypes = { darkTheme: PropTypes.bool.isRequired, + hideNotificationToasts: PropTypes.bool.isRequired, }; class App extends Component { @@ -249,7 +250,9 @@ class App extends Component { presentationIsOpen, darkTheme, intl, + pluginConfig, genericMainContentId, + hideNotificationToasts, } = this.props; const { @@ -260,7 +263,7 @@ class App extends Component { return ( <> - + @@ -317,7 +320,7 @@ class App extends Component { ) : null} {this.renderAudioCaptions()} - + { !hideNotificationToasts && } - + { !hideNotificationToasts && } diff --git a/bigbluebutton-html5/imports/ui/components/app/container.jsx b/bigbluebutton-html5/imports/ui/components/app/container.jsx index 474431fe0c..ceabf5cd19 100755 --- a/bigbluebutton-html5/imports/ui/components/app/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/app/container.jsx @@ -54,6 +54,7 @@ const AppContainer = (props) => { const captionsStyle = layoutSelectOutput((i) => i.captions); const presentation = layoutSelectInput((i) => i.presentation); const sharedNotesInput = layoutSelectInput((i) => i.sharedNotes); + const { hideNotificationToasts } = layoutSelectInput((i) => i.notificationsBar); const setSpeechOptions = useSetSpeechOptions(); const { data: pinnedPadData } = useDeduplicatedSubscription(PINNED_PAD_SUBSCRIPTION); @@ -94,7 +95,8 @@ const AppContainer = (props) => { ? ( { shouldShowPresentation, genericMainContentId: genericMainContent.genericContentId, audioCaptions: , + hideNotificationToasts: hideNotificationToasts + || getFromUserSettings('bbb_hide_notifications', false), darkTheme, }} {...props} diff --git a/bigbluebutton-html5/imports/ui/components/app/service.js b/bigbluebutton-html5/imports/ui/components/app/service.js index 7f238feca3..17094ea346 100644 --- a/bigbluebutton-html5/imports/ui/components/app/service.js +++ b/bigbluebutton-html5/imports/ui/components/app/service.js @@ -23,7 +23,7 @@ export function useMeetingIsBreakout() { export const setDarkTheme = (value) => { let invert = [Styled.DtfInvert]; - if(equalURLs()) { + if (equalURLs()) { invert = [Styled.DtfBrandingInvert]; } @@ -36,22 +36,16 @@ export const setDarkTheme = (value) => { ignoreImageAnalysis: [Styled.DtfImages], }, ); - logger.info( - { - logCode: 'dark_mode', - }, - 'Dark mode is on.', - ); + logger.info({ logCode: 'dark_mode' }, 'Dark mode is on.'); + + window.dispatchEvent(new CustomEvent('darkmodechange', { detail: { enabled: true } })); } if (!value && DarkReader.isEnabled()) { DarkReader.disable(); - logger.info( - { - logCode: 'dark_mode', - }, - 'Dark mode is off.', - ); + logger.info({ logCode: 'dark_mode' }, 'Dark mode is off.'); + + window.dispatchEvent(new CustomEvent('darkmodechange', { detail: { enabled: false } })); } }; diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-captions/button/component.tsx b/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-captions/button/component.tsx index 5c0a25bb3f..26221282fc 100644 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-captions/button/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-captions/button/component.tsx @@ -18,8 +18,9 @@ import useMeeting from '/imports/ui/core/hooks/useMeeting'; import { ActiveCaptionsResponse, getactiveCaptions } from './queries'; import AudioCaptionsService from '/imports/ui/components/audio/audio-graphql/audio-captions/service'; import useDeduplicatedSubscription from '/imports/ui/core/hooks/useDeduplicatedSubscription'; +import { TRANSCRIPTION_LOCALE } from '/imports/ui/components/audio/audio-graphql/audio-captions/transcriptionLocale'; -const intlMessages = defineMessages({ +const messages: { [key: string]: { id: string; description?: string } } = { start: { id: 'app.audio.captions.button.start', description: 'Start audio captions', @@ -50,48 +51,18 @@ const intlMessages = defineMessages({ id: 'app.audio.captions.button.autoDetect', description: 'Audio speech recognition language auto detect', }, - 'de-DE': { - id: 'app.audio.captions.select.de-DE', - description: 'Audio speech recognition german language', - }, - 'en-US': { - id: 'app.audio.captions.select.en-US', - description: 'Audio speech recognition english language', - }, - 'es-ES': { - id: 'app.audio.captions.select.es-ES', - description: 'Audio speech recognition spanish language', - }, - 'fr-FR': { - id: 'app.audio.captions.select.fr-FR', - description: 'Audio speech recognition french language', - }, - 'hi-ID': { - id: 'app.audio.captions.select.hi-ID', - description: 'Audio speech recognition indian language', - }, - 'it-IT': { - id: 'app.audio.captions.select.it-IT', - description: 'Audio speech recognition italian language', - }, - 'ja-JP': { - id: 'app.audio.captions.select.ja-JP', - description: 'Audio speech recognition japanese language', - }, - 'pt-BR': { - id: 'app.audio.captions.select.pt-BR', - description: 'Audio speech recognition portuguese language', - }, - 'ru-RU': { - id: 'app.audio.captions.select.ru-RU', - description: 'Audio speech recognition russian language', - }, - 'zh-CN': { - id: 'app.audio.captions.select.zh-CN', - description: 'Audio speech recognition chinese language', - }, +}; + +Object.keys(TRANSCRIPTION_LOCALE).forEach((key: string) => { + const localeKey = TRANSCRIPTION_LOCALE[key as keyof typeof TRANSCRIPTION_LOCALE]; + messages[localeKey] = { + id: `app.audio.captions.select.${localeKey}`, + description: `Audio speech recognition ${key} language`, + }; }); +const intlMessages = defineMessages(messages); + interface AudioCaptionsButtonProps { isRTL: boolean; availableVoices: string[]; diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-captions/captions/component.tsx b/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-captions/captions/component.tsx index 17a388fdcd..ebdef1f698 100644 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-captions/captions/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-captions/captions/component.tsx @@ -13,8 +13,9 @@ import { import useCurrentUser from '/imports/ui/core/hooks/useCurrentUser'; import { SET_SPEECH_LOCALE } from '/imports/ui/core/graphql/mutations/userMutations'; import Styled from './styles'; +import { TRANSCRIPTION_LOCALE } from '/imports/ui/components/audio/audio-graphql/audio-captions/transcriptionLocale'; -const intlMessages = defineMessages({ +const messages: { [key: string]: { id: string; description?: string } } = { title: { id: 'app.audio.captions.speech.title', description: 'Audio speech recognition title', @@ -31,48 +32,18 @@ const intlMessages = defineMessages({ id: 'app.audio.captions.speech.auto', description: 'Audio speech recognition auto', }, - 'de-DE': { - id: 'app.audio.captions.select.de-DE', - description: 'Audio speech recognition german language', - }, - 'en-US': { - id: 'app.audio.captions.select.en-US', - description: 'Audio speech recognition english language', - }, - 'es-ES': { - id: 'app.audio.captions.select.es-ES', - description: 'Audio speech recognition spanish language', - }, - 'fr-FR': { - id: 'app.audio.captions.select.fr-FR', - description: 'Audio speech recognition french language', - }, - 'hi-ID': { - id: 'app.audio.captions.select.hi-ID', - description: 'Audio speech recognition indian language', - }, - 'it-IT': { - id: 'app.audio.captions.select.it-IT', - description: 'Audio speech recognition italian language', - }, - 'ja-JP': { - id: 'app.audio.captions.select.ja-JP', - description: 'Audio speech recognition japanese language', - }, - 'pt-BR': { - id: 'app.audio.captions.select.pt-BR', - description: 'Audio speech recognition portuguese language', - }, - 'ru-RU': { - id: 'app.audio.captions.select.ru-RU', - description: 'Audio speech recognition russian language', - }, - 'zh-CN': { - id: 'app.audio.captions.select.zh-CN', - description: 'Audio speech recognition chinese language', - }, +}; + +Object.keys(TRANSCRIPTION_LOCALE).forEach((key: string) => { + const localeKey = TRANSCRIPTION_LOCALE[key as keyof typeof TRANSCRIPTION_LOCALE]; + messages[localeKey] = { + id: `app.audio.captions.select.${localeKey}`, + description: `Audio speech recognition ${key} language`, + }; }); +const intlMessages = defineMessages(messages); + interface AudioCaptionsContainerProps { showTitleLabel?: boolean; } diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-captions/transcriptionLocale.ts b/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-captions/transcriptionLocale.ts new file mode 100644 index 0000000000..11afca9270 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-captions/transcriptionLocale.ts @@ -0,0 +1,73 @@ +export const TRANSCRIPTION_LOCALE = { + Afrikaans: 'af-ZA', + Albanian: 'sq-AL', + Amharic: 'am-ET', + Arabic: 'ar', + Armenian: 'hy-AM', + Azerbaijani: 'az-AZ', + Basque: 'eu-ES', + Bengali: 'bn', + Bosnian: 'bs-BA', + Bulgarian: 'bg-BG', + Catalan: 'ca-ES', + 'Chinese (simplified)': 'zh-CN', + 'Chinese (traditional)': 'zh-TW', + Croatian: 'hr-HR', + Czech: 'cs-CZ', + Danish: 'da-DK', + Dutch: 'nl-NL', + 'English (USA)': 'en-US', + 'English (British)': 'en-GB', + Estonian: 'et-EE', + Finnish: 'fi-FI', + French: 'fr-FR', + Galician: 'gl-ES', + German: 'de-DE', + Greek: 'el-GR', + Gujarati: 'gu-IN', + Hindi: 'hi-IN', + Hungarian: 'hu-HU', + Icelandic: 'is-IS', + Indonesian: 'id-ID', + Italian: 'it-IT', + Japanese: 'ja-JP', + Javanese: 'jv-ID', + Kannada: 'kn-IN', + Kazakh: 'kk-KZ', + Khmer: 'km-KH', + Korean: 'ko-KR', + Lao: 'lo-LA', + Latvian: 'lv-LV', + Lithuanian: 'lt-LT', + Macedonian: 'mk-MK', + Malay: 'ms-MY', + Malayalam: 'ml-IN', + Marathi: 'mr-IN', + Mongolian: 'mn-MN', + Nepali: 'ne-NP', + Norwegian: 'no-NO', + Persian: 'fa-IR', + Polish: 'pl-PL', + Romanian: 'ro-RO', + 'Portuguese (Portugal)': 'pt-PT', + 'Portuguese (Brazil)': 'pt-BR', + Russian: 'ru-RU', + Serbian: 'sr-RS', + Sinhala: 'si-LK', + Slovak: 'sk-SK', + Slovenian: 'sl-SI', + Spanish: 'es-ES', + Sundanese: 'su-ID', + Swahili: 'sw', + Swedish: 'sv-SE', + Tamil: 'ta', + Telugu: 'te-IN', + Thai: 'th-TH', + Turkish: 'tr-TR', + Ukrainian: 'uk-UA', + Urdu: 'ur', + Uzbek: 'uz-UZ', + Vietnamese: 'vi-VN', +}; + +export default TRANSCRIPTION_LOCALE; diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-controls/component.tsx b/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-controls/component.tsx index d8125deb32..b7005d7378 100644 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-controls/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-controls/component.tsx @@ -100,7 +100,7 @@ const AudioControls: React.FC = ({ loading={isConnecting} /> ); - }, [isConnected, disabled, joinAudioShortcut, away]); + }, [isConnected, disabled, joinAudioShortcut, away, intl.locale]); useEffect(() => { if (isEchoTest) { diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-controls/input-stream-live-selector/component.tsx b/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-controls/input-stream-live-selector/component.tsx index c2d4d5c458..cc8d483458 100644 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-controls/input-stream-live-selector/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-graphql/audio-controls/input-stream-live-selector/component.tsx @@ -79,6 +79,8 @@ interface InputStreamLiveSelectorProps extends InputStreamLiveSelectorContainerP away: boolean; permissionStatus: string; supportsTransparentListenOnly: boolean; + updateInputDevices: (devices: InputDeviceInfo[]) => void; + updateOutputDevices: (devices: MediaDeviceInfo[]) => void; } const InputStreamLiveSelector: React.FC = ({ @@ -100,6 +102,8 @@ const InputStreamLiveSelector: React.FC = ({ permissionStatus, supportsTransparentListenOnly, openAudioSettings, + updateInputDevices, + updateOutputDevices, }) => { const intl = useIntl(); const toggleVoice = useToggleVoice(); @@ -164,6 +168,9 @@ const InputStreamLiveSelector: React.FC = ({ const audioOutputDevices = devices.filter((i) => i.kind === AUDIO_OUTPUT); setInputDevices(audioInputDevices as InputDeviceInfo[]); setOutputDevices(audioOutputDevices); + // Update audio devices in AudioManager + updateInputDevices(audioInputDevices as InputDeviceInfo[]); + updateOutputDevices(audioOutputDevices); if (inAudio) updateRemovedDevices(audioInputDevices, audioOutputDevices); }) @@ -308,6 +315,12 @@ const InputStreamLiveSelectorContainer: React.FC { + AudioManager.inputDevices = devices; + }; + const updateOutputDevices = (devices: MediaDeviceInfo[] = []) => { + AudioManager.outputDevices = devices; + }; return ( ); }; diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-modal/component.jsx b/bigbluebutton-html5/imports/ui/components/audio/audio-modal/component.jsx index 1cd29fd4f7..030ea1fa19 100755 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-modal/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-modal/component.jsx @@ -38,6 +38,8 @@ const propTypes = { leaveEchoTest: PropTypes.func.isRequired, changeInputDevice: PropTypes.func.isRequired, changeOutputDevice: PropTypes.func.isRequired, + updateInputDevices: PropTypes.func.isRequired, + updateOutputDevices: PropTypes.func.isRequired, isEchoTest: PropTypes.bool.isRequired, isConnecting: PropTypes.bool.isRequired, isConnected: PropTypes.bool.isRequired, @@ -207,6 +209,8 @@ const AudioModal = ({ unmuteOnExit = false, permissionStatus = null, isTranscriptionEnabled, + updateInputDevices, + updateOutputDevices, }) => { const [content, setContent] = useState(initialContent); const [hasError, setHasError] = useState(false); @@ -528,6 +532,8 @@ const AudioModal = ({ permissionStatus={permissionStatus} isTranscriptionEnabled={isTranscriptionEnabled} skipAudioOptions={skipAudioOptions} + updateInputDevices={updateInputDevices} + updateOutputDevices={updateOutputDevices} /> ); }; diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-modal/container.jsx b/bigbluebutton-html5/imports/ui/components/audio/audio-modal/container.jsx index 9c7b34ae1f..b70ef05848 100755 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-modal/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-modal/container.jsx @@ -129,6 +129,8 @@ const AudioModalContainer = (props) => { liveChangeInputDevice={Service.liveChangeInputDevice} changeInputStream={Service.changeInputStream} changeOutputDevice={Service.changeOutputDevice} + updateInputDevices={Service.updateInputDevices} + updateOutputDevices={Service.updateOutputDevices} joinEchoTest={Service.joinEchoTest} exitAudio={Service.exitAudio} localEchoEnabled={LOCAL_ECHO_TEST_ENABLED} diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-settings/component.jsx b/bigbluebutton-html5/imports/ui/components/audio/audio-settings/component.jsx index 9a75fc239e..ce2bee9bdd 100644 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-settings/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-settings/component.jsx @@ -21,6 +21,8 @@ const propTypes = { changeInputDevice: PropTypes.func.isRequired, liveChangeInputDevice: PropTypes.func.isRequired, changeOutputDevice: PropTypes.func.isRequired, + updateInputDevices: PropTypes.func.isRequired, + updateOutputDevices: PropTypes.func.isRequired, handleBack: PropTypes.func.isRequired, handleConfirmation: PropTypes.func.isRequired, handleGUMFailure: PropTypes.func.isRequired, @@ -384,11 +386,16 @@ class AudioSettings extends React.Component { } updateDeviceList() { + const { updateInputDevices, updateOutputDevices } = this.props; + return navigator.mediaDevices.enumerateDevices() .then((devices) => { const audioInputDevices = devices.filter((i) => i.kind === 'audioinput'); const audioOutputDevices = devices.filter((i) => i.kind === 'audiooutput'); + // Update audio devices in AudioManager + updateInputDevices(audioInputDevices); + updateOutputDevices(audioOutputDevices); this.setState({ audioInputDevices, audioOutputDevices, diff --git a/bigbluebutton-html5/imports/ui/components/audio/service.js b/bigbluebutton-html5/imports/ui/components/audio/service.js index 6c78a516e2..b59919b686 100755 --- a/bigbluebutton-html5/imports/ui/components/audio/service.js +++ b/bigbluebutton-html5/imports/ui/components/audio/service.js @@ -186,6 +186,8 @@ export default { outputDeviceId, isLive, ) => AudioManager.changeOutputDevice(outputDeviceId, isLive), + updateInputDevices: (devices) => { AudioManager.inputDevices = devices }, + updateOutputDevices: (devices) => { AudioManager.outputDevices = devices }, toggleMuteMicrophone, toggleMuteMicrophoneSystem, isConnectedToBreakout: () => { diff --git a/bigbluebutton-html5/imports/ui/components/breakout-room/create-breakout-room/breakout-room-user-assignment-mobile/room-user-list/component.tsx b/bigbluebutton-html5/imports/ui/components/breakout-room/create-breakout-room/breakout-room-user-assignment-mobile/room-user-list/component.tsx index 132b548c6a..60771dddb2 100644 --- a/bigbluebutton-html5/imports/ui/components/breakout-room/create-breakout-room/breakout-room-user-assignment-mobile/room-user-list/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/breakout-room/create-breakout-room/breakout-room-user-assignment-mobile/room-user-list/component.tsx @@ -18,10 +18,10 @@ interface RoomUserListProps { confirm: () => void; selectedRoom: number; rooms: { - [key:number]: { - id: number; - name: string; - users: BreakoutUser[]; + [key: number]: { + id: number; + name: string; + users: BreakoutUser[]; } } moveUser: (userId: string, fromRoomId: number, toRoomId: number) => void; @@ -34,47 +34,36 @@ const RoomUserList: React.FC = ({ confirm, }) => { const intl = useIntl(); + const users = useMemo(() => { - const userElements = Object.values(rooms).sort((a, b) => { - if (a.id === selectedRoom) { - return -1; // Move itemToMove to the front - } - if (b.id === selectedRoom) { - return 1; // Move itemToMove to the front - } - return 0; - }).map((room) => { - return room.users.map((user) => { - return ( - - - ) => { - if (e.target.checked) { - moveUser(user.userId, room.id, selectedRoom); - } else { - moveUser(user.userId, room.id, 0); - } - }} - /> - {/* eslint-disable-next-line */} - - - - {user.name} - {((room.id !== selectedRoom) && room.id !== 0) ? `\t[${room.id}]` : ''} - - - ); - }); + return Object.values(rooms).map((room) => { + return room.users.map((user) => ( + + + ) => { + if (e.target.checked) { + moveUser(user.userId, room.id, selectedRoom); + } else { + moveUser(user.userId, room.id, 0); + } + }} + /> + {/* eslint-disable-next-line */} + + + {user.name} + {room.id !== 0 && room.id !== selectedRoom ? `\t[${room.id}]` : ''} + + + )); }).flat(); - return userElements; - }, [rooms, selectedRoom]); + }, [rooms, selectedRoom, moveUser]); + return ( diff --git a/bigbluebutton-html5/imports/ui/components/breakout-room/create-breakout-room/queries.ts b/bigbluebutton-html5/imports/ui/components/breakout-room/create-breakout-room/queries.ts index d6efb10310..676de597a6 100644 --- a/bigbluebutton-html5/imports/ui/components/breakout-room/create-breakout-room/queries.ts +++ b/bigbluebutton-html5/imports/ui/components/breakout-room/create-breakout-room/queries.ts @@ -25,6 +25,7 @@ export interface getBreakoutsResponse { export const getUser = gql` query getUser { user( + where: { bot: {_eq: false } } order_by: [ {role: asc}, {raiseHandTime: asc_nulls_last}, diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-editing-warning/component.tsx b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-editing-warning/component.tsx new file mode 100644 index 0000000000..9bbcabfdab --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-editing-warning/component.tsx @@ -0,0 +1,78 @@ +import React, { useEffect, useState } from 'react'; +import { defineMessages, useIntl } from 'react-intl'; +import { ChatEvents } from '/imports/ui/core/enums/chat'; +import Icon from '/imports/ui/components/common/icon/component'; +import { + Cancel, Container, Highlighted, Left, Root, +} from './styles'; + +const intlMessages = defineMessages({ + editing: { + id: 'app.chat.toolbar.edit.editing', + description: '', + }, + cancel: { + id: 'app.chat.toolbar.edit.cancel', + description: '', + }, +}); + +const CANCEL_KEY_LABEL = 'esc'; + +const ChatEditingWarning = () => { + const [show, setShow] = useState(false); + const intl = useIntl(); + + useEffect(() => { + const handleEditingMessage = (e: Event) => { + if (e instanceof CustomEvent) { + setShow(true); + } + }; + + const handleCancelEditingMessage = (e: Event) => { + if (e instanceof CustomEvent) { + setShow(false); + } + }; + window.addEventListener(ChatEvents.CHAT_EDIT_REQUEST, handleEditingMessage); + window.addEventListener(ChatEvents.CHAT_CANCEL_EDIT_REQUEST, handleCancelEditingMessage); + + return () => { + window.removeEventListener(ChatEvents.CHAT_EDIT_REQUEST, handleEditingMessage); + window.removeEventListener(ChatEvents.CHAT_CANCEL_EDIT_REQUEST, handleCancelEditingMessage); + }; + }, []); + + if (!show) return null; + + const cancelMessage = intl.formatMessage(intlMessages.cancel, { 0: CANCEL_KEY_LABEL }); + const editingMessage = intl.formatMessage(intlMessages.editing); + + return ( + + + + + {editingMessage} + + { + window.dispatchEvent(new CustomEvent(ChatEvents.CHAT_CANCEL_EDIT_REQUEST)); + }} + > + {cancelMessage.split(CANCEL_KEY_LABEL)[0]} +   + {CANCEL_KEY_LABEL} +   + {cancelMessage.split(CANCEL_KEY_LABEL)[1]} + + + {`${editingMessage} ${cancelMessage}`} + + + + ); +}; + +export default ChatEditingWarning; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-editing-warning/styles.ts b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-editing-warning/styles.ts new file mode 100644 index 0000000000..d55c0b599f --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-editing-warning/styles.ts @@ -0,0 +1,61 @@ +import styled from 'styled-components'; +import { colorGrayLight, colorWhite } from '/imports/ui/stylesheets/styled-components/palette'; +import { xlPadding, xsPadding } from '/imports/ui/stylesheets/styled-components/general'; + +export const Root = styled.div` + position: relative; +`; + +export const Container = styled.div` + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: nowrap; + color: ${colorGrayLight}; + z-index: 10; + background-color: ${colorWhite}; + + [dir='ltr'] & { + margin-right: ${xlPadding}; + } + + [dir='rtl'] & { + margin-left: ${xlPadding}; + } +`; + +export const Highlighted = styled.span` + font-weight: bold; +`; + +export const Left = styled.span` + display: flex; + align-items: center; + gap: ${xsPadding}; +`; + +export const Cancel = styled.button` + background: none; + outline: none; + border: none; + color: inherit; + padding: 0.125rem; + border-radius: 0.5rem; + text-decoration: underline; + cursor: pointer; + + &:hover { + opacity: .75; + } + + &:focus { + box-shadow: inset 0 0 0.125rem ${colorGrayLight}; + } +`; + +export default { + Container, + Left, + Cancel, + Root, +}; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-header/chat-actions/queries.ts b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-header/chat-actions/queries.ts index 2b396dc759..d417aed629 100644 --- a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-header/chat-actions/queries.ts +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-header/chat-actions/queries.ts @@ -24,6 +24,9 @@ query getChatMessageHistory { name role } + deletedBy { + name + } } meeting { name diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-header/chat-actions/services.ts b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-header/chat-actions/services.ts index fea700dc2f..7d1cf3e9d6 100644 --- a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-header/chat-actions/services.ts +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-header/chat-actions/services.ts @@ -21,6 +21,10 @@ const intlMessages = defineMessages({ id: 'app.chat.notAway', description: 'message when user is no longer away', }, + deleteMessage: { + id: 'app.chat.deleteMessage', + description: '', + }, }); export const htmlDecode = (input: string) => { @@ -70,7 +74,9 @@ export const generateExportedMessages = ( } case ChatMessageType.TEXT: default: - messageText = htmlDecode(message.message); + messageText = message.message + ? htmlDecode(message.message) + : intl.formatMessage(intlMessages.deleteMessage, { 0: message.deletedBy?.name }); break; } return `${acc}${hourMin} ${userName}${messageText}\n`; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-form/component.tsx b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-form/component.tsx index 13392112b9..f3c9e0a425 100644 --- a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-form/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-form/component.tsx @@ -6,6 +6,7 @@ import React, { useRef, useMemo, } from 'react'; +import { useMutation } from '@apollo/client'; import TextareaAutosize from 'react-autosize-textarea'; import { ChatFormCommandsEnum } from 'bigbluebutton-html-plugin-sdk/dist/cjs/ui-commands/chat/form/enums'; import { FillChatFormCommandArguments } from 'bigbluebutton-html-plugin-sdk/dist/cjs/ui-commands/chat/form/types'; @@ -32,13 +33,13 @@ import useMeeting from '/imports/ui/core/hooks/useMeeting'; import ChatOfflineIndicator from './chat-offline-indicator/component'; import { ChatEvents } from '/imports/ui/core/enums/chat'; -import { useMutation } from '@apollo/client'; import { CHAT_SEND_MESSAGE, CHAT_SET_TYPING } from './mutations'; import Storage from '/imports/ui/services/storage/session'; import { indexOf, without } from '/imports/utils/array-utils'; import { GraphqlDataHookSubscriptionResponse } from '/imports/ui/Types/hook'; import { throttle } from '/imports/utils/throttle'; import logger from '/imports/startup/client/logger'; +import { CHAT_EDIT_MESSAGE_MUTATION } from '../chat-message-list/page/chat-message/mutations'; const CLOSED_CHAT_LIST_KEY = 'closedChatList'; const START_TYPING_THROTTLE_INTERVAL = 1000; @@ -113,6 +114,8 @@ const messages = defineMessages({ }, }); +type EditingMessage = { chatId: string; messageId: string, message: string }; + const ChatMessageForm: React.FC = ({ title, disabled, @@ -134,6 +137,8 @@ const ChatMessageForm: React.FC = ({ const emojiPickerRef = useRef(null); const emojiPickerButtonRef = useRef(null); const [isTextAreaFocused, setIsTextAreaFocused] = React.useState(false); + const [repliedMessageId, setRepliedMessageId] = React.useState(null); + const [editingMessage, setEditingMessage] = React.useState(null); const textAreaRef: RefObject = useRef(null); const { isMobile } = deviceInfo; const prevChatId = usePreviousValue(chatId); @@ -151,6 +156,10 @@ const ChatMessageForm: React.FC = ({ const [chatSendMessage, { loading: chatSendMessageLoading, error: chatSendMessageError, }] = useMutation(CHAT_SEND_MESSAGE); + const [ + chatEditMessage, + { loading: chatEditMessageLoading }, + ] = useMutation(CHAT_EDIT_MESSAGE_MUTATION); const CHAT_CONFIG = window.meetingClientSettings.public.chat; const PUBLIC_CHAT_ID = CHAT_CONFIG.public_id; @@ -282,6 +291,49 @@ const ChatMessageForm: React.FC = ({ })); }, [message]); + useEffect(() => { + const handleReplyIntention = (e: Event) => { + if (e instanceof CustomEvent) { + setRepliedMessageId(e.detail.messageId); + textAreaRef.current?.textarea.focus(); + } + }; + + const handleEditingMessage = (e: Event) => { + if (e instanceof CustomEvent) { + if (textAreaRef.current) { + setMessage(e.detail.message); + setEditingMessage(e.detail); + } + } + }; + + const handleCancelEditingMessage = (e: Event) => { + if (e instanceof CustomEvent) { + setMessage(''); + setEditingMessage(null); + } + }; + + const handleCancelReplyIntention = (e: Event) => { + if (e instanceof CustomEvent) { + setRepliedMessageId(null); + } + }; + + window.addEventListener(ChatEvents.CHAT_REPLY_INTENTION, handleReplyIntention); + window.addEventListener(ChatEvents.CHAT_EDIT_REQUEST, handleEditingMessage); + window.addEventListener(ChatEvents.CHAT_CANCEL_EDIT_REQUEST, handleCancelEditingMessage); + window.addEventListener(ChatEvents.CHAT_CANCEL_REPLY_INTENTION, handleCancelReplyIntention); + + return () => { + window.removeEventListener(ChatEvents.CHAT_REPLY_INTENTION, handleReplyIntention); + window.removeEventListener(ChatEvents.CHAT_EDIT_REQUEST, handleEditingMessage); + window.removeEventListener(ChatEvents.CHAT_CANCEL_EDIT_REQUEST, handleCancelEditingMessage); + window.removeEventListener(ChatEvents.CHAT_CANCEL_REPLY_INTENTION, handleCancelReplyIntention); + }; + }, []); + const renderForm = () => { const formRef = useRef(null); @@ -298,12 +350,38 @@ const ChatMessageForm: React.FC = ({ return; } - if (!chatSendMessageLoading) { + const sendCancelEvents = () => { + if (repliedMessageId) { + window.dispatchEvent( + new CustomEvent(ChatEvents.CHAT_CANCEL_REPLY_INTENTION), + ); + } + if (editingMessage) { + window.dispatchEvent( + new CustomEvent(ChatEvents.CHAT_CANCEL_EDIT_REQUEST), + ); + } + }; + + if (editingMessage && !chatEditMessageLoading) { + chatEditMessage({ + variables: { + chatId: editingMessage.chatId, + messageId: editingMessage.messageId, + chatMessageInMarkdownFormat: msg, + }, + }).then(() => { + sendCancelEvents(); + }); + } else if (!chatSendMessageLoading) { chatSendMessage({ variables: { chatMessageInMarkdownFormat: msg, chatId: chatId === PUBLIC_CHAT_ID ? PUBLIC_GROUP_CHAT_ID : chatId, + replyToMessageId: repliedMessageId, }, + }).then(() => { + sendCancelEvents(); }); } const currentClosedChats = Storage.getItem(CLOSED_CHAT_LIST_KEY); @@ -431,65 +509,69 @@ const ChatMessageForm: React.FC = ({ ) : null} - { - window.dispatchEvent(new CustomEvent(PluginSdk.ChatFormUiDataNames.CHAT_INPUT_IS_FOCUSED, { - detail: { - value: true, - }, - })); - setIsTextAreaFocused(true); - }} - onBlur={() => { - window.dispatchEvent(new CustomEvent(PluginSdk.ChatFormUiDataNames.CHAT_INPUT_IS_FOCUSED, { - detail: { - value: false, - }, - })); - }} - onChange={handleMessageChange} - onKeyDown={handleMessageKeyDown} - onPaste={(e) => { e.stopPropagation(); }} - onCut={(e) => { e.stopPropagation(); }} - onCopy={(e) => { e.stopPropagation(); }} - async - /> - {ENABLE_EMOJI_PICKER ? ( - setShowEmojiPicker(!showEmojiPicker)} - icon="happy" - color="light" - ghost - type="button" - circle - hideLabel - label={intl.formatMessage(messages.emojiButtonLabel)} - data-test="emojiPickerButton" + + { + window.dispatchEvent(new CustomEvent(PluginSdk.ChatFormUiDataNames.CHAT_INPUT_IS_FOCUSED, { + detail: { + value: true, + }, + })); + setIsTextAreaFocused(true); + }} + onBlur={() => { + window.dispatchEvent(new CustomEvent(PluginSdk.ChatFormUiDataNames.CHAT_INPUT_IS_FOCUSED, { + detail: { + value: false, + }, + })); + }} + onChange={handleMessageChange} + onKeyDown={handleMessageKeyDown} + onPaste={(e) => { e.stopPropagation(); }} + onCut={(e) => { e.stopPropagation(); }} + onCopy={(e) => { e.stopPropagation(); }} + async /> - ) : null} - { }} - data-test="sendMessageButton" - /> + {ENABLE_EMOJI_PICKER ? ( + setShowEmojiPicker(!showEmojiPicker)} + icon="happy" + color="light" + ghost + type="button" + circle + hideLabel + label={intl.formatMessage(messages.emojiButtonLabel)} + data-test="emojiPickerButton" + /> + ) : null} + +
+ { }} + data-test="sendMessageButton" + /> +
{ error && ( @@ -543,7 +625,7 @@ const ChatMessageFormContainer: React.FC = () => { if (isPublicChat) { locked = (isLocked && disablePublicChat) || false; } else { - locked = (isLocked && disablePrivateChat) || false; + locked = (isLocked && disablePrivateChat && !chat?.participant?.isModerator) || false; } } diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-form/mutations.tsx b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-form/mutations.tsx index fdc3664f97..911225f111 100644 --- a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-form/mutations.tsx +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-form/mutations.tsx @@ -2,10 +2,11 @@ import { gql } from '@apollo/client'; // Define the GraphQL mutation export const CHAT_SEND_MESSAGE = gql` - mutation ChatSendMessage($chatId: String!, $chatMessageInMarkdownFormat: String!) { + mutation ChatSendMessage($chatId: String!, $chatMessageInMarkdownFormat: String!, $replyToMessageId: String) { chatSendMessage( chatId: $chatId, - chatMessageInMarkdownFormat: $chatMessageInMarkdownFormat + chatMessageInMarkdownFormat: $chatMessageInMarkdownFormat, + replyToMessageId: $replyToMessageId ) } `; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-form/styles.ts b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-form/styles.ts index 9ab78446e2..7f562d9995 100644 --- a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-form/styles.ts +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-form/styles.ts @@ -1,18 +1,18 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ import styled from 'styled-components'; import { colorBlueLight, colorText, colorGrayLighter, - colorPrimary, colorDanger, colorGrayDark, + colorGrayLightest, } from '/imports/ui/stylesheets/styled-components/palette'; import { smPaddingX, smPaddingY, borderRadius, borderSize, + xsPadding, } from '/imports/ui/stylesheets/styled-components/general'; import { fontSizeBase } from '/imports/ui/stylesheets/styled-components/typography'; import TextareaAutosize from 'react-autosize-textarea'; @@ -43,13 +43,15 @@ const Form = styled.form` const Wrapper = styled.div` display: flex; flex-direction: row; + box-shadow: inset 0 0 0 1px ${colorGrayLightest}; + border-radius: 0.75rem; `; const Input = styled(TextareaAutosize)` flex: 1; background: #fff; background-clip: padding-box; - margin: 0; + margin: ${xsPadding} 0 ${xsPadding} ${xsPadding}; color: ${colorText}; -webkit-appearance: none; padding: calc(${smPaddingY} * 2.5) calc(${smPaddingX} * 1.25); @@ -60,8 +62,17 @@ const Input = styled(TextareaAutosize)` line-height: 1; min-height: 2.5rem; max-height: 10rem; - border: 1px solid ${colorGrayLighter}; - box-shadow: 0 0 0 1px ${colorGrayLighter}; + border: none; + box-shadow: none; + outline: none; + + [dir='ltr'] & { + border-radius: 0.75rem 0 0 0.75rem; + } + + [dir='rtl'] & { + border-radius: 0 0.75rem 0.75rem 0; + } &:disabled, &[disabled] { @@ -69,29 +80,22 @@ const Input = styled(TextareaAutosize)` opacity: .75; background-color: rgba(167,179,189,0.25); } - - &:focus { - border-radius: ${borderSize}; - box-shadow: 0 0 0 ${borderSize} ${colorBlueLight}, inset 0 0 0 1px ${colorPrimary}; - } - - &:hover, - &:active, - &:focus { - outline: transparent; - outline-style: dotted; - outline-width: ${borderSize}; - } `; // @ts-ignore - as button comes from JS, we can't provide its props const SendButton = styled(Button)` - margin:0 0 0 ${smPaddingX}; align-self: center; font-size: 0.9rem; + height: 100%; + + & > span { + height: 100%; + display: flex; + align-items: center; + border-radius: 0 0.75rem 0.75rem 0; + } [dir="rtl"] & { - margin: 0 ${smPaddingX} 0 0; -webkit-transform: scale(-1, 1); -moz-transform: scale(-1, 1); -ms-transform: scale(-1, 1); @@ -161,6 +165,28 @@ const EmojiPicker = styled(EmojiPickerComponent)` position: relative; `; +const InputWrapper = styled.div` + display: flex; + flex-direction: row; + flex-grow: 1; + min-width: 0; + z-index: 0; + + [dir='ltr'] & { + border-radius: 0.75rem 0 0 0.75rem; + margin-right: ${xsPadding}; + } + + [dir='rtl'] & { + border-radius: 0 0.75rem 0.75rem 0; + margin-left: ${xsPadding}; + } + + &:focus-within { + box-shadow: 0 0 0 ${xsPadding} ${colorBlueLight}; + } +`; + export default { Form, Wrapper, @@ -171,4 +197,5 @@ export default { EmojiPicker, EmojiPickerWrapper, ChatMessageError, + InputWrapper, }; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/component.tsx b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/component.tsx index c1be7d67c2..05d563309e 100644 --- a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/component.tsx @@ -1,9 +1,9 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ import React, { useCallback, useEffect, useState, useMemo, + KeyboardEventHandler, } from 'react'; import { makeVar, useMutation } from '@apollo/client'; import { defineMessages, useIntl } from 'react-intl'; @@ -21,12 +21,13 @@ import LAST_SEEN_MUTATION from './queries'; import { ButtonLoadMore, MessageList, - MessageListWrapper, UnreadButton, - ChatMessages, } from './styles'; import useReactiveRef from '/imports/ui/hooks/useReactiveRef'; import useStickyScroll from '/imports/ui/hooks/useStickyScroll'; +import ChatReplyIntention from '../chat-reply-intention/component'; +import ChatEditingWarning from '../chat-editing-warning/component'; +import KEY_CODES from '/imports/utils/keyCodes'; const PAGE_SIZE = 50; @@ -105,6 +106,60 @@ const dispatchLastSeen = () => setTimeout(() => { } }, 500); +const roving = ( + event: React.KeyboardEvent, + changeState: (el: HTMLElement | null) => void, + elementsList: HTMLElement, + element: HTMLElement | null, +) => { + const numberOfChilds = elementsList.childElementCount; + + if ([KEY_CODES.ESCAPE, KEY_CODES.TAB].includes(event.keyCode)) { + changeState(null); + } + + if (event.keyCode === KEY_CODES.ARROW_DOWN) { + const firstElement = elementsList.firstChild as HTMLElement; + let elRef = element && numberOfChilds > 1 ? (element.nextSibling as HTMLElement) : firstElement; + + while (elRef && elRef.dataset.focusable !== 'true' && elRef.nextSibling) { + elRef = elRef.nextSibling as HTMLElement; + } + + elRef = (elRef && elRef.dataset.focusable === 'true') ? elRef : firstElement; + changeState(elRef); + } + + if (event.keyCode === KEY_CODES.ARROW_UP) { + const lastElement = elementsList.lastChild as HTMLElement; + let elRef = element ? (element.previousSibling as HTMLElement) : lastElement; + + while (elRef && elRef.dataset.focusable !== 'true' && elRef.previousSibling) { + elRef = elRef.previousSibling as HTMLElement; + } + + elRef = (elRef && elRef.dataset.focusable === 'true') ? elRef : lastElement; + changeState(elRef); + } + + if ([KEY_CODES.SPACE, KEY_CODES.ENTER].includes(event.keyCode)) { + const elRef = document.activeElement?.firstChild as HTMLElement; + changeState(elRef); + } + + if ([KEY_CODES.ARROW_RIGHT].includes(event.keyCode)) { + if (element?.dataset) { + const { sequence } = element.dataset; + + window.dispatchEvent(new CustomEvent(ChatEvents.CHAT_KEYBOARD_FOCUS_MESSAGE_REQUEST, { + detail: { + sequence, + }, + })); + } + } +}; + const ChatMessageList: React.FC = ({ totalPages, chatId, @@ -113,29 +168,34 @@ const ChatMessageList: React.FC = ({ isRTL, }) => { const intl = useIntl(); - const contentRef = React.useRef(null); // I used a ref here because I don't want to re-render the component when the last sender changes const lastSenderPerPage = React.useRef>(new Map()); const sentinelRef = React.useRef(null); const { - ref: messageListRef, - current: currentMessageList, + ref: messageListContainerRef, + current: currentMessageListContainer, } = useReactiveRef(null); + const messageListRef = React.useRef(null); const [userLoadedBackUntilPage, setUserLoadedBackUntilPage] = useState(null); const [lastMessageCreatedAt, setLastMessageCreatedAt] = useState(''); const [followingTail, setFollowingTail] = React.useState(true); + const [selectedMessage, setSelectedMessage] = React.useState(null); const { childRefProxy: sentinelRefProxy, intersecting: isSentinelVisible, - parentRefProxy: messageListRefProxy, - } = useIntersectionObserver(messageListRef, sentinelRef); + parentRefProxy: messageListContainerRefProxy, + } = useIntersectionObserver(messageListContainerRef, sentinelRef); const { - startObserving, - stopObserving, - } = useStickyScroll(currentMessageList); + startObserving: startObservingStickyScroll, + stopObserving: stopObservingStickyScroll, + } = useStickyScroll(currentMessageListContainer, currentMessageListContainer, 'ne'); useEffect(() => { - if (isSentinelVisible) startObserving(); else stopObserving(); + if (isSentinelVisible) { + startObservingStickyScroll(); + } else { + stopObservingStickyScroll(); + } toggleFollowingTail(isSentinelVisible); }, [isSentinelVisible]); @@ -159,6 +219,21 @@ const ChatMessageList: React.FC = ({ } }, [lastMessageCreatedAt]); + useEffect(() => { + const handler = (e: Event) => { + if (e instanceof CustomEvent) { + toggleFollowingTail(false); + setUserLoadedBackUntilPage(Math.ceil(e.detail.sequence / PAGE_SIZE) - 1); + } + }; + + window.addEventListener(ChatEvents.CHAT_FOCUS_MESSAGE_REQUEST, handler); + + return () => { + window.removeEventListener(ChatEvents.CHAT_FOCUS_MESSAGE_REQUEST, handler); + }; + }, []); + const markMessageAsSeen = useCallback((message: Message) => { if (new Date(message.createdAt).getTime() > new Date((lastMessageCreatedAt || 0)).getTime()) { dispatchLastSeen(); @@ -179,14 +254,14 @@ const ChatMessageList: React.FC = ({ const toggleFollowingTail = (toggle: boolean) => { setFollowingTail(toggle); - if (isElement(contentRef.current)) { + if (isElement(messageListRef.current)) { if (toggle) { - scrollObserver.observe(contentRef.current); + scrollObserver.observe(messageListRef.current); } else { if (userLoadedBackUntilPage === null) { setUserLoadedBackUntilPage(Math.max(totalPages - 2, 0)); } - scrollObserver.unobserve(contentRef.current); + scrollObserver.unobserve(messageListRef.current); } } }; @@ -242,72 +317,88 @@ const ChatMessageList: React.FC = ({ : Math.max(totalPages - 2, 0); const pagesToLoad = (totalPages - firstPageToLoad) || 1; + const rove: KeyboardEventHandler = (e) => { + if (messageListRef.current) { + roving( + e, + setSelectedMessage, + messageListRef.current, + selectedMessage, + ); + } + }; + return ( <> { [ - - { - setScrollToTailEventHandler(); - }} - onTouchEnd={() => { - setScrollToTailEventHandler(); + { + setScrollToTailEventHandler(); + }} + onTouchEnd={() => { + setScrollToTailEventHandler(); + }} + data-test="chatMessages" + isRTL={isRTL} + ref={messageListContainerRefProxy} + > +
{ + setSelectedMessage(null); }} > - - { - (userLoadedBackUntilPage) - ? ( - { - if (followingTail) { - toggleFollowingTail(false); - } - setUserLoadedBackUntilPage(userLoadedBackUntilPage - 1); - }} - > - {intl.formatMessage(intlMessages.loadMoreButtonLabel)} - - ) : null - } - - - - { - // @ts-ignore - Array.from({ length: pagesToLoad }, (v, k) => k + (firstPageToLoad)).map((page) => { - return ( - setLastSender(lastSenderPerPage.current)} - lastSenderPreviousPage={page ? lastSenderPerPage.current.get(page - 1) : undefined} - chatId={chatId} - markMessageAsSeen={markMessageAsSeen} - scrollRef={messageListRef} - /> - ); - }) - } - -
- - , + {userLoadedBackUntilPage ? ( + { + if (followingTail) { + toggleFollowingTail(false); + } + setUserLoadedBackUntilPage(userLoadedBackUntilPage - 1); + }} + > + {intl.formatMessage(intlMessages.loadMoreButtonLabel)} + + ) : null} + + {Array.from({ length: pagesToLoad }, (_v, k) => k + (firstPageToLoad)).map((page) => { + return ( + setLastSender(lastSenderPerPage.current)} + lastSenderPreviousPage={page ? lastSenderPerPage.current.get(page - 1) : undefined} + chatId={chatId} + markMessageAsSeen={markMessageAsSeen} + scrollRef={messageListContainerRefProxy} + focusedId={selectedMessage?.dataset.sequence + ? Number.parseInt(selectedMessage?.dataset.sequence, 10) + : null} + /> + ); + })} +
+
+ , renderUnreadNotification, + , + , ] } diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/component.tsx b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/component.tsx index 5c15a3054b..5fc7ec3ac7 100644 --- a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/component.tsx @@ -2,11 +2,13 @@ import React, { memo, useCallback, useEffect, + useImperativeHandle, useMemo, } from 'react'; -import { UpdatedEventDetailsForChatMessageDomElements } from 'bigbluebutton-html-plugin-sdk/dist/cjs/dom-element-manipulation/chat/message/types'; +import { useMutation } from '@apollo/client'; +import { MessageDetails } from 'bigbluebutton-html-plugin-sdk/dist/cjs/dom-element-manipulation/chat/message/types'; import { Message } from '/imports/ui/Types/message'; -import { defineMessages, useIntl } from 'react-intl'; +import { defineMessages, FormattedTime, useIntl } from 'react-intl'; import ChatMessageHeader from './message-header/component'; import ChatMessageTextContent from './message-content/text-content/component'; import ChatPollContent from './message-content/poll-content/component'; @@ -16,18 +18,51 @@ import { ChatContent, ChatAvatar, MessageItemWrapper, + Container, + DeleteMessage, + ChatHeading, + EditLabel, + ChatContentFooter, } from './styles'; import { ChatMessageType } from '/imports/ui/core/enums/chat'; import MessageReadConfirmation from './message-read-confirmation/component'; +import ChatMessageToolbar from './message-toolbar/component'; +import ChatMessageReactions from './message-reactions/component'; +import ChatMessageReplied from './message-replied/component'; +import useMeeting from '/imports/ui/core/hooks/useMeeting'; +import useCurrentUser from '/imports/ui/core/hooks/useCurrentUser'; +import { layoutSelect } from '/imports/ui/components/layout/context'; +import { Layout } from '/imports/ui/components/layout/layoutTypes'; +import useChat from '/imports/ui/core/hooks/useChat'; +import { GraphqlDataHookSubscriptionResponse } from '/imports/ui/Types/hook'; +import { Chat } from '/imports/ui/Types/chat'; +import { CHAT_DELETE_REACTION_MUTATION, CHAT_SEND_REACTION_MUTATION } from './mutations'; +import Icon from '/imports/ui/components/common/icon/component'; +import { colorBlueLighterChannel } from '/imports/ui/stylesheets/styled-components/palette'; +import { + useIsReplyChatMessageEnabled, + useIsChatMessageReactionsEnabled, + useIsEditChatMessageEnabled, + useIsDeleteChatMessageEnabled, +} from '/imports/ui/services/features'; +import ChatMessageNotificationContent from './message-content/notification-content/component'; +import { ChatTime } from './message-header/styles'; interface ChatMessageProps { message: Message; previousMessage: Message; lastSenderPreviousPage: string | null | undefined; - setMessagesRequestedFromPlugin: React.Dispatch> + setRenderedChatMessages: React.Dispatch> scrollRef: React.RefObject; markMessageAsSeen: (message: Message) => void; messageReadFeedbackEnabled: boolean; + focused: boolean; + keyboardFocused: boolean; + editing: boolean; +} + +export interface ChatMessageRef { + requestFocus: () => void; } const intlMessages = defineMessages({ @@ -51,6 +86,18 @@ const intlMessages = defineMessages({ id: 'app.chat.notAway', description: 'message when user is no longer away', }, + editTime: { + id: 'app.chat.editTime', + description: '', + }, + deleteMessage: { + id: 'app.chat.deleteMessage', + description: '', + }, + edited: { + id: 'app.chat.toolbar.edit.edited', + description: 'edited message label', + }, }); function isInViewport(el: HTMLDivElement) { @@ -63,25 +110,152 @@ function isInViewport(el: HTMLDivElement) { const messageRef = React.createRef(); -const ChatMesssage: React.FC = ({ +const ANIMATION_DURATION = 1000; +const SCROLL_ANIMATION_DURATION = 500; + +const ChatMessage = React.forwardRef(({ previousMessage, lastSenderPreviousPage, scrollRef, message, - setMessagesRequestedFromPlugin, + setRenderedChatMessages, markMessageAsSeen, messageReadFeedbackEnabled, -}) => { + focused, + keyboardFocused, + editing, +}, ref) => { + const idChatOpen: string = layoutSelect((i: Layout) => i.idChatOpen); + const { data: meeting } = useMeeting((m) => ({ + lockSettings: m?.lockSettings, + })); + const { data: currentUser } = useCurrentUser((c) => ({ + isModerator: c?.isModerator, + userLockSettings: c?.userLockSettings, + locked: c?.locked, + userId: c.userId, + })); + const { data: chat } = useChat((c: Partial) => ({ + participant: c?.participant, + chatId: c?.chatId, + public: c?.public, + }), idChatOpen) as GraphqlDataHookSubscriptionResponse>; const intl = useIntl(); const markMessageAsSeenOnScrollEnd = useCallback(() => { if (messageRef.current && isInViewport(messageRef.current)) { markMessageAsSeen(message); } }, [message, messageRef]); - const messageContentRef = React.createRef(); + const messageContentRef = React.useRef(null); + const [isToolbarReactionPopoverOpen, setIsToolbarReactionPopoverOpen] = React.useState(false); + const containerRef = React.useRef(null); + const animationInitialTimestamp = React.useRef(0); + const animationInitialScrollPosition = React.useRef(0); + const animationScrollPositionDiff = React.useRef(0); + const [chatSendReaction] = useMutation(CHAT_SEND_REACTION_MUTATION); + const [chatDeleteReaction] = useMutation(CHAT_DELETE_REACTION_MUTATION); + + const sendReaction = useCallback((reactionEmoji: string, reactionEmojiId: string) => { + chatSendReaction({ + variables: { + chatId: message.chatId, + messageId: message.messageId, + reactionEmoji, + reactionEmojiId, + }, + }); + }, []); + + const deleteReaction = useCallback((reactionEmoji: string, reactionEmojiId: string) => { + chatDeleteReaction({ + variables: { + chatId: message.chatId, + messageId: message.messageId, + reactionEmoji, + reactionEmojiId, + }, + }); + }, []); + + const isModerator = currentUser?.isModerator; + const isPublicChat = chat?.public; + const isLocked = currentUser?.locked || currentUser?.userLockSettings?.disablePublicChat; + const disablePublicChat = meeting?.lockSettings?.disablePublicChat + || currentUser?.userLockSettings?.disablePublicChat; + const disablePrivateChat = meeting?.lockSettings?.disablePrivateChat; + + let locked = false; + + if (!isModerator) { + if (isPublicChat) { + locked = (isLocked && disablePublicChat) || false; + } else { + locked = (isLocked && disablePrivateChat) || false; + } + } + + const CHAT_REPLY_ENABLED = useIsReplyChatMessageEnabled(); + const CHAT_REACTIONS_ENABLED = useIsChatMessageReactionsEnabled(); + const CHAT_EDIT_ENABLED = useIsEditChatMessageEnabled(); + const CHAT_DELETE_ENABLED = useIsDeleteChatMessageEnabled(); + + const hasToolbar = !!message.user && [ + CHAT_REPLY_ENABLED, + CHAT_REACTIONS_ENABLED, + CHAT_EDIT_ENABLED, + CHAT_DELETE_ENABLED, + ].some((config) => config); + + useImperativeHandle(ref, () => ({ + requestFocus() { + setTimeout(() => { + requestAnimationFrame(startScrollAnimation); + }, 0); + }, + }), []); + + const startScrollAnimation = (timestamp: number) => { + animationInitialScrollPosition.current = scrollRef.current?.scrollTop || 0; + animationScrollPositionDiff.current = (scrollRef.current?.scrollTop || 0) + - ((containerRef.current?.offsetTop || 0) - ((scrollRef.current?.offsetHeight || 0) / 2)); + animationInitialTimestamp.current = timestamp; + requestAnimationFrame(animateScrollPosition); + }; + + const startBackgroundAnimation = (timestamp: number) => { + animationInitialTimestamp.current = timestamp; + requestAnimationFrame(animateBackgroundColor); + }; + + const animateScrollPosition = (timestamp: number) => { + const value = (timestamp - animationInitialTimestamp.current) / SCROLL_ANIMATION_DURATION; + const { current: scrollContainer } = scrollRef; + const { current: messageContainer } = containerRef; + const { current: initialPosition } = animationInitialScrollPosition; + const { current: diff } = animationScrollPositionDiff; + if (!scrollContainer || !messageContainer) return; + if (value <= 1) { + // eslint-disable-next-line no-param-reassign + scrollContainer.scrollTop = initialPosition - (value * diff); + requestAnimationFrame(animateScrollPosition); + } else { + requestAnimationFrame(startBackgroundAnimation); + } + }; + + const animateBackgroundColor = (timestamp: number) => { + if (!messageContentRef.current) return; + const value = (timestamp - animationInitialTimestamp.current) / ANIMATION_DURATION; + if (value < 1) { + messageContentRef.current.style.backgroundColor = `rgb(${colorBlueLighterChannel} / ${1 - value})`; + requestAnimationFrame(animateBackgroundColor); + } else { + messageContentRef.current.style.backgroundColor = '#f4f6fa'; + } + }; useEffect(() => { - setMessagesRequestedFromPlugin((messages) => { + setRenderedChatMessages((messages) => { if (messageContentRef.current && !messages.some((m) => m.messageId === message.messageId)) { messages.push({ messageId: message.messageId, @@ -122,18 +296,25 @@ const ChatMesssage: React.FC = ({ const formattedTime = intl.formatTime(dateTime, { hour: 'numeric', minute: 'numeric', + hour12: false, }); + const editTime = message.editedAt ? new Date(message.editedAt) : null; + const deleteTime = message.deletedAt ? new Date(message.deletedAt) : null; const msgTime = formattedTime; const clearMessage = `${msgTime} ${intl.formatMessage(intlMessages.chatClear)}`; const messageContent: { - name: string, - color: string, - isModerator: boolean, - isPresentationUpload?: boolean, - component: React.ReactElement, - avatarIcon?: string, + name: string; + color: string; + isModerator: boolean; + isPresentationUpload?: boolean; + component: React.ReactNode; + avatarIcon?: string; + isSystemSender: boolean; + showAvatar: boolean; + showHeading: boolean; + showToolbar: boolean; } = useMemo(() => { switch (message.messageType) { case ChatMessageType.POLL: @@ -145,6 +326,10 @@ const ChatMesssage: React.FC = ({ ), avatarIcon: 'icon-bbb-polling', + showAvatar: true, + showHeading: true, + showToolbar: false, + isSystemSender: true, }; case ChatMessageType.PRESENTATION: return { @@ -152,12 +337,16 @@ const ChatMesssage: React.FC = ({ color: '#0F70D7', isModerator: false, isPresentationUpload: true, + isSystemSender: true, component: ( ), avatarIcon: 'icon-bbb-download', + showAvatar: true, + showHeading: true, + showToolbar: false, }; case ChatMessageType.CHAT_CLEAR: return { @@ -166,26 +355,30 @@ const ChatMesssage: React.FC = ({ isModerator: false, isSystemSender: true, component: ( - ), + showAvatar: false, + showHeading: false, + showToolbar: false, }; case ChatMessageType.BREAKOUT_ROOM: return { name: message.senderName, color: '#0F70D7', isModerator: true, - isSystemSender: true, + isSystemSender: false, component: ( ), + showAvatar: true, + showHeading: true, + showToolbar: true, }; case ChatMessageType.API: return { @@ -194,30 +387,33 @@ const ChatMesssage: React.FC = ({ isModerator: true, isSystemSender: true, component: ( - ), + showAvatar: false, + showHeading: false, + showToolbar: false, }; case ChatMessageType.USER_AWAY_STATUS_MSG: { const { away } = JSON.parse(message.messageMetadata); const awayMessage = (away) - ? `${intl.formatMessage(intlMessages.userAway)}` - : `${intl.formatMessage(intlMessages.userNotAway)}`; + ? `${message.senderName} ${intl.formatMessage(intlMessages.userAway)}` + : `${message.senderName} ${intl.formatMessage(intlMessages.userNotAway)}`; return { name: message.senderName, color: '#0F70D7', isModerator: true, isSystemSender: true, component: ( - ), + showAvatar: false, + showHeading: false, + showToolbar: false, }; } case ChatMessageType.PLUGIN: { @@ -226,13 +422,15 @@ const ChatMesssage: React.FC = ({ color: message.user?.color, isModerator: message.user?.isModerator, isSystemSender: false, + showAvatar: true, + showHeading: true, + showToolbar: true, component: currentPluginMessageMetadata.custom - ? (<>) + ? null : ( ), }; @@ -243,78 +441,167 @@ const ChatMesssage: React.FC = ({ name: message.user?.name, color: message.user?.color, isModerator: message.user?.isModerator, - isSystemSender: ChatMessageType.BREAKOUT_ROOM, + isSystemSender: false, + showAvatar: true, + showHeading: true, + showToolbar: true, component: ( ), }; } - }, []); + }, [message.message]); + + const shouldRenderAvatar = messageContent.showAvatar + && !sameSender + && !isCustomPluginMessage; + + const shouldRenderHeader = messageContent.showHeading + && !sameSender + && !isCustomPluginMessage; + return ( - - {((!message?.user || !sameSender) && ( - message.messageType !== ChatMessageType.USER_AWAY_STATUS_MSG - && message.messageType !== ChatMessageType.API - && message.messageType !== ChatMessageType.CHAT_CLEAR - && !isCustomPluginMessage) - ) && ( - - {!messageContent.avatarIcon ? ( - !message.user || (message.user?.avatar.length === 0 ? messageContent.name.toLowerCase().slice(0, 2) : '') - ) : ( - - )} - - )} - - {message.messageType !== ChatMessageType.CHAT_CLEAR - && !isCustomPluginMessage - && ( + { + sendReaction(emoji.native, emoji.id); + setIsToolbarReactionPopoverOpen(false); + }} + onReactionPopoverOpenChange={setIsToolbarReactionPopoverOpen} + reactionPopoverIsOpen={isToolbarReactionPopoverOpen} + chatDeleteEnabled={CHAT_DELETE_ENABLED} + chatEditEnabled={CHAT_EDIT_ENABLED} + chatReactionsEnabled={CHAT_REACTIONS_ENABLED} + chatReplyEnabled={CHAT_REPLY_ENABLED} + /> + {(shouldRenderAvatar || shouldRenderHeader) && ( + + {shouldRenderAvatar && ( + + {!messageContent.avatarIcon ? ( + !message.user || (message.user?.avatar.length === 0 ? messageContent.name.toLowerCase().slice(0, 2) : '') + ) : ( + + )} + + )} + {shouldRenderHeader && ( )} - - {messageContent.component} - {messageReadFeedbackEnabled && ( + + )} + + {message.replyToMessage && !deleteTime && ( + + )} + {!deleteTime && ( + + {messageContent.component} + {messageReadFeedbackEnabled && ( + )} + )} - - - + {sameSender && ( + + {!deleteTime && editTime && ( + + + {intl.formatMessage(intlMessages.edited)} + + )} + + + + + )} + {deleteTime && ( + + {intl.formatMessage(intlMessages.deleteMessage, { 0: message.deletedBy?.name })} + + )} + + {!deleteTime && ( + + )} + + ); -}; +}); function areChatMessagesEqual(prevProps: ChatMessageProps, nextProps: ChatMessageProps) { const prevMessage = prevProps?.message; const nextMessage = nextProps?.message; return prevMessage?.createdAt === nextMessage?.createdAt && prevMessage?.user?.currentlyInMeeting === nextMessage?.user?.currentlyInMeeting - && prevMessage?.recipientHasSeen === nextMessage.recipientHasSeen; + && prevMessage?.recipientHasSeen === nextMessage.recipientHasSeen + && prevMessage?.message === nextMessage.message + && prevMessage?.reactions?.length === nextMessage?.reactions?.length + && prevProps.focused === nextProps.focused + && prevProps.keyboardFocused === nextProps.keyboardFocused + && prevMessage.replyToMessage?.message === nextMessage.replyToMessage?.message; } -export default memo(ChatMesssage, areChatMessagesEqual); +export default memo(ChatMessage, areChatMessagesEqual); diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-content/notification-content/component.tsx b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-content/notification-content/component.tsx new file mode 100644 index 0000000000..c6679ec9b6 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-content/notification-content/component.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import Styled from './styles'; + +interface ChatMessageNotificationContentProps { + text: string; + iconName?: string; +} + +const ChatMessageNotificationContent: React.FC = (props) => { + const { text, iconName } = props; + return ( + + {iconName && } + + {text} + + + ); +}; + +export default ChatMessageNotificationContent; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-content/notification-content/styles.ts b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-content/notification-content/styles.ts new file mode 100644 index 0000000000..88503d4cbf --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-content/notification-content/styles.ts @@ -0,0 +1,37 @@ +import styled from 'styled-components'; +import BaseIcon from '/imports/ui/components/common/icon/component'; +import { colorGray } from '/imports/ui/stylesheets/styled-components/palette'; +import { $3xlPadding, smPadding } from '/imports/ui/stylesheets/styled-components/general'; + +export const Root = styled.div` + color: ${colorGray}; + padding: 0 ${$3xlPadding}; + width: 100%; + text-align: center; +`; + +export const Icon = styled(BaseIcon)` + vertical-align: baseline; + + [dir='ltr'] & { + margin-right: ${smPadding}; + } + + [dir='rtl'] & { + margin-left: ${smPadding}; + } +`; + +export const Typography = styled.p` + display: inline; + margin: 0; + vertical-align: baseline; + overflow-wrap: break-word; + white-space: pre-wrap; +`; + +export default { + Root, + Icon, + Typography, +}; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-content/text-content/component.tsx b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-content/text-content/component.tsx index cd2ddd86cf..5dd5e322dc 100644 --- a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-content/text-content/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-content/text-content/component.tsx @@ -5,19 +5,17 @@ import Styled from './styles'; interface ChatMessageTextContentProps { text: string; emphasizedMessage: boolean; - systemMsg: boolean; + dataTest?: string | null; } const ChatMessageTextContent: React.FC = ({ text, emphasizedMessage, - systemMsg, + dataTest = 'messageContent', }) => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - temporary, while meteor exists in the project const { allowedElements } = window.meetingClientSettings.public.chat; return ( - + ` flex-direction: column; color: ${colorText}; word-break: break-word; - ${({ systemMsg }) => systemMsg && ` - background: ${systemMessageBackgroundColor}; - border: 1px solid ${systemMessageBorderColor}; - border-radius: ${borderRadius}; - font-weight: ${btnFontWeight}; - padding: ${fontSizeBase}; - text-color: #1f252b; - margin-top: 0; - margin-bottom: 0; - overflow-wrap: break-word; - `} + ${({ emphasizedMessage }) => emphasizedMessage && ` font-weight: bold; `} diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-header/component.tsx b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-header/component.tsx index ded8cc1217..2e684ca1d0 100644 --- a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-header/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-header/component.tsx @@ -1,5 +1,6 @@ import React from 'react'; import { useIntl, defineMessages, FormattedTime } from 'react-intl'; +import Icon from '/imports/ui/components/common/icon/component'; import Styled from './styles'; const intlMessages = defineMessages({ @@ -7,6 +8,10 @@ const intlMessages = defineMessages({ id: 'app.chat.offline', description: 'Offline', }, + edited: { + id: 'app.chat.toolbar.edit.edited', + description: 'Edited', + }, }); interface ChatMessageHeaderProps { @@ -14,6 +19,8 @@ interface ChatMessageHeaderProps { currentlyInMeeting: boolean; dateTime: Date; sameSender: boolean; + deleteTime: Date | null; + editTime: Date | null; } const ChatMessageHeader: React.FC = ({ @@ -21,6 +28,8 @@ const ChatMessageHeader: React.FC = ({ name, currentlyInMeeting, dateTime, + deleteTime, + editTime, }) => { const intl = useIntl(); if (sameSender) return null; @@ -38,8 +47,19 @@ const ChatMessageHeader: React.FC = ({ ) } + {!deleteTime && editTime && ( + + + {intl.formatMessage(intlMessages.edited)} + + )} + {deleteTime && ( + + + + )} - + diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-header/styles.ts b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-header/styles.ts index bf20cee5e9..bb406ce45c 100644 --- a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-header/styles.ts +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-header/styles.ts @@ -2,10 +2,10 @@ import styled from 'styled-components'; import { colorHeading, - palettePlaceholderText, colorGrayLight, + colorGrayDark, } from '/imports/ui/stylesheets/styled-components/palette'; -import { lineHeightComputed } from '/imports/ui/stylesheets/styled-components/typography'; +import { fontSizeSmaller, lineHeightComputed } from '/imports/ui/stylesheets/styled-components/typography'; interface ChatUserNameProps { currentlyInMeeting: boolean; @@ -14,6 +14,7 @@ interface ChatUserNameProps { export const HeaderContent = styled.div` display: flex; flex-flow: row; + align-items: center; width: 100%; `; @@ -30,6 +31,7 @@ export const ChatUserName = styled.div` white-space: nowrap; overflow: hidden; text-overflow: ellipsis; + flex-grow: 1; ${({ currentlyInMeeting }) => currentlyInMeeting && ` color: ${colorHeading}; @@ -65,8 +67,8 @@ export const ChatUserOffline = styled.span` export const ChatTime = styled.time` flex-shrink: 0; flex-grow: 0; - flex-basis: 3.5rem; - color: ${palettePlaceholderText}; + flex-basis: max-content; + color: ${colorGrayDark}; text-transform: uppercase; font-size: 75%; [dir='rtl'] & { @@ -84,10 +86,27 @@ export const ChatHeaderText = styled.div` width: 100%; `; +export const EditLabel = styled.span` + color: ${colorGrayLight}; + font-size: ${fontSizeSmaller}; + display: flex; + align-items: center; + gap: calc(${lineHeightComputed} / 4); + + [dir='ltr'] & { + margin-right: calc(${lineHeightComputed} / 2); + } + + [dir='rtl'] & { + margin-left: calc(${lineHeightComputed} / 2); + } +`; + export default { HeaderContent, ChatTime, ChatUserOffline, ChatUserName, ChatHeaderText, + EditLabel, }; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-reactions/component.tsx b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-reactions/component.tsx new file mode 100644 index 0000000000..a77ee75ca6 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-reactions/component.tsx @@ -0,0 +1,129 @@ +import React from 'react'; +import { defineMessages, useIntl } from 'react-intl'; +import Styled from './styles'; +import useCurrentUser from '/imports/ui/core/hooks/useCurrentUser'; +import TooltipContainer from '/imports/ui/components/common/tooltip/container'; + +const intlMessages = defineMessages({ + reactedBy: { + id: 'app.chat.toolbar.reactions.reactedByLabel', + }, + you: { + id: 'app.chat.toolbar.reactions.youLabel', + }, + and: { + id: 'app.chat.toolbar.reactions.andLabel', + }, + findAReaction: { + id: 'app.chat.toolbar.reactions.findReactionButtonLabel', + }, +}); + +interface ChatMessageReactionsProps { + reactions: { + createdAt: string; + reactionEmoji: string; + reactionEmojiId: string; + user: { + name: string; + userId: string; + }; + }[]; + sendReaction(reactionEmoji: string, reactionEmojiId: string): void; + deleteReaction(reactionEmoji: string, reactionEmojiId: string): void; +} + +type ReactionItem = { + count: number; + userNames: string[]; + reactedByMe: boolean; + reactionEmoji: string; + reactionEmojiId: string; + leastRecent: number; +} + +const sortByCount = (r1: ReactionItem, r2: ReactionItem) => r2.count - r1.count; +const sortByLeastRecent = (r1: ReactionItem, r2: ReactionItem) => r1.leastRecent - r2.leastRecent; + +const ChatMessageReactions: React.FC = (props) => { + const { reactions, sendReaction, deleteReaction } = props; + + const { data: currentUser } = useCurrentUser((u) => ({ userId: u.userId })); + const intl = useIntl(); + + if (reactions.length === 0) return null; + + const reactionItems: Record< + string, + ReactionItem + > = {}; + + reactions.forEach((reaction) => { + if (!reactionItems[reaction.reactionEmojiId]) { + const reactedByMe = reaction.user.userId === currentUser?.userId; + reactionItems[reaction.reactionEmojiId] = { + count: 1, + userNames: reactedByMe ? [] : [reaction.user.name], + reactedByMe, + reactionEmoji: reaction.reactionEmoji, + reactionEmojiId: reaction.reactionEmojiId, + leastRecent: new Date(reaction.createdAt).getTime(), + }; + return; + } + + reactionItems[reaction.reactionEmojiId].count += 1; + if (reaction.user.userId === currentUser?.userId) { + reactionItems[reaction.reactionEmojiId].reactedByMe = true; + } else { + reactionItems[reaction.reactionEmojiId].userNames.push(reaction.user.name); + } + }); + + return ( + + {Object.values(reactionItems).sort(sortByLeastRecent).sort(sortByCount).map((details) => { + let label = intl.formatMessage(intlMessages.reactedBy); + if (details.userNames.length) { + const users = details.userNames.join(', '); + label += ` ${users}`; + + if (details.reactedByMe) { + label += ` ${intl.formatMessage(intlMessages.and)} ${intl.formatMessage(intlMessages.you)}`; + } + } else if (details.reactedByMe) { + label += ` ${intl.formatMessage(intlMessages.you)}`; + } + + return ( + + { + if (details.reactedByMe) { + deleteReaction(details.reactionEmoji, details.reactionEmojiId); + } else { + sendReaction(details.reactionEmoji, details.reactionEmojiId); + } + }} + > + + {details.count} + + + ); + })} + + ); +}; + +export default ChatMessageReactions; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-reactions/styles.ts b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-reactions/styles.ts new file mode 100644 index 0000000000..1fda9f646c --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-reactions/styles.ts @@ -0,0 +1,45 @@ +import styled from 'styled-components'; +import { + colorGrayLighter, colorGrayLightest, colorOffWhite, +} from '/imports/ui/stylesheets/styled-components/palette'; + +const EmojiWrapper = styled.button<{ highlighted: boolean }>` + background: none; + border-radius: 1rem; + padding: 0.375rem 1rem; + line-height: 1; + display: flex; + flex-wrap: nowrap; + border: 1px solid ${colorGrayLightest}; + cursor: pointer; + + ${({ highlighted }) => highlighted && ` + background-color: ${colorOffWhite}; + `} + + em-emoji { + [dir='ltr'] & { + margin-right: 0.25rem; + } + + [dir='rtl'] & { + margin-left: 0.25rem; + } + } + + &:hover { + border: 1px solid ${colorGrayLighter}; + } +`; + +const ReactionsWrapper = styled.div` + display: flex; + flex-wrap: wrap; + gap: 0.25rem; + user-select: none; +`; + +export default { + EmojiWrapper, + ReactionsWrapper, +}; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-replied/component.tsx b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-replied/component.tsx new file mode 100644 index 0000000000..58b5a4ee71 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-replied/component.tsx @@ -0,0 +1,60 @@ +import React from 'react'; +import { defineMessages, useIntl } from 'react-intl'; +import Styled, { DeleteMessage } from './styles'; +import Storage from '/imports/ui/services/storage/in-memory'; +import { ChatEvents } from '/imports/ui/core/enums/chat'; + +const intlMessages = defineMessages({ + deleteMessage: { + id: 'app.chat.deleteMessage', + description: '', + }, +}); + +interface MessageRepliedProps { + message: string; + sequence: number; + emphasizedMessage: boolean; + deletedByUser: string | null; +} + +const ChatMessageReplied: React.FC = (props) => { + const { + message, sequence, emphasizedMessage, deletedByUser, + } = props; + + const intl = useIntl(); + const messageChunks = message.split('\n'); + + return ( + { + e.preventDefault(); + window.dispatchEvent( + new CustomEvent(ChatEvents.CHAT_FOCUS_MESSAGE_REQUEST, { + detail: { + sequence, + }, + }), + ); + Storage.removeItem(ChatEvents.CHAT_FOCUS_MESSAGE_REQUEST); + Storage.setItem(ChatEvents.CHAT_FOCUS_MESSAGE_REQUEST, sequence); + }} + > + {!deletedByUser && ( + + + {messageChunks[0]} + + + )} + {deletedByUser && ( + + {intl.formatMessage(intlMessages.deleteMessage, { 0: deletedByUser })} + + )} + + ); +}; + +export default ChatMessageReplied; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-replied/styles.tsx b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-replied/styles.tsx new file mode 100644 index 0000000000..3736dc2009 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-replied/styles.tsx @@ -0,0 +1,73 @@ +import styled from 'styled-components'; +import { + colorGrayLight, + colorGrayLightest, colorPrimary, colorText, colorWhite, +} from '/imports/ui/stylesheets/styled-components/palette'; +import { $3xlPadding, smPadding } from '/imports/ui/stylesheets/styled-components/general'; +import ReactMarkdown from 'react-markdown'; + +const Container = styled.div` + border-top-left-radius: 0.5rem; + border-top-right-radius: 0.5rem; + background-color: ${colorWhite}; + box-shadow: inset 0 0 0 1px ${colorGrayLightest}; + padding: ${smPadding} ${$3xlPadding}; + position: relative; + overflow: hidden; + cursor: pointer; + + [dir='ltr'] & { + border-right: 0.5rem solid ${colorPrimary}; + } + + [dir='rtl'] & { + border-left: 0.5rem solid ${colorPrimary}; + } +`; + +const Message = styled.div` + line-height: normal; + overflow: hidden; +`; + +export const DeleteMessage = styled.span` + color: ${colorGrayLight}; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +`; + +export const Markdown = styled(ReactMarkdown)<{ + $emphasizedMessage: boolean; +}>` + color: ${colorText}; + + ${({ $emphasizedMessage }) => $emphasizedMessage && ` + font-weight: bold; + `} + + & img { + max-width: 100%; + max-height: 100%; + } + + & p { + margin: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + & code { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +`; + +export default { + Container, + Message, + DeleteMessage, + Markdown, +}; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-toolbar/component.tsx b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-toolbar/component.tsx new file mode 100644 index 0000000000..3d24c15b36 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-toolbar/component.tsx @@ -0,0 +1,237 @@ +import React from 'react'; +import { defineMessages, useIntl } from 'react-intl'; +import { useMutation } from '@apollo/client'; +import Popover from '@mui/material/Popover'; +import { FocusTrap } from '@mui/base/FocusTrap'; +import { layoutSelect } from '/imports/ui/components/layout/context'; +import { Layout } from '/imports/ui/components/layout/layoutTypes'; +import { ChatEvents } from '/imports/ui/core/enums/chat'; +import ConfirmationModal from '/imports/ui/components/common/modal/confirmation/component'; +import { + Container, + Divider, + EmojiButton, + EmojiPicker, + EmojiPickerWrapper, + Root, +} from './styles'; +import { CHAT_DELETE_MESSAGE_MUTATION } from '../mutations'; + +const intlMessages = defineMessages({ + reply: { + id: 'app.chat.toolbar.reply', + description: 'reply label', + }, + edit: { + id: 'app.chat.toolbar.edit', + description: 'edit label', + }, + delete: { + id: 'app.chat.toolbar.delete', + description: 'delete label', + }, + cancelLabel: { + id: 'app.chat.toolbar.delete.cancelLabel', + description: '', + }, + confirmationTitle: { + id: 'app.chat.toolbar.delete.confirmationTitle', + description: '', + }, + confirmationDescription: { + id: 'app.chat.toolbar.delete.confirmationDescription', + description: '', + }, +}); + +interface ChatMessageToolbarProps { + messageId: string; + chatId: string; + username: string; + own: boolean; + amIModerator: boolean; + message: string; + messageSequence: number; + emphasizedMessage: boolean; + onEmojiSelected(emoji: { id: string; native: string }): void; + onReactionPopoverOpenChange(open: boolean): void; + reactionPopoverIsOpen: boolean; + hasToolbar: boolean; + locked: boolean; + deleted: boolean; + chatReplyEnabled: boolean; + chatReactionsEnabled: boolean; + chatEditEnabled: boolean; + chatDeleteEnabled: boolean; + keyboardFocused: boolean; +} + +const ChatMessageToolbar: React.FC = (props) => { + const { + messageId, chatId, message, username, onEmojiSelected, deleted, + messageSequence, emphasizedMessage, own, amIModerator, locked, + onReactionPopoverOpenChange, reactionPopoverIsOpen, hasToolbar, keyboardFocused, + chatDeleteEnabled, chatEditEnabled, chatReactionsEnabled, chatReplyEnabled, + } = props; + const [reactionsAnchor, setReactionsAnchor] = React.useState( + null, + ); + const [isTryingToDelete, setIsTryingToDelete] = React.useState(false); + const intl = useIntl(); + const [chatDeleteMessage] = useMutation(CHAT_DELETE_MESSAGE_MUTATION); + + const isRTL = layoutSelect((i: Layout) => i.isRTL); + + if ([ + chatReplyEnabled, + chatReactionsEnabled, + chatEditEnabled, + chatDeleteEnabled, + ].every((config) => !config) || !hasToolbar || locked || deleted) return null; + + const showReplyButton = chatReplyEnabled; + const showReactionsButton = chatReactionsEnabled; + const showEditButton = chatEditEnabled && own; + const showDeleteButton = chatDeleteEnabled && (own || amIModerator); + const showDivider = (showReplyButton || showReactionsButton) && (showEditButton || showDeleteButton); + + return ( + { + if (e.key === 'Escape' && keyboardFocused) { + window.dispatchEvent(new CustomEvent(ChatEvents.CHAT_KEYBOARD_FOCUS_MESSAGE_CANCEL)); + } + }} + > + + + {showReplyButton && ( + <> + ) => { + e.stopPropagation(); + window.dispatchEvent( + new CustomEvent(ChatEvents.CHAT_REPLY_INTENTION, { + detail: { + username, + message, + messageId, + chatId, + emphasizedMessage, + sequence: messageSequence, + }, + }), + ); + window.dispatchEvent( + new CustomEvent(ChatEvents.CHAT_CANCEL_EDIT_REQUEST), + ); + }} + /> + + {intl.formatMessage(intlMessages.reply, { 0: messageSequence })} + + + )} + {showReactionsButton && ( + ) => { + e.stopPropagation(); + onReactionPopoverOpenChange(true); + }} + svgIcon="reactions" + color="light" + data-test="reactionsPickerButton" + ref={setReactionsAnchor} + /> + )} + {showDivider && } + {showEditButton && ( + ) => { + e.stopPropagation(); + window.dispatchEvent( + new CustomEvent(ChatEvents.CHAT_EDIT_REQUEST, { + detail: { + messageId, + chatId, + message, + }, + }), + ); + window.dispatchEvent( + new CustomEvent(ChatEvents.CHAT_CANCEL_REPLY_INTENTION), + ); + }} + icon="pen_tool" + color="light" + data-test="editMessageButton" + /> + )} + {showDeleteButton && ( + ) => { + e.stopPropagation(); + setIsTryingToDelete(true); + }} + icon="delete" + color="light" + data-test="deleteMessageButton" + /> + )} + { + onReactionPopoverOpenChange(false); + }} + anchorOrigin={{ + vertical: 'top', + horizontal: isRTL ? 'left' : 'right', + }} + transformOrigin={{ + vertical: 'top', + horizontal: isRTL ? 'right' : 'left', + }} + > + + { + onEmojiSelected(emojiObject); + }} + showPreview={false} + showSkinTones={false} + /> + + + {isTryingToDelete && ( + setIsTryingToDelete(false)} + onConfirm={() => { + chatDeleteMessage({ + variables: { + chatId, + messageId, + }, + }); + }} + title={intl.formatMessage(intlMessages.confirmationTitle)} + confirmButtonLabel={intl.formatMessage(intlMessages.delete)} + cancelButtonLabel={intl.formatMessage(intlMessages.cancelLabel)} + description={intl.formatMessage(intlMessages.confirmationDescription)} + confirmButtonColor="danger" + priority="low" + /> + )} + + + + ); +}; + +export default ChatMessageToolbar; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-toolbar/emoji-button/component.tsx b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-toolbar/emoji-button/component.tsx new file mode 100644 index 0000000000..967f3ae17e --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-toolbar/emoji-button/component.tsx @@ -0,0 +1,34 @@ +import React from 'react'; +import Styled from './styles'; +import Icon from '/imports/ui/components/common/icon/component'; +import SvgIcon from '/imports/ui/components/common/icon-svg/component'; + +interface EmojiButtonProps extends React.ComponentProps<'button'> { + icon?: string; + svgIcon?: string; +} + +const EmojiButton = React.forwardRef((props, ref) => { + const { + icon, + svgIcon, + ...buttonProps + } = props; + + let IconComponent: React.ReactNode = null; + + if (icon) { + IconComponent = (); + } else if (svgIcon) { + IconComponent = (); + } + + return ( + // eslint-disable-next-line react/jsx-props-no-spreading + + {IconComponent} + + ); +}); + +export default EmojiButton; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-toolbar/emoji-button/styles.ts b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-toolbar/emoji-button/styles.ts new file mode 100644 index 0000000000..ace20831f2 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-toolbar/emoji-button/styles.ts @@ -0,0 +1,40 @@ +import styled from 'styled-components'; +import { colorGray } from '/imports/ui/stylesheets/styled-components/palette'; +import { lgPadding } from '/imports/ui/stylesheets/styled-components/general'; +import { fontSizeSmaller } from '/imports/ui/stylesheets/styled-components/typography'; + +const EmojiButton = styled.button` + line-height: 1; + font-size: ${fontSizeSmaller}; + background: none; + border: none; + outline: none; + padding: ${lgPadding}; + color: ${colorGray}; + cursor: pointer; + + &:focus, + &:hover { + opacity: 0.5; + } + + &:active { + transform: scale(0.9); + } + + i::before { + display: block; + width: 100%; + height: 100%; + } + + svg { + width: 1rem; + height: 1rem; + vertical-align: middle; + } +`; + +export default { + EmojiButton, +}; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-toolbar/styles.ts b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-toolbar/styles.ts new file mode 100644 index 0000000000..0efd3f838b --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-toolbar/styles.ts @@ -0,0 +1,105 @@ +import styled, { css } from 'styled-components'; +import { + colorGrayLighter, + colorGrayLightest, + colorWhite, +} from '/imports/ui/stylesheets/styled-components/palette'; +import { $2xlPadding, borderRadius, smPadding } from '/imports/ui/stylesheets/styled-components/general'; +import EmojiPickerComponent from '/imports/ui/components/emoji-picker/component'; +import BaseEmojiButton from './emoji-button/component'; + +interface RootProps { + $reactionPopoverIsOpen: boolean; +} + +const Root = styled.div` + padding-bottom: ${smPadding}; + justify-content: flex-end; + display: none; + position: absolute; + bottom: 100%; + z-index: 10; + + [dir='ltr'] & { + padding-left: ${$2xlPadding}; + right: 0; + } + + [dir='rtl'] & { + padding-right: ${$2xlPadding}; + left: 0; + } + + .chat-message-wrapper:hover &, + .chat-message-wrapper:focus &, + .chat-message-wrapper-focused &, + .chat-message-wrapper-keyboard-focused &, + &:hover, + &:focus-within { + display: flex; + } + + ${({ $reactionPopoverIsOpen }) => ($reactionPopoverIsOpen && css` + display: flex; + `)} +`; + +const Container = styled.div` + max-width: max-content; + display: flex; + border-radius: 1rem; + background-color: ${colorWhite}; + box-shadow: 0 0.125rem 0.125rem 0 ${colorGrayLighter}; +`; + +const EmojiPickerWrapper = styled.div` + bottom: calc(100% + 0.5rem); + left: 0; + right: 0; + border: 1px solid ${colorGrayLighter}; + border-radius: ${borderRadius}; + box-shadow: 0 0.125rem 10px rgba(0,0,0,0.1); + z-index: 1000; + + .emoji-mart { + max-width: 100% !important; + } + + .emoji-mart-anchor { + cursor: pointer; + } + + .emoji-mart-emoji { + cursor: pointer !important; + } + + .emoji-mart-category-list { + span { + cursor: pointer !important; + display: inline-block !important; + } + } +`; + +const EmojiButton = styled(BaseEmojiButton)``; + +const EmojiPicker = styled(EmojiPickerComponent)` + position: relative; +`; + +const Divider = styled.div` + width: 0.125rem; + height: 75%; + border-radius: 0.5rem; + background-color: ${colorGrayLightest}; + align-self: center; +`; + +export { + Container, + EmojiPicker, + EmojiPickerWrapper, + EmojiButton, + Root, + Divider, +}; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/mutations.ts b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/mutations.ts new file mode 100644 index 0000000000..272aee9993 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/mutations.ts @@ -0,0 +1,49 @@ +import { gql } from '@apollo/client'; + +const CHAT_EDIT_MESSAGE_MUTATION = gql` + mutation($chatId: String!, $messageId: String!, $chatMessageInMarkdownFormat: String!) { + chatEditMessage(chatId: $chatId, messageId: $messageId, chatMessageInMarkdownFormat: $chatMessageInMarkdownFormat) + } +`; + +const CHAT_DELETE_MESSAGE_MUTATION = gql` + mutation($chatId: String!, $messageId: String!) { + chatDeleteMessage(chatId: $chatId, messageId: $messageId) + } +`; + +const CHAT_SEND_REACTION_MUTATION = gql` + mutation($chatId: String!, $messageId: String!, $reactionEmoji: String!, $reactionEmojiId: String!) { + chatSendMessageReaction( + chatId: $chatId, + messageId: $messageId, + reactionEmoji: $reactionEmoji, + reactionEmojiId: $reactionEmojiId + ) + } +`; + +const CHAT_DELETE_REACTION_MUTATION = gql` + mutation($chatId: String!, $messageId: String!, $reactionEmoji: String!, $reactionEmojiId: String!) { + chatDeleteMessageReaction( + chatId: $chatId, + messageId: $messageId, + reactionEmoji: $reactionEmoji, + reactionEmojiId: $reactionEmojiId + ) + } +`; + +export default { + CHAT_EDIT_MESSAGE_MUTATION, + CHAT_DELETE_MESSAGE_MUTATION, + CHAT_DELETE_REACTION_MUTATION, + CHAT_SEND_REACTION_MUTATION, +}; + +export { + CHAT_EDIT_MESSAGE_MUTATION, + CHAT_DELETE_MESSAGE_MUTATION, + CHAT_DELETE_REACTION_MUTATION, + CHAT_SEND_REACTION_MUTATION, +}; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/styles.ts b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/styles.ts index 95274606c8..e84ec910b0 100644 --- a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/styles.ts +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/styles.ts @@ -1,19 +1,26 @@ import styled, { css } from 'styled-components'; import { - borderSize, userIndicatorsOffset, smPaddingX, + smPaddingY, + lgPadding, + $3xlPadding, + xlPadding, + mdPadding, } from '/imports/ui/stylesheets/styled-components/general'; import { - lineHeightComputed, fontSizeBase, + fontSizeSmaller, } from '/imports/ui/stylesheets/styled-components/typography'; import { colorWhite, userListBg, colorSuccess, + colorBlueLightest, + colorGrayLight, + colorGrayLightest, } from '/imports/ui/stylesheets/styled-components/palette'; import Header from '/imports/ui/components/common/control-header/component'; @@ -28,6 +35,12 @@ interface ChatWrapperProps { interface ChatContentProps { sameSender: boolean; isCustomPluginMessage: boolean; + $isSystemSender: boolean; + $editing: boolean; + $highlight: boolean; + $reactionPopoverIsOpen: boolean; + $focused: boolean; + $keyboardFocused: boolean; } interface ChatAvatarProps { @@ -39,12 +52,17 @@ interface ChatAvatarProps { export const ChatWrapper = styled.div` pointer-events: auto; + display: flex; + flex-flow: column; + gap: ${smPaddingY}; + position: relative; + font-size: ${fontSizeBase}; + position: relative; + [dir='rtl'] & { direction: rtl; } - display: flex; - flex-flow: row; - position: relative; + ${({ isPresentationUpload }) => isPresentationUpload && ` border-left: 2px solid #0F70D7; margin-top: 1rem; @@ -52,18 +70,6 @@ export const ChatWrapper = styled.div` word-break: break-word; background-color: #F3F6F9; `} - ${({ sameSender }) => sameSender && ` - flex: 1; - margin: ${borderSize} 0 0 ${borderSize}; - margin-top: calc(${lineHeightComputed} / 3); - `} - ${({ sameSender }) => !sameSender && ` - padding-top:${lineHeightComputed}; - `} - [dir="rtl"] & { - margin: ${borderSize} ${borderSize} 0 0; - } - font-size: ${fontSizeBase}; ${({ isSystemSender }) => isSystemSender && ` background-color: #fef9f1; border-left: 2px solid #f5c67f; @@ -80,11 +86,31 @@ export const ChatContent = styled.div` display: flex; flex-flow: column; width: 100%; + border-radius: 0.5rem; - ${({ sameSender, isCustomPluginMessage }) => sameSender - && !isCustomPluginMessage && ` - margin-left: 2.6rem; + ${({ $isSystemSender }) => !$isSystemSender && ` + background-color: #f4f6fa; `} + + ${({ $highlight }) => $highlight && ` + .chat-message-wrapper:hover > & { + background-color: ${colorBlueLightest} !important; + } + `} + + ${({ + $editing, $reactionPopoverIsOpen, $focused, $keyboardFocused, + }) => ($reactionPopoverIsOpen || $editing || $focused || $keyboardFocused) + && ` + background-color: ${colorBlueLightest} !important; + `} +`; + +export const ChatContentFooter = styled.div` + display: flex; + justify-content: flex-end; + gap: 0.25rem; + padding: 0 ${lgPadding} ${lgPadding}; `; export const ChatHeader = styled(Header)` @@ -112,7 +138,6 @@ export const ChatAvatar = styled.div` ${({ color }) => css` background-color: ${color}; `} - } &:after, &:before { @@ -171,14 +196,44 @@ export const ChatAvatar = styled.div` justify-content: center; align-items:center; // ================ content ================ - + & .react-loading-skeleton { height: 2.25rem; width: 2.25rem; } `; +export const Container = styled.div<{ $sequence: number }>` + display: flex; + flex-direction: column; + + &:not(:first-child) { + margin-top: calc((${fontSizeSmaller} + ${lgPadding} * 2) / 2); + } +`; + export const MessageItemWrapper = styled.div` display: flex; flex-direction: row; + padding: ${lgPadding} ${$3xlPadding}; +`; + +export const DeleteMessage = styled.span` + color: ${colorGrayLight}; + padding: ${mdPadding} ${xlPadding}; + border: 1px solid ${colorGrayLightest}; + border-radius: 0.375rem; +`; + +export const ChatHeading = styled.div` + display: flex; +`; + +export const EditLabel = styled.span` + color: ${colorGrayLight}; + font-size: 75%; + display: flex; + align-items: center; + gap: 0.125rem; + line-height: 1; `; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/component.tsx b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/component.tsx index 0920d152c9..62c081befa 100644 --- a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/component.tsx @@ -1,12 +1,15 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ import React, { useContext, useEffect, useState, memo, + useRef, } from 'react'; import { PluginsContext } from '/imports/ui/components/components-data/plugin-context/context'; -import { UpdatedEventDetailsForChatMessageDomElements } from 'bigbluebutton-html-plugin-sdk/dist/cjs/dom-element-manipulation/chat/message/types'; +import { + UpdatedEventDetailsForChatMessageDomElements, + MessageDetails, +} from 'bigbluebutton-html-plugin-sdk/dist/cjs/dom-element-manipulation/chat/message/types'; import { HookEvents } from 'bigbluebutton-html-plugin-sdk/dist/cjs/core/enum'; import { UpdatedEventDetails } from 'bigbluebutton-html-plugin-sdk/dist/cjs/core/types'; import { DomElementManipulationHooks } from 'bigbluebutton-html-plugin-sdk/dist/cjs/dom-element-manipulation/enums'; @@ -15,11 +18,15 @@ import { CHAT_MESSAGE_PRIVATE_SUBSCRIPTION, } from './queries'; import { Message } from '/imports/ui/Types/message'; -import ChatMessage from './chat-message/component'; +import ChatMessage, { ChatMessageRef } from './chat-message/component'; import { GraphqlDataHookSubscriptionResponse } from '/imports/ui/Types/hook'; import { useCreateUseSubscription } from '/imports/ui/core/hooks/createUseSubscription'; import { setLoadedMessageGathering } from '/imports/ui/core/hooks/useLoadedChatMessages'; import { ChatLoading } from '../../component'; +import { ChatEvents } from '/imports/ui/core/enums/chat'; +import { useStorageKey, STORAGES } from '/imports/ui/services/storage/hooks'; + +const PAGE_SIZE = 50; interface ChatListPageContainerProps { page: number; @@ -29,6 +36,8 @@ interface ChatListPageContainerProps { chatId: string; markMessageAsSeen: (message: Message) => void; scrollRef: React.RefObject; + focusedId: number | null; + firstPageToLoad: number; } interface ChatListPageProps { @@ -38,6 +47,8 @@ interface ChatListPageProps { page: number; markMessageAsSeen: (message: Message)=> void; scrollRef: React.RefObject; + focusedId: number | null; + firstPageToLoad: number; } const areChatPagesEqual = (prevProps: ChatListPageProps, nextProps: ChatListPageProps) => { @@ -50,8 +61,10 @@ const areChatPagesEqual = (prevProps: ChatListPageProps, nextProps: ChatListPage && prevMessage.createdAt === nextMessage.createdAt && prevMessage?.user?.currentlyInMeeting === nextMessage?.user?.currentlyInMeeting && prevMessage?.recipientHasSeen === nextMessage?.recipientHasSeen + && prevMessage?.message === nextMessage?.message + && prevMessage?.reactions?.length === nextMessage?.reactions?.length ); - }); + }) && prevProps.focusedId === nextProps.focusedId; }; const ChatListPage: React.FC = ({ @@ -61,29 +74,114 @@ const ChatListPage: React.FC = ({ page, markMessageAsSeen, scrollRef, + focusedId, + firstPageToLoad, }) => { const { domElementManipulationIdentifiers } = useContext(PluginsContext); + const messageRefs = useRef>({}); + const chatFocusMessageRequest = useStorageKey(ChatEvents.CHAT_FOCUS_MESSAGE_REQUEST, STORAGES.IN_MEMORY); + const [keyboardFocusedMessageSequence, setKeyboardFocusedMessageSequence] = useState(null); + const [editingId, setEditingId] = useState(null); - const [messagesRequestedFromPlugin, setMessagesRequestedFromPlugin] = useState< - UpdatedEventDetailsForChatMessageDomElements[]>([]); + const [renderedChatMessages, setRenderedChatMessages] = useState([]); useEffect(() => { - const dataToSend = messagesRequestedFromPlugin.filter(( + const requestedMessages = renderedChatMessages.filter(( chatMessageRequested, ) => domElementManipulationIdentifiers.CHAT_MESSAGE?.includes(chatMessageRequested.messageId)); - window.dispatchEvent( - new CustomEvent>(HookEvents.BBB_CORE_SENT_NEW_DATA, { - detail: { - hook: DomElementManipulationHooks.CHAT_MESSAGE, - data: dataToSend, - }, - }), - ); - }, [domElementManipulationIdentifiers, messagesRequestedFromPlugin]); + + if (renderedChatMessages.length === messages.length) { + // Only dispatch event when all messages from the page have been rendered + // and dom elements registered in the components state + window.dispatchEvent( + new CustomEvent>(HookEvents.BBB_CORE_SENT_NEW_DATA, { + detail: { + hook: DomElementManipulationHooks.CHAT_MESSAGE, + data: { + page, + messages: requestedMessages, + }, + }, + }), + ); + } + + return () => { + // The page has unmounted, send an event to indicate this to the plugins sdk + window.dispatchEvent( + new CustomEvent>(HookEvents.BBB_CORE_SENT_NEW_DATA, { + detail: { + hook: DomElementManipulationHooks.CHAT_MESSAGE, + data: { + page, + messages: [], + }, + }, + }), + ); + }; + }, [domElementManipulationIdentifiers, renderedChatMessages]); + + useEffect(() => { + const handleKeyboardFocusMessageRequest = (e: Event) => { + if (e instanceof CustomEvent) { + setKeyboardFocusedMessageSequence(Number.parseInt(e.detail.sequence, 10)); + } + }; + + const handleKeyboardFocusMessageCancel = (e: Event) => { + if (e instanceof CustomEvent) { + setKeyboardFocusedMessageSequence(null); + } + }; + + const handleFocusMessageRequest = (e: Event) => { + if (e instanceof CustomEvent) { + if (e.detail.sequence) { + if (Math.ceil(e.detail.sequence / PAGE_SIZE) < firstPageToLoad) { + return; + } + messageRefs.current[Number.parseInt(e.detail.sequence, 10)]?.requestFocus(); + } + } + }; + + const handleChatEditRequest = (e: Event) => { + if (e instanceof CustomEvent) { + setEditingId(e.detail.messageId); + } + }; + + const handleCancelChatEditRequest = (e: Event) => { + if (e instanceof CustomEvent) { + setEditingId(null); + } + }; + + window.addEventListener(ChatEvents.CHAT_KEYBOARD_FOCUS_MESSAGE_REQUEST, handleKeyboardFocusMessageRequest); + window.addEventListener(ChatEvents.CHAT_KEYBOARD_FOCUS_MESSAGE_CANCEL, handleKeyboardFocusMessageCancel); + window.addEventListener(ChatEvents.CHAT_FOCUS_MESSAGE_REQUEST, handleFocusMessageRequest); + window.addEventListener(ChatEvents.CHAT_EDIT_REQUEST, handleChatEditRequest); + window.addEventListener(ChatEvents.CHAT_CANCEL_EDIT_REQUEST, handleCancelChatEditRequest); + + return () => { + window.removeEventListener(ChatEvents.CHAT_KEYBOARD_FOCUS_MESSAGE_REQUEST, handleKeyboardFocusMessageRequest); + window.removeEventListener(ChatEvents.CHAT_KEYBOARD_FOCUS_MESSAGE_CANCEL, handleKeyboardFocusMessageCancel); + window.removeEventListener(ChatEvents.CHAT_FOCUS_MESSAGE_REQUEST, handleFocusMessageRequest); + window.removeEventListener(ChatEvents.CHAT_EDIT_REQUEST, handleChatEditRequest); + window.removeEventListener(ChatEvents.CHAT_CANCEL_EDIT_REQUEST, handleCancelChatEditRequest); + }; + }, [firstPageToLoad]); + + useEffect(() => { + if (typeof chatFocusMessageRequest === 'number') { + messageRefs.current[chatFocusMessageRequest]?.requestFocus(); + } + }, []); return ( - // eslint-disable-next-line react/jsx-filename-extension -
+ {messages.map((message, index, messagesArray) => { const previousMessage = messagesArray[index - 1]; return ( @@ -91,17 +189,23 @@ const ChatListPage: React.FC = ({ key={message.createdAt} message={message} previousMessage={previousMessage} - setMessagesRequestedFromPlugin={setMessagesRequestedFromPlugin} + setRenderedChatMessages={setRenderedChatMessages} lastSenderPreviousPage={ !previousMessage ? lastSenderPreviousPage : null } scrollRef={scrollRef} markMessageAsSeen={markMessageAsSeen} messageReadFeedbackEnabled={messageReadFeedbackEnabled} + focused={focusedId === message.messageSequence} + keyboardFocused={keyboardFocusedMessageSequence === message.messageSequence} + editing={editingId === message.messageId} + ref={(ref) => { + messageRefs.current[message.messageSequence] = ref; + }} /> ); })} -
+ ); }; @@ -115,8 +219,9 @@ const ChatListPageContainer: React.FC = ({ chatId, markMessageAsSeen, scrollRef, + focusedId, + firstPageToLoad, }) => { - // @ts-ignore - temporary, while meteor exists in the project const CHAT_CONFIG = window.meetingClientSettings.public.chat; const PUBLIC_GROUP_CHAT_KEY = CHAT_CONFIG.public_group_id; const PRIVATE_MESSAGE_READ_FEEDBACK_ENABLED = CHAT_CONFIG.privateMessageReadFeedback.enabled; @@ -130,7 +235,7 @@ const ChatListPageContainer: React.FC = ({ ? defaultVariables : { ...defaultVariables, requestedChatId: chatId }; const isPrivateReadFeedbackEnabled = !isPublicChat && PRIVATE_MESSAGE_READ_FEEDBACK_ENABLED; - const useChatMessageSubscription = useCreateUseSubscription(chatQuery, variables, true); + const useChatMessageSubscription = useCreateUseSubscription(chatQuery, variables); const { data: chatMessageData, } = useChatMessageSubscription((msg) => msg) as GraphqlDataHookSubscriptionResponse; @@ -156,6 +261,8 @@ const ChatListPageContainer: React.FC = ({ page={page} markMessageAsSeen={markMessageAsSeen} scrollRef={scrollRef} + focusedId={focusedId} + firstPageToLoad={firstPageToLoad} /> ); }; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/queries.ts b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/queries.ts index ceaa08f55f..af561e6829 100644 --- a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/queries.ts +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/page/queries.ts @@ -1,4 +1,3 @@ -/* eslint-disable camelcase */ import { gql } from '@apollo/client'; export const CHAT_MESSAGE_PUBLIC_SUBSCRIPTION = gql` @@ -12,12 +11,40 @@ export const CHAT_MESSAGE_PUBLIC_SUBSCRIPTION = gql` isModerator color } + messageSequence + replyToMessage { + deletedAt + deletedBy { + name + } + chatEmphasizedText + messageSequence + message + user { + name + color + } + } + reactions(order_by: { createdAt: asc }) { + createdAt + reactionEmoji + reactionEmojiId + user { + name + userId + } + } messageType chatEmphasizedText chatId message messageId createdAt + editedAt + deletedAt + deletedBy { + name + } messageMetadata senderName senderRole @@ -41,12 +68,39 @@ export const CHAT_MESSAGE_PRIVATE_SUBSCRIPTION = gql` isModerator color } + messageSequence + replyToMessage { + deletedAt + deletedBy { + name + } + chatEmphasizedText + messageSequence + message + user { + name + color + } + } + reactions { + createdAt + reactionEmoji + user { + name + userId + } + } chatId message messageType chatEmphasizedText messageId createdAt + editedAt + deletedAt + deletedBy { + name + } messageMetadata recipientHasSeen } diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/styles.ts b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/styles.ts index 7d18bfb6ce..1f2c0c0619 100644 --- a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/styles.ts +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-message-list/styles.ts @@ -1,6 +1,5 @@ import styled from 'styled-components'; import { - mdPaddingX, smPaddingX, borderRadius, } from '/imports/ui/stylesheets/styled-components/general'; @@ -8,22 +7,24 @@ import { ScrollboxVertical } from '/imports/ui/stylesheets/styled-components/scr import { colorGrayDark } from '/imports/ui/stylesheets/styled-components/palette'; import { ButtonElipsis } from '/imports/ui/stylesheets/styled-components/placeholders'; -interface ChatMessagesProps { +interface MessageListProps { isRTL: boolean; } -export const MessageListWrapper = styled.div` - height: 100%; - display: flex; +export const MessageList = styled(ScrollboxVertical)` flex-flow: column; flex-shrink: 1; - position: relative; + padding-top: 2rem; + outline-style: none; overflow-x: hidden; - overflow-y: auto; + user-select: text; + height: 100%; z-index: 2; -`; + overflow-y: auto; + position: relative; + display: flex; + padding-bottom: ${smPaddingX}; -export const ChatMessages = styled.div` ${({ isRTL }) => isRTL && ` padding-left: ${smPaddingX}; `} @@ -31,25 +32,6 @@ export const ChatMessages = styled.div` ${({ isRTL }) => !isRTL && ` padding-right: ${smPaddingX}; `} - - padding-bottom: ${smPaddingX}; - user-select: text; -`; - -export const MessageList = styled(ScrollboxVertical)` - flex-flow: column; - flex-shrink: 1; - right: 0 ${mdPaddingX} 0 0; - padding-top: 0; - outline-style: none; - overflow-x: hidden; - user-select: none; - - [dir='rtl'] & { - margin: 0 0 0 auto; - padding: 0 0 0 ${mdPaddingX}; - } - display: block; `; export const ButtonLoadMore = styled.button` @@ -70,8 +52,6 @@ export const UnreadButton = styled(ButtonElipsis)` `; export default { - MessageListWrapper, MessageList, UnreadButton, - ChatMessages, }; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-reply-intention/component.tsx b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-reply-intention/component.tsx new file mode 100644 index 0000000000..1279cefd69 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-reply-intention/component.tsx @@ -0,0 +1,87 @@ +import React, { useEffect, useState } from 'react'; +import Styled from './styles'; +import useSettings from '/imports/ui/services/settings/hooks/useSettings'; +import { SETTINGS } from '/imports/ui/services/settings/enums'; +import { ChatEvents } from '/imports/ui/core/enums/chat'; +import Storage from '/imports/ui/services/storage/in-memory'; + +const ChatReplyIntention = () => { + const [username, setUsername] = useState(); + const [message, setMessage] = useState(); + const [emphasizedMessage, setEmphasizedMessage] = useState(); + const [sequence, setSequence] = useState(); + + useEffect(() => { + const handleReplyIntention = (e: Event) => { + if (e instanceof CustomEvent) { + setUsername(e.detail.username); + setMessage(e.detail.message); + setEmphasizedMessage(e.detail.emphasizedMessage); + setSequence(e.detail.sequence); + } + }; + + const handleCancelReplyIntention = (e: Event) => { + if (e instanceof CustomEvent) { + setUsername(undefined); + setMessage(undefined); + setEmphasizedMessage(undefined); + setSequence(undefined); + } + }; + + window.addEventListener(ChatEvents.CHAT_REPLY_INTENTION, handleReplyIntention); + window.addEventListener(ChatEvents.CHAT_CANCEL_REPLY_INTENTION, handleCancelReplyIntention); + + return () => { + window.removeEventListener(ChatEvents.CHAT_REPLY_INTENTION, handleReplyIntention); + window.removeEventListener(ChatEvents.CHAT_CANCEL_REPLY_INTENTION, handleCancelReplyIntention); + }; + }, []); + + const { animations } = useSettings(SETTINGS.APPLICATION) as { + animations: boolean; + }; + + const hidden = !username || !message; + const messageChunks = message ? message.split('\n') : null; + + return ( + { + window.dispatchEvent( + new CustomEvent(ChatEvents.CHAT_FOCUS_MESSAGE_REQUEST, { + detail: { + sequence, + }, + }), + ); + Storage.removeItem(ChatEvents.CHAT_FOCUS_MESSAGE_REQUEST); + if (sequence) Storage.setItem(ChatEvents.CHAT_FOCUS_MESSAGE_REQUEST, sequence); + }} + > + + + {messageChunks ? messageChunks[0] : ''} + + + { + e.stopPropagation(); + window.dispatchEvent( + new CustomEvent(ChatEvents.CHAT_CANCEL_REPLY_INTENTION), + ); + }} + icon="close" + tabIndex={hidden ? -1 : 0} + aria-hidden={hidden} + /> + + ); +}; + +export default ChatReplyIntention; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-reply-intention/styles.tsx b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-reply-intention/styles.tsx new file mode 100644 index 0000000000..5a48197474 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/chat-reply-intention/styles.tsx @@ -0,0 +1,104 @@ +import styled, { css } from 'styled-components'; +import ReactMarkdown from 'react-markdown'; +import { + colorGrayLightest, + colorPrimary, + colorText, + colorWhite, +} from '/imports/ui/stylesheets/styled-components/palette'; +import { + mdPadding, smPadding, smPaddingX, xlPadding, +} from '/imports/ui/stylesheets/styled-components/general'; +import EmojiButton from '../chat-message-list/page/chat-message/message-toolbar/emoji-button/component'; + +const Container = styled.div<{ $hidden: boolean; $animations: boolean }>` + border-radius: 0.375rem; + background-color: ${colorWhite}; + box-shadow: inset 0 0 0 1px ${colorGrayLightest}; + display: flex; + align-items: center; + overflow: hidden; + + [dir='ltr'] & { + border-right: 0.375rem solid ${colorPrimary}; + } + + [dir='rtl'] & { + border-left: 0.375rem solid ${colorPrimary}; + } + + ${({ $hidden }) => ($hidden + ? css` + height: 0; + min-height: 0; + ` + : css` + min-height: calc(1rlh + ${mdPadding} * 2); + height: calc(1rlh + ${mdPadding} * 2); + padding: ${mdPadding} calc(${smPaddingX} * 1.25); + margin-bottom: ${smPadding}; + + [dir='ltr'] & { + margin-right: ${xlPadding}; + } + + [dir='rtl'] & { + margin-left: ${xlPadding}; + } + ` + )} + + ${({ $animations }) => $animations + && css` + transition-property: height, min-height; + transition-duration: 0.1s; + `} +`; + +const Message = styled.div` + line-height: 1rlh; + flex-grow: 1; +`; + +const Markdown = styled(ReactMarkdown)<{ + $emphasizedMessage: boolean; +}>` + color: ${colorText}; + + ${({ $emphasizedMessage }) => $emphasizedMessage && ` + font-weight: bold; + `} + + & img { + max-width: 100%; + max-height: 100%; + } + + & p { + line-height: 1rlh; + margin: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + & code { + line-height: 1rlh; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +`; + +const CloseBtn = styled(EmojiButton)` + font-size: 75%; + height: 1rem; + padding: 0; +`; + +export default { + Container, + CloseBtn, + Message, + Markdown, +}; diff --git a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/component.tsx b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/component.tsx index 0ff783aa00..5f22371ad7 100644 --- a/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/chat/chat-graphql/component.tsx @@ -1,4 +1,5 @@ -import React from 'react'; +import React, { useRef } from 'react'; +import { CircularProgress } from '@mui/material'; import ChatHeader from './chat-header/component'; import { layoutSelect, layoutSelectInput } from '../../layout/context'; import { Input, Layout } from '../../layout/layoutTypes'; @@ -7,13 +8,13 @@ import ChatMessageListContainer from './chat-message-list/component'; import ChatMessageFormContainer from './chat-message-form/component'; import ChatTypingIndicatorContainer from './chat-typing-indicator/component'; import { PANELS, ACTIONS } from '/imports/ui/components/layout/enums'; -import { CircularProgress } from '@mui/material'; import usePendingChat from '/imports/ui/core/local-states/usePendingChat'; import useChat from '/imports/ui/core/hooks/useChat'; import { Chat as ChatType } from '/imports/ui/Types/chat'; import { layoutDispatch } from '/imports/ui/components/layout/context'; import browserInfo from '/imports/utils/browserInfo'; import { GraphqlDataHookSubscriptionResponse } from '/imports/ui/Types/hook'; +import { ChatEvents } from '/imports/ui/core/enums/chat'; interface ChatProps { isRTL: boolean; @@ -21,6 +22,7 @@ interface ChatProps { const Chat: React.FC = ({ isRTL }) => { const { isChrome } = browserInfo; + const isEditingMessage = useRef(false); React.useEffect(() => { const handleMouseDown = () => { @@ -32,10 +34,36 @@ const Chat: React.FC = ({ isRTL }) => { } }; + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === 'Escape' && isEditingMessage.current) { + window.dispatchEvent( + new CustomEvent(ChatEvents.CHAT_CANCEL_EDIT_REQUEST), + ); + } + }; + + const handleEditingMessage = (e: Event) => { + if (e instanceof CustomEvent) { + isEditingMessage.current = true; + } + }; + + const handleCancelEditingMessage = (e: Event) => { + if (e instanceof CustomEvent) { + isEditingMessage.current = false; + } + }; + document.addEventListener('mousedown', handleMouseDown); + document.addEventListener('keydown', handleKeyDown); + window.addEventListener(ChatEvents.CHAT_EDIT_REQUEST, handleEditingMessage); + window.addEventListener(ChatEvents.CHAT_CANCEL_EDIT_REQUEST, handleCancelEditingMessage); return () => { document.removeEventListener('mousedown', handleMouseDown); + document.removeEventListener('keydown', handleKeyDown); + window.removeEventListener(ChatEvents.CHAT_EDIT_REQUEST, handleEditingMessage); + window.removeEventListener(ChatEvents.CHAT_CANCEL_EDIT_REQUEST, handleCancelEditingMessage); }; }, []); diff --git a/bigbluebutton-html5/imports/ui/components/common/error-boundary/component.jsx b/bigbluebutton-html5/imports/ui/components/common/error-boundary/component.jsx index a4c71fe7bd..17c7f61db6 100644 --- a/bigbluebutton-html5/imports/ui/components/common/error-boundary/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/common/error-boundary/component.jsx @@ -2,6 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import logger, { generateLoggerStreams } from '/imports/startup/client/logger'; import apolloContextHolder from '/imports/ui/core/graphql/apolloContextHolder/apolloContextHolder'; +import Session from '/imports/ui/services/storage/in-memory'; import { ApolloLink } from '@apollo/client'; const propTypes = { @@ -86,6 +87,10 @@ class ErrorBoundary extends Component { } } + if ('cause' in error) { + Session.setItem('errorMessageDescription', error.cause); + } + this.setState({ error, errorInfo, @@ -97,7 +102,7 @@ class ErrorBoundary extends Component { const { children, Fallback, errorMessage } = this.props; const fallbackElement = Fallback && error - ? :
{errorMessage}
; + ? :
{errorMessage}
; return (error ? fallbackElement : children); diff --git a/bigbluebutton-html5/imports/ui/components/common/menu/component.jsx b/bigbluebutton-html5/imports/ui/components/common/menu/component.jsx index ab0f6b09b8..c5772fd118 100644 --- a/bigbluebutton-html5/imports/ui/components/common/menu/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/common/menu/component.jsx @@ -151,7 +151,7 @@ class BBBMenu extends React.Component { isEmoji={isEmoji} > {a.icon ? : null} - {label} + {label} {description &&
{`${description}${selected ? ` - ${intl.formatMessage(intlMessages.active)}` : ''}`}
} {a.iconRight ? : null} @@ -169,7 +169,7 @@ class BBBMenu extends React.Component { {!contentFunction ? ( <> {a.icon ? : null} - {label} + {label} {a.iconRight ? : null} {(isTitle && titleActions?.length > 0) ? ( titleActions.map((item, index) => ( @@ -218,7 +218,7 @@ class BBBMenu extends React.Component { } = this.props; const actionsItems = this.makeMenuItems(); - const roundedCornersStyles = { borderRadius: '1.8rem' }; + const roundedCornersStyles = { borderRadius: '3rem' }; let menuStyles = { zIndex: 999 }; if (customStyles) { diff --git a/bigbluebutton-html5/imports/ui/components/common/menu/styles.js b/bigbluebutton-html5/imports/ui/components/common/menu/styles.js index 3446ee3fcd..bd1d28aa07 100644 --- a/bigbluebutton-html5/imports/ui/components/common/menu/styles.js +++ b/bigbluebutton-html5/imports/ui/components/common/menu/styles.js @@ -86,6 +86,13 @@ const Option = styled.div` margin-right: 0; margin-left: 0; `} + + ${({ $isToggle }) => $isToggle && ` + margin: 0 !important; + padding: .1rem 0 0 0; + width: 100%; + `} + `; const CloseButton = styled(Button)` diff --git a/bigbluebutton-html5/imports/ui/components/connection-manager/component.tsx b/bigbluebutton-html5/imports/ui/components/connection-manager/component.tsx index 4969b14c5c..cc4a3d02a9 100644 --- a/bigbluebutton-html5/imports/ui/components/connection-manager/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/connection-manager/component.tsx @@ -1,6 +1,7 @@ import { ApolloClient, ApolloProvider, InMemoryCache, NormalizedCacheObject, ApolloLink, } from '@apollo/client'; +import { GraphQLError } from 'graphql'; import { GraphQLWsLink } from '@apollo/client/link/subscriptions'; import { createClient } from 'graphql-ws'; import { onError } from '@apollo/client/link/error'; @@ -17,6 +18,11 @@ interface ConnectionManagerProps { children: React.ReactNode; } +interface ErrorPayload extends GraphQLError { + messageId?: string; + message: string; +} + interface WsError { name: string; message: string; @@ -81,7 +87,7 @@ const ConnectionManager: React.FC = ({ children }): Reac const tsLastMessageRef = useRef(0); const tsLastPingMessageRef = useRef(0); const boundary = useRef(15_000); - const [terminalError, setTerminalError] = React.useState(''); + const [terminalError, setTerminalError] = React.useState(''); const [MeetingSettings] = useMeetingSettings(); const enableDevTools = MeetingSettings.public.app.enableApolloDevTools; @@ -125,7 +131,11 @@ const ConnectionManager: React.FC = ({ children }): Reac useEffect(() => { if (terminalError) { - throw new Error(terminalError); + if (typeof terminalError === 'string') { + throw new Error(terminalError); + } else { + throw terminalError; + } } }, [terminalError]); @@ -236,7 +246,12 @@ const ConnectionManager: React.FC = ({ children }): Reac // it contains a prop message.messageId which can be used to show a proper error to the user logger.error({ logCode: 'graphql_server_closed_connection', extraInfo: message }, 'Graphql Server closed the connection'); loadingContextInfo.setLoading(false, ''); - setTerminalError('Server closed the connection'); + const payload = message.payload as ErrorPayload[]; + if (payload[0].messageId) { + setTerminalError(new Error(payload[0].message, { cause: payload[0].messageId })); + } else { + setTerminalError(new Error('Server closed the connection', { cause: 'server_closed' })); + } } tsLastMessageRef.current = Date.now(); }, diff --git a/bigbluebutton-html5/imports/ui/components/error-screen/component.jsx b/bigbluebutton-html5/imports/ui/components/error-screen/component.jsx index 540103b9ad..af48a81392 100644 --- a/bigbluebutton-html5/imports/ui/components/error-screen/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/error-screen/component.jsx @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { defineMessages, injectIntl } from 'react-intl'; import Session from '/imports/ui/services/storage/in-memory'; import Styled from './styles'; +import intlHolder from '../../core/singletons/intlHolder'; const intlMessages = defineMessages({ 503: { @@ -70,51 +71,65 @@ const intlMessages = defineMessages({ able_to_rejoin_user_disconnected_reason: { id: 'app.error.disconnected.rejoin', }, + user_not_found: { + id: 'app.error.userNotFound', + }, + request_timeout: { + id: 'app.error.requestTimeout', + }, + meeting_not_found: { + id: 'app.error.meetingNotFound', + }, + session_token_replaced: { + id: 'app.error.sessionTokenReplaced', + }, + internal_error: { + id: 'app.error.serverInternalError', + }, + param_missing: { + id: 'app.error.paramMissing', + }, + too_many_connections: { + id: 'app.error.tooManyConnections', + }, + server_closed: { + id: 'app.error.serverClosed', + }, }); const propTypes = { - code: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.number, - ]), error: PropTypes.object, - errorInfo: PropTypes.object, }; const defaultProps = { - code: '500', callback: () => {}, endedReason: null, error: {}, - errorInfo: null, }; class ErrorScreen extends PureComponent { componentDidMount() { - const { code, callback, endedReason } = this.props; + const { callback, endedReason } = this.props; // stop audio window.dispatchEvent(new Event('StopAudioTracks')); callback(endedReason, () => {}); - console.error({ logCode: 'startup_client_usercouldnotlogin_error' }, `User could not log in HTML5, hit ${code}`); + console.error({ logCode: 'startup_client_usercouldnotlogin_error' }, 'User could not log in HTML5'); } render() { const { - intl, - code, children, error, - errorInfo, } = this.props; - let formatedMessage = 'Oops, something went wrong'; + const formatedMessage = 'Oops, something went wrong'; let errorMessageDescription = Session.getItem('errorMessageDescription'); + const intl = intlHolder.getIntl(); + + if (error) { + errorMessageDescription = error.message; + } + if (intl) { - formatedMessage = intl.formatMessage(intlMessages[defaultProps.code]); - - if (code in intlMessages) { - formatedMessage = intl.formatMessage(intlMessages[code]); - } - errorMessageDescription = Session.getItem('errorMessageDescription'); if (errorMessageDescription in intlMessages) { @@ -122,10 +137,6 @@ class ErrorScreen extends PureComponent { } } - if (error) { - errorMessageDescription = error.message; - } - return ( @@ -140,23 +151,6 @@ class ErrorScreen extends PureComponent { ) } - { - errorInfo - ? ( - - ) - : null - } - - - {code} -
{children}
diff --git a/bigbluebutton-html5/imports/ui/components/external-video-player/external-video-player-graphql/component.tsx b/bigbluebutton-html5/imports/ui/components/external-video-player/external-video-player-graphql/component.tsx index 2aaea07b8d..d6c7585482 100644 --- a/bigbluebutton-html5/imports/ui/components/external-video-player/external-video-player-graphql/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/external-video-player/external-video-player-graphql/component.tsx @@ -73,9 +73,9 @@ interface ExternalVideoPlayerProps { externalVideo: ExternalVideo; playing: boolean; playerPlaybackRate: number; - key: string; + playerKey: string; isSidebarContentOpen: boolean; - setKey: (key: string) => void; + setPlayerKey: (key: string) => void; sendMessage: (event: string, data: { rate: number; time: number; @@ -104,8 +104,8 @@ const ExternalVideoPlayer: React.FC = ({ playing, playerPlaybackRate, isEchoTest, - key, - setKey, + playerKey, + setPlayerKey, sendMessage, getCurrentTime, }) => { @@ -130,15 +130,15 @@ const ExternalVideoPlayer: React.FC = ({ return { // default option for all players, can be overwritten playerOptions: { - autoplay: true, - playsinline: true, + autoPlay: true, + playsInline: true, controls: isPresenter, }, file: { attributes: { controls: isPresenter ? 'controls' : '', - autoplay: 'autoplay', - playsinline: 'playsinline', + autoPlay: true, + playsInline: true, }, }, facebook: { @@ -263,16 +263,14 @@ const ExternalVideoPlayer: React.FC = ({ useEffect(() => { if (isPresenter !== presenterRef.current) { - setKey(uniqueId('react-player')); + setPlayerKey(uniqueId('react-player')); presenterRef.current = isPresenter; } }, [isPresenter]); const handleOnStart = () => { - if (!isPresenter) { - currentTime = getCurrentTime(); - playerRef.current?.seekTo(truncateTime(currentTime), 'seconds'); - } + currentTime = getCurrentTime(); + playerRef.current?.seekTo(truncateTime(currentTime), 'seconds'); }; const handleOnPlay = () => { @@ -308,10 +306,6 @@ const ExternalVideoPlayer: React.FC = ({ } }; - const handleOnReady = (reactPlayer: ReactPlayer) => { - reactPlayer.seekTo(truncateTime(currentTime), 'seconds'); - }; - const handleProgress = (state: OnProgressProps) => { setPlayed(state.played); setLoaded(state.loaded); @@ -379,12 +373,11 @@ const ExternalVideoPlayer: React.FC = ({ url={videoUrl} playing={playing} playbackRate={playerPlaybackRate} - key={key} + key={playerKey} height="100%" width="100%" ref={playerRef} volume={volume} - onReady={handleOnReady} onStart={handleOnStart} onPlay={handleOnPlay} onDuration={handleDuration} @@ -397,7 +390,7 @@ const ExternalVideoPlayer: React.FC = ({ shouldShowTools() ? ( { setMute(m); }} - handleReload={() => setKey(uniqueId('react-player'))} + handleReload={() => setPlayerKey(uniqueId('react-player'))} setShowHoverToolBar={setShowHoverToolBar} toolbarStyle={toolbarStyle} handleVolumeChanged={changeVolume} @@ -578,8 +571,8 @@ const ExternalVideoPlayerContainer: React.FC = () => { fullscreenContext={fullscreenContext} externalVideo={externalVideo} getCurrentTime={getCurrentTime} - key={key} - setKey={setKey} + playerKey={key} + setPlayerKey={setKey} sendMessage={sendMessage} /> ); diff --git a/bigbluebutton-html5/imports/ui/components/floating-window/component.tsx b/bigbluebutton-html5/imports/ui/components/floating-window/component.tsx index 243a060fa7..35ff843180 100644 --- a/bigbluebutton-html5/imports/ui/components/floating-window/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/floating-window/component.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import * as ReactDOM from 'react-dom/client'; import { useEffect, useRef } from 'react'; import Draggable from 'react-draggable'; import Styled from './styles'; @@ -10,7 +11,7 @@ interface FloatingWindowProps { backgroundColor: string; boxShadow: string; isDraggable: boolean; - renderFunction: (element: HTMLElement) => void; + renderFunction: (element: HTMLElement) => ReactDOM.Root; } const renderComponent = ( @@ -45,9 +46,17 @@ const FloatingWindow: React.FC = ({ const elementRef = useRef(null); useEffect(() => { + let rootRef: ReactDOM.Root | null; if (elementRef.current && renderFunction) { - renderFunction(elementRef.current); + rootRef = renderFunction(elementRef.current); } + + return () => { + // extensible area injected by content functions have to + // be explicitly unmounted, because plugins use a different + // instance of ReactDOM + if (rootRef) rootRef.unmount(); + }; }, [elementRef]); const componentToRender = renderComponent( diff --git a/bigbluebutton-html5/imports/ui/components/generic-content/generic-content-item/component.tsx b/bigbluebutton-html5/imports/ui/components/generic-content/generic-content-item/component.tsx index 926c0de36c..6c8dd47f05 100644 --- a/bigbluebutton-html5/imports/ui/components/generic-content/generic-content-item/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/generic-content/generic-content-item/component.tsx @@ -1,4 +1,5 @@ import React, { useEffect, useRef } from 'react'; +import * as ReactDOM from 'react-dom/client'; import { GenericContentItemProps } from './types'; const GenericContentItem: React.FC = (props) => { @@ -9,10 +10,18 @@ const GenericContentItem: React.FC = (props) => { const elementRef = useRef(null); useEffect(() => { + let rootRef: ReactDOM.Root | null; if (elementRef.current && renderFunction) { - renderFunction(elementRef.current); + rootRef = renderFunction(elementRef.current); } - }, [elementRef]); + + return () => { + // extensible area injected by content functions have to + // be explicitly unmounted, because plugins use a different + // instance of ReactDOM + if (rootRef) rootRef.unmount(); + }; + }, [elementRef, renderFunction]); const style: React.CSSProperties = { height: '100%', diff --git a/bigbluebutton-html5/imports/ui/components/generic-content/generic-content-item/types.ts b/bigbluebutton-html5/imports/ui/components/generic-content/generic-content-item/types.ts index 86426fde7d..6beb76a2df 100644 --- a/bigbluebutton-html5/imports/ui/components/generic-content/generic-content-item/types.ts +++ b/bigbluebutton-html5/imports/ui/components/generic-content/generic-content-item/types.ts @@ -1,4 +1,6 @@ +import * as ReactDOM from 'react-dom/client'; + export interface GenericContentItemProps { - renderFunction: (element: HTMLElement) => void; + renderFunction: (element: HTMLElement) => ReactDOM.Root; width?: string; } diff --git a/bigbluebutton-html5/imports/ui/components/generic-content/types.ts b/bigbluebutton-html5/imports/ui/components/generic-content/types.ts index d564264ec2..9d4cbc868c 100644 --- a/bigbluebutton-html5/imports/ui/components/generic-content/types.ts +++ b/bigbluebutton-html5/imports/ui/components/generic-content/types.ts @@ -1,3 +1,4 @@ +import * as ReactDOM from 'react-dom/client'; import { GenericContentMainArea } from 'bigbluebutton-html-plugin-sdk'; import { GenericContentMainArea as GenericContentMainAreaLayout } from '../layout/layoutTypes'; @@ -19,6 +20,6 @@ export interface GenericContentSidekickContainerProps { export interface GenericSidekickContentProps { layoutContextDispatch: (...args: unknown[]) => void; genericContentId: string; - renderFunction: (element: HTMLElement) => void; + renderFunction: (element: HTMLElement) => ReactDOM.Root; genericContentLabel: string; } diff --git a/bigbluebutton-html5/imports/ui/components/join-handler/custom-users-settings/component.tsx b/bigbluebutton-html5/imports/ui/components/join-handler/custom-users-settings/component.tsx index 30b9a08cb4..f440e2054d 100644 --- a/bigbluebutton-html5/imports/ui/components/join-handler/custom-users-settings/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/join-handler/custom-users-settings/component.tsx @@ -97,7 +97,6 @@ const CustomUsersSettings: React.FC = ({ {error ? ( ) : null} {loading ? ( diff --git a/bigbluebutton-html5/imports/ui/components/layout/context.jsx b/bigbluebutton-html5/imports/ui/components/layout/context.jsx index 6e61e243c4..70238f925f 100644 --- a/bigbluebutton-html5/imports/ui/components/layout/context.jsx +++ b/bigbluebutton-html5/imports/ui/components/layout/context.jsx @@ -205,6 +205,24 @@ const reducer = (state, action) => { }; } + // NOTIFICATION TOASTS + case ACTIONS.SET_HIDE_NOTIFICATION_TOASTS: { + const { notificationsBar } = state.input; + if (notificationsBar.hideNotificationToasts === action.value) { + return state; + } + return { + ...state, + input: { + ...state.input, + notificationsBar: { + ...notificationsBar, + hideNotificationToasts: action.value, + }, + }, + }; + } + // NAV BAR case ACTIONS.SET_HAS_NAVBAR: { @@ -224,6 +242,23 @@ const reducer = (state, action) => { }; } + case ACTIONS.SET_HIDE_NAVBAR_TOP_ROW: { + const { navBar } = state.output; + if (navBar.hideTopRow === action.value) { + return state; + } + return { + ...state, + output: { + ...state.output, + navBar: { + ...navBar, + hideTopRow: action.value, + }, + }, + }; + } + case ACTIONS.SET_NAVBAR_OUTPUT: { const { display, width, height, top, left, tabOrder, zIndex, @@ -855,6 +890,9 @@ const reducer = (state, action) => { if (presentation.isOpen === action.value) { return state; } + const { presentationAreaContentActions } = state; + presentationAreaContentActions[presentationAreaContentActions.length - 1] + .value.open = action.value; return { ...state, input: { @@ -864,6 +902,7 @@ const reducer = (state, action) => { isOpen: action.value, }, }, + presentationAreaContentActions, }; } case ACTIONS.SET_PRESENTATION_SLIDES_LENGTH: { @@ -1314,7 +1353,7 @@ const reducer = (state, action) => { ) { indexes.push(index); } - } else if (p.value.content === action.value.content && p.value.open) { + } else if (p.value.content === action.value.content) { indexes.push(index); } return indexes; diff --git a/bigbluebutton-html5/imports/ui/components/layout/enums.js b/bigbluebutton-html5/imports/ui/components/layout/enums.js index 58a701eea9..036dfea4e8 100644 --- a/bigbluebutton-html5/imports/ui/components/layout/enums.js +++ b/bigbluebutton-html5/imports/ui/components/layout/enums.js @@ -6,6 +6,7 @@ export const LAYOUT_TYPE = { CAMERAS_ONLY: 'camerasOnly', PRESENTATION_ONLY: 'presentationOnly', PARTICIPANTS_AND_CHAT_ONLY: 'participantsAndChatOnly', + MEDIA_ONLY: 'mediaOnly', }; export const DEVICE_TYPE = { @@ -18,6 +19,8 @@ export const DEVICE_TYPE = { export const SMALL_VIEWPORT_BREAKPOINT = 640; +export const MEDIA_ONLY_LAYOUT_MARGIN = 10; + export const CAMERADOCK_POSITION = { CONTENT_TOP: 'contentTop', CONTENT_RIGHT: 'contentRight', @@ -31,8 +34,22 @@ export const HIDDEN_LAYOUTS = [ LAYOUT_TYPE.CAMERAS_ONLY, LAYOUT_TYPE.PRESENTATION_ONLY, LAYOUT_TYPE.PARTICIPANTS_AND_CHAT_ONLY, + LAYOUT_TYPE.MEDIA_ONLY, ]; +export const LAYOUT_ELEMENTS = { + LAYOUT_TYPE: 'layoutType', + PRESENTATION_STATE: 'presentationState', + FOCUSED_CAMERA: 'focusedCamera', + CAMERA_DOCK_SIZE: 'cameraDockSize', + CAMERA_DOCK_POSITION: 'cameradockPosition', +}; + +export const SYNC = { + PROPAGATE_ELEMENTS: 'propagateElements', + REPLICATE_ELEMENTS: 'replicateElements', +}; + export const ACTIONS = { SET_AUTO_ARRANGE_LAYOUT: 'setAutoArrangeLayout', SET_IS_RTL: 'setIsRTL', @@ -53,8 +70,10 @@ export const ACTIONS = { SET_HAS_BANNER_BAR: 'setHasBannerBar', SET_HAS_NOTIFICATIONS_BAR: 'setHasNotificationsBar', + SET_HIDE_NOTIFICATION_TOASTS: 'setHideNotificationToasts', SET_HAS_NAVBAR: 'setHasNavBar', + SET_HIDE_NAVBAR_TOP_ROW: 'setHideNavBarTopRow', SET_NAVBAR_OUTPUT: 'setNavBarOutput', SET_HAS_ACTIONBAR: 'setHasActionBar', diff --git a/bigbluebutton-html5/imports/ui/components/layout/initState.js b/bigbluebutton-html5/imports/ui/components/layout/initState.js index b86e19aaf5..9b3dc49999 100644 --- a/bigbluebutton-html5/imports/ui/components/layout/initState.js +++ b/bigbluebutton-html5/imports/ui/components/layout/initState.js @@ -14,6 +14,7 @@ export const INITIAL_INPUT_STATE = { }, notificationsBar: { hasNotification: false, + hideNotificationToasts: false, }, navBar: { hasNavBar: true, @@ -114,6 +115,7 @@ export const INITIAL_INPUT_STATE = { export const INITIAL_OUTPUT_STATE = { navBar: { display: false, + hideTopRow: false, width: 0, height: 0, top: 0, diff --git a/bigbluebutton-html5/imports/ui/components/layout/layout-manager/layoutEngine.jsx b/bigbluebutton-html5/imports/ui/components/layout/layout-manager/layoutEngine.jsx index 304fdf2431..a24a21f4a1 100644 --- a/bigbluebutton-html5/imports/ui/components/layout/layout-manager/layoutEngine.jsx +++ b/bigbluebutton-html5/imports/ui/components/layout/layout-manager/layoutEngine.jsx @@ -1,5 +1,5 @@ import React from 'react'; -import { layoutSelect, layoutSelectInput } from '/imports/ui/components/layout/context'; +import { layoutSelect, layoutSelectInput, layoutSelectOutput } from '/imports/ui/components/layout/context'; import DEFAULT_VALUES from '/imports/ui/components/layout/defaultValues'; import { LAYOUT_TYPE, DEVICE_TYPE } from '/imports/ui/components/layout/enums'; @@ -14,6 +14,7 @@ import { getSettingsSingletonInstance } from '/imports/ui/services/settings'; import useSettings from '/imports/ui/services/settings/hooks/useSettings'; import { SETTINGS } from '/imports/ui/services/settings/enums'; import { useIsPresentationEnabled } from '/imports/ui/services/features'; +import MediaOnlyLayout from './mediaOnlyLayout'; const LayoutEngine = () => { const bannerBarInput = layoutSelectInput((i) => i.bannerBar); @@ -22,6 +23,7 @@ const LayoutEngine = () => { const presentationInput = layoutSelectInput((i) => i.presentation); const actionbarInput = layoutSelectInput((i) => i.actionBar); const navBarInput = layoutSelectInput((i) => i.navBar); + const navBarOutput = layoutSelectOutput((i) => i.navBar); const sidebarNavigationInput = layoutSelectInput((i) => i.sidebarNavigation); const sidebarContentInput = layoutSelectInput((i) => i.sidebarContent); const externalVideoInput = layoutSelectInput((i) => i.externalVideo); @@ -69,7 +71,6 @@ const LayoutEngine = () => { return cameraDockBounds; } - const navBarHeight = calculatesNavbarHeight(); const hasPresentation = isPresentationEnabled && slidesLength !== 0; const isGeneralMediaOff = !hasPresentation && !hasExternalVideo && !hasScreenShare @@ -78,9 +79,9 @@ const LayoutEngine = () => { if (!isOpen || isGeneralMediaOff) { cameraDockBounds.width = mediaAreaBounds.width; cameraDockBounds.maxWidth = mediaAreaBounds.width; - cameraDockBounds.height = mediaAreaBounds.height - bannerAreaHeight(); + cameraDockBounds.height = mediaAreaBounds.height; cameraDockBounds.maxHeight = mediaAreaBounds.height; - cameraDockBounds.top = navBarHeight + bannerAreaHeight(); + cameraDockBounds.top = mediaAreaBounds.top; cameraDockBounds.left = !isRTL ? mediaAreaBounds.left : 0; cameraDockBounds.right = isRTL ? sidebarSize : null; } @@ -106,7 +107,9 @@ const LayoutEngine = () => { const calculatesNavbarHeight = () => { const { navBarHeight } = DEFAULT_VALUES; - return navBarInput.hasNavBar ? navBarHeight : 0; + const finalHeight = navBarOutput.hideTopRow ? navBarHeight / 2 : navBarHeight; + + return navBarInput.hasNavBar ? finalHeight : 0; }; const calculatesNavbarBounds = (mediaAreaBounds) => { @@ -293,7 +296,7 @@ const LayoutEngine = () => { }; }; - const calculatesMediaAreaBounds = (sidebarNavWidth, sidebarContentWidth) => { + const calculatesMediaAreaBounds = (sidebarNavWidth, sidebarContentWidth, margin = 0) => { const { height: actionBarHeight } = calculatesActionbarHeight(); const navBarHeight = calculatesNavbarHeight(); @@ -307,10 +310,10 @@ const LayoutEngine = () => { } return { - width, - height: windowHeight() - (navBarHeight + actionBarHeight + bannerAreaHeight()), - top: navBarHeight + bannerAreaHeight(), - left, + width: width - (2 * margin), + height: windowHeight() - (navBarHeight + actionBarHeight + bannerAreaHeight() + (2 * margin)), + top: navBarHeight + bannerAreaHeight() + margin, + left: left + margin, }; }; @@ -355,6 +358,9 @@ const LayoutEngine = () => { case LAYOUT_TYPE.PARTICIPANTS_AND_CHAT_ONLY: layout?.setAttribute('data-layout', LAYOUT_TYPE.PARTICIPANTS_AND_CHAT_ONLY); return ; + case LAYOUT_TYPE.MEDIA_ONLY: + layout?.setAttribute('data-layout', LAYOUT_TYPE.MEDIA_ONLY); + return ; default: layout?.setAttribute('data-layout', LAYOUT_TYPE.CUSTOM_LAYOUT); return ; diff --git a/bigbluebutton-html5/imports/ui/components/layout/layout-manager/mediaOnlyLayout.jsx b/bigbluebutton-html5/imports/ui/components/layout/layout-manager/mediaOnlyLayout.jsx new file mode 100644 index 0000000000..a5d198e566 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/layout/layout-manager/mediaOnlyLayout.jsx @@ -0,0 +1,525 @@ +import { useEffect, useRef } from 'react'; +import { throttle } from '/imports/utils/throttle'; +import { layoutDispatch, layoutSelect, layoutSelectInput } from '/imports/ui/components/layout/context'; +import DEFAULT_VALUES from '/imports/ui/components/layout/defaultValues'; +import { INITIAL_INPUT_STATE } from '/imports/ui/components/layout/initState'; +import { ACTIONS, CAMERADOCK_POSITION, MEDIA_ONLY_LAYOUT_MARGIN } from '/imports/ui/components/layout/enums'; +import { defaultsDeep } from '/imports/utils/array-utils'; +import Session from '/imports/ui/services/storage/in-memory'; +import { getSettingsSingletonInstance } from '/imports/ui/services/settings'; + +const windowWidth = () => window.document.documentElement.clientWidth; +const windowHeight = () => window.document.documentElement.clientHeight; + +const MediaOnlyLayout = (props) => { + const { isMobile } = props; + + function usePrevious(value) { + const ref = useRef(); + useEffect(() => { + ref.current = value; + }); + return ref.current; + } + + const input = layoutSelect((i) => i.input); + const deviceType = layoutSelect((i) => i.deviceType); + const Settings = getSettingsSingletonInstance(); + const { isRTL } = Settings.application; + const fullscreen = layoutSelect((i) => i.fullscreen); + const fontSize = layoutSelect((i) => i.fontSize); + const currentPanelType = layoutSelect((i) => i.currentPanelType); + + const navbarInput = layoutSelectInput((i) => i.navBar); + const presentationInput = layoutSelectInput((i) => i.presentation); + const cameraDockInput = layoutSelectInput((i) => i.cameraDock); + const actionbarInput = layoutSelectInput((i) => i.actionBar); + const externalVideoInput = layoutSelectInput((i) => i.externalVideo); + const genericMainContentInput = layoutSelectInput((i) => i.genericMainContent); + const screenShareInput = layoutSelectInput((i) => i.screenShare); + const sharedNotesInput = layoutSelectInput((i) => i.sharedNotes); + const layoutContextDispatch = layoutDispatch(); + + const prevDeviceType = usePrevious(deviceType); + const { isPresentationEnabled } = props; + + useEffect(() => { + window.addEventListener('resize', () => { + layoutContextDispatch({ + type: ACTIONS.SET_BROWSER_SIZE, + value: { + width: window.document.documentElement.clientWidth, + height: window.document.documentElement.clientHeight, + }, + }); + }); + }, []); + + const calculatesSlideSize = (mediaAreaBounds) => { + const { currentSlide } = presentationInput; + + if (currentSlide.size.width === 0 && currentSlide.size.height === 0) { + return { + width: 0, + height: 0, + }; + } + + let slideWidth; + let slideHeight; + + slideWidth = (currentSlide.size.width * mediaAreaBounds.height) / currentSlide.size.height; + slideHeight = mediaAreaBounds.height; + + if (slideWidth > mediaAreaBounds.width) { + slideWidth = mediaAreaBounds.width; + slideHeight = (currentSlide.size.height * mediaAreaBounds.width) / currentSlide.size.width; + } + + return { + width: slideWidth, + height: slideHeight, + }; + }; + + const calculatesScreenShareSize = (mediaAreaBounds) => { + const { width = 0, height = 0 } = screenShareInput; + + if (width === 0 && height === 0) return { width, height }; + + let screeShareWidth; + let screeShareHeight; + + screeShareWidth = (width * mediaAreaBounds.height) / height; + screeShareHeight = mediaAreaBounds.height; + + if (screeShareWidth > mediaAreaBounds.width) { + screeShareWidth = mediaAreaBounds.width; + screeShareHeight = (height * mediaAreaBounds.width) / width; + } + + return { + width: screeShareWidth, + height: screeShareHeight, + }; + }; + + const calculatesCameraDockBounds = (mediaAreaBounds, mediaBounds, sidebarSize) => { + const { baseCameraDockBounds } = props; + const baseBounds = baseCameraDockBounds(mediaAreaBounds, sidebarSize); + + if (Object.keys(baseBounds).length > 0) { + baseBounds.isCameraHorizontal = false; + return baseBounds; + } + + const { presentationToolbarMinWidth } = DEFAULT_VALUES; + + const cameraDockBounds = {}; + + cameraDockBounds.isCameraHorizontal = false; + + const mediaBoundsWidth = mediaBounds.width > presentationToolbarMinWidth + && !isMobile + ? mediaBounds.width + : presentationToolbarMinWidth; + cameraDockBounds.top = mediaAreaBounds.top; + cameraDockBounds.left = mediaAreaBounds.left; + cameraDockBounds.right = isRTL ? sidebarSize : null; + cameraDockBounds.zIndex = 1; + + if (mediaBounds.width < mediaAreaBounds.width) { + cameraDockBounds.width = mediaAreaBounds.width + - mediaBoundsWidth - MEDIA_ONLY_LAYOUT_MARGIN; + cameraDockBounds.maxWidth = mediaAreaBounds.width * 0.8; + cameraDockBounds.height = mediaAreaBounds.height; + cameraDockBounds.maxHeight = mediaAreaBounds.height; + cameraDockBounds.isCameraHorizontal = true; + cameraDockBounds.position = CAMERADOCK_POSITION.CONTENT_LEFT; + } else { + cameraDockBounds.width = mediaAreaBounds.width; + cameraDockBounds.maxWidth = mediaAreaBounds.width; + cameraDockBounds.height = mediaAreaBounds.height + - mediaBounds.height - MEDIA_ONLY_LAYOUT_MARGIN; + cameraDockBounds.maxHeight = mediaAreaBounds.height * 0.8; + cameraDockBounds.position = CAMERADOCK_POSITION.CONTENT_TOP; + } + + cameraDockBounds.minWidth = cameraDockBounds.width; + cameraDockBounds.minHeight = cameraDockBounds.height; + + return cameraDockBounds; + }; + + const calculatesMediaBounds = (mediaAreaBounds, slideSize, sidebarSize, screenShareSize) => { + const { isOpen, slidesLength } = presentationInput; + const { hasExternalVideo } = externalVideoInput; + const { genericContentId } = genericMainContentInput; + const { hasScreenShare } = screenShareInput; + const { isPinned: isSharedNotesPinned } = sharedNotesInput; + + const hasPresentation = isPresentationEnabled && slidesLength !== 0; + const isGeneralMediaOff = !hasPresentation && !hasExternalVideo + && !hasScreenShare && !isSharedNotesPinned && !genericContentId; + + const mediaBounds = {}; + const { element: fullscreenElement } = fullscreen; + + if (!isOpen || isGeneralMediaOff) { + mediaBounds.width = 0; + mediaBounds.height = 0; + mediaBounds.top = 0; + mediaBounds.left = !isRTL ? 0 : null; + mediaBounds.right = isRTL ? 0 : null; + mediaBounds.zIndex = 0; + return mediaBounds; + } + + if ( + fullscreenElement === 'Presentation' + || fullscreenElement === 'Screenshare' + || fullscreenElement === 'ExternalVideo' + || fullscreenElement === 'GenericContent' + ) { + mediaBounds.width = windowWidth(); + mediaBounds.height = windowHeight(); + mediaBounds.top = 0; + mediaBounds.left = !isRTL ? 0 : null; + mediaBounds.right = isRTL ? 0 : null; + mediaBounds.zIndex = 99; + return mediaBounds; + } + + const mediaContentSize = hasScreenShare ? screenShareSize : slideSize; + + if (cameraDockInput.numCameras > 0 && !cameraDockInput.isDragging) { + if (mediaContentSize.width !== 0 && mediaContentSize.height !== 0 + && !hasExternalVideo && !genericContentId) { + if (mediaContentSize.width < mediaAreaBounds.width && !isMobile) { + if (mediaContentSize.width < mediaAreaBounds.width * 0.8) { + mediaBounds.width = mediaContentSize.width; + } else { + mediaBounds.width = mediaAreaBounds.width * 0.8; + } + mediaBounds.height = mediaAreaBounds.height; + mediaBounds.top = mediaAreaBounds.top; + const sizeValue = mediaAreaBounds.left + (mediaAreaBounds.width - mediaBounds.width); + mediaBounds.left = !isRTL ? sizeValue : null; + mediaBounds.right = isRTL ? sidebarSize : null; + } else { + if (mediaContentSize.height < mediaAreaBounds.height * 0.8) { + mediaBounds.height = mediaContentSize.height; + } else { + mediaBounds.height = mediaAreaBounds.height * 0.8; + } + mediaBounds.width = mediaAreaBounds.width; + mediaBounds.top = mediaAreaBounds.top + (mediaAreaBounds.height - mediaBounds.height); + const sizeValue = mediaAreaBounds.left; + mediaBounds.left = !isRTL ? sizeValue : null; + mediaBounds.right = isRTL ? sidebarSize : null; + } + } else { + mediaBounds.width = mediaAreaBounds.width; + mediaBounds.height = mediaAreaBounds.height * 0.8; + mediaBounds.top = mediaAreaBounds.top + (mediaAreaBounds.height - mediaBounds.height); + const sizeValue = mediaAreaBounds.left; + mediaBounds.left = !isRTL ? sizeValue : null; + mediaBounds.right = isRTL ? sidebarSize : null; + } + } else { + mediaBounds.width = mediaAreaBounds.width; + mediaBounds.height = mediaAreaBounds.height; + mediaBounds.top = mediaAreaBounds.top; + const sizeValue = mediaAreaBounds.left; + mediaBounds.left = !isRTL ? sizeValue : null; + mediaBounds.right = isRTL ? sidebarSize : null; + } + mediaBounds.zIndex = 1; + + return mediaBounds; + }; + + const calculatesLayout = () => { + const { + calculatesNavbarBounds, + calculatesActionbarBounds, + calculatesSidebarNavBounds, + calculatesSidebarContentBounds, + calculatesMediaAreaBounds, + } = props; + const { camerasMargin } = DEFAULT_VALUES; + + const sidebarNavBounds = calculatesSidebarNavBounds(); + const sidebarContentBounds = calculatesSidebarContentBounds(0); + const mediaAreaBounds = calculatesMediaAreaBounds(0, 0, MEDIA_ONLY_LAYOUT_MARGIN); + const navbarBounds = calculatesNavbarBounds(mediaAreaBounds); + const actionbarBounds = calculatesActionbarBounds(mediaAreaBounds); + const slideSize = calculatesSlideSize(mediaAreaBounds); + const screenShareSize = calculatesScreenShareSize(mediaAreaBounds); + const sidebarSize = 0; + const mediaBounds = calculatesMediaBounds( + mediaAreaBounds, + slideSize, + sidebarSize, + screenShareSize, + ); + const cameraDockBounds = calculatesCameraDockBounds(mediaAreaBounds, mediaBounds, sidebarSize); + const horizontalCameraDiff = cameraDockBounds.isCameraHorizontal + ? cameraDockBounds.width + camerasMargin * 2 + : 0; + + layoutContextDispatch({ + type: ACTIONS.SET_NAVBAR_OUTPUT, + value: { + display: navbarInput.hasNavBar, + width: navbarBounds.width, + height: navbarBounds.height, + top: navbarBounds.top, + left: navbarBounds.left, + tabOrder: DEFAULT_VALUES.navBarTabOrder, + zIndex: navbarBounds.zIndex, + }, + }); + + layoutContextDispatch({ + type: ACTIONS.SET_ACTIONBAR_OUTPUT, + value: { + display: actionbarInput.hasActionBar, + width: actionbarBounds.width, + height: actionbarBounds.height, + innerHeight: actionbarBounds.innerHeight, + top: actionbarBounds.top, + left: actionbarBounds.left, + padding: actionbarBounds.padding, + tabOrder: DEFAULT_VALUES.actionBarTabOrder, + zIndex: actionbarBounds.zIndex, + }, + }); + + layoutContextDispatch({ + type: ACTIONS.SET_SIDEBAR_NAVIGATION_OUTPUT, + value: { + display: false, + minWidth: 0, + width: 0, + maxWidth: 0, + height: 0, + top: 0, + left: 0, + right: 0, + tabOrder: DEFAULT_VALUES.sidebarNavTabOrder, + isResizable: false, + zIndex: sidebarNavBounds.zIndex, + }, + }); + + layoutContextDispatch({ + type: ACTIONS.SET_SIDEBAR_NAVIGATION_RESIZABLE_EDGE, + value: { + top: false, + right: false, + bottom: false, + left: false, + }, + }); + + layoutContextDispatch({ + type: ACTIONS.SET_SIDEBAR_CONTENT_OUTPUT, + value: { + display: false, + minWidth: 0, + width: 0, + maxWidth: 0, + height: 0, + top: 0, + left: 0, + right: 0, + currentPanelType, + tabOrder: DEFAULT_VALUES.sidebarContentTabOrder, + isResizable: false, + zIndex: sidebarContentBounds.zIndex, + }, + }); + + layoutContextDispatch({ + type: ACTIONS.SET_SIDEBAR_CONTENT_RESIZABLE_EDGE, + value: { + top: false, + right: false, + bottom: false, + left: false, + }, + }); + + layoutContextDispatch({ + type: ACTIONS.SET_MEDIA_AREA_SIZE, + value: { + width: mediaAreaBounds.width, + height: mediaAreaBounds.height, + }, + }); + + layoutContextDispatch({ + type: ACTIONS.SET_CAMERA_DOCK_OUTPUT, + value: { + display: cameraDockInput.numCameras > 0, + position: cameraDockBounds.position, + minWidth: cameraDockBounds.minWidth, + width: cameraDockBounds.width, + maxWidth: cameraDockBounds.maxWidth, + minHeight: cameraDockBounds.minHeight, + height: cameraDockBounds.height, + maxHeight: cameraDockBounds.maxHeight, + top: cameraDockBounds.top, + left: cameraDockBounds.left, + right: cameraDockBounds.right, + tabOrder: 4, + isDraggable: false, + resizableEdge: { + top: false, + right: false, + bottom: false, + left: false, + }, + zIndex: cameraDockBounds.zIndex, + focusedId: input.cameraDock.focusedId, + }, + }); + + layoutContextDispatch({ + type: ACTIONS.SET_PRESENTATION_OUTPUT, + value: { + display: presentationInput.isOpen, + width: mediaBounds.width, + height: mediaBounds.height, + top: mediaBounds.top, + left: mediaBounds.left, + right: isRTL ? mediaBounds.right + horizontalCameraDiff : null, + tabOrder: DEFAULT_VALUES.presentationTabOrder, + isResizable: false, + zIndex: mediaBounds.zIndex, + }, + }); + + layoutContextDispatch({ + type: ACTIONS.SET_SCREEN_SHARE_OUTPUT, + value: { + width: mediaBounds.width, + height: mediaBounds.height, + top: mediaBounds.top, + left: mediaBounds.left, + right: isRTL ? mediaBounds.right + horizontalCameraDiff : null, + zIndex: mediaBounds.zIndex, + }, + }); + + layoutContextDispatch({ + type: ACTIONS.SET_EXTERNAL_VIDEO_OUTPUT, + value: { + width: mediaBounds.width, + height: mediaBounds.height, + top: mediaBounds.top, + left: mediaBounds.left, + right: isRTL ? mediaBounds.right + horizontalCameraDiff : null, + }, + }); + + layoutContextDispatch({ + type: ACTIONS.SET_GENERIC_CONTENT_OUTPUT, + value: { + width: mediaBounds.width, + height: mediaBounds.height, + top: mediaBounds.top, + left: mediaBounds.left, + right: isRTL ? mediaBounds.right + horizontalCameraDiff : null, + }, + }); + + layoutContextDispatch({ + type: ACTIONS.SET_SHARED_NOTES_OUTPUT, + value: { + width: mediaBounds.width, + height: mediaBounds.height, + top: mediaBounds.top, + left: mediaBounds.left, + right: isRTL ? mediaBounds.right + horizontalCameraDiff : null, + }, + }); + }; + + const throttledCalculatesLayout = throttle(() => calculatesLayout(), 50, { + trailing: true, + leading: true, + }); + + const init = () => { + layoutContextDispatch({ + type: ACTIONS.SET_LAYOUT_INPUT, + value: (prevInput) => { + const { + sidebarContent, presentation, cameraDock, + externalVideo, genericMainContent, screenShare, sharedNotes, + } = prevInput; + const { sidebarContentPanel } = sidebarContent; + return defaultsDeep( + { + sidebarNavigation: { + isOpen: false, + }, + sidebarContent: { + isOpen: false, + sidebarContentPanel, + }, + SidebarContentHorizontalResizer: { + isOpen: false, + }, + presentation: { + isOpen: presentation.isOpen, + slidesLength: presentation.slidesLength, + currentSlide: { + ...presentation.currentSlide, + }, + }, + cameraDock: { + numCameras: cameraDock.numCameras, + }, + externalVideo: { + hasExternalVideo: externalVideo.hasExternalVideo, + }, + genericMainContent: { + genericContentId: genericMainContent.genericContentId, + }, + screenShare: { + hasScreenShare: screenShare.hasScreenShare, + width: screenShare.width, + height: screenShare.height, + }, + sharedNotes: { + isPinned: sharedNotes.isPinned, + }, + }, + INITIAL_INPUT_STATE, + ); + }, + }); + Session.setItem('layoutReady', true); + throttledCalculatesLayout(); + }; + + useEffect(() => { + if (deviceType === null) return () => null; + + if (deviceType !== prevDeviceType) { + // reset layout if deviceType changed + // not all options is supported in all devices + init(); + } else { + throttledCalculatesLayout(); + } + return () => {}; + }, [input, deviceType, isRTL, fontSize, fullscreen, isPresentationEnabled]); + + return null; +}; + +export default MediaOnlyLayout; diff --git a/bigbluebutton-html5/imports/ui/components/layout/layoutTypes.ts b/bigbluebutton-html5/imports/ui/components/layout/layoutTypes.ts index dee1f13885..c06325b332 100644 --- a/bigbluebutton-html5/imports/ui/components/layout/layoutTypes.ts +++ b/bigbluebutton-html5/imports/ui/components/layout/layoutTypes.ts @@ -97,6 +97,7 @@ export interface GenericContentMainArea { } interface NavBar { hasNavBar?: boolean; + hideTopRow: boolean; height: number; display?: boolean; left?: number; @@ -108,6 +109,7 @@ interface NavBar { interface NotificationsBar { hasNotification: boolean; + hideNotificationToasts: boolean; } interface Size { diff --git a/bigbluebutton-html5/imports/ui/components/layout/observer.tsx b/bigbluebutton-html5/imports/ui/components/layout/observer.tsx index 355c31207a..235456cf9e 100644 --- a/bigbluebutton-html5/imports/ui/components/layout/observer.tsx +++ b/bigbluebutton-html5/imports/ui/components/layout/observer.tsx @@ -101,7 +101,13 @@ const LayoutObserver: React.FC = () => { layoutContextDispatch({ type: ACTIONS.SET_HAS_ACTIONBAR, - value: !getFromUserSettings('bbb_hide_actions_bar', false), + value: !(getFromUserSettings('bbb_hide_actions_bar', false) + || getFromUserSettings('bbb_hide_controls', false)), + }); + + layoutContextDispatch({ + type: ACTIONS.SET_HIDE_NAVBAR_TOP_ROW, + value: getFromUserSettings('bbb_hide_controls', false), }); layoutContextDispatch({ @@ -109,6 +115,11 @@ const LayoutObserver: React.FC = () => { value: !getFromUserSettings('bbb_hide_nav_bar', false), }); + layoutContextDispatch({ + type: ACTIONS.SET_HIDE_NOTIFICATION_TOASTS, + value: getFromUserSettings('bbb_hide_notifications', false), + }); + window.addEventListener('localeChanged', () => { layoutContextDispatch({ type: ACTIONS.SET_IS_RTL, diff --git a/bigbluebutton-html5/imports/ui/components/layout/push-layout/pushLayoutEngine.jsx b/bigbluebutton-html5/imports/ui/components/layout/push-layout/pushLayoutEngine.jsx index 603f2819d8..c9c707b92a 100644 --- a/bigbluebutton-html5/imports/ui/components/layout/push-layout/pushLayoutEngine.jsx +++ b/bigbluebutton-html5/imports/ui/components/layout/push-layout/pushLayoutEngine.jsx @@ -3,8 +3,13 @@ import PropTypes from 'prop-types'; import getFromUserSettings from '/imports/ui/services/users-settings'; import { getSettingsSingletonInstance } from '/imports/ui/services/settings'; import MediaService from '/imports/ui/components/media/service'; -import { LAYOUT_TYPE, ACTIONS } from '../enums'; -import { isMobile } from '../utils'; +import { + LAYOUT_TYPE, + ACTIONS, + SYNC, + LAYOUT_ELEMENTS, +} from '../enums'; +import { isMobile, LAYOUTS_SYNC } from '../utils'; import { updateSettings } from '/imports/ui/components/settings/service'; import Session from '/imports/ui/services/storage/in-memory'; import usePreviousValue from '/imports/ui/hooks/usePreviousValue'; @@ -116,7 +121,7 @@ const PushLayoutEngine = (props) => { const HIDE_PRESENTATION = window.meetingClientSettings.public.layout.hidePresentationOnJoin; const shouldOpenPresentation = shouldShowScreenshare || shouldShowExternalVideo; - let presentationLastState = !getFromUserSettings('bbb_hide_presentation_on_join', HIDE_PRESENTATION); + let presentationLastState = isPresenter || !getFromUserSettings('bbb_hide_presentation_on_join', HIDE_PRESENTATION); presentationLastState = pushLayoutMeeting ? meetingPresentationIsOpen : presentationLastState; presentationLastState = shouldOpenPresentation || presentationLastState; MediaService.setPresentationIsOpen(layoutContextDispatch, presentationLastState); @@ -159,6 +164,7 @@ const PushLayoutEngine = (props) => { }, [hasMeetingLayout]); useEffect(() => { + if (!selectedLayout) return () => {}; const meetingLayoutDidChange = meetingLayout !== prevProps.meetingLayout; const pushLayoutMeetingDidChange = pushLayoutMeeting !== prevProps.pushLayoutMeeting; const enforceLayoutDidChange = enforceLayout !== prevProps.enforceLayout; @@ -166,13 +172,15 @@ const PushLayoutEngine = (props) => { ? meetingLayoutDidChange || enforceLayoutDidChange : ((meetingLayoutDidChange || pushLayoutMeetingDidChange) && pushLayoutMeeting) || enforceLayoutDidChange; + const layoutReplicateElements = LAYOUTS_SYNC[selectedLayout][SYNC.REPLICATE_ELEMENTS]; + const layoutPropagateElements = LAYOUTS_SYNC[selectedLayout][SYNC.PROPAGATE_ELEMENTS]; const Settings = getSettingsSingletonInstance(); - if (shouldSwitchLayout) { + const replicateLayoutType = () => { let contextLayout = enforceLayout || meetingLayout; if (isMobile()) { - if (contextLayout === 'custom') { - contextLayout = 'smart'; + if (contextLayout === LAYOUT_TYPE.CUSTOM_LAYOUT) { + contextLayout = LAYOUT_TYPE.SMART_LAYOUT; } } @@ -187,18 +195,19 @@ const PushLayoutEngine = (props) => { selectedLayout: contextLayout, }, }, null, setLocalSettings); - } + }; - if (!enforceLayout && pushLayoutMeetingDidChange) { - updateSettings({ - application: { - ...Settings.application, - pushLayout: pushLayoutMeeting, - }, - }, null, setLocalSettings); - } + const replicatePresentationState = () => { + if (meetingPresentationIsOpen !== prevProps.meetingPresentationIsOpen + || meetingLayoutUpdatedAt !== prevProps.meetingLayoutUpdatedAt) { + layoutContextDispatch({ + type: ACTIONS.SET_PRESENTATION_IS_OPEN, + value: meetingPresentationIsOpen, + }); + } + }; - if (meetingLayout === 'custom' && selectedLayout === 'custom' && !isPresenter) { + const replicateFocusedCamera = () => { if (meetingLayoutFocusedCamera !== prevProps.meetingLayoutFocusedCamera || meetingLayoutUpdatedAt !== prevProps.meetingLayoutUpdatedAt) { layoutContextDispatch({ @@ -206,7 +215,9 @@ const PushLayoutEngine = (props) => { value: meetingLayoutFocusedCamera, }); } + }; + const replicateCameraDockPosition = () => { if (meetingLayoutCameraPosition !== prevProps.meetingLayoutCameraPosition || meetingLayoutUpdatedAt !== prevProps.meetingLayoutUpdatedAt) { layoutContextDispatch({ @@ -214,7 +225,9 @@ const PushLayoutEngine = (props) => { value: meetingLayoutCameraPosition, }); } + }; + const replicateCameraDockSize = () => { if (!equalDouble(meetingLayoutVideoRate, prevProps.meetingLayoutVideoRate) || meetingLayoutUpdatedAt !== prevProps.meetingLayoutUpdatedAt) { let w; let h; @@ -243,16 +256,28 @@ const PushLayoutEngine = (props) => { }, }); } + }; - if (meetingPresentationIsOpen !== prevProps.meetingPresentationIsOpen - || meetingLayoutUpdatedAt !== prevProps.meetingLayoutUpdatedAt) { - layoutContextDispatch({ - type: ACTIONS.SET_PRESENTATION_IS_OPEN, - value: meetingPresentationIsOpen, - }); + // REPLICATE LAYOUT + if (shouldSwitchLayout && layoutReplicateElements.includes(LAYOUT_ELEMENTS.LAYOUT_TYPE)) { + replicateLayoutType(); + } + if (!isPresenter) { + if (layoutReplicateElements.includes(LAYOUT_ELEMENTS.PRESENTATION_STATE)) { + replicatePresentationState(); + } + if (layoutReplicateElements.includes(LAYOUT_ELEMENTS.FOCUSED_CAMERA)) { + replicateFocusedCamera(); + } + if (layoutReplicateElements.includes(LAYOUT_ELEMENTS.CAMERA_DOCK_POSITION)) { + replicateCameraDockPosition(); + } + if (layoutReplicateElements.includes(LAYOUT_ELEMENTS.CAMERA_DOCK_SIZE)) { + replicateCameraDockSize(); } } + // PROPAGATE LAYOUT const layoutChanged = presentationIsOpen !== prevProps.presentationIsOpen || selectedLayout !== prevProps.selectedLayout || cameraIsResizing !== prevProps.cameraIsResizing @@ -270,8 +295,12 @@ const PushLayoutEngine = (props) => { } // change layout sizes / states - if ((pushLayout && layoutChanged) || pushLayout !== prevProps.pushLayout) { - if (isPresenter) { + if (isPresenter + // since all meeting layout properties are pushed together in a + // single call just check whether there is any element to be propagate + && layoutPropagateElements.length > 0 + ) { + if ((pushLayout && layoutChanged) || pushLayout !== prevProps.pushLayout) { setMeetingLayout(); } } @@ -279,6 +308,7 @@ const PushLayoutEngine = (props) => { if (selectedLayout !== prevProps.selectedLayout) { Session.setItem('isGridEnabled', selectedLayout === LAYOUT_TYPE.VIDEO_FOCUS); } + return () => {}; }); return null; diff --git a/bigbluebutton-html5/imports/ui/components/layout/utils.js b/bigbluebutton-html5/imports/ui/components/layout/utils.js index 12c62b82f2..97f948ca70 100644 --- a/bigbluebutton-html5/imports/ui/components/layout/utils.js +++ b/bigbluebutton-html5/imports/ui/components/layout/utils.js @@ -1,4 +1,9 @@ -import { DEVICE_TYPE, LAYOUT_TYPE } from './enums'; +import { + DEVICE_TYPE, + LAYOUT_ELEMENTS, + LAYOUT_TYPE, + SYNC, +} from './enums'; const phoneUpperBoundary = 600; const tabletPortraitUpperBoundary = 900; @@ -66,4 +71,58 @@ const suportedLayouts = [ ], }, ]; -export { suportedLayouts }; + +const COMMON_ELEMENTS = { + DEFAULT: [ + LAYOUT_ELEMENTS.LAYOUT_TYPE, + LAYOUT_ELEMENTS.PRESENTATION_STATE, + LAYOUT_ELEMENTS.FOCUSED_CAMERA, + ], + DOCK: [ + LAYOUT_ELEMENTS.CAMERA_DOCK_POSITION, + LAYOUT_ELEMENTS.CAMERA_DOCK_SIZE, + ], +}; + +const LAYOUTS_SYNC = { + [LAYOUT_TYPE.CUSTOM_LAYOUT]: { + [SYNC.PROPAGATE_ELEMENTS]: [...COMMON_ELEMENTS.DEFAULT, ...COMMON_ELEMENTS.DOCK], + [SYNC.REPLICATE_ELEMENTS]: [...COMMON_ELEMENTS.DEFAULT, ...COMMON_ELEMENTS.DOCK], + }, + [LAYOUT_TYPE.SMART_LAYOUT]: { + [SYNC.PROPAGATE_ELEMENTS]: COMMON_ELEMENTS.DEFAULT, + [SYNC.REPLICATE_ELEMENTS]: COMMON_ELEMENTS.DEFAULT, + }, + [LAYOUT_TYPE.PRESENTATION_FOCUS]: { + [SYNC.PROPAGATE_ELEMENTS]: COMMON_ELEMENTS.DEFAULT, + [SYNC.REPLICATE_ELEMENTS]: COMMON_ELEMENTS.DEFAULT, + }, + [LAYOUT_TYPE.VIDEO_FOCUS]: { + [SYNC.PROPAGATE_ELEMENTS]: COMMON_ELEMENTS.DEFAULT, + [SYNC.REPLICATE_ELEMENTS]: COMMON_ELEMENTS.DEFAULT, + }, + // Hidden layouts neither propagate nor replicate the layout type pushed. + // These layouts are not available for selection in the UI and are set only via join parameters. + // Propagating or replicating the layout type would be inappropriate, as + // they are intended to maintain a specific view unaffected by layout type changes. + [LAYOUT_TYPE.CAMERAS_ONLY]: { + [SYNC.PROPAGATE_ELEMENTS]: [], + [SYNC.REPLICATE_ELEMENTS]: [LAYOUT_ELEMENTS.FOCUSED_CAMERA], + }, + [LAYOUT_TYPE.PRESENTATION_ONLY]: { + [SYNC.PROPAGATE_ELEMENTS]: [], + [SYNC.REPLICATE_ELEMENTS]: [], + }, + [LAYOUT_TYPE.PARTICIPANTS_AND_CHAT_ONLY]: { + [SYNC.PROPAGATE_ELEMENTS]: [], + [SYNC.REPLICATE_ELEMENTS]: [], + }, + [LAYOUT_TYPE.MEDIA_ONLY]: { + [SYNC.PROPAGATE_ELEMENTS]: [], + [SYNC.REPLICATE_ELEMENTS]: [ + LAYOUT_ELEMENTS.FOCUSED_CAMERA, + LAYOUT_ELEMENTS.PRESENTATION_STATE, + ], + }, +}; +export { suportedLayouts, LAYOUTS_SYNC }; diff --git a/bigbluebutton-html5/imports/ui/components/meeting-ended/component.tsx b/bigbluebutton-html5/imports/ui/components/meeting-ended/component.tsx index 83baa00492..8ed738b21b 100644 --- a/bigbluebutton-html5/imports/ui/components/meeting-ended/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/meeting-ended/component.tsx @@ -284,7 +284,7 @@ const MeetingEnded: React.FC = ({ { learningDashboardAccessToken && isModerator // Always set cookie in case Dashboard is already opened - && setLearningDashboardCookie(learningDashboardAccessToken, meetingId) === true + && setLearningDashboardCookie(learningDashboardAccessToken, meetingId, learningDashboardBase) === true ? ( { + // Helper function to extract domain parts in reverse order + const getDomainParts = (url: string): string[] => { + try { + const { hostname } = new URL(url); + return hostname.split('.').reverse(); + } catch (e) { + throw new Error(`Invalid URL format: ${url}`); + } + }; + + try { + const domain1Parts: string[] = getDomainParts(url1); + const domain2Parts: string[] = getDomainParts(url2); + + // Find common parts starting from the end (TLD) + const commonParts: string[] = []; + const minLength: number = Math.min(domain1Parts.length, domain2Parts.length); + + for (let i = 0; i < minLength; i += 1) { + if (domain1Parts[i] === domain2Parts[i]) { + commonParts.push(domain1Parts[i]); + } else { + break; + } + } + + // Return the common parts in correct order + if (commonParts.length > 0) { + return commonParts.reverse().join('.'); + } + return ''; + } catch (error) { + return ''; + } +}; + export const openLearningDashboardUrl = ( accessToken: string, mId: string, @@ -31,18 +68,28 @@ export const openLearningDashboardUrl = ( learningDashboardBase: string, lang: string, ) => { - if (accessToken && setLearningDashboardCookie(accessToken, mId)) { + if (accessToken && setLearningDashboardCookie(accessToken, mId, learningDashboardBase)) { window.open(`${learningDashboardBase}/?meeting=${mId}&lang=${lang}`, '_blank'); } else { window.open(`${learningDashboardBase}/?meeting=${mId}&sessionToken=${sToken}&lang=${lang}`, '_blank'); } }; -export const setLearningDashboardCookie = (accessToken: string, mId: string) => { +export const setLearningDashboardCookie = (accessToken: string, mId: string, learningDashboardBase: string) => { if (accessToken !== null) { const lifetime = new Date(); lifetime.setTime(lifetime.getTime() + (3600000)); // 1h (extends 7d when open Dashboard) - document.cookie = `ld-${mId}=${accessToken}; expires=${lifetime.toUTCString()}; path=/`; + let cookieString = `ld-${mId}=${accessToken}; expires=${lifetime.toUTCString()}; path=/`; + + // In a cluster setup it will be necessary to specify the root domain + // because the Dashboard might be in a different subdomain + if (learningDashboardBase && learningDashboardBase.startsWith('http')) { + const commonDomain = findCommonDomain(learningDashboardBase, window.location.href); + if (commonDomain !== '') { + cookieString += `;domain=${commonDomain}`; + } + } + document.cookie = cookieString; return true; } return false; diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/component.jsx b/bigbluebutton-html5/imports/ui/components/nav-bar/component.jsx index 2b4ff891df..2316d8d9ae 100755 --- a/bigbluebutton-html5/imports/ui/components/nav-bar/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/nav-bar/component.jsx @@ -272,6 +272,7 @@ class NavBar extends Component { currentUserId, isDirectLeaveButtonEnabled, isMeteorConnected, + hideTopRow, } = this.props; const hasNotification = hasUnreadMessages || (hasUnreadNotes && !isPinned); @@ -288,7 +289,8 @@ class NavBar extends Component { const { selectedLayout } = Settings.application; const shouldShowNavBarToggleButton = selectedLayout !== LAYOUT_TYPE.CAMERAS_ONLY && selectedLayout !== LAYOUT_TYPE.PRESENTATION_ONLY - && selectedLayout !== LAYOUT_TYPE.PARTICIPANTS_AND_CHAT_ONLY; + && selectedLayout !== LAYOUT_TYPE.PARTICIPANTS_AND_CHAT_ONLY + && selectedLayout !== LAYOUT_TYPE.MEDIA_ONLY; const APP_CONFIG = window.meetingClientSettings?.public?.app; const enableTalkingIndicator = APP_CONFIG?.enableTalkingIndicator; @@ -312,58 +314,60 @@ class NavBar extends Component { } } > - - - {shouldShowNavBarToggleButton && isExpanded && document.dir === 'ltr' - && } - {shouldShowNavBarToggleButton && !isExpanded && document.dir === 'rtl' - && } - {shouldShowNavBarToggleButton && ( - + + {shouldShowNavBarToggleButton && isExpanded && document.dir === 'ltr' + && } + {shouldShowNavBarToggleButton && !isExpanded && document.dir === 'rtl' + && } + {shouldShowNavBarToggleButton && ( + + )} + {shouldShowNavBarToggleButton && !isExpanded && document.dir === 'ltr' + && } + {shouldShowNavBarToggleButton && isExpanded && document.dir === 'rtl' + && } + {renderPluginItems(leftPluginItems)} + + + + {presentationTitle} + + - )} - {shouldShowNavBarToggleButton && !isExpanded && document.dir === 'ltr' - && } - {shouldShowNavBarToggleButton && isExpanded && document.dir === 'rtl' - && } - {renderPluginItems(leftPluginItems)} - - - - {presentationTitle} - - - {renderPluginItems(centerPluginItems)} - - - {renderPluginItems(rightPluginItems)} - {ConnectionStatusService.isEnabled() ? : null} - {ConnectionStatusService.isEnabled() ? : null} - {isDirectLeaveButtonEnabled && isMeteorConnected - ? : null} - - - + {renderPluginItems(centerPluginItems)} + + + {renderPluginItems(rightPluginItems)} + {ConnectionStatusService.isEnabled() ? : null} + {ConnectionStatusService.isEnabled() ? : null} + {isDirectLeaveButtonEnabled && isMeteorConnected + ? : null} + + + + )} {enableTalkingIndicator ? : null} diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx b/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx index 2c743e776d..ad0919da89 100755 --- a/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx @@ -3,7 +3,7 @@ import { defineMessages, useIntl } from 'react-intl'; import Auth from '/imports/ui/services/auth'; import getFromUserSettings from '/imports/ui/services/users-settings'; import NavBar from './component'; -import { layoutSelectInput, layoutSelectOutput, layoutDispatch } from '../layout/context'; +import { layoutSelectInput, layoutDispatch, layoutSelectOutput } from '../layout/context'; import { PluginsContext } from '/imports/ui/components/components-data/plugin-context/context'; import { PANELS } from '/imports/ui/components/layout/enums'; import useCurrentUser from '/imports/ui/core/hooks/useCurrentUser'; @@ -121,6 +121,7 @@ const NavBarContainer = ({ children, ...props }) => { isDirectLeaveButtonEnabled: IS_DIRECT_LEAVE_BUTTON_ENABLED, // TODO: Remove/Replace isMeteorConnected: true, + hideTopRow: navBar.hideTopRow, ...props, }} style={{ ...navBar }} diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/recording-indicator/component.tsx b/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/recording-indicator/component.tsx index 0350903004..935fe113d9 100644 --- a/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/recording-indicator/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/recording-indicator/component.tsx @@ -6,6 +6,7 @@ import React, { } from 'react'; import useMeeting from '/imports/ui/core/hooks/useMeeting'; import deviceInfo, { isMobile } from '/imports/utils/deviceInfo'; +import { defineMessages, useIntl } from 'react-intl'; import { GET_MEETING_RECORDING_DATA, GET_MEETING_RECORDING_POLICIES, @@ -20,7 +21,6 @@ import humanizeSeconds from '/imports/utils/humanizeSeconds'; import { notify } from '/imports/ui/services/notification'; import Styled from './styles'; import { User } from '/imports/ui/Types/user'; -import { defineMessages, useIntl } from 'react-intl'; import useTimeSync from '/imports/ui/core/local-states/useTimeSync'; import RecordingNotify from './notify/component'; import RecordingContainer from '/imports/ui/components/recording/container'; @@ -28,6 +28,7 @@ import useDeduplicatedSubscription from '/imports/ui/core/hooks/useDeduplicatedS import { getSettingsSingletonInstance } from '/imports/ui/services/settings'; import logger from '/imports/startup/client/logger'; import SvgIcon from '/imports/ui/components/common/icon-svg/component'; +import Service from './service'; const intlMessages = defineMessages({ notificationRecordingStart: { @@ -233,7 +234,9 @@ const RecordingIndicator: React.FC = ({ } const recordingButton = recording ? recordMeetingButtonWithTooltip : recordMeetingButton; - const showButton = isModerator && allowStartStopRecording; + const showButton = Service.mayIRecord(isModerator, allowStartStopRecording); + const defaultRecordTooltip = intl.formatMessage(intlMessages.notificationRecordingStop); + const customRecordTooltip = Service.getCustomRecordTooltip(defaultRecordTooltip); if (!record) return null; return ( <> @@ -249,18 +252,14 @@ const RecordingIndicator: React.FC = ({ {showButton ? recordingButton : null} {showButton ? null : ( {recordingIndicatorIcon} diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/recording-indicator/notify/service.tsx b/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/recording-indicator/notify/service.tsx deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/recording-indicator/service.tsx b/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/recording-indicator/service.tsx new file mode 100644 index 0000000000..6f2307a9f5 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/recording-indicator/service.tsx @@ -0,0 +1,15 @@ +import getFromUserSettings from '/imports/ui/services/users-settings'; + +const mayIRecord = (amIModerator: boolean, allowStartStopRecording: boolean) => { + const customRecord = getFromUserSettings('bbb_record_permission', undefined); + if (!allowStartStopRecording) return false; + if (customRecord !== undefined) { + return customRecord; + } + return amIModerator; +}; + +export default { + mayIRecord, + getCustomRecordTooltip: (value: string) => getFromUserSettings('bbb_record_permission_tooltip', value), +}; diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/recording-indicator/styles.ts b/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/recording-indicator/styles.ts index b8fb1559aa..59282cde3b 100644 --- a/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/recording-indicator/styles.ts +++ b/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/recording-indicator/styles.ts @@ -167,7 +167,7 @@ const RecordingStatusViewOnly = styled.div` display: flex; ${({ recording }) => recording && ` - padding: 5px 0 5px 5px; + padding: 5px 5px 5px 5px; background-color: ${colorDangerDark}; border: ${borderSizeLarge} solid ${colorDangerDark}; border-radius: 10px; diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/talking-indicator/component.tsx b/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/talking-indicator/component.tsx index c11b26d7f5..8e9e9636a1 100644 --- a/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/talking-indicator/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/talking-indicator/component.tsx @@ -140,10 +140,14 @@ const TalkingIndicator: React.FC = ({ color="primary" icon={icon} size="lg" - style={{ - backgroundColor: color, - border: `solid 2px ${color}`, - }} + style={ + isModerator + ? { + backgroundColor: color, + border: `solid 2px ${color}`, + } + : undefined + } > {talking ? ( @@ -179,11 +183,13 @@ const TalkingIndicator: React.FC = ({ aria-label={ariaLabel} color="primary" size="sm" - style={{ - backgroundColor: '#4a148c', - border: 'solid 2px #4a148c', - cursor: 'default', - }} + style={ + isModerator ? { + backgroundColor: '#4a148c', + border: 'solid 2px #4a148c', + cursor: 'default', + } : undefined + } /> ); }; diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/talking-indicator/styles.ts b/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/talking-indicator/styles.ts index 49defcbfb9..4cf22f037b 100644 --- a/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/talking-indicator/styles.ts +++ b/bigbluebutton-html5/imports/ui/components/nav-bar/nav-bar-graphql/talking-indicator/styles.ts @@ -115,6 +115,7 @@ const TalkingIndicatorButton = styled(Button)` ${({ $isViewer }) => $isViewer && ` cursor: default; + pointer-events: none; `} `; diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/options-dropdown/component.jsx b/bigbluebutton-html5/imports/ui/components/nav-bar/options-dropdown/component.jsx index 0868b60304..6e4bd59fbd 100644 --- a/bigbluebutton-html5/imports/ui/components/nav-bar/options-dropdown/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/nav-bar/options-dropdown/component.jsx @@ -17,6 +17,7 @@ import deviceInfo from '/imports/utils/deviceInfo'; import Session from '/imports/ui/services/storage/in-memory'; import { LAYOUT_TYPE } from '/imports/ui/components/layout/enums'; import { getSettingsSingletonInstance } from '/imports/ui/services/settings'; +import Toggle from '/imports/ui/components/common/switch/component'; const intlMessages = defineMessages({ optionsLabel: { @@ -103,6 +104,14 @@ const intlMessages = defineMessages({ id: 'app.actionsBar.actionsDropdown.layoutModal', description: 'Label for layouts selection button', }, + awayLabel: { + id: 'app.actionsBar.reactions.away', + description: 'Away Label', + }, + activeLabel: { + id: 'app.actionsBar.reactions.active', + description: 'Active Label', + }, }); const propTypes = { @@ -212,7 +221,7 @@ class OptionsDropdown extends PureComponent { icon: fullscreenIcon, label: fullscreenLabel, description: fullscreenDesc, - onClick: handleToggleFullscreen, + onClick: () => handleToggleFullscreen(), }, ) ); @@ -255,7 +264,7 @@ class OptionsDropdown extends PureComponent { const { intl, amIModerator, isBreakoutRoom, isMeteorConnected, audioCaptionsEnabled, audioCaptionsActive, audioCaptionsSet, isMobile, optionsDropdownItems, - isDirectLeaveButtonEnabled, isLayoutsEnabled, + isDirectLeaveButtonEnabled, isLayoutsEnabled, away, handleToggleAFK, } = this.props; const { isIos } = deviceInfo; @@ -270,6 +279,42 @@ class OptionsDropdown extends PureComponent { this.menuItems = []; + const actionCustomStyles = { + paddingLeft: 0, + paddingRight: 0, + paddingTop: isMobile ? '0' : '0.5rem', + paddingBottom: isMobile ? '0' : '0.5rem', + }; + + const ToggleAFKLabel = () => (away + ? intl.formatMessage(intlMessages.awayLabel) + : intl.formatMessage(intlMessages.activeLabel)); + + this.menuItems.push({ + label: ( + + <>Presence + + {ToggleAFKLabel()} + + + + ), + key: 'none', + isToggle: true, + customStyles: { ...actionCustomStyles, width: 'auto' }, + }, { + key: 'separator-01', + isSeparator: true, + }); + this.getFullscreenItem(this.menuItems); const BBB_TABLET_APP_CONFIG = window.meetingClientSettings.public.app.bbbTabletApp; diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/options-dropdown/container.jsx b/bigbluebutton-html5/imports/ui/components/nav-bar/options-dropdown/container.jsx index 60c2e81627..6a11824367 100755 --- a/bigbluebutton-html5/imports/ui/components/nav-bar/options-dropdown/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/nav-bar/options-dropdown/container.jsx @@ -12,6 +12,14 @@ import { useShortcut } from '/imports/ui/core/hooks/useShortcut'; import { useStorageKey } from '/imports/ui/services/storage/hooks'; import Session from '/imports/ui/services/storage/in-memory'; import { useIsLayoutsEnabled } from '/imports/ui/services/features'; +import useCurrentUser from '/imports/ui/core/hooks/useCurrentUser'; +import useToggleVoice from '/imports/ui/components/audio/audio-graphql/hooks/useToggleVoice'; +import useWhoIsUnmuted from '/imports/ui/core/hooks/useWhoIsUnmuted'; +import Auth from '/imports/ui/services/auth'; +import { SET_AWAY } from '/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/user-actions/mutations'; +import { + muteAway, +} from '/imports/ui/components/audio/audio-graphql/audio-controls/input-stream-live-selector/service'; const { isIphone } = deviceInfo; const { isSafari, isValidSafariVersion } = browserInfo; @@ -37,10 +45,30 @@ const OptionsDropdownContainer = (props) => { isBreakout: m.isBreakout, })); + const { data: currentUserData } = useCurrentUser((user) => ({ + away: user.away, + })); + const voiceToggle = useToggleVoice(); + const { data: unmutedUsers } = useWhoIsUnmuted(); + const muted = !unmutedUsers[Auth.userID]; + + const away = currentUserData?.away; + const componentsFlags = currentMeeting?.componentsFlags; const audioCaptionsEnabled = componentsFlags?.hasCaption; const [userLeaveMeeting] = useMutation(USER_LEAVE_MEETING); + const [setAway] = useMutation(SET_AWAY); + + const handleToggleAFK = () => { + muteAway(muted, away, voiceToggle); + setAway({ + variables: { + away: !away, + }, + }); + }; + const openOptions = useShortcut('openOptions'); const audioCaptionsActive = useStorageKey('audioCaptions') || false; const isDropdownOpen = useStorageKey('dropdownOpen'); @@ -63,6 +91,8 @@ const OptionsDropdownContainer = (props) => { // TODO: Replace/Remove isMeteorConnected: true, isLayoutsEnabled, + away, + handleToggleAFK, ...props, }} /> diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/options-dropdown/styles.js b/bigbluebutton-html5/imports/ui/components/nav-bar/options-dropdown/styles.js index 35b8a0e0d0..0d8a064f68 100644 --- a/bigbluebutton-html5/imports/ui/components/nav-bar/options-dropdown/styles.js +++ b/bigbluebutton-html5/imports/ui/components/nav-bar/options-dropdown/styles.js @@ -1,6 +1,11 @@ import styled from 'styled-components'; import { smallOnly } from '/imports/ui/stylesheets/styled-components/breakpoints'; import Button from '/imports/ui/components/common/button/component'; +import { + colorGrayDark, + btnPrimaryColor, + btnPrimaryActiveBg, +} from '/imports/ui/stylesheets/styled-components/palette'; const DropdownButton = styled(Button)` ${({ state }) => state === 'open' && ` @@ -15,6 +20,63 @@ const DropdownButton = styled(Button)` `} `; +const AwayOption = styled.div` + display: flex; + align-items: center; + justify-content: space-between; +`; + +const ToggleButtonWrapper = styled.div` + border: 1px solid transparent; + cursor: pointer; + display: flex; + align-items: center; + + &:focus { + background-color: ${colorGrayDark}; + } + + & > button { + cursor: pointer; + flex: auto; + } + + & > * > span { + padding: 4px; + } + + ${({ active }) => active && ` + color: ${btnPrimaryColor}; + background-color: ${btnPrimaryActiveBg}; + + &:hover{ + filter: brightness(90%); + color: ${btnPrimaryColor}; + background-color: ${btnPrimaryActiveBg} !important; + } + `} + + width: auto; + cursor: inherit; + &:hover { + background-color: transparent !important; + } +`; + +const AFKLabel = styled.div` + padding-right: .5rem; + padding-left: 0; + + [dir="rtl"] & { + padding-left: .5rem; + padding-right: 0; + } + +`; + export default { DropdownButton, + AwayOption, + ToggleButtonWrapper, + AFKLabel, }; diff --git a/bigbluebutton-html5/imports/ui/components/notes/component.tsx b/bigbluebutton-html5/imports/ui/components/notes/component.tsx index 375dc13095..46afd66b2f 100644 --- a/bigbluebutton-html5/imports/ui/components/notes/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/notes/component.tsx @@ -175,18 +175,7 @@ const NotesContainerGraphql: React.FC = (props) => { const { area, isToSharedNotesBeShow } = props; const hasPermission = useHasPermission(); - const [pinnedPadDataState, setPinnedPadDataState] = useState(null); - - useEffect(() => { - const fetchData = async () => { - const { data: pinnedPadData } = await useDeduplicatedSubscription( - PINNED_PAD_SUBSCRIPTION, - ); - setPinnedPadDataState(pinnedPadData || []); - }; - - fetchData(); - }, []); + const { data: pinnedPadData } = useDeduplicatedSubscription(PINNED_PAD_SUBSCRIPTION); const { data: currentUserData } = useCurrentUser((user) => ({ presenter: user.presenter, @@ -209,10 +198,10 @@ const NotesContainerGraphql: React.FC = (props) => { const { isOpen: isSidebarContentOpen } = sidebarContent; const isGridLayout = useStorageKey('isGridEnabled'); - const shouldShowSharedNotesOnPresentationArea = isGridLayout ? !!pinnedPadDataState - && pinnedPadDataState.sharedNotes[0]?.sharedNotesExtId === NOTES_CONFIG.id - && isSidebarContentOpen : !!pinnedPadDataState - && pinnedPadDataState.sharedNotes[0]?.sharedNotesExtId === NOTES_CONFIG.id; + const shouldShowSharedNotesOnPresentationArea = isGridLayout ? !!pinnedPadData + && pinnedPadData.sharedNotes[0]?.sharedNotesExtId === NOTES_CONFIG.id + && isSidebarContentOpen : !!pinnedPadData + && pinnedPadData.sharedNotes[0]?.sharedNotesExtId === NOTES_CONFIG.id; const [stopExternalVideoShare] = useMutation(EXTERNAL_VIDEO_STOP); const isScreenBroadcasting = useIsScreenBroadcasting(); diff --git a/bigbluebutton-html5/imports/ui/components/plugins-engine/extensible-areas/manager.tsx b/bigbluebutton-html5/imports/ui/components/plugins-engine/extensible-areas/manager.tsx index 649edb4c42..acc038d927 100644 --- a/bigbluebutton-html5/imports/ui/components/plugins-engine/extensible-areas/manager.tsx +++ b/bigbluebutton-html5/imports/ui/components/plugins-engine/extensible-areas/manager.tsx @@ -45,7 +45,9 @@ const extensibleAreaComponentManagers: ExtensibleAreaComponentManager[] = [ function generateItemWithId( item: T, ): T { - item.setItemId(uuidLib.v4()); + if (!item.id) { + item.setItemId(uuidLib.v4()); + } return item; } diff --git a/bigbluebutton-html5/imports/ui/components/plugins-engine/loader/manager.tsx b/bigbluebutton-html5/imports/ui/components/plugins-engine/loader/manager.tsx index b3bd320bfb..8b49379485 100644 --- a/bigbluebutton-html5/imports/ui/components/plugins-engine/loader/manager.tsx +++ b/bigbluebutton-html5/imports/ui/components/plugins-engine/loader/manager.tsx @@ -6,7 +6,7 @@ const PluginLoaderManager = (props: PluginLoaderManagerProps) => { const { uuid, containerRef, - loadedPlugins, + setNumberOfLoadedPlugins, setLastLoadedPlugin, pluginConfig: plugin, } = props; @@ -22,7 +22,7 @@ const PluginLoaderManager = (props: PluginLoaderManagerProps) => { const script: HTMLScriptElement = document.createElement('script'); script.onload = () => { - loadedPlugins.current += 1; + setNumberOfLoadedPlugins((current) => current + 1); setLastLoadedPlugin(script); logger.info({ logCode: 'plugin_loaded', @@ -40,8 +40,8 @@ const PluginLoaderManager = (props: PluginLoaderManagerProps) => { script.src = plugin.url; script.setAttribute('uuid', div.id); script.setAttribute('pluginName', plugin.name); - if (plugin.checksum) { - script.setAttribute('integrity', plugin.checksum); + if (plugin.javascriptEntrypointIntegrity) { + script.setAttribute('integrity', plugin.javascriptEntrypointIntegrity); } document.head.appendChild(script); }, [plugin, containerRef]); diff --git a/bigbluebutton-html5/imports/ui/components/plugins-engine/loader/types.ts b/bigbluebutton-html5/imports/ui/components/plugins-engine/loader/types.ts index 7c1993a7b1..901a102941 100644 --- a/bigbluebutton-html5/imports/ui/components/plugins-engine/loader/types.ts +++ b/bigbluebutton-html5/imports/ui/components/plugins-engine/loader/types.ts @@ -3,7 +3,7 @@ import { PluginConfig } from '../types'; export interface PluginLoaderManagerProps { uuid: string; containerRef: React.RefObject; - loadedPlugins: React.MutableRefObject; + setNumberOfLoadedPlugins: React.Dispatch>; setLastLoadedPlugin: React.Dispatch>; pluginConfig: PluginConfig; } diff --git a/bigbluebutton-html5/imports/ui/components/plugins-engine/manager.tsx b/bigbluebutton-html5/imports/ui/components/plugins-engine/manager.tsx index de09ba0837..213130416c 100644 --- a/bigbluebutton-html5/imports/ui/components/plugins-engine/manager.tsx +++ b/bigbluebutton-html5/imports/ui/components/plugins-engine/manager.tsx @@ -1,5 +1,5 @@ import React, { - useEffect, useRef, useState, useMemo, + useEffect, useRef, useState, } from 'react'; import logger from '/imports/startup/client/logger'; import { @@ -9,7 +9,7 @@ import * as PluginSdk from 'bigbluebutton-html-plugin-sdk'; import * as uuidLib from 'uuid'; import PluginDataConsumptionManager from './data-consumption/manager'; import PluginsEngineComponent from './component'; -import { PluginConfig, EffectivePluginConfig } from './types'; +import { EffectivePluginConfig, PluginsEngineManagerProps } from './types'; import PluginLoaderManager from './loader/manager'; import ExtensibleAreaStateManager from './extensible-areas/manager'; import PluginDataChannelManager from './data-channel/manager'; @@ -18,34 +18,38 @@ import PluginDomElementManipulationManager from './dom-element-manipulation/mana import PluginServerCommandsHandler from './server-commands/handler'; import PluginLearningAnalyticsDashboardManager from './learning-analytics-dashboard/manager'; -const PluginsEngineManager = () => { +const PluginsEngineManager = (props: PluginsEngineManagerProps) => { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - temporary, while meteor exists in the project - const PLUGINS_CONFIG = window.meetingClientSettings.public.plugins; + const { pluginConfig } = props; // If there is no plugin to load, the engine simply returns null - if (!PLUGINS_CONFIG) return null; const containerRef = useRef(null); const [lastLoadedPlugin, setLastLoadedPlugin] = useState(); - const loadedPlugins = useRef(0); + const [effectivePluginsConfig, setEffectivePluginsConfig] = useState(); + const [numberOfLoadedPlugins, setNumberOfLoadedPlugins] = useState(0); - const effectivePluginsConfig: EffectivePluginConfig[] = useMemo( - () => PLUGINS_CONFIG.map((p: PluginConfig) => ({ - ...p, - uuid: uuidLib.v4(), - } as EffectivePluginConfig)), [ - PLUGINS_CONFIG, - ], - ); + useEffect(() => { + setEffectivePluginsConfig( + pluginConfig?.map((p) => ({ + ...p, + name: p.name, + url: p.javascriptEntrypointUrl, + uuid: uuidLib.v4(), + } as EffectivePluginConfig)), + ); + }, [ + pluginConfig, + ]); - const totalNumberOfPlugins = PLUGINS_CONFIG?.length; + const totalNumberOfPlugins = pluginConfig?.length; window.React = React; useEffect(() => { - logger.info(`${loadedPlugins.current}/${totalNumberOfPlugins} plugins loaded`); + if (totalNumberOfPlugins) logger.info(`${numberOfLoadedPlugins}/${totalNumberOfPlugins} plugins loaded`); }, - [loadedPlugins.current, lastLoadedPlugin]); + [numberOfLoadedPlugins, lastLoadedPlugin]); return ( <> @@ -59,7 +63,7 @@ const PluginsEngineManager = () => { { - effectivePluginsConfig.map((effectivePluginConfig: EffectivePluginConfig) => { + effectivePluginsConfig?.map((effectivePluginConfig: EffectivePluginConfig) => { const { uuid, name: pluginName } = effectivePluginConfig; const pluginApi: PluginSdk.PluginApi = BbbPluginSdk.getPluginApi(uuid, pluginName); return ( @@ -68,7 +72,7 @@ const PluginsEngineManager = () => { {...{ uuid, containerRef, - loadedPlugins, + setNumberOfLoadedPlugins, setLastLoadedPlugin, pluginConfig: effectivePluginConfig, }} diff --git a/bigbluebutton-html5/imports/ui/components/plugins-engine/query.ts b/bigbluebutton-html5/imports/ui/components/plugins-engine/query.ts new file mode 100644 index 0000000000..8d383fbf56 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/plugins-engine/query.ts @@ -0,0 +1,11 @@ +import { gql } from '@apollo/client'; + +const PLUGIN_CONFIGURATION_QUERY = gql`query PluginConfigurationQuery { + plugin { + name, + javascriptEntrypointUrl, + javascriptEntrypointIntegrity, + } +}`; + +export default PLUGIN_CONFIGURATION_QUERY; diff --git a/bigbluebutton-html5/imports/ui/components/plugins-engine/styles.ts b/bigbluebutton-html5/imports/ui/components/plugins-engine/styles.ts index 45680b5b62..5333d82962 100644 --- a/bigbluebutton-html5/imports/ui/components/plugins-engine/styles.ts +++ b/bigbluebutton-html5/imports/ui/components/plugins-engine/styles.ts @@ -2,10 +2,10 @@ import styled from 'styled-components'; // eslint-disable-next-line import/prefer-default-export export const PluginsEngine = styled.div` - position: 'absolute', - top: 0, - left: 0, - width: '100vw', - height: '100vh', - zIndex: -1, + position: 'absolute'; + top: 0; + left: 0; + width: '100vw'; + height: '100vh'; + z-index: -1; `; diff --git a/bigbluebutton-html5/imports/ui/components/plugins-engine/types.ts b/bigbluebutton-html5/imports/ui/components/plugins-engine/types.ts index 42fae08f88..8e3c032ca5 100644 --- a/bigbluebutton-html5/imports/ui/components/plugins-engine/types.ts +++ b/bigbluebutton-html5/imports/ui/components/plugins-engine/types.ts @@ -4,10 +4,19 @@ export interface PluginsEngineComponentProps { containerRef: React.RefObject; } +export interface PluginConfigFromGraphql { + javascriptEntrypointUrl: string; + name: string; +} + +export interface PluginsEngineManagerProps { + pluginConfig: PluginConfigFromGraphql[] | undefined; +} + export interface PluginConfig { name: string; url: string; - checksum?: string; + javascriptEntrypointIntegrity?: string; } export interface EffectivePluginConfig extends PluginConfig { diff --git a/bigbluebutton-html5/imports/ui/components/plugins-engine/ui-commands/conference/handler.tsx b/bigbluebutton-html5/imports/ui/components/plugins-engine/ui-commands/conference/handler.tsx new file mode 100644 index 0000000000..516f1f8413 --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/plugins-engine/ui-commands/conference/handler.tsx @@ -0,0 +1,28 @@ +import { useEffect } from 'react'; +import { ConferenceEnum } from 'bigbluebutton-html-plugin-sdk/dist/cjs/ui-commands/conference/enums'; +import { SetSpeakerLevelCommandArguments } from 'bigbluebutton-html-plugin-sdk/dist/cjs/ui-commands/conference/types'; +import { setSpeakerLevel } from '../../../audio/audio-graphql/audio-controls/input-stream-live-selector/service'; + +const PluginConferenceUiCommandsHandler = () => { + const handleSetSpeakerLevel = (event: CustomEvent) => { + const { level } = event.detail; + setSpeakerLevel(level); + }; + + useEffect(() => { + window.addEventListener( + ConferenceEnum.SET_SPEAKER_LEVEL, + handleSetSpeakerLevel as EventListener, + ); + + return () => { + window.removeEventListener( + ConferenceEnum.SET_SPEAKER_LEVEL, + handleSetSpeakerLevel as EventListener, + ); + }; + }, []); + return null; +}; + +export default PluginConferenceUiCommandsHandler; diff --git a/bigbluebutton-html5/imports/ui/components/plugins-engine/ui-commands/handler.tsx b/bigbluebutton-html5/imports/ui/components/plugins-engine/ui-commands/handler.tsx index af0866e4dc..3690d04923 100644 --- a/bigbluebutton-html5/imports/ui/components/plugins-engine/ui-commands/handler.tsx +++ b/bigbluebutton-html5/imports/ui/components/plugins-engine/ui-commands/handler.tsx @@ -2,12 +2,16 @@ import * as React from 'react'; import PluginChatUiCommandsHandler from './chat/handler'; import PluginSidekickOptionsContainerUiCommandsHandler from './sidekick-options-container/handler'; import PluginPresentationAreaUiCommandsHandler from './presentation/handler'; +import PluginUserStatusUiCommandsHandler from './user-status/handler'; +import PluginConferenceUiCommandsHandler from './conference/handler'; const PluginUiCommandsHandler = () => ( <> + + ); diff --git a/bigbluebutton-html5/imports/ui/components/plugins-engine/ui-commands/user-status/handler.tsx b/bigbluebutton-html5/imports/ui/components/plugins-engine/ui-commands/user-status/handler.tsx new file mode 100644 index 0000000000..4cbd12350b --- /dev/null +++ b/bigbluebutton-html5/imports/ui/components/plugins-engine/ui-commands/user-status/handler.tsx @@ -0,0 +1,53 @@ +import { useEffect } from 'react'; +import { useMutation } from '@apollo/client'; +import { muteAway } from '/imports/ui/components/audio/audio-graphql/audio-controls/input-stream-live-selector/service'; +import useToggleVoice from '/imports/ui/components/audio/audio-graphql/hooks/useToggleVoice'; +import { SET_AWAY } from '/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/user-actions/mutations'; +import useWhoIsUnmuted from '/imports/ui/core/hooks/useWhoIsUnmuted'; +import useCurrentUser from '/imports/ui/core/hooks/useCurrentUser'; +import Auth from '/imports/ui/services/auth'; +import { SetAwayStatusCommandArguments } from 'bigbluebutton-html-plugin-sdk/dist/cjs/ui-commands/user-status/types'; +import { UserStatusEnum } from 'bigbluebutton-html-plugin-sdk/dist/cjs/ui-commands/user-status/enums'; + +const PluginUserStatusUiCommandsHandler = () => { + const [setAway] = useMutation(SET_AWAY); + const { data: unmutedUsers } = useWhoIsUnmuted(); + const { data: currentUserData } = useCurrentUser((user) => ({ + away: user.away, + })); + const voiceToggle = useToggleVoice(); + const muted = !unmutedUsers[Auth.userID as string]; + + const handleUserStatusAway = (event: CustomEvent) => { + const { away: targetAwayStatus } = event.detail; + const { away: currentAwayStatus } = currentUserData as { away: boolean }; + + if (targetAwayStatus === currentAwayStatus) return; + muteAway(muted, currentAwayStatus, voiceToggle); + setAway({ + variables: { + away: targetAwayStatus, + }, + }); + }; + + useEffect(() => { + // add event listener only when the subscription for + // current user information is valid + if (!currentUserData) return () => {}; + window.addEventListener( + UserStatusEnum.SET_AWAY_STATUS, + handleUserStatusAway as EventListener, + ); + + return () => { + window.removeEventListener( + UserStatusEnum.SET_AWAY_STATUS, + handleUserStatusAway as EventListener, + ); + }; + }, [unmutedUsers, currentUserData]); + return null; +}; + +export default PluginUserStatusUiCommandsHandler; diff --git a/bigbluebutton-html5/imports/ui/components/plugins-engine/ui-data-hooks/layout/presentation-area/utils.ts b/bigbluebutton-html5/imports/ui/components/plugins-engine/ui-data-hooks/layout/presentation-area/utils.ts index 5223d1d35c..5ba30f8d8c 100644 --- a/bigbluebutton-html5/imports/ui/components/plugins-engine/ui-data-hooks/layout/presentation-area/utils.ts +++ b/bigbluebutton-html5/imports/ui/components/plugins-engine/ui-data-hooks/layout/presentation-area/utils.ts @@ -2,6 +2,7 @@ import { useEffect, useState } from 'react'; import { Layout } from '/imports/ui/components/layout/layoutTypes'; import { LayoutPresentatioAreaUiDataNames, UiLayouts } from 'bigbluebutton-html-plugin-sdk'; import { LayoutPresentationAreaUiDataPayloads } from 'bigbluebutton-html-plugin-sdk/dist/cjs/ui-data-hooks/layout/presentation-area/types'; +import { UI_DATA_LISTENER_SUBSCRIBED } from 'bigbluebutton-html-plugin-sdk/dist/cjs/ui-data-hooks/consts'; import { PRESENTATION_AREA } from '/imports/ui/components/layout/enums'; const useUpdatePresentationAreaContentForPluginForPlugin = (layoutContextState: Layout) => { @@ -10,8 +11,8 @@ const useUpdatePresentationAreaContentForPluginForPlugin = (layoutContextState: ]>(); const { presentationAreaContentActions: presentationAreaContentPile } = layoutContextState; - useEffect(() => { - setPresentationAreaContent(presentationAreaContentPile.map((p) => { + const generateNewContentInfo = () => { + return presentationAreaContentPile.map((p) => { let currentElement; let genericContentId; switch (p.value.content) { @@ -37,12 +38,40 @@ const useUpdatePresentationAreaContentForPluginForPlugin = (layoutContextState: currentElement, genericContentId, }; - })); - }, [layoutContextState]); - useEffect(() => { + }); + }; + + // Define function to first inform ui data hooks that subscribe to this event + const updateUiDataHookLayoutPresentatioAreaChangedForPlugin = () => { + const content = presentationAreaContent || generateNewContentInfo(); window.dispatchEvent(new CustomEvent(LayoutPresentatioAreaUiDataNames.CURRENT_ELEMENT, { - detail: presentationAreaContent, + detail: content, })); + }; + + useEffect(() => { + // When component mount, add event listener to send first information + // about this ui data hooks to plugin + window.addEventListener( + `${UI_DATA_LISTENER_SUBSCRIBED}-${LayoutPresentatioAreaUiDataNames.CURRENT_ELEMENT}`, + updateUiDataHookLayoutPresentatioAreaChangedForPlugin, + ); + + // Before component unmount, remove event listeners for plugin ui data hooks + return () => { + window.removeEventListener( + `${UI_DATA_LISTENER_SUBSCRIBED}-${LayoutPresentatioAreaUiDataNames.CURRENT_ELEMENT}`, + updateUiDataHookLayoutPresentatioAreaChangedForPlugin, + ); + }; + }, []); + + useEffect(() => { + setPresentationAreaContent(generateNewContentInfo()); + }, [layoutContextState]); + + useEffect(() => { + updateUiDataHookLayoutPresentatioAreaChangedForPlugin(); }, [presentationAreaContent]); }; diff --git a/bigbluebutton-html5/imports/ui/components/presentation/component.jsx b/bigbluebutton-html5/imports/ui/components/presentation/component.jsx index 5c3d97770d..dc6ac394f5 100755 --- a/bigbluebutton-html5/imports/ui/components/presentation/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/presentation/component.jsx @@ -143,18 +143,20 @@ class Presentation extends PureComponent { componentDidMount() { this.getInitialPresentationSizes(); - this.refPresentationContainer.addEventListener( - 'keydown', - this.handlePanShortcut, - ); - this.refPresentationContainer.addEventListener( - 'keyup', - this.handlePanShortcut, - ); - this.refPresentationContainer.addEventListener( - FULLSCREEN_CHANGE_EVENT, - this.onFullscreenChange, - ); + if (this.refPresentationContainer) { + this.refPresentationContainer.addEventListener( + 'keydown', + this.handlePanShortcut, + ); + this.refPresentationContainer.addEventListener( + 'keyup', + this.handlePanShortcut, + ); + this.refPresentationContainer.addEventListener( + FULLSCREEN_CHANGE_EVENT, + this.onFullscreenChange, + ); + } window.addEventListener('resize', this.onResize, false); const { @@ -213,6 +215,7 @@ class Presentation extends PureComponent { fitToWidth, isDefaultPresentation, presentationIsDownloadable, + setPresentationFitToWidth, } = this.props; const { presentationWidth, @@ -360,6 +363,10 @@ class Presentation extends PureComponent { ) { this.setIsPanning(); } + + if (!userIsPresenter && prevProps.userIsPresenter && fitToWidth) { + setPresentationFitToWidth(false); + } } componentWillUnmount() { @@ -367,18 +374,20 @@ class Presentation extends PureComponent { const { fullscreenContext, layoutContextDispatch } = this.props; window.removeEventListener('resize', this.onResize, false); - this.refPresentationContainer.removeEventListener( - FULLSCREEN_CHANGE_EVENT, - this.onFullscreenChange, - ); - this.refPresentationContainer.removeEventListener( - 'keydown', - this.handlePanShortcut, - ); - this.refPresentationContainer.removeEventListener( - 'keyup', - this.handlePanShortcut, - ); + if (this.refPresentationContainer) { + this.refPresentationContainer.removeEventListener( + FULLSCREEN_CHANGE_EVENT, + this.onFullscreenChange, + ); + this.refPresentationContainer.removeEventListener( + 'keydown', + this.handlePanShortcut, + ); + this.refPresentationContainer.removeEventListener( + 'keyup', + this.handlePanShortcut, + ); + } if (fullscreenContext) { layoutContextDispatch({ @@ -500,9 +509,9 @@ class Presentation extends PureComponent { zoomChanger(zoom) { let boundZoom = parseInt(zoom); if (boundZoom < HUNDRED_PERCENT) { - boundZoom = HUNDRED_PERCENT + boundZoom = HUNDRED_PERCENT; } else if (boundZoom > MAX_PERCENT) { - boundZoom = MAX_PERCENT + boundZoom = MAX_PERCENT; } this.setState({ zoom: boundZoom }); } @@ -817,7 +826,7 @@ class Presentation extends PureComponent { const presentationZIndex = fullscreenContext ? presentationBounds.zIndex : undefined; const APP_CRASH_METADATA = { logCode: 'whiteboard_crash', logMessage: 'Possible whiteboard crash' }; - + if (!presentationIsOpen) return null; return ( <> { + const { presentationIsOpen } = props; + const layoutContextDispatch = layoutDispatch(); const { selectedLayout } = useSettings(SETTINGS.APPLICATION); const { data: presentationPageData } = useDeduplicatedSubscription( CURRENT_PRESENTATION_PAGE_SUBSCRIPTION, ); + + const { data: annotationStreamData } = useDeduplicatedSubscription( + CURRENT_PAGE_ANNOTATIONS_STREAM, + { + variables: { lastUpdatedAt: new Date(0).toISOString() }, + }, + ); + + useEffect(() => { + if ( + ( + annotationStreamData?.pres_annotation_curr_stream + && annotationStreamData.pres_annotation_curr_stream.length > 0) + && !presentationIsOpen) { + MediaService.setPresentationIsOpen(layoutContextDispatch, true); + } + }, [annotationStreamData]); + const { pres_page_curr: presentationPageArray } = (presentationPageData || {}); const currentPresentationPage = presentationPageArray && presentationPageArray[0]; const slideSvgUrl = currentPresentationPage && currentPresentationPage.svgUrl; @@ -176,13 +197,11 @@ const PresentationContainer = (props) => { } } - const { presentationIsOpen } = props; - const cameraDock = layoutSelectInput((i) => i.cameraDock); const presentation = layoutSelectOutput((i) => i.presentation); const fullscreen = layoutSelect((i) => i.fullscreen); const deviceType = layoutSelect((i) => i.deviceType); - const layoutContextDispatch = layoutDispatch(); + const layoutType = layoutSelect((i) => i.layoutType); const { numCameras } = cameraDock; const { element } = fullscreen; @@ -203,6 +222,8 @@ const PresentationContainer = (props) => { presentationAreaHeight: presentation?.height, }; + if (layoutType === 'videoFocus' && presentation?.width === 0) return null; + return ( { currentUser, whiteboardId, persistShape, + hasWBAccess, } = props; const [state, setState] = useState({ @@ -378,7 +379,9 @@ const PresentationMenu = (props) => { ); } - menuItems.push( + const showVisibilityOption = currentUser?.presenter || hasWBAccess; + + showVisibilityOption && menuItems.push( { key: 'list-item-toolvisibility', dataTest: 'toolVisibility', diff --git a/bigbluebutton-html5/imports/ui/components/presentation/presentation-menu/container.jsx b/bigbluebutton-html5/imports/ui/components/presentation/presentation-menu/container.jsx index 68d23c6d28..5b3baebc80 100755 --- a/bigbluebutton-html5/imports/ui/components/presentation/presentation-menu/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/presentation/presentation-menu/container.jsx @@ -1,4 +1,4 @@ -import React, { useContext, useState, useEffect } from 'react'; +import React, { useContext } from 'react'; import PropTypes from 'prop-types'; import PresentationMenu from './component'; import FullscreenService from '/imports/ui/components/common/fullscreen-button/service'; @@ -33,22 +33,14 @@ const PresentationMenuContainer = (props) => { ]; } - const [whiteboardWriters, setWhiteboardWriters] = useState([]); - - useEffect(() => { - const fetchData = async () => { - const { data } = await useDeduplicatedSubscription( - CURRENT_PAGE_WRITERS_SUBSCRIPTION, - { - variables: { pageId: whiteboardId }, - skip: !whiteboardId, - }, - ); - setWhiteboardWriters(data?.pres_page_writers || []); - }; - - fetchData(); - }, [whiteboardId]); + const { data: whiteboardWritersData } = useDeduplicatedSubscription( + CURRENT_PAGE_WRITERS_SUBSCRIPTION, + { + variables: { pageId: whiteboardId }, + skip: !whiteboardId, + }, + ); + const whiteboardWriters = whiteboardWritersData?.pres_page_writers || []; const hasWBAccess = whiteboardWriters?.some((writer) => writer.userId === Auth.userID); const meetingInfo = useMeeting((meeting) => ({ diff --git a/bigbluebutton-html5/imports/ui/components/presentation/presentation-toast/presentation-uploader-toast/component.jsx b/bigbluebutton-html5/imports/ui/components/presentation/presentation-toast/presentation-uploader-toast/component.jsx index af2e2cf719..bd8de39c81 100644 --- a/bigbluebutton-html5/imports/ui/components/presentation/presentation-toast/presentation-uploader-toast/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/presentation/presentation-toast/presentation-uploader-toast/component.jsx @@ -58,7 +58,7 @@ const intlMessages = defineMessages({ }, SCAN_FAILED: { id: 'app.presentationUploder.upload.scanFailed', - description: 'error that the file could not be uploaded because scanning failed' + description: 'error that the file could not be uploaded because scanning failed', }, CONVERSION_TIMEOUT: { id: 'app.presentationUploder.conversion.conversionTimeout', @@ -487,11 +487,12 @@ export const PresentationUploaderToast = ({ }); }, [presentations]); - let activeToast = Session.getItem('presentationUploaderToastId'); + const activeToast = Session.getItem('presentationUploaderToastId'); + const showToast = convertingPresentations.length > 0; - if (showToast && !activeToast) { - activeToast = toast.info(() => renderToastList(convertingPresentations, intl), { + if (showToast && !toast.isActive(activeToast)) { + const convertingPresToast = toast.info(() => renderToastList(convertingPresentations, intl), { hideProgressBar: true, autoClose: false, newestOnTop: true, @@ -501,7 +502,7 @@ export const PresentationUploaderToast = ({ Session.setItem('presentationUploaderToastId', null); }, }); - Session.setItem('presentationUploaderToastId', activeToast); + Session.setItem('presentationUploaderToastId', convertingPresToast); } else if (!showToast && activeToast) { handleDismissToast(activeToast); } else { diff --git a/bigbluebutton-html5/imports/ui/components/recording/component.tsx b/bigbluebutton-html5/imports/ui/components/recording/component.tsx index 520ee37eca..4a4e1756e6 100755 --- a/bigbluebutton-html5/imports/ui/components/recording/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/recording/component.tsx @@ -46,7 +46,6 @@ const intlMessages = defineMessages({ }); interface RecordingComponentProps { - amIModerator: boolean; connected: boolean; isOpen: boolean; recordingStatus: boolean, @@ -59,7 +58,6 @@ interface RecordingComponentProps { const RecordingComponent: React.FC = (props) => { const { - amIModerator, connected, isOpen, recordingStatus, @@ -76,8 +74,6 @@ const RecordingComponent: React.FC = (props) => { let description; let cancelButtonLabel; - if (!amIModerator) return null; - if (recordingStatus) { description = intl.formatMessage(intlMessages.stopDescription); title = intl.formatMessage(intlMessages.stopTitle); diff --git a/bigbluebutton-html5/imports/ui/components/recording/container.tsx b/bigbluebutton-html5/imports/ui/components/recording/container.tsx index 8ce64d0941..6dd19b517a 100755 --- a/bigbluebutton-html5/imports/ui/components/recording/container.tsx +++ b/bigbluebutton-html5/imports/ui/components/recording/container.tsx @@ -2,10 +2,11 @@ import React from 'react'; import { useMutation, useReactiveVar } from '@apollo/client'; import RecordingComponent from './component'; import { SET_RECORDING_STATUS } from './mutations'; -import { GetRecordingResponse } from './queries'; +import { GetRecordingResponse, GetRecordingPoliciesResponse } from './queries'; import useDeduplicatedSubscription from '/imports/ui/core/hooks/useDeduplicatedSubscription'; import ConnectionStatus from '/imports/ui/core/graphql/singletons/connectionStatus'; -import { GET_MEETING_RECORDING_DATA } from '/imports/ui/components/nav-bar/nav-bar-graphql/recording-indicator/queries'; +import { GET_MEETING_RECORDING_DATA, GET_MEETING_RECORDING_POLICIES } from '/imports/ui/components/nav-bar/nav-bar-graphql/recording-indicator/queries'; +import Service from '/imports/ui/components/nav-bar/nav-bar-graphql/recording-indicator/service'; interface RecordingContainerProps { setIsOpen: React.Dispatch>; @@ -24,9 +25,13 @@ const RecordingContainer: React.FC = (props) => { const { data: recordingData, } = useDeduplicatedSubscription(GET_MEETING_RECORDING_DATA); + const { + data: recordingPoliciesData, + } = useDeduplicatedSubscription(GET_MEETING_RECORDING_POLICIES); const recording = recordingData?.meeting_recording[0]?.isRecording ?? false; const time = recordingData?.meeting_recording[0]?.previousRecordedTimeInSeconds ?? 0; + const allowStartStopRecording = recordingPoliciesData?.meeting_recordingPolicies[0]?.allowStartStopRecording ?? false; const toggleRecording = () => { setRecordingStatus({ @@ -37,10 +42,13 @@ const RecordingContainer: React.FC = (props) => { setIsOpen(false); }; + const mayIRecord = Service.mayIRecord(amIModerator, allowStartStopRecording); + + if (!mayIRecord) return null; + return ( = (props) => { {error ? ( ) : null} {loading ? ( diff --git a/bigbluebutton-html5/imports/ui/components/sidebar-content/container.jsx b/bigbluebutton-html5/imports/ui/components/sidebar-content/container.jsx index ba1908d699..3f5d8c1d02 100644 --- a/bigbluebutton-html5/imports/ui/components/sidebar-content/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/sidebar-content/container.jsx @@ -27,6 +27,8 @@ const SidebarContentContainer = () => { const currentSlideId = presentationPage?.pageId; + if (sidebarContentOutput.display === false) return null; + return ( { const CustomLogoUrl = useStorageKey('CustomLogoUrl', 'session'); const CustomDarkLogoUrl = useStorageKey('CustomDarkLogoUrl', 'session'); - const DarkModeIsEnabled = isDarkThemeEnabled(); + const [DarkModeIsEnabled, setDarkModeIsEnabled] = useState(isDarkThemeEnabled()); + + useEffect(() => { + const handleDarkModeChange = (event) => { + setDarkModeIsEnabled(event.detail.enabled); + }; + + window.addEventListener('darkmodechange', handleDarkModeChange); + + return () => { + window.removeEventListener('darkmodechange', handleDarkModeChange); + }; + }, []); return ( = ({ // --- Plugin related code --- useEffect(() => { - const updateUiDataHookCurrentVolumeForPlugin = () => { + const updateUiDataHookUserListForPlugin = () => { window.dispatchEvent(new CustomEvent(PluginSdk.UserListUiDataNames.USER_LIST_IS_OPEN, { detail: { value: true, @@ -58,13 +58,13 @@ const UserListParticipants: React.FC = ({ } as UserListUiDataPayloads[PluginSdk.UserListUiDataNames.USER_LIST_IS_OPEN], })); window.addEventListener( - `${UI_DATA_LISTENER_SUBSCRIBED}-${PluginSdk.ExternalVideoVolumeUiDataNames.IS_VOLUME_MUTED}`, - updateUiDataHookCurrentVolumeForPlugin, + `${UI_DATA_LISTENER_SUBSCRIBED}-${PluginSdk.UserListUiDataNames.USER_LIST_IS_OPEN}`, + updateUiDataHookUserListForPlugin, ); return () => { window.removeEventListener( - `${UI_DATA_LISTENER_SUBSCRIBED}-${PluginSdk.ExternalVideoVolumeUiDataNames.CURRENT_VOLUME_VALUE}`, - updateUiDataHookCurrentVolumeForPlugin, + `${UI_DATA_LISTENER_SUBSCRIBED}-${PluginSdk.UserListUiDataNames.USER_LIST_IS_OPEN}`, + updateUiDataHookUserListForPlugin, ); window.dispatchEvent(new CustomEvent(PluginSdk.UserListUiDataNames.USER_LIST_IS_OPEN, { detail: { diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/list-item/styles.ts b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/list-item/styles.ts index 9b8a5c9a24..10dc01be71 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/list-item/styles.ts +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/list-item/styles.ts @@ -52,8 +52,6 @@ const UserItemContents = styled.div` position: static; padding: .45rem; width: 100%; - margin-left: .5rem; - ${({ selected }) => selected && ` background-color: ${listItemBgHover}; diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/styles.ts b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/styles.ts index de5e29738b..0521d0ccc7 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/styles.ts +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/styles.ts @@ -272,6 +272,7 @@ const VirtualizedList = styled(ScrollboxVertical)` const UserListItem = styled.div` padding: .25em 0; + margin-left: .5rem; `; export default { diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/user-actions/component.tsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/user-actions/component.tsx index 8c0bf933aa..60f90b3225 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/user-actions/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/user-actions/component.tsx @@ -565,7 +565,7 @@ const UserActions: React.FC = ({ ]; const actions = dropdownOptions.filter((key) => key.allowed); - if (!actions.length) { + if (!actions.length || user.bot) { return ( {children} diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/user-actions/service.ts b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/user-actions/service.ts index c21e94face..e824b7c53a 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/user-actions/service.ts +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-participants/user-actions/service.ts @@ -6,6 +6,7 @@ import { import Auth from '/imports/ui/services/auth'; import logger from '/imports/startup/client/logger'; import { toggleMuteMicrophone } from '/imports/ui/components/audio/audio-graphql/audio-controls/input-stream-live-selector/service'; +import getFromUserSettings from '/imports/ui/services/users-settings'; export const isVoiceOnlyUser = (userId: string) => userId.toString().startsWith('v_'); @@ -25,6 +26,9 @@ export const generateActionsPermissions = ( const isDialInUser = isVoiceOnlyUser(subjectUser.userId); const amISubjectUser = isMe(subjectUser.userId); const isSubjectUserModerator = subjectUser.isModerator; + // Breakout rooms mess up with role permissions + // A breakout room user that has a moderator role in it's parent room + const parentRoomModerator = getFromUserSettings('bbb_parent_room_moderator', false); const isSubjectUserGuest = subjectUser.guest; const hasAuthority = currentUser.isModerator || amISubjectUser; const allowedToChatPrivately = !amISubjectUser && !isDialInUser; @@ -42,7 +46,7 @@ export const generateActionsPermissions = ( // if currentUser is a moderator, allow removing other users const allowedToRemove = amIModerator && !amISubjectUser - && !isBreakout; + && (!isBreakout || parentRoomModerator); const allowedToPromote = amIModerator && !amISubjectUser diff --git a/bigbluebutton-html5/imports/ui/components/video-preview/component.jsx b/bigbluebutton-html5/imports/ui/components/video-preview/component.jsx index 30fb28e2f5..84b4fbf98c 100755 --- a/bigbluebutton-html5/imports/ui/components/video-preview/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/video-preview/component.jsx @@ -690,6 +690,7 @@ class VideoPreview extends Component { extraInfo: { errorName: error.name, errorMessage: error.message, + errorStack: error.stack, virtualBgType: type, virtualBgName: name, }, diff --git a/bigbluebutton-html5/imports/ui/components/webcam/component.tsx b/bigbluebutton-html5/imports/ui/components/webcam/component.tsx index 033bc68330..98666dac41 100644 --- a/bigbluebutton-html5/imports/ui/components/webcam/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/webcam/component.tsx @@ -21,6 +21,7 @@ import useDeduplicatedSubscription from '/imports/ui/core/hooks/useDeduplicatedS import { useStorageKey } from '/imports/ui/services/storage/hooks'; import useSettings from '../../services/settings/hooks/useSettings'; import { SETTINGS } from '../../services/settings/enums'; +import { INITIAL_INPUT_STATE } from '../layout/initState'; interface WebcamComponentProps { cameraDock: Output['cameraDock']; @@ -107,7 +108,7 @@ const WebcamComponent: React.FC = ({ const handleVideoFocus = (id: string) => { layoutContextDispatch({ type: ACTIONS.SET_FOCUSED_CAMERA_ID, - value: focusedId !== id ? id : false, + value: focusedId !== id ? id : INITIAL_INPUT_STATE.cameraDock.focusedId, }); }; @@ -185,8 +186,8 @@ const WebcamComponent: React.FC = ({ } const isIphone = !!(navigator.userAgent.match(/iPhone/i)); - const mobileWidth = `${isDragging ? cameraSize?.width : cameraDock.width}pt`; - const mobileHeight = `${isDragging ? cameraSize?.height : cameraDock.height}pt`; + const mobileWidth = `${isDragging ? cameraSize?.width : cameraDock.width}px`; + const mobileHeight = `${isDragging ? cameraSize?.height : cameraDock.height}px`; const isDesktopWidth = isDragging ? cameraSize?.width : cameraDock.width; const isDesktopHeight = isDragging ? cameraSize?.height : cameraDock.height; const camOpacity = isDragging ? 0.5 : undefined; diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/component.jsx b/bigbluebutton-html5/imports/ui/components/whiteboard/component.jsx index 23bbd5b1ee..24813b68dc 100644 --- a/bigbluebutton-html5/imports/ui/components/whiteboard/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/whiteboard/component.jsx @@ -1,7 +1,7 @@ import * as React from 'react'; import PropTypes from 'prop-types'; import { useRef, useCallback } from 'react'; -import { debounce, isEqual } from 'radash'; +import { isEqual } from 'radash'; import { Tldraw, DefaultColorStyle, @@ -46,18 +46,6 @@ const clearTldrawCache = () => { deleteLocalStorageItemsWithPrefix('TLDRAW'); }; -const calculateEffectiveZoom = ( - initViewboxWidth, curViewboxWidth, initViewboxHeight, curViewboxHeight, -) => { - // Calculate the effective zoom level based on the change in viewBox dimensions - const widthZoomValue = (initViewboxWidth * 100) / curViewboxWidth; - const heightZoomValue = (initViewboxHeight * 100) / curViewboxHeight; - - // Take the smaller zoom value to ensure the entire content fits in the viewbox - const effectiveZoomValue = Math.min(widthZoomValue, heightZoomValue); - return effectiveZoomValue; -}; - const createCamera = (pageId, zoomLevel) => ({ id: `camera:page:${pageId}`, meta: {}, @@ -108,6 +96,7 @@ const Whiteboard = React.memo((props) => { publishCursorUpdate, otherCursors, hideViewersCursor, + presentationWidth, presentationHeight, skipToSlide, intl, @@ -118,6 +107,7 @@ const Whiteboard = React.memo((props) => { selectedLayout, isInfiniteWhiteboard, whiteboardWriters, + isPhone, } = props; clearTldrawCache(); @@ -143,6 +133,7 @@ const Whiteboard = React.memo((props) => { const isMountedRef = useRef(false); const isWheelZoomRef = useRef(false); const isPresenterRef = useRef(isPresenter); + const fitToWidthRef = useRef(fitToWidth); const whiteboardIdRef = React.useRef(whiteboardId); const curPageIdRef = React.useRef(curPageId); const hasWBAccessRef = React.useRef(hasWBAccess); @@ -152,9 +143,11 @@ const Whiteboard = React.memo((props) => { const initialViewBoxHeightRef = React.useRef(null); const previousTool = React.useRef(null); const bgSelectedRef = React.useRef(false); + const lastVisibilityStateRef = React.useRef(''); const THRESHOLD = 0.1; const CAMERA_UPDATE_DELAY = 650; + const MOUNTED_CAMERA_DELAY = 500; const lastKnownHeight = React.useRef(presentationAreaHeight); const lastKnownWidth = React.useRef(presentationAreaWidth); @@ -216,6 +209,10 @@ const Whiteboard = React.memo((props) => { } }, [isPresenter]); + React.useEffect(() => { + fitToWidthRef.current = fitToWidth; + }, [fitToWidth]); + React.useEffect(() => { if (!isEqual(prevShapesRef.current, shapes)) { prevShapesRef.current = shapes; @@ -310,6 +307,10 @@ const Whiteboard = React.memo((props) => { event.stopPropagation(); return; } + // ignore if the edit link dialog is open + if (document.querySelector('h2.tlui-dialog__header__title')?.textContent === 'Edit link') { + return; + } const key = event.key.toLowerCase(); @@ -443,6 +444,110 @@ const Whiteboard = React.memo((props) => { whiteboardIdRef.current, ); + const setCamera = (zoom, x = 0, y = 0) => { + if (tlEditorRef.current) { + tlEditorRef.current.setCamera({ x, y, z: zoom }, { duration: 175 }); + } + }; + + const calculateZoomValue = (localWidth, localHeight) => { + const calcedZoom = fitToWidth + ? presentationAreaWidth / localWidth + : Math.min( + presentationAreaWidth / localWidth, + presentationAreaHeight / localHeight, + ); + + return calcedZoom === 0 || calcedZoom === Infinity + ? HUNDRED_PERCENT + : calcedZoom; + }; + + let cameraUpdateTimeoutId = null; + + const adjustCameraOnMount = (includeViewerLogic = true) => { + // Clear any existing timeout to prevent overlaps + if (cameraUpdateTimeoutId) { + clearTimeout(cameraUpdateTimeoutId); + } + + if (presenterChanged) { + localStorage.removeItem('initialViewBoxWidth'); + localStorage.removeItem('initialViewBoxHeight'); + } + + const storedWidth = localStorage.getItem('initialViewBoxWidth'); + const storedHeight = localStorage.getItem('initialViewBoxHeight'); + if (storedWidth && storedHeight) { + initialViewBoxWidthRef.current = parseFloat(storedWidth); + initialViewBoxHeightRef.current = parseFloat(storedHeight); + } else { + const currentZoomLevel = currentPresentationPageRef.current.scaledWidth + / currentPresentationPageRef.current.scaledViewBoxWidth; + const calculatedWidth = currentZoomLevel !== 1 + ? currentPresentationPageRef.current.scaledWidth / currentZoomLevel + : currentPresentationPageRef.current.scaledWidth; + const calculatedHeight = currentZoomLevel !== 1 + ? currentPresentationPageRef.current.scaledHeight / currentZoomLevel + : currentPresentationPageRef.current.scaledHeight; + + initialViewBoxWidthRef.current = calculatedWidth; + initialViewBoxHeightRef.current = calculatedHeight; + localStorage.setItem('initialViewBoxWidth', calculatedWidth.toString()); + localStorage.setItem('initialViewBoxHeight', calculatedHeight.toString()); + } + + cameraUpdateTimeoutId = setTimeout(() => { + if ( + presentationAreaHeight > 0 + && presentationAreaWidth > 0 + && currentPresentationPageRef.current + && currentPresentationPageRef.current.scaledWidth > 0 + && currentPresentationPageRef.current.scaledHeight > 0 + ) { + const adjustedPresentationAreaHeight = isPresenter + ? presentationAreaHeight - 40 + : presentationAreaHeight; + + let baseZoom; + if (isPresenter) { + baseZoom = fitToWidth + ? presentationAreaWidth / currentPresentationPageRef.current.scaledWidth + : Math.min( + presentationAreaWidth / currentPresentationPageRef.current.scaledWidth, + adjustedPresentationAreaHeight / currentPresentationPageRef.current.scaledHeight, + ); + + const zoomAdjustmentFactor = currentPresentationPageRef.current.scaledWidth + / currentPresentationPageRef.current.scaledViewBoxWidth; + baseZoom *= zoomAdjustmentFactor; + + const adjustedXPos = currentPresentationPageRef.current.xOffset; + const adjustedYPos = currentPresentationPageRef.current.yOffset; + + setCamera(baseZoom, adjustedXPos, adjustedYPos); + } else if (includeViewerLogic) { + baseZoom = calculateZoomValue( + currentPresentationPage.scaledViewBoxWidth, + currentPresentationPage.scaledViewBoxHeight, + ); + + const presenterXOffset = currentPresentationPageRef.current.xOffset; + const presenterYOffset = currentPresentationPageRef.current.yOffset; + + const adjustedXPos = isInfiniteWhiteboard + ? presenterXOffset + : currentPresentationPage.xOffset; + const adjustedYPos = isInfiniteWhiteboard + ? presenterYOffset + : currentPresentationPage.yOffset; + + setCamera(baseZoom, adjustedXPos, adjustedYPos); + } + } + }, MOUNTED_CAMERA_DELAY); + }; + const handleTldrawMount = (editor) => { setTlEditor(editor); setTldrawAPI(editor); @@ -578,7 +683,9 @@ const Whiteboard = React.memo((props) => { const [prevCam, nextCam] = cameras; const panned = prevCam.x !== nextCam.x || prevCam.y !== nextCam.y; - if (panned && isPresenterRef.current) { + const zoomed = prevCam.z !== nextCam.z; + + if ((panned || (zoomed && fitToWidthRef.current)) && isPresenterRef.current) { const viewedRegionW = SlideCalcUtil.calcViewedRegionWidth( editor?.getViewportPageBounds()?.w, currentPresentationPageRef.current?.scaledWidth, @@ -668,6 +775,57 @@ const Whiteboard = React.memo((props) => { // eslint-disable-next-line no-param-reassign editor.store.onBeforeChange = (prev, next) => { + if (isPhone) { + const path = editor.getPath(); + const activePaths = [ + 'draw.drawing', + 'eraser.erasing', + 'select.dragging_handle', + 'select.resizing', + 'select.translating', + 'select.rotating', + 'select.editing_shape', + 'hand.pointing', + 'hand.dragging', + 'geo.pointing', + 'line.pointing', + 'highlight.drawing', + ]; + const idlePaths = [ + 'draw.idle', + 'eraser.idle', + 'select.idle', + 'hand.idle', + 'highlight.idle', + ]; + + let visibilityState = null; + if (activePaths.includes(path)) { + visibilityState = 'visible'; + } else if (idlePaths.includes(path)) { + visibilityState = 'hidden'; + } + + if (visibilityState && visibilityState !== lastVisibilityStateRef.current) { + if (visibilityState === 'visible') { + toggleToolsAnimations( + 'fade-in', + 'fade-out', + '0s', + hasWBAccessRef.current || isPresenterRef.current, + ); + } else if (visibilityState === 'hidden') { + toggleToolsAnimations( + 'fade-out', + 'fade-in', + '0s', + hasWBAccessRef.current || isPresenterRef.current, + ); + } + lastVisibilityStateRef.current = visibilityState; + } + } + const newNext = next; if (next?.typeName === 'instance_page_state') { if (isPresenterRef.current || isModeratorRef.current) return next; @@ -693,10 +851,19 @@ const Whiteboard = React.memo((props) => { } // Get viewport dimensions and bounds - const viewportPageBounds = editor.getViewportPageBounds(); - const { w: viewportWidth, h: viewportHeight } = viewportPageBounds; + let viewportWidth; + let viewportHeight; - const presentationWidth = currentPresentationPage?.scaledWidth || 0; + if (isPresenterRef.current) { + const viewportPageBounds = editor?.getViewportPageBounds(); + viewportWidth = viewportPageBounds?.w; + viewportHeight = viewportPageBounds?.h; + } else { + viewportWidth = currentPresentationPageRef.current?.scaledViewBoxWidth; + viewportHeight = currentPresentationPageRef.current?.scaledViewBoxHeight; + } + + const presentationWidthLocal = currentPresentationPage?.scaledWidth || 0; const presentationHeightLocal = currentPresentationPage?.scaledHeight || 0; // Adjust camera position to ensure it stays within bounds @@ -705,8 +872,8 @@ const Whiteboard = React.memo((props) => { // Horizontal bounds check if (next.x > 0) { newNext.x = 0; - } else if (next.x < -(presentationWidth - viewportWidth)) { - newNext.x = -(presentationWidth - viewportWidth); + } else if (next.x < -(presentationWidthLocal - viewportWidth)) { + newNext.x = -(presentationWidthLocal - viewportWidth); } // Vertical bounds check @@ -720,19 +887,21 @@ const Whiteboard = React.memo((props) => { return newNext; }; + // eslint-disable-next-line no-param-reassign editor.store.onAfterChange = (prev, next) => { - if (next['selectedShapeIds'] && next['selectedShapeIds']?.some(id => id.includes('shape:BG'))) { + if (next.selectedShapeIds && next.selectedShapeIds?.some((id) => id.includes('shape:BG'))) { bgSelectedRef.current = true; - } else if ((next['selectedShapeIds'] && !next['selectedShapeIds']?.some(id => id.includes('shape:BG')))) { + } else if ((next.selectedShapeIds && !next.selectedShapeIds?.some((id) => id.includes('shape:BG')))) { bgSelectedRef.current = false; } - } + }; if (!isPresenterRef.current && !hasWBAccessRef.current) { editor.setCurrentTool('noop'); } } + adjustCameraOnMount(true); isMountedRef.current = true; }; @@ -794,35 +963,16 @@ const Whiteboard = React.memo((props) => { }; }, [prevShapesRef.current, curPageId]); - const setCamera = (zoom, x = 0, y = 0) => { - if (tlEditorRef.current) { - tlEditorRef.current.setCamera({ x, y, z: zoom }, { duration: 175 }); - } - }; - - const calculateZoomValue = (localWidth, localHeight) => { - const calcedZoom = fitToWidth - ? presentationAreaWidth / localWidth - : Math.min( - presentationAreaWidth / localWidth, - presentationAreaHeight / localHeight, - ); - - return calcedZoom === 0 || calcedZoom === Infinity - ? HUNDRED_PERCENT - : calcedZoom; - }; - const calculateZoomWithGapValue = ( localWidth, localHeight, widthAdjustment = 0, ) => { - const presentationWidth = presentationAreaWidth - widthAdjustment; + const presentationWidthLocal = presentationAreaWidth - widthAdjustment; const calcedZoom = (fitToWidth - ? presentationWidth / localWidth + ? presentationWidthLocal / localWidth : Math.min( - presentationWidth / localWidth, + presentationWidthLocal / localWidth, presentationAreaHeight / localHeight, )); return calcedZoom === 0 || calcedZoom === Infinity @@ -832,10 +982,9 @@ const Whiteboard = React.memo((props) => { useMouseEvents( { - whiteboardRef, tlEditorRef, isWheelZoomRef, initialZoomRef, + whiteboardRef, tlEditorRef, isWheelZoomRef, initialZoomRef, isPresenterRef, }, { - isPresenter, hasWBAccess: hasWBAccessRef.current, whiteboardToolbarAutoHide, animations, @@ -926,11 +1075,11 @@ const Whiteboard = React.memo((props) => { && isPresenter && isWheelZoomRef.current === false ) { - const zoomLevelForReset = initialZoomRef.current - || calculateZoomValue( + const zoomLevelForReset = (fitToWidthRef.current || !initialZoomRef.current) + ? calculateZoomValue( currentPresentationPage.scaledWidth, currentPresentationPage.scaledHeight, - ); + ) : initialZoomRef.current; const zoomCamera = zoomValue === HUNDRED_PERCENT ? zoomLevelForReset @@ -955,12 +1104,11 @@ const Whiteboard = React.memo((props) => { if ( zoomValue !== prevZoomValueRef.current - || zoomValue === HUNDRED_PERCENT ) { tlEditor.setCamera(nextCamera, { duration: 175 }); timeoutId = setTimeout(() => { - if (zoomValue === HUNDRED_PERCENT) { + if (zoomValue === HUNDRED_PERCENT && !fitToWidthRef.current) { zoomChanger(HUNDRED_PERCENT); zoomSlide(HUNDRED_PERCENT, HUNDRED_PERCENT, 0, 0); } else { @@ -983,7 +1131,7 @@ const Whiteboard = React.memo((props) => { // Update the previous zoom value ref with the current zoom value prevZoomValueRef.current = zoomValue; return () => clearTimeout(timeoutId); - }, [zoomValue, tlEditor, curPageId, isWheelZoomRef.current]); + }, [zoomValue, tlEditor, curPageId, isWheelZoomRef.current, fitToWidthRef.current]); React.useEffect(() => { // A slight delay to ensure the canvas has rendered @@ -1002,7 +1150,9 @@ const Whiteboard = React.memo((props) => { let initialZoom; - if (slideAspectRatio > presentationAreaAspectRatio) { + if (slideAspectRatio > presentationAreaAspectRatio + || (fitToWidthRef.current && isPresenter) + ) { initialZoom = presentationAreaWidth / currentPresentationPage.scaledWidth; } else { initialZoom = adjustedPresentationAreaHeight @@ -1020,8 +1170,43 @@ const Whiteboard = React.memo((props) => { currentPresentationPage.scaledWidth, presentationAreaWidth, presentationAreaHeight, + presentationWidth, + presentationHeight, isPresenter, presentationId, + fitToWidthRef.current, + ]); + + React.useEffect(() => { + if (fitToWidthRef.current && isPresenterRef.current) { + // when presentationHeight changes and we are using fitToWidht + // the zoom level and camera position stays same + // so we have to send the updated viewed area to server manually + const handleHeightChanged = () => { + const viewedRegionW = SlideCalcUtil.calcViewedRegionWidth( + tlEditorRef.current?.getViewportPageBounds()?.w, + currentPresentationPageRef.current?.scaledWidth, + ); + const viewedRegionH = SlideCalcUtil.calcViewedRegionHeight( + tlEditorRef.current?.getViewportPageBounds()?.h, + currentPresentationPageRef.current?.scaledHeight, + ); + + const camera = tlEditorRef.current.getCamera(); + + zoomSlide( + viewedRegionW, viewedRegionH, camera.x, camera.y, + currentPresentationPageRef.current, + ); + }; + const timeoutId = setTimeout(handleHeightChanged, CAMERA_UPDATE_DELAY); + return () => clearTimeout(timeoutId); + } + return () => null; + }, [ + presentationHeight, + fitToWidthRef.current, + isPresenterRef.current, ]); React.useEffect(() => { @@ -1057,7 +1242,7 @@ const Whiteboard = React.memo((props) => { const currentZoom = zoomValueRef.current || HUNDRED_PERCENT; const baseZoom = calculateZoomValue( currentPresentationPageRef.current.scaledWidth, - currentPresentationPageRef.current.scaledHeight + currentPresentationPageRef.current.scaledHeight, ); let adjustedZoom = baseZoom * (currentZoom / HUNDRED_PERCENT); if (isPresenter) { @@ -1092,9 +1277,9 @@ const Whiteboard = React.memo((props) => { const formattedPageId = Number(curPageIdRef?.current); - let updatedCurrentCam = { + const updatedCurrentCam = { ...camera, - z: adjustedZoom + z: adjustedZoom, }; let cameras = [ @@ -1102,31 +1287,28 @@ const Whiteboard = React.memo((props) => { updatedCurrentCam, createCamera(formattedPageId + 1, zoomToApply), ]; - cameras = cameras.filter(camera => camera.id !== 'camera:page:0'); + cameras = cameras.filter((cam) => cam.id !== 'camera:page:0'); tlEditorRef.current.store.put(cameras); } else { // Viewer logic - const effectiveZoom = calculateEffectiveZoom( - initialViewBoxWidthRef.current, - currentPresentationPageRef.current.scaledViewBoxWidth, - initialViewBoxHeightRef.current, - currentPresentationPageRef.current.scaledViewBoxHeight + const newZoom = calculateZoomValue( + currentPresentationPage.scaledViewBoxWidth, + currentPresentationPage.scaledViewBoxHeight, ); - adjustedZoom = baseZoom * (effectiveZoom / HUNDRED_PERCENT); const camera = tlEditorRef.current.getCamera(); const formattedPageId = Number(curPageIdRef?.current); - let updatedCurrentCam = { + const updatedCurrentCam = { ...camera, - z: adjustedZoom + z: newZoom, }; let cameras = [ - createCamera(formattedPageId - 1, adjustedZoom), + createCamera(formattedPageId - 1, newZoom), updatedCurrentCam, - createCamera(formattedPageId + 1, adjustedZoom), + createCamera(formattedPageId + 1, newZoom), ]; - cameras = cameras.filter(camera => camera.id !== 'camera:page:0'); + cameras = cameras.filter((cam) => cam.id !== 'camera:page:0'); tlEditorRef.current.store.put(cameras); } } @@ -1152,28 +1334,21 @@ const Whiteboard = React.memo((props) => { && initialViewBoxHeightRef.current && currentPresentationPage ) { - const effectiveZoom = calculateEffectiveZoom( - initialViewBoxWidthRef.current, + const newZoom = calculateZoomValue( currentPresentationPage.scaledViewBoxWidth, - initialViewBoxHeightRef.current, currentPresentationPage.scaledViewBoxHeight, ); - const adjustedZoom = calculateZoomValue( - currentPresentationPage.scaledWidth, - currentPresentationPage.scaledHeight, - ) * (effectiveZoom / HUNDRED_PERCENT); - const adjustedXPos = currentPresentationPage.xOffset; const adjustedYPos = currentPresentationPage.yOffset; setCamera( - adjustedZoom, + newZoom, adjustedXPos, adjustedYPos, ); } - }, [currentPresentationPage]); + }, [currentPresentationPage, isPresenter]); React.useEffect(() => { if (shapesToAdd.length || shapesToUpdate.length || shapesToRemove.length) { @@ -1285,17 +1460,15 @@ const Whiteboard = React.memo((props) => { } }, [otherCursors, whiteboardWriters]); - const createPage = (currentPageId) => { - return [ - { - meta: {}, - id: currentPageId, - name: `Slide ${currentPageId?.split(':')[1]}`, - index: 'a1', - typeName: 'page', - }, - ]; - } + const createPage = (currentPageId) => [ + { + meta: {}, + id: currentPageId, + name: `Slide ${currentPageId?.split(':')[1]}`, + index: 'a1', + typeName: 'page', + }, + ]; const createCameras = (pageId, tlZ) => { const cameras = []; @@ -1313,40 +1486,40 @@ const Whiteboard = React.memo((props) => { } return cameras; - } + }; const cleanupStore = (currentPageId) => { const allRecords = tlEditorRef.current.store.allRecords(); const shapeIdsToRemove = allRecords - .filter(record => record.typeName === 'shape' && record.parentId && record.parentId !== currentPageId) - .map(shape => shape.id); + .filter((record) => record.typeName === 'shape' && record.parentId && record.parentId !== currentPageId) + .map((shape) => shape.id); if (shapeIdsToRemove.length > 0) { tlEditorRef.current.deleteShapes(shapeIdsToRemove); } - } + }; const updateStore = (pages, cameras) => { tlEditorRef.current.store.put(pages); tlEditorRef.current.store.put(cameras); tlEditorRef.current.store.put(assets); tlEditorRef.current.store.put(bgShape); - } + }; const finalizeStore = () => { tlEditorRef.current.history.clear(); - } + }; const toggleToolbarIfNeeded = () => { if (whiteboardToolbarAutoHide && toggleToolsAnimations) { - toggleToolsAnimations("fade-in", "fade-out", "0s", hasWBAccessRef.current || isPresenterRef.current); + toggleToolsAnimations('fade-in', 'fade-out', '0s', hasWBAccessRef.current || isPresenterRef.current); } - } + }; const resetSlideState = () => { slideChanged.current = false; slideNext.current = null; - } + }; React.useEffect(() => { const formattedPageId = parseInt(curPageIdRef.current, 10); @@ -1371,112 +1544,6 @@ const Whiteboard = React.memo((props) => { } }, [curPageId]); - const adjustCameraOnMount = (includeViewerLogic = true) => { - if (presenterChanged) { - localStorage.removeItem('initialViewBoxWidth'); - localStorage.removeItem('initialViewBoxHeight'); - } - - const storedWidth = localStorage.getItem('initialViewBoxWidth'); - const storedHeight = localStorage.getItem('initialViewBoxHeight'); - if (storedWidth && storedHeight) { - initialViewBoxWidthRef.current = parseFloat(storedWidth); - initialViewBoxHeightRef.current = parseFloat(storedHeight); - } else { - const currentZoomLevel = currentPresentationPageRef.current.scaledWidth - / currentPresentationPageRef.current.scaledViewBoxWidth; - const calculatedWidth = currentZoomLevel !== 1 - ? currentPresentationPageRef.current.scaledWidth / currentZoomLevel - : currentPresentationPageRef.current.scaledWidth; - const calculatedHeight = currentZoomLevel !== 1 - ? currentPresentationPageRef.current.scaledHeight / currentZoomLevel - : currentPresentationPageRef.current.scaledHeight; - - initialViewBoxWidthRef.current = calculatedWidth; - initialViewBoxHeightRef.current = calculatedHeight; - localStorage.setItem('initialViewBoxWidth', calculatedWidth.toString()); - localStorage.setItem('initialViewBoxHeight', calculatedHeight.toString()); - } - - setTimeout(() => { - if ( - presentationAreaHeight > 0 - && presentationAreaWidth > 0 - && currentPresentationPageRef.current - && currentPresentationPageRef.current.scaledWidth > 0 - && currentPresentationPageRef.current.scaledHeight > 0 - ) { - const adjustedPresentationAreaHeight = isPresenter - ? presentationAreaHeight - 40 - : presentationAreaHeight; - - const effectiveZoom = calculateEffectiveZoom( - initialViewBoxWidthRef.current, - currentPresentationPageRef.current.scaledViewBoxWidth, - initialViewBoxHeightRef.current, - currentPresentationPageRef.current.scaledViewBoxHeight, - ); - - let baseZoom; - if (isPresenter) { - baseZoom = fitToWidth - ? presentationAreaWidth / currentPresentationPageRef.current.scaledWidth - : Math.min( - presentationAreaWidth / currentPresentationPageRef.current.scaledWidth, - adjustedPresentationAreaHeight / currentPresentationPageRef.current.scaledHeight, - ); - - const zoomAdjustmentFactor = currentPresentationPageRef.current.scaledWidth - / currentPresentationPageRef.current.scaledViewBoxWidth; - baseZoom *= zoomAdjustmentFactor; - - const adjustedXPos = currentPresentationPageRef.current.xOffset; - const adjustedYPos = currentPresentationPageRef.current.yOffset; - - setCamera(baseZoom, adjustedXPos, adjustedYPos); - } else if (includeViewerLogic) { - baseZoom = Math.min( - presentationAreaWidth / currentPresentationPageRef.current.scaledWidth, - adjustedPresentationAreaHeight / currentPresentationPageRef.current.scaledHeight, - ); - - const zoomAdjustmentFactor = currentPresentationPageRef.current.scaledWidth - / currentPresentationPageRef.current.scaledViewBoxWidth; - baseZoom *= zoomAdjustmentFactor; - - const presenterXOffset = currentPresentationPageRef.current.xOffset; - const presenterYOffset = currentPresentationPageRef.current.yOffset; - - const adjustedXPos = isInfiniteWhiteboard - ? presenterXOffset - : presenterXOffset * effectiveZoom; - const adjustedYPos = isInfiniteWhiteboard - ? presenterYOffset - : presenterYOffset * effectiveZoom; - - setCamera(baseZoom, adjustedXPos, adjustedYPos); - } - } - }, CAMERA_UPDATE_DELAY); - }; - - React.useEffect(() => { - if (isMountedRef.current) { - adjustCameraOnMount(true); - } - }, [ - isMountedRef.current, - presentationId, - curPageId, - isMultiUserActive, - isPresenter, - animations, - locale, - whiteboardToolbarAutoHide, - darkTheme, - isInfiniteWhiteboard, - ]); - React.useEffect(() => { if (isMountedRef.current) { adjustCameraOnMount(false); @@ -1485,6 +1552,13 @@ const Whiteboard = React.memo((props) => { isMountedRef.current, selectedLayout, isInfiniteWhiteboard, + fitToWidthRef.current, + presentationWidth, + curPageId, + isPresenter, + animations, + locale, + darkTheme, ]); React.useEffect(() => { @@ -1604,6 +1678,7 @@ export default Whiteboard; Whiteboard.propTypes = { isPresenter: PropTypes.bool, + isPhone: PropTypes.bool, removeShapes: PropTypes.func.isRequired, persistShapeWrapper: PropTypes.func.isRequired, notifyNotAllowedChange: PropTypes.func.isRequired, @@ -1615,6 +1690,7 @@ Whiteboard.propTypes = { whiteboardId: PropTypes.string, zoomSlide: PropTypes.func.isRequired, curPageNum: PropTypes.number.isRequired, + presentationWidth: PropTypes.number.isRequired, presentationHeight: PropTypes.number.isRequired, zoomChanger: PropTypes.func.isRequired, isRTL: PropTypes.bool.isRequired, diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/container.jsx b/bigbluebutton-html5/imports/ui/components/whiteboard/container.jsx index ad396151b0..e809e880a5 100644 --- a/bigbluebutton-html5/imports/ui/components/whiteboard/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/whiteboard/container.jsx @@ -36,7 +36,6 @@ import deviceInfo from '/imports/utils/deviceInfo'; import Whiteboard from './component'; import useCurrentUser from '/imports/ui/core/hooks/useCurrentUser'; -import useMeeting from '/imports/ui/core/hooks/useMeeting'; import { PRESENTATION_SET_ZOOM, PRES_ANNOTATION_DELETE, @@ -48,6 +47,8 @@ import { useMergedCursorData } from './hooks.ts'; import useDeduplicatedSubscription from '../../core/hooks/useDeduplicatedSubscription'; import MediaService from '/imports/ui/components/media/service'; import getFromUserSettings from '/imports/ui/services/users-settings'; +import { debounce } from '/imports/utils/debounce'; +import useLockContext from '/imports/ui/components/lock-viewers/hooks/useLockContext'; const FORCE_RESTORE_PRESENTATION_ON_NEW_EVENTS = 'bbb_force_restore_presentation_on_new_events'; @@ -64,9 +65,8 @@ const WhiteboardContainer = (props) => { const [shapes, setShapes] = useState({}); const [currentPresentationPage, setCurrentPresentationPage] = useState(null); - const meeting = useMeeting((m) => ({ - lockSettings: m?.lockSettings, - })); + const { userLocks } = useLockContext(); + const { data: currentUser } = useCurrentUser((user) => ({ presenter: user.presenter, isModerator: user.isModerator, @@ -138,7 +138,7 @@ const WhiteboardContainer = (props) => { }); }; - const zoomSlide = ( + const zoomSlide = debounce(( widthRatio, heightRatio, xOffset, yOffset, currPage = currentPresentationPage, ) => { const { pageId, num } = currPage; @@ -154,7 +154,7 @@ const WhiteboardContainer = (props) => { heightRatio, }, }); - }; + }, 500); const submitAnnotations = async (newAnnotations) => { const isAnnotationSent = await presentationSubmitAnnotations({ @@ -269,7 +269,7 @@ const WhiteboardContainer = (props) => { setShapes(updatedShapes); }, [annotations, intl, curPageNum, currentPresentationPage]); - const { isIphone } = deviceInfo; + const { isIphone, isPhone } = deviceInfo; const assetId = AssetRecordType.createId(curPageNum); const assets = [{ @@ -361,6 +361,7 @@ const WhiteboardContainer = (props) => { animations: Settings?.application?.animations, toggleToolsAnimations, isIphone, + isPhone, currentPresentationPage, numberOfPages: currentPresentationPage?.totalPages, presentationId, @@ -378,7 +379,7 @@ const WhiteboardContainer = (props) => { meetingId={Auth.meetingID} publishCursorUpdate={throttledPublishCursorUpdate} otherCursors={cursorArray} - hideViewersCursor={meeting?.data?.lockSettings?.hideViewersCursor} + hideViewersCursor={userLocks?.hideViewersCursor} /> ); }; diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/hooks.js b/bigbluebutton-html5/imports/ui/components/whiteboard/hooks.js index 9d2b7a33cd..7732312b65 100644 --- a/bigbluebutton-html5/imports/ui/components/whiteboard/hooks.js +++ b/bigbluebutton-html5/imports/ui/components/whiteboard/hooks.js @@ -23,9 +23,8 @@ const useCursor = (publishCursorUpdate, whiteboardId) => { }; const useMouseEvents = ({ - whiteboardRef, tlEditorRef, isWheelZoomRef, initialZoomRef, + whiteboardRef, tlEditorRef, isWheelZoomRef, initialZoomRef, isPresenterRef, }, { - isPresenter, hasWBAccess, whiteboardToolbarAutoHide, animations, @@ -52,7 +51,7 @@ const useMouseEvents = ({ }; const handleMouseDownWhiteboard = (event) => { - if (!isPresenter && !hasWBAccess) { + if (!isPresenterRef.current && !hasWBAccess) { const updateProps = { isReadonly: false }; if (event.button === 1) { @@ -82,7 +81,7 @@ const useMouseEvents = ({ 'fade-out', 'fade-in', animations ? '.3s' : '0s', - hasWBAccess || isPresenter, + hasWBAccess || isPresenterRef.current, ); } }; @@ -93,7 +92,7 @@ const useMouseEvents = ({ 'fade-in', 'fade-out', animations ? '3s' : '0s', - hasWBAccess || isPresenter, + hasWBAccess || isPresenterRef.current, ); } @@ -105,7 +104,7 @@ const useMouseEvents = ({ const handleMouseWheel = throttle({ interval: 175 }, (event) => { event.preventDefault(); event.stopPropagation(); - if (!tlEditorRef.current || !isPresenter || !currentPresentationPage) { + if (!tlEditorRef.current || !isPresenterRef.current || !currentPresentationPage) { return; } @@ -164,14 +163,14 @@ const useMouseEvents = ({ 'fade-in', 'fade-out', animations ? '3s' : '0s', - hasWBAccess || isPresenter, + hasWBAccess || isPresenterRef.current, ); } else { toggleToolsAnimations( 'fade-out', 'fade-in', animations ? '.3s' : '0s', - hasWBAccess || isPresenter, + hasWBAccess || isPresenterRef.current, ); } }, [whiteboardToolbarAutoHide]); @@ -203,6 +202,7 @@ const useMouseEvents = ({ }, [ whiteboardRef, tlEditorRef, + isPresenterRef, handleMouseDownWhiteboard, handleMouseUp, handleMouseEnter, diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/styles.js b/bigbluebutton-html5/imports/ui/components/whiteboard/styles.js index 7b0bef9db1..545bd39150 100644 --- a/bigbluebutton-html5/imports/ui/components/whiteboard/styles.js +++ b/bigbluebutton-html5/imports/ui/components/whiteboard/styles.js @@ -123,6 +123,7 @@ const TldrawV2GlobalStyle = createGlobalStyle` [data-testid="tools.more.laser"], [data-testid="tools.asset"], [data-testid="page-menu.button"], + [data-testid="menu-item.zoom-to-100"], .tlui-menu-zone { display: none !important; } diff --git a/bigbluebutton-html5/imports/ui/core/enums/chat.ts b/bigbluebutton-html5/imports/ui/core/enums/chat.ts index 7abdf30387..c5548e57c3 100644 --- a/bigbluebutton-html5/imports/ui/core/enums/chat.ts +++ b/bigbluebutton-html5/imports/ui/core/enums/chat.ts @@ -1,5 +1,13 @@ export const enum ChatEvents { SENT_MESSAGE = 'sentMessage', + CHAT_FOCUS_MESSAGE_REQUEST = 'ChatFocusMessageRequest', + CHAT_KEYBOARD_FOCUS_MESSAGE_REQUEST = 'ChatKeyboardFocusMessageRequest', + CHAT_KEYBOARD_FOCUS_MESSAGE_CANCEL = 'ChatKeyboardFocusMessageCancel', + CHAT_REPLY_INTENTION = 'ChatReplyIntention', + CHAT_CANCEL_REPLY_INTENTION = 'ChatCancelReplyIntention', + CHAT_EDIT_REQUEST = 'ChatEditRequest', + CHAT_CANCEL_EDIT_REQUEST = 'ChatCancelEditRequest', + CHAT_DELETE_REQUEST = 'ChatDeleteRequest', } export const enum ChatCommands { diff --git a/bigbluebutton-html5/imports/ui/core/graphql/queries/users.ts b/bigbluebutton-html5/imports/ui/core/graphql/queries/users.ts index a818980dfb..8aab7bdab7 100644 --- a/bigbluebutton-html5/imports/ui/core/graphql/queries/users.ts +++ b/bigbluebutton-html5/imports/ui/core/graphql/queries/users.ts @@ -30,6 +30,7 @@ subscription UserListSubscription($offset: Int!, $limit: Int!) { locked authed mobile + bot guest clientType disconnected @@ -71,7 +72,7 @@ export const USER_AGGREGATE_COUNT_SUBSCRIPTION = gql` export const GET_USER_IDS = gql` query Users { - user { + user(where: { bot: { _eq: false } } ) { userId } } @@ -79,7 +80,7 @@ export const GET_USER_IDS = gql` export const GET_USER_NAMES = gql` query Users { - user { + user(where: { bot: { _eq: false } } ) { name } } diff --git a/bigbluebutton-html5/imports/ui/core/initial-values/meetingClientSettings.ts b/bigbluebutton-html5/imports/ui/core/initial-values/meetingClientSettings.ts index e6319a8a40..79132ac4b3 100644 --- a/bigbluebutton-html5/imports/ui/core/initial-values/meetingClientSettings.ts +++ b/bigbluebutton-html5/imports/ui/core/initial-values/meetingClientSettings.ts @@ -569,6 +569,7 @@ export const meetingClientSettingsInitialValues: MeetingClientSettings = { 'p', 'strong', ], + toolbar: [], }, userReaction: { enabled: true, diff --git a/bigbluebutton-html5/imports/ui/hooks/useStickyScroll.ts b/bigbluebutton-html5/imports/ui/hooks/useStickyScroll.ts index e9e61384b8..25fa6437f8 100644 --- a/bigbluebutton-html5/imports/ui/hooks/useStickyScroll.ts +++ b/bigbluebutton-html5/imports/ui/hooks/useStickyScroll.ts @@ -1,5 +1,5 @@ import { - useCallback, useEffect, useMemo, useRef, + useCallback, useEffect, useRef, } from 'react'; interface Handlers { @@ -7,47 +7,68 @@ interface Handlers { stopObserving(): void; } -const useStickyScroll = (el: HTMLElement | null) => { - const elHeight = useRef(0); +const useStickyScroll = ( + stickyElement: HTMLElement | null, + onResizeOf: HTMLElement | null, + operator: 'ne' | 'gt' = 'gt', +) => { + const elHeight = useRef(stickyElement?.offsetHeight ?? 0); const timeout = useRef>(); + const observer = useRef(null); const handlers = useRef({ startObserving: () => {}, stopObserving: () => {}, }); - const observer = useMemo( - () => new ResizeObserver((entries) => { + useEffect(() => { + if (observer.current) { + observer.current.disconnect(); + } + + observer.current = new ResizeObserver((entries) => { entries.forEach((entry) => { const { target } = entry; if (target instanceof HTMLElement) { - if (target.offsetHeight > elHeight.current) { + let elementHeightChanged = false; + switch (operator) { + case 'ne': { + elementHeightChanged = target.offsetHeight !== elHeight.current; + break; + } + case 'gt': + default: { + elementHeightChanged = target.offsetHeight > elHeight.current; + break; + } + } + if (elementHeightChanged) { elHeight.current = target.offsetHeight; - target.scrollTop = target.scrollHeight + target.clientHeight; - } else { - elHeight.current = 0; + if (stickyElement) { + // eslint-disable-next-line no-param-reassign + stickyElement.scrollTop = stickyElement.scrollHeight + stickyElement.clientHeight; + } } } }); - }), - [], - ); + }); + }, [stickyElement, operator]); handlers.current.startObserving = useCallback(() => { - if (!el) return; + if (!onResizeOf) return; clearTimeout(timeout.current); - observer.observe(el); - }, [el]); + observer.current?.observe(onResizeOf); + }, [onResizeOf]); handlers.current.stopObserving = useCallback(() => { - if (!el) return; + if (!onResizeOf) return; timeout.current = setTimeout(() => { - observer.unobserve(el); + observer.current?.unobserve(onResizeOf); }, 500); - }, [el]); + }, [onResizeOf]); useEffect( () => () => { - observer.disconnect(); + observer.current?.disconnect(); }, [], ); diff --git a/bigbluebutton-html5/imports/ui/services/audio-manager/index.js b/bigbluebutton-html5/imports/ui/services/audio-manager/index.js index 1d41fb308d..e1435db7d4 100755 --- a/bigbluebutton-html5/imports/ui/services/audio-manager/index.js +++ b/bigbluebutton-html5/imports/ui/services/audio-manager/index.js @@ -16,6 +16,8 @@ import { storeAudioInputDeviceId, getStoredAudioOutputDeviceId, storeAudioOutputDeviceId, + getAudioConstraints, + doGUM, } from '/imports/api/audio/client/bridge/service'; import MediaStreamUtils from '/imports/utils/media-stream-utils'; import { makeVar } from '@apollo/client'; @@ -86,6 +88,8 @@ class AudioManager { this._outputDeviceId = { value: makeVar(null), }; + this._inputDevices = []; + this._outputDevices = []; this.BREAKOUT_AUDIO_TRANSFER_STATES = BREAKOUT_AUDIO_TRANSFER_STATES; this._voiceActivityObserver = null; @@ -183,6 +187,34 @@ class AudioManager { return this._outputDeviceId.value(); } + set inputDevices(value) { + if (value?.length) { + this._inputDevices = value; + } + } + + get inputDevices() { + return this._inputDevices; + } + + get inputDevicesJSON() { + return this.inputDevices.map((device) => device.toJSON()); + } + + set outputDevices(value) { + if (value?.length) { + this._outputDevices = value; + } + } + + get outputDevices() { + return this._outputDevices; + } + + get outputDevicesJSON() { + return this.outputDevices.map((device) => device.toJSON()); + } + shouldBypassGUM() { return this.supportsTransparentListenOnly() && this.inputDeviceId === 'listen-only'; } @@ -335,8 +367,6 @@ class AudioManager { } joinMicrophone() { - this.audioJoinStartTime = new Date(); - this.logAudioJoinTime = false; this.isListenOnly = false; this.isEchoTest = false; @@ -354,8 +384,6 @@ class AudioManager { } joinEchoTest() { - this.audioJoinStartTime = new Date(); - this.logAudioJoinTime = false; this.isListenOnly = false; this.isEchoTest = true; @@ -390,62 +418,85 @@ class AudioManager { }); } - joinAudio(callOptions, callStateCallback) { - return this.bridge - .joinAudio(callOptions, callStateCallback.bind(this)) - .catch((error) => { - const { name, message } = error; - const errorPayload = { - type: 'MEDIA_ERROR', - errMessage: message || 'MEDIA_ERROR', - errCode: AudioErrors.MIC_ERROR.UNKNOWN, - }; + async joinAudio(callOptions, callStateCallback) { + try { + // If there's no input stream, we need to get one via getUserMedia + if (callOptions?.inputStream == null + && !this.shouldBypassGUM() + && !callOptions.isListenOnly) { + const constraints = getAudioConstraints({ deviceId: this?.bridge?.inputDeviceId }); + this.inputStream = await doGUM({ audio: constraints }); + // eslint-disable-next-line no-param-reassign + callOptions.inputStream = this.inputStream; + } - switch (name) { - case 'NotAllowedError': - errorPayload.errCode = AudioErrors.MIC_ERROR.NO_PERMISSION; - logger.error({ - logCode: 'audiomanager_error_getting_device', - extraInfo: { - errorName: error.name, - errorMessage: error.message, - }, - }, - `Error getting microphone - {${error.name}: ${error.message}}`, - ); - break; - case 'NotFoundError': - errorPayload.errCode = AudioErrors.MIC_ERROR.DEVICE_NOT_FOUND; - logger.error({ - logCode: 'audiomanager_error_device_not_found', - extraInfo: { - errorName: error.name, - errorMessage: error.message, - }, - }, - `Error getting microphone - {${error.name}: ${error.message}}`, - ); - break; - default: - logger.error({ - logCode: 'audiomanager_error_unknown', - extraInfo: { - errorName: error.name, - errorMessage: error.message, - }, - }, `Error enabling audio - {${name}: ${message}}`); - break; - } + // Start tracking audio join time here to avoid counting time spent on + // getUserMedia prompts. We're primarily focused on negotiation times here. + // We're only concerned with gUM timeouts - and it'll throw an error which + // is logged accordingly whenever it times out. + this.audioJoinStartTime = new Date(); + this.logAudioJoinTime = false; - this.isConnecting = false; + await this.bridge.joinAudio(callOptions, callStateCallback.bind(this)); + } catch (error) { + // Reset audio join time tracking if an error occurs + this.audioJoinStartTime = null; + this.logAudioJoinTime = false; + const { name, message } = error; + const errorPayload = { + type: 'MEDIA_ERROR', + errMessage: message || 'MEDIA_ERROR', + errCode: AudioErrors.MIC_ERROR.UNKNOWN, + }; - throw errorPayload; - }); + switch (name) { + case 'NotAllowedError': + errorPayload.errCode = AudioErrors.MIC_ERROR.NO_PERMISSION; + logger.error({ + logCode: 'audiomanager_error_getting_device', + extraInfo: { + errorName: error.name, + errorMessage: error.message, + }, + }, `Error getting microphone - {${error.name}: ${error.message}}`); + break; + case 'NotFoundError': + errorPayload.errCode = AudioErrors.MIC_ERROR.DEVICE_NOT_FOUND; + logger.error({ + logCode: 'audiomanager_error_device_not_found', + extraInfo: { + errorName: error.name, + errorMessage: error.message, + inputDeviceId: this.inputDeviceId, + inputDevices: this.inputDevicesJSON, + }, + }, `Error getting microphone - {${error.name}: ${error.message}}`); + // Reset the input device ID so the user can select a new one + this.changeInputDevice(null); + break; + default: + logger.error({ + logCode: 'audiomanager_error_unknown', + extraInfo: { + errorName: error.name, + errorMessage: error.message, + errorStack: error?.stack, + inputDeviceId: this.inputDeviceId, + inputDevices: this.inputDevicesJSON, + outputDeviceId: this.outputDeviceId, + outputDevices: this.outputDevicesJSON, + }, + }, `Error enabling audio - {${name}: ${message}}`); + break; + } + + this.isConnecting = false; + + throw errorPayload; + } } async joinListenOnly() { - this.audioJoinStartTime = new Date(); - this.logAudioJoinTime = false; this.isListenOnly = true; this.isEchoTest = false; @@ -532,7 +583,12 @@ class AudioManager { this.isConnecting = false; const STATS = window.meetingClientSettings.public.stats; - const secondsToActivateAudio = (new Date() - this.audioJoinStartTime) / 1000; + // If we don't have a start time, something went wrong with the tracking code + // Log it as 0 seconds to keep things consistent, but 0 should be treated + // as an invalid value and be ignored in any log analysis. + const secondsToActivateAudio = this.audioJoinStartTime > 0 + ? (new Date() - this.audioJoinStartTime) / 1000 + : 0; if (!this.logAudioJoinTime) { this.logAudioJoinTime = true; @@ -588,10 +644,13 @@ class AudioManager { extraInfo: { secondsToActivateAudio, inputDeviceId: this.inputDeviceId, + inputDevices: this.inputDevicesJSON, outputDeviceId: this.outputDeviceId, + outputDevices: this.outputDevicesJSON, isListenOnly: this.isListenOnly, }, }, 'Audio Joined'); + if (STATS.enabled) this.monitor(); this.audioEventHandler({ name: 'started', @@ -655,8 +714,17 @@ class AudioManager { breakoutMeetingId: '', status: BREAKOUT_AUDIO_TRANSFER_STATES.DISCONNECTED, }); - logger.info({ logCode: 'audio_ended' }, 'Audio ended without issue'); this.onAudioExit(); + logger.info({ + logCode: 'audio_ended', + extraInfo: { + inputDeviceId: this.inputDeviceId, + inputDevices: this.inputDevicesJSON, + outputDeviceId: this.outputDeviceId, + outputDevices: this.outputDevicesJSON, + isListenOnly: this.isListenOnly, + }, + }, 'Audio ended without issue'); } else if (status === FAILED) { this.isReconnecting = false; this.setBreakoutAudioTransferStatus({ @@ -674,7 +742,9 @@ class AudioManager { cause: bridgeError, bridge, inputDeviceId: this.inputDeviceId, + inputDevices: this.inputDevicesJSON, outputDeviceId: this.outputDeviceId, + outputDevices: this.outputDevicesJSON, isListenOnly: this.isListenOnly, }, }, @@ -749,18 +819,16 @@ class AudioManager { this.setSenderTrackEnabled(!this.isMuted); }) .catch((error) => { - logger.error( - { - logCode: 'audiomanager_input_live_device_change_failure', - extraInfo: { - errorName: error.name, - errorMessage: error.message, - deviceId: currentDeviceId, - newDeviceId: deviceId, - }, + logger.error({ + logCode: 'audiomanager_input_live_device_change_failure', + extraInfo: { + errorName: error.name, + errorMessage: error.message, + deviceId: currentDeviceId, + newDeviceId: deviceId, + inputDevices: this.inputDevicesJSON, }, - `Input device live change failed - {${error.name}: ${error.message}}` - ); + }, `Input device live change failed - {${error.name}: ${error.message}}`); throw error; }); @@ -801,18 +869,16 @@ class AudioManager { return this.outputDeviceId; } catch (error) { - logger.error( - { - logCode: 'audiomanager_output_device_change_failure', - extraInfo: { - errorName: error.name, - errorMessage: error.message, - deviceId: currentDeviceId, - newDeviceId: targetDeviceId, - }, - }, - `Error changing output device - {${error.name}: ${error.message}}` - ); + logger.error({ + logCode: 'audiomanager_output_device_change_failure', + extraInfo: { + errorName: error.name, + errorMessage: error.message, + deviceId: currentDeviceId, + newDeviceId: targetDeviceId, + outputDevices: this.outputDevicesJSON, + } + }, `Error changing output device - {${error.name}: ${error.message}}`); // Rollback/enforce current sinkId (if possible) if (sinkIdSupported) { diff --git a/bigbluebutton-html5/imports/ui/services/features/index.js b/bigbluebutton-html5/imports/ui/services/features/index.js index af31ff6cc1..16c56bf540 100644 --- a/bigbluebutton-html5/imports/ui/services/features/index.js +++ b/bigbluebutton-html5/imports/ui/services/features/index.js @@ -103,3 +103,31 @@ export function useIsInfiniteWhiteboardEnabled() { && window.meetingClientSettings.public.whiteboard.allowInfiniteWhiteboard ); } + +export function useIsReplyChatMessageEnabled() { + return ( + useDisabledFeatures().indexOf('replyChatMessage') === -1 + && window.meetingClientSettings.public.chat.toolbar.includes('reply') + ); +} + +export function useIsDeleteChatMessageEnabled() { + return ( + useDisabledFeatures().indexOf('deleteChatMessage') === -1 + && window.meetingClientSettings.public.chat.toolbar.includes('delete') + ); +} + +export function useIsEditChatMessageEnabled() { + return ( + useDisabledFeatures().indexOf('editChatMessage') === -1 + && window.meetingClientSettings.public.chat.toolbar.includes('edit') + ); +} + +export function useIsChatMessageReactionsEnabled() { + return ( + useDisabledFeatures().indexOf('chatMessageReactions') === -1 + && window.meetingClientSettings.public.chat.toolbar.includes('reactions') + ); +} diff --git a/bigbluebutton-html5/imports/ui/services/meeting-settings/index.js b/bigbluebutton-html5/imports/ui/services/meeting-settings/index.js index 64855220af..b0cdb8151b 100644 --- a/bigbluebutton-html5/imports/ui/services/meeting-settings/index.js +++ b/bigbluebutton-html5/imports/ui/services/meeting-settings/index.js @@ -17,7 +17,12 @@ window.addEventListener('graphqlSubscription', (e) => { const { data } = response; if (data) { const { metadata = [], voiceSettings } = data.meeting[0]; - settings(metadata); + // convert metadata format to { key: value } + const result = metadata.reduce((acc, item) => { + acc[item.name] = item.value; + return acc; + }, {}); + settings(result); voiceConf(voiceSettings.voiceConf); } } diff --git a/bigbluebutton-html5/imports/ui/services/storage/hooks.ts b/bigbluebutton-html5/imports/ui/services/storage/hooks.ts index 9189570c9a..4a799d4d2d 100644 --- a/bigbluebutton-html5/imports/ui/services/storage/hooks.ts +++ b/bigbluebutton-html5/imports/ui/services/storage/hooks.ts @@ -53,8 +53,10 @@ const useStorageKey = (key: string, storage?: Storage[keyof Storage]) => { export { useStorageKey, + STORAGES, }; export default { useStorageKey, + STORAGES, }; diff --git a/bigbluebutton-html5/imports/ui/stylesheets/styled-components/general.js b/bigbluebutton-html5/imports/ui/stylesheets/styled-components/general.js index 8b45d81728..98f99c1f7c 100644 --- a/bigbluebutton-html5/imports/ui/stylesheets/styled-components/general.js +++ b/bigbluebutton-html5/imports/ui/stylesheets/styled-components/general.js @@ -11,6 +11,14 @@ const lgPaddingY = '0.6rem'; const jumboPaddingY = '1.5rem'; const jumboPaddingX = '3.025rem'; +const xsPadding = '0.125rem'; +const smPadding = '0.25rem'; +const mdPadding = '0.375rem'; +const lgPadding = '0.5rem'; +const xlPadding = '0.75rem'; +const $2xlPadding = '1rem'; +const $3xlPadding = '1.25rem'; + const whiteboardToolbarPadding = '.5rem'; const whiteboardToolbarMargin = '.5rem'; const whiteboardToolbarPaddingSm = '.3rem'; @@ -170,4 +178,11 @@ export { presentationMenuHeight, styleMenuOffset, styleMenuOffsetSmall, + lgPadding, + mdPadding, + smPadding, + $2xlPadding, + $3xlPadding, + xlPadding, + xsPadding, }; diff --git a/bigbluebutton-html5/imports/ui/stylesheets/styled-components/palette.js b/bigbluebutton-html5/imports/ui/stylesheets/styled-components/palette.js index 91c26ee77d..d8ad1957a1 100644 --- a/bigbluebutton-html5/imports/ui/stylesheets/styled-components/palette.js +++ b/bigbluebutton-html5/imports/ui/stylesheets/styled-components/palette.js @@ -12,6 +12,8 @@ const colorGrayLightest = 'var(--color-gray-lightest, #D4D9DF)'; const colorBlueLight = 'var(--color-blue-light, #54a1f3)'; const colorBlueLighter = 'var(--color-blue-lighter, #92BCEA)'; const colorBlueLightest = 'var(--color-blue-lightest, #E4ECF2)'; +const colorBlueLightestChannel = '228 236 242'; +const colorBlueLighterChannel = '146 188 234'; const colorTransparent = 'var(--color-transparent, #ff000000)'; @@ -135,6 +137,8 @@ export { colorBlueLight, colorBlueLighter, colorBlueLightest, + colorBlueLightestChannel, + colorBlueLighterChannel, colorPrimary, colorDanger, colorDangerDark, diff --git a/bigbluebutton-html5/package-lock.json b/bigbluebutton-html5/package-lock.json index 90ab5ebba4..bb8d56974a 100644 --- a/bigbluebutton-html5/package-lock.json +++ b/bigbluebutton-html5/package-lock.json @@ -20,6 +20,7 @@ "@emotion/styled": "^11.10.8", "@jitsi/sdp-interop": "0.1.14", "@mconf/bbb-diff": "^1.2.0", + "@mui/base": "^5.0.0-beta.58", "@mui/material": "^5.12.2", "@mui/system": "^5.12.3", "@types/node": "^20.5.7", @@ -28,7 +29,7 @@ "autoprefixer": "^10.4.4", "axios": "^1.7.4", "babel-runtime": "~6.26.0", - "bigbluebutton-html-plugin-sdk": "0.0.59", + "bigbluebutton-html-plugin-sdk": "0.0.66", "bowser": "^2.11.0", "browser-bunyan": "^1.8.0", "classnames": "^2.2.6", @@ -118,7 +119,7 @@ "husky": "^1.3.1", "lint-staged": "11.2.0", "mini-css-extract-plugin": "^2.9.0", - "postcss": "^8.4.45", + "postcss": "^8.4.47", "postcss-loader": "^8.1.1", "prettier": "3.3.3", "react": "18.3.1", @@ -2980,6 +2981,68 @@ "diff": "^5.0.0" } }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.58", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.58.tgz", + "integrity": "sha512-P0E7ZrxOuyYqBvVv9w8k7wm+Xzx/KRu+BGgFcR2htTsGCpJNQJCSUXNUZ50MUmSU9hzqhwbQWNXhV1MBTl6F7A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.0", + "@floating-ui/react-dom": "^2.1.1", + "@mui/types": "^7.2.15", + "@mui/utils": "6.0.0-rc.0", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/base/node_modules/@mui/utils": { + "version": "6.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.0.0-rc.0.tgz", + "integrity": "sha512-tBp0ILEXDL0bbDDT8PnZOjCqSm5Dfk2N0Z45uzRw+wVl6fVvloC9zw8avl+OdX1Bg3ubs/ttKn8nRNv17bpM5A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.0", + "@mui/types": "^7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@mui/core-downloads-tracker": { "version": "5.16.7", "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz", @@ -6377,9 +6440,9 @@ } }, "node_modules/bigbluebutton-html-plugin-sdk": { - "version": "0.0.59", - "resolved": "https://registry.npmjs.org/bigbluebutton-html-plugin-sdk/-/bigbluebutton-html-plugin-sdk-0.0.59.tgz", - "integrity": "sha512-HYmV9vkbC8M3CcKizCJMzgYaEA9w3fbRbuGtqDhHFQ0hFrsGP/Cd86gT+toFXKNoG1KatYwhZdMXk4eXNMjywg==", + "version": "0.0.66", + "resolved": "https://registry.npmjs.org/bigbluebutton-html-plugin-sdk/-/bigbluebutton-html-plugin-sdk-0.0.66.tgz", + "integrity": "sha512-cjwq4N5EKB177bB910Jw6+QP/NN5bdZXxV16rNfpz3B28/NTMQ5of2x62TA7LEdJcM3KZNxFE5Caxhx9cpibmQ==", "license": "LGPL-3.0", "dependencies": { "@apollo/client": "^3.8.7", @@ -7107,9 +7170,9 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, "license": "MIT", "engines": { @@ -9264,9 +9327,9 @@ "license": "BSD-3-Clause" }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9275,7 +9338,7 @@ "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -13640,8 +13703,7 @@ "node_modules/picocolors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "license": "ISC" + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -13777,9 +13839,9 @@ } }, "node_modules/postcss": { - "version": "8.4.45", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", - "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "funding": [ { "type": "opencollective", @@ -13797,8 +13859,8 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -15973,10 +16035,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "license": "BSD-3-Clause", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } diff --git a/bigbluebutton-html5/package.json b/bigbluebutton-html5/package.json index c067df2c9d..b5aa538f82 100644 --- a/bigbluebutton-html5/package.json +++ b/bigbluebutton-html5/package.json @@ -49,6 +49,7 @@ "@emotion/styled": "^11.10.8", "@jitsi/sdp-interop": "0.1.14", "@mconf/bbb-diff": "^1.2.0", + "@mui/base": "^5.0.0-beta.58", "@mui/material": "^5.12.2", "@mui/system": "^5.12.3", "@types/node": "^20.5.7", @@ -57,7 +58,7 @@ "autoprefixer": "^10.4.4", "axios": "^1.7.4", "babel-runtime": "~6.26.0", - "bigbluebutton-html-plugin-sdk": "0.0.59", + "bigbluebutton-html-plugin-sdk": "0.0.66", "bowser": "^2.11.0", "browser-bunyan": "^1.8.0", "classnames": "^2.2.6", @@ -147,7 +148,7 @@ "husky": "^1.3.1", "lint-staged": "11.2.0", "mini-css-extract-plugin": "^2.9.0", - "postcss": "^8.4.45", + "postcss": "^8.4.47", "postcss-loader": "^8.1.1", "prettier": "3.3.3", "react": "18.3.1", diff --git a/bigbluebutton-html5/private/config/settings.yml b/bigbluebutton-html5/private/config/settings.yml index 484d6365d9..78a004bd57 100755 --- a/bigbluebutton-html5/private/config/settings.yml +++ b/bigbluebutton-html5/private/config/settings.yml @@ -105,7 +105,7 @@ public: - en-US - es-ES - fr-FR - # - hi-ID + # - hi-IN # - it-IT # - ja-JP - pt-BR @@ -768,6 +768,9 @@ public: # e.g.: disableEmojis: ['grin','laughing'] disableEmojis: [] allowedElements: ['a', 'code', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'li', 'ol', 'ul', 'p', 'strong'] + # available options for toolbar: reply, edit, delete, reactions + # example: ['reply', 'delete'] + toolbar: [] userReaction: enabled: true expire: 30 diff --git a/bigbluebutton-html5/public/locales/el_GR.json b/bigbluebutton-html5/public/locales/el_GR.json index 483b1b8fb5..217feeabf7 100644 --- a/bigbluebutton-html5/public/locales/el_GR.json +++ b/bigbluebutton-html5/public/locales/el_GR.json @@ -5,6 +5,7 @@ "app.chat.errorMaxMessageLength": "Πολύ μεγάλο μήνυμα, ξεπερνά το μέγιστο όριο των {0} χαρακτήρων", "app.chat.errorMinMessageLength": "Ελάχιστος αριθμός χαρακτήρων μηνύματος {0}", "app.chat.errorOnSendMessage": "Σφάλμα κατά την αποστολή μηνύματος συνομιλίας", + "app.chat.errorOnUpdateMessage": "Σφάλμα ενημέρωσης μηνυμάτων συνομιλίας", "app.chat.disconnected": "Έχετε αποσυνδεθεί, δεν μπορείτε να στείλετε μηνύματα.", "app.chat.locked": "Η συνομιλία είναι κλειδωμένη, απενεργοποιήθηκαν τα μηνύματα.", "app.chat.inputLabel": "Εισαγωγή μηνύματος συνομιλίας {0}", @@ -29,7 +30,7 @@ "app.chat.breakoutDurationUpdatedModerator": "Ο χρόνος των τμημάτων της αίθουσας είναι {0} λεπτά. Έχει σταλθεί ειδοποίηση.", "app.chat.emptyLogLabel": "Το αρχείο καταγραφής συνομιλίας είναι κενό", "app.chat.away": "Είναι απών", - "app.chat.notAway": "Είναι παρών", + "app.chat.notAway": "είναι ενεργό ξανά", "app.chat.clearPublicChatMessage": "Το ιστορικό δημόσιας συνομιλίας έχει διαγραφεί από τον συντονιστή.", "app.chat.multi.typing": "Πολλοί χρήστες πληκτρολογούν", "app.chat.someone.typing": "Κάποιος πληκτρολογεί", @@ -39,6 +40,21 @@ "app.chat.copyErr": "Η αντιγραφή του αρχείου καταγραφής της συνομιλίας απέτυχε", "app.chat.messageRead": "Το μήνυμα διαβάστηκε από τον αποδέκτη", "app.chat.closePopup": "Κλείσιμο", + "app.chat.editTime": "Τελευταία επεξεργασία στις {0}", + "app.chat.deleteMessage": "Το μήνυμα διαγράφηκε από τον {0}", + "app.chat.toolbar.reply": "Απάντηση στο μήνυμα {0}", + "app.chat.toolbar.edit": "Επεξεργασία", + "app.chat.toolbar.delete": "Διαγραφή", + "app.chat.toolbar.reactions.reactedByLabel": "Αντίδραση από ", + "app.chat.toolbar.reactions.youLabel": "εσάς", + "app.chat.toolbar.reactions.andLabel": "και", + "app.chat.toolbar.reactions.findReactionButtonLabel": "Βρείτε μια αντίδραση", + "app.chat.toolbar.edit.editing": "Επεξεργασία μηνύματος", + "app.chat.toolbar.edit.cancel": "Πιέστε {0} για ακύρωση.", + "app.chat.toolbar.edit.edited": "Έχει επεξεργαστεί. ", + "app.chat.toolbar.delete.cancelLabel": "Ακύρωση", + "app.chat.toolbar.delete.confirmationTitle": "Είστε σιγουρος/η; ", + "app.chat.toolbar.delete.confirmationDescription": "Αυτή η ενέργεια είναι μόνιμη, δε θα μπορείτε να έχετε πρόσβαση στο μήνυμα ξανά. ", "app.timer.toolTipTimerStopped": "Ο χρόνος σταμάτησε.", "app.timer.toolTipTimerRunning": "Ο χρόνος λειτουργεί.", "app.timer.toolTipStopwatchStopped": "Το χρονόμετρο σταμάτησε.", @@ -680,8 +696,8 @@ "app.actionsBar.reactions.raiseHand": "Σηκώστε το χέρι σας", "app.actionsBar.reactions.lowHand": "Κατεβάστε το χέρι σας", "app.actionsBar.reactions.autoCloseReactionsBarLabel": "Αυτόματο κλείσιμο της γραμμής αντιδράσεων", - "app.actionsBar.reactions.setAway": "Ορισμός ως απών/ούσα", - "app.actionsBar.reactions.setActive": "Ορισμός ως ενεργός/ή", + "app.actionsBar.reactions.away": "Μη διαθέσιμος", + "app.actionsBar.reactions.active": "Ενεργός", "app.actionsBar.currentStatusDesc": "τρέχουσα κατάσταση {0}", "app.actionsBar.captions.start": "Έναρξη προβολής ενδογλωσσικών υποτίτλων", "app.actionsBar.captions.stop": "Κλείσιμο προβολής ενδογλωσσικών υποτίτλων", @@ -806,16 +822,75 @@ "app.audio.captions.speech.disabled": "Απενεργοποιημένο", "app.audio.captions.speech.unsupported": "Ο φυλλομετρητής σας δεν υποστηρίζει αναγνώριση φωνής. Ο ήχος σας δε θα μεταφερθεί.", "app.audio.captions.speech.auto": "Αυτόματος εντοπισμός", - "app.audio.captions.select.de-DE": "Γερμανικά", - "app.audio.captions.select.en-US": "Αγγλικά", - "app.audio.captions.select.es-ES": "Ισπανικά", + "app.audio.captions.select.af-ZA": "Afrikaans", + "app.audio.captions.select.sq-AL": "Albanian", + "app.audio.captions.select.am-ET": "Amharic", + "app.audio.captions.select.ar": "Arabic", + "app.audio.captions.select.hy-AM": "Armenian", + "app.audio.captions.select.az-AZ": "Azerbaijani", + "app.audio.captions.select.eu-ES": "Basque", + "app.audio.captions.select.bn": "Bengali", + "app.audio.captions.select.bs-BA": "Bosnian", + "app.audio.captions.select.bg-BG": "Bulgarian", + "app.audio.captions.select.ca-ES": "Catalan", + "app.audio.captions.select.zh-CN": "Chinese (simplified)", + "app.audio.captions.select.zh-TW": "Chinese (traditional)", + "app.audio.captions.select.hr-HR": "Croatian", + "app.audio.captions.select.cs-CZ": "Czech", + "app.audio.captions.select.da-DK": "Danish", + "app.audio.captions.select.nl-NL": "Dutch", + "app.audio.captions.select.en-US": "English (USA)", + "app.audio.captions.select.en-GB": "English (GB)", + "app.audio.captions.select.et-EE": "Estonian", + "app.audio.captions.select.fi-FI": "Finnish", "app.audio.captions.select.fr-FR": "Γαλλικά", - "app.audio.captions.select.hi-ID": "Χίντι", + "app.audio.captions.select.gl-ES": "Galician", + "app.audio.captions.select.de-DE": "Γερμανικά", + "app.audio.captions.select.el-GR": "Ελληνικά", + "app.audio.captions.select.gu-IN": "Gujarati", + "app.audio.captions.select.hi-IN": "Hindi", + "app.audio.captions.select.hu-HU": "Hungarian", + "app.audio.captions.select.is-IS": "Icelandic", + "app.audio.captions.select.id-ID": "Indonesian", "app.audio.captions.select.it-IT": "Ιταλικά", "app.audio.captions.select.ja-JP": "Ιαπωνικά", - "app.audio.captions.select.pt-BR": "Πορτογαλικά", + "app.audio.captions.select.jv-ID": "Javanese", + "app.audio.captions.select.kn-IN": "Kannada", + "app.audio.captions.select.kk-KZ": "Kazakh", + "app.audio.captions.select.km-KH": "Khmer", + "app.audio.captions.select.ko-KR": "Korean", + "app.audio.captions.select.lo-LA": "Lao", + "app.audio.captions.select.lv-LV": "Latvian", + "app.audio.captions.select.lt-LT": "Lithuanian", + "app.audio.captions.select.mk-MK": "Macedonian", + "app.audio.captions.select.ms-MY": "Malay", + "app.audio.captions.select.ml-IN": "Malayalam", + "app.audio.captions.select.mr-IN": "Marathi", + "app.audio.captions.select.mn-MN": "Mongolian", + "app.audio.captions.select.ne-NP": "Nepali", + "app.audio.captions.select.no-NO": "Norwegian", + "app.audio.captions.select.fa-IR": "Persian", + "app.audio.captions.select.pl-PL": "Polish", + "app.audio.captions.select.ro-RO": "Romanian", + "app.audio.captions.select.pt-PT": "Portuguese (Portugal)", + "app.audio.captions.select.pt-BR": "Portuguese (Brazil)", "app.audio.captions.select.ru-RU": "Ρωσικά", - "app.audio.captions.select.zh-CN": "Κινεζικά", + "app.audio.captions.select.sr-RS": "Serbian", + "app.audio.captions.select.si-LK": "Sinhala", + "app.audio.captions.select.sk-SK": "Slovak", + "app.audio.captions.select.sl-SI": "Slovenian", + "app.audio.captions.select.es-ES": "Ισπανικά", + "app.audio.captions.select.su-ID": "Sundanese", + "app.audio.captions.select.sw": "Swahili", + "app.audio.captions.select.sv-SE": "Swedish", + "app.audio.captions.select.ta": "Tamil", + "app.audio.captions.select.te-IN": "Telugu", + "app.audio.captions.select.th-TH": "Thai", + "app.audio.captions.select.tr-TR": "Turkish", + "app.audio.captions.select.uk-UA": "Ukrainian", + "app.audio.captions.select.ur": "Urdu", + "app.audio.captions.select.uz-UZ": "Uzbek", + "app.audio.captions.select.vi-VN": "Vietnamese", "app.error.removed": "Έχετε αφαιρεθεί από τη διάσκεψη.", "app.error.meeting.ended": "Έχετε αποσυνδεθεί από τη διάσκεψη.", "app.meeting.logout.duplicateUserEjectReason": "Χρήστης με ίδιο όνομα προσπαθεί να συνδεθεί στην τηλεδιάσκεψη.", @@ -858,6 +933,14 @@ "app.error.fallback.presentation.title": "Παρουσιάστηκε σφάλμα", "app.error.fallback.presentation.description": "Καταγράφτηκε. Παρακαλούμε δοκιμάστε να ανανεώσετε τη σελίδα.", "app.error.fallback.presentation.reloadButton": "Επαναφόρτωση", + "app.error.userNotFound": "Ο χρήστης δεν βρέθηκε", + "app.error.requestTimeout": "Σφάλμα χρονικού ορίου.", + "app.error.meetingNotFound": "Η τηλεμετρία δεν βρέθηκε.", + "app.error.sessionTokenReplaced": "Ο χρήστης συνδέθηκε με νέο αναγνωριστικό.", + "app.error.serverInternalError": "Εσωτερικό σφάλμα διακομιστή.", + "app.error.paramMissing": "Απουσία παραμέτρου στην αρχική σύνδεση.", + "app.error.tooManyConnections": "Πάρα πολλές συνδέσεις.", + "app.error.serverClosed": "Ο διακομιστής τερμάτισε τη σύνδεση.", "app.guest.errorSeeConsole": "Σφάλμα: δείτε περισσότερες πληροφορίες στην κονσόλα.", "app.guest.noModeratorResponse": "Καμία απάντηση από συντονιστή.", "app.guest.noSessionToken": "Δεν έχει ληφθεί το αναγνωριστικό συνεδρίας.", @@ -1367,6 +1450,10 @@ "app.learningDashboard.shareButton": "Διαμοιρασμός με άλλους", "app.learningDashboard.shareLinkCopied": "Ο σύνδεσμος αντιγράφηκε επιτυχών!", "app.learningDashboard.user": "Χρήστης", + "app.learningDashboard.learnMore": "Μάθετε περισσότερα για τη χρήση του Πίνακα Ελέγχου στο {0} της Γνωσιακής Βάσης μας.", + "app.learningDashboard.learnMoreLinkText": "αυτό το άρθρο", + "app.learningDashboard.feedback": "Πως ήταν η εμπειρία σας με αυτή τη δυνατότητα; θα θέλαμε να ακούσουμε την άποψή σας και τις προτάσεις για τη βελτίωση της. Μοιραστείτε την άποψή σας μαζί μας κάνοντας κλικ {0}.", + "app.learningDashboard.feedbackLinkText": "εδώ", "app.learningDashboard.indicators.meetingStatusEnded": "Τερματίστηκε", "app.learningDashboard.indicators.meetingStatusActive": "Ενεργό", "app.learningDashboard.indicators.usersOnline": "Ενεργοί χρήστες", diff --git a/bigbluebutton-html5/public/locales/en.json b/bigbluebutton-html5/public/locales/en.json index 26c2afb4dd..cdfd03e8db 100755 --- a/bigbluebutton-html5/public/locales/en.json +++ b/bigbluebutton-html5/public/locales/en.json @@ -5,6 +5,7 @@ "app.chat.errorMaxMessageLength": "The message is too long, exceeded the maximum of {0} characters", "app.chat.errorMinMessageLength": "The message did not reach the minimum of {0} characters", "app.chat.errorOnSendMessage": "Error on sending chat message", + "app.chat.errorOnUpdateMessage": "Error on update chat message", "app.chat.disconnected": "You are disconnected, messages can't be sent", "app.chat.locked": "Chat is locked, messages can't be sent", "app.chat.inputLabel": "Message input for chat {0}", @@ -29,7 +30,7 @@ "app.chat.breakoutDurationUpdatedModerator": "Breakout rooms time is now {0} minutes, and a notification has been sent.", "app.chat.emptyLogLabel": "Chat log empty", "app.chat.away": "is away", - "app.chat.notAway": "is back", + "app.chat.notAway": "is back online", "app.chat.clearPublicChatMessage": "The public chat history was cleared by a moderator", "app.chat.multi.typing": "Multiple users are typing", "app.chat.someone.typing": "Someone is typing", @@ -39,6 +40,21 @@ "app.chat.copyErr": "Copy chat transcript failed", "app.chat.messageRead": "Message read by the recipient", "app.chat.closePopup": "Close", + "app.chat.editTime": "Last edited at {0}", + "app.chat.deleteMessage": "This message was deleted by {0}", + "app.chat.toolbar.reply": "Reply to message {0}", + "app.chat.toolbar.edit": "Edit", + "app.chat.toolbar.delete": "Delete", + "app.chat.toolbar.reactions.reactedByLabel": "Reacted by", + "app.chat.toolbar.reactions.youLabel": "you", + "app.chat.toolbar.reactions.andLabel": "and", + "app.chat.toolbar.reactions.findReactionButtonLabel": "Find a reaction", + "app.chat.toolbar.edit.editing": "Editing message", + "app.chat.toolbar.edit.cancel": "Press {0} to cancel.", + "app.chat.toolbar.edit.edited": "Edited", + "app.chat.toolbar.delete.cancelLabel": "Cancel", + "app.chat.toolbar.delete.confirmationTitle": "Are you sure?", + "app.chat.toolbar.delete.confirmationDescription": "This action is permanent, you will not be able to access this message again.", "app.timer.toolTipTimerStopped": "The timer has stopped.", "app.timer.toolTipTimerRunning": "The timer is running.", "app.timer.toolTipStopwatchStopped": "The stopwatch has stopped.", @@ -237,7 +253,7 @@ "app.meeting.endedFromAPI": "The session was terminated by the system", "app.meeting.endedWhenNoUserJoined": "The session was ended because no users joined", "app.meeting.endedWhenLastUserLeft": "The session was ended when the last user left", - "app.meeting.endedAfterExceedingDuration": "session was ended due to exceeding the maximum duration", + "app.meeting.endedAfterExceedingDuration": "The session was ended due to exceeding the maximum duration", "app.meeting.breakoutEndedAfterExceedingDuration": "Breakout was ended due to exceeding the maximum duration", "app.meeting.breakoutEndedByModerator": "Breakout was terminated by Moderator", "app.meeting.endedDueNoAuthed": "the session was ended because no authed user in the room", @@ -680,8 +696,8 @@ "app.actionsBar.reactions.raiseHand": "Raise your hand", "app.actionsBar.reactions.lowHand": "Lower your hand", "app.actionsBar.reactions.autoCloseReactionsBarLabel": "Auto close the reactions bar", - "app.actionsBar.reactions.setAway": "Set away", - "app.actionsBar.reactions.setActive": "Set active", + "app.actionsBar.reactions.away": "Away", + "app.actionsBar.reactions.active": "Active", "app.actionsBar.currentStatusDesc": "current status {0}", "app.actionsBar.captions.start": "Start viewing closed captions", "app.actionsBar.captions.stop": "Stop viewing closed captions", @@ -806,16 +822,75 @@ "app.audio.captions.speech.disabled": "Disabled", "app.audio.captions.speech.unsupported": "Your browser doesn't support speech recognition. Your audio won't be transcribed", "app.audio.captions.speech.auto": "Auto Detect", - "app.audio.captions.select.de-DE": "German", - "app.audio.captions.select.en-US": "English", - "app.audio.captions.select.es-ES": "Spanish", + "app.audio.captions.select.af-ZA": "Afrikaans", + "app.audio.captions.select.sq-AL": "Albanian", + "app.audio.captions.select.am-ET": "Amharic", + "app.audio.captions.select.ar": "Arabic", + "app.audio.captions.select.hy-AM": "Armenian", + "app.audio.captions.select.az-AZ": "Azerbaijani", + "app.audio.captions.select.eu-ES": "Basque", + "app.audio.captions.select.bn": "Bengali", + "app.audio.captions.select.bs-BA": "Bosnian", + "app.audio.captions.select.bg-BG": "Bulgarian", + "app.audio.captions.select.ca-ES": "Catalan", + "app.audio.captions.select.zh-CN": "Chinese (simplified)", + "app.audio.captions.select.zh-TW": "Chinese (traditional)", + "app.audio.captions.select.hr-HR": "Croatian", + "app.audio.captions.select.cs-CZ": "Czech", + "app.audio.captions.select.da-DK": "Danish", + "app.audio.captions.select.nl-NL": "Dutch", + "app.audio.captions.select.en-US": "English (USA)", + "app.audio.captions.select.en-GB": "English (GB)", + "app.audio.captions.select.et-EE": "Estonian", + "app.audio.captions.select.fi-FI": "Finnish", "app.audio.captions.select.fr-FR": "French", - "app.audio.captions.select.hi-ID": "Hindi", + "app.audio.captions.select.gl-ES": "Galician", + "app.audio.captions.select.de-DE": "German", + "app.audio.captions.select.el-GR": "Greek", + "app.audio.captions.select.gu-IN": "Gujarati", + "app.audio.captions.select.hi-IN": "Hindi", + "app.audio.captions.select.hu-HU": "Hungarian", + "app.audio.captions.select.is-IS": "Icelandic", + "app.audio.captions.select.id-ID": "Indonesian", "app.audio.captions.select.it-IT": "Italian", "app.audio.captions.select.ja-JP": "Japanese", - "app.audio.captions.select.pt-BR": "Portuguese", + "app.audio.captions.select.jv-ID": "Javanese", + "app.audio.captions.select.kn-IN": "Kannada", + "app.audio.captions.select.kk-KZ": "Kazakh", + "app.audio.captions.select.km-KH": "Khmer", + "app.audio.captions.select.ko-KR": "Korean", + "app.audio.captions.select.lo-LA": "Lao", + "app.audio.captions.select.lv-LV": "Latvian", + "app.audio.captions.select.lt-LT": "Lithuanian", + "app.audio.captions.select.mk-MK": "Macedonian", + "app.audio.captions.select.ms-MY": "Malay", + "app.audio.captions.select.ml-IN": "Malayalam", + "app.audio.captions.select.mr-IN": "Marathi", + "app.audio.captions.select.mn-MN": "Mongolian", + "app.audio.captions.select.ne-NP": "Nepali", + "app.audio.captions.select.no-NO": "Norwegian", + "app.audio.captions.select.fa-IR": "Persian", + "app.audio.captions.select.pl-PL": "Polish", + "app.audio.captions.select.ro-RO": "Romanian", + "app.audio.captions.select.pt-PT": "Portuguese (Portugal)", + "app.audio.captions.select.pt-BR": "Portuguese (Brazil)", "app.audio.captions.select.ru-RU": "Russian", - "app.audio.captions.select.zh-CN": "Chinese", + "app.audio.captions.select.sr-RS": "Serbian", + "app.audio.captions.select.si-LK": "Sinhala", + "app.audio.captions.select.sk-SK": "Slovak", + "app.audio.captions.select.sl-SI": "Slovenian", + "app.audio.captions.select.es-ES": "Spanish", + "app.audio.captions.select.su-ID": "Sundanese", + "app.audio.captions.select.sw": "Swahili", + "app.audio.captions.select.sv-SE": "Swedish", + "app.audio.captions.select.ta": "Tamil", + "app.audio.captions.select.te-IN": "Telugu", + "app.audio.captions.select.th-TH": "Thai", + "app.audio.captions.select.tr-TR": "Turkish", + "app.audio.captions.select.uk-UA": "Ukrainian", + "app.audio.captions.select.ur": "Urdu", + "app.audio.captions.select.uz-UZ": "Uzbek", + "app.audio.captions.select.vi-VN": "Vietnamese", "app.error.removed": "You have been removed from the conference", "app.error.meeting.ended": "You have logged out of the conference", "app.meeting.logout.duplicateUserEjectReason": "Duplicate user trying to join session", @@ -858,6 +933,14 @@ "app.error.fallback.presentation.title": "An error occurred", "app.error.fallback.presentation.description": "It has been logged. Please try reloading the page.", "app.error.fallback.presentation.reloadButton": "Reload", + "app.error.userNotFound": "User not found.", + "app.error.requestTimeout": "Request Timeout error.", + "app.error.meetingNotFound": "Meeting not found.", + "app.error.sessionTokenReplaced": "User connected with a new session token.", + "app.error.serverInternalError": "Server internal error.", + "app.error.paramMissing": "Param missing on initial connection.", + "app.error.tooManyConnections": "Too many connections.", + "app.error.serverClosed": "Server closed the connection.", "app.guest.errorSeeConsole": "Error: more details in the console.", "app.guest.noModeratorResponse": "No response from Moderator.", "app.guest.noSessionToken": "No session Token received.", @@ -1367,6 +1450,10 @@ "app.learningDashboard.shareButton": "Share with others", "app.learningDashboard.shareLinkCopied": "Link successfully copied!", "app.learningDashboard.user": "User", + "app.learningDashboard.learnMore": "Learn more about the use of the Dashboard in {0} from our Knowledge Base.", + "app.learningDashboard.learnMoreLinkText": "this article", + "app.learningDashboard.feedback": "How has your experience been with this feature? We would love to hear your opinion and even suggestions on how we can improve it. Share with us by clicking {0}.", + "app.learningDashboard.feedbackLinkText": "here", "app.learningDashboard.indicators.meetingStatusEnded": "Ended", "app.learningDashboard.indicators.meetingStatusActive": "Active", "app.learningDashboard.indicators.usersOnline": "Active Users", diff --git a/bigbluebutton-html5/public/locales/fa_IR.json b/bigbluebutton-html5/public/locales/fa_IR.json index ba70ce4fd6..d390b1de27 100644 --- a/bigbluebutton-html5/public/locales/fa_IR.json +++ b/bigbluebutton-html5/public/locales/fa_IR.json @@ -5,6 +5,7 @@ "app.chat.errorMaxMessageLength": "پیام خیلی طولانی است، از حداکثر {0} نویسه بیش‌تر است", "app.chat.errorMinMessageLength": "پیام به حداقل {0} نویسه نرسید", "app.chat.errorOnSendMessage": "خطا در ارسال پیام گفتگو", + "app.chat.errorOnUpdateMessage": "خطا در به‌روز رسانی پیام گفتگو", "app.chat.disconnected": "ارتباط شما قطع شده است، امکان ارسال پیام وجود ندارد", "app.chat.locked": "گپ قفل شده است، امکان ارسال هیچ پیامی وجود ندارد", "app.chat.inputLabel": "ورودی پیام برای گپ {0}", @@ -29,7 +30,7 @@ "app.chat.breakoutDurationUpdatedModerator": "زمان اتاق‌های جانبی اکنون {0} دقیقه است و آگاه‌سازی ارسال شده است.", "app.chat.emptyLogLabel": "سابقهٔ گپ خالی است", "app.chat.away": "حضور ندارد", - "app.chat.notAway": "دوباره حاضر شد", + "app.chat.notAway": "دوباره برخط شد", "app.chat.clearPublicChatMessage": "سابقهٔ گپ عمومی توسط مدیر حذف گردید", "app.chat.multi.typing": "چند کاربر درحال نوشتن هستند", "app.chat.someone.typing": "شخصی درحال نوشتن است", @@ -39,6 +40,21 @@ "app.chat.copyErr": "رونوشت از ترانوشت گپ با خطا مواجه شد", "app.chat.messageRead": "پیام توسط گیرنده خوانده شده", "app.chat.closePopup": "بستن", + "app.chat.editTime": "آخرین ویرایش در {0}", + "app.chat.deleteMessage": "این پیام توسط {0} حذف شد", + "app.chat.toolbar.reply": "پاسخ به پیام {0}", + "app.chat.toolbar.edit": "ویرایش", + "app.chat.toolbar.delete": "حذف", + "app.chat.toolbar.reactions.reactedByLabel": "واکنش نشان داده توسط", + "app.chat.toolbar.reactions.youLabel": "شما", + "app.chat.toolbar.reactions.andLabel": "و", + "app.chat.toolbar.reactions.findReactionButtonLabel": "یک واکنش پیدا کنید", + "app.chat.toolbar.edit.editing": "در حال ویرایش پیام", + "app.chat.toolbar.edit.cancel": "برای لغو، {0} را فشار دهید.", + "app.chat.toolbar.edit.edited": "ویرایش‌شده", + "app.chat.toolbar.delete.cancelLabel": "لغو", + "app.chat.toolbar.delete.confirmationTitle": "آیا مطمئنید؟", + "app.chat.toolbar.delete.confirmationDescription": "این عمل دائمی است، دیگر نخواهید توانست به این پیام دسترسی پیدا کنید.", "app.timer.toolTipTimerStopped": "شمارش معکوس متوقف شده است", "app.timer.toolTipTimerRunning": "شمارش معکوس درحال اجراست.", "app.timer.toolTipStopwatchStopped": "زمان‌سنج متوقف شده است", @@ -237,7 +253,7 @@ "app.meeting.endedFromAPI": "جلسه توسط سیستم خاتمه یافت", "app.meeting.endedWhenNoUserJoined": "جلسه به دلیل عدم پیوستن هیچ کاربری به پایان رسید", "app.meeting.endedWhenLastUserLeft": "جلسه با خروج آخرین کاربر پایان یافت", - "app.meeting.endedAfterExceedingDuration": "جلسه به دلیل فراتر رفتن از حداکثر مدت زمان، پایان یافت", + "app.meeting.endedAfterExceedingDuration": "جلسه به دلیل فراتر رفتن از حداکثر مدت زمان، پایان یافت.", "app.meeting.breakoutEndedAfterExceedingDuration": "زمان استراحت به دلیل فراتر رفتن از حداکثر مدت زمان، پایان یافت", "app.meeting.breakoutEndedByModerator": "اتاق جانبی توسط مدیر خاتمه یافت", "app.meeting.endedDueNoAuthed": "جلسه به دلیل عدم حضور کاربر تأیید شده در اتاق به پایان رسید", @@ -680,8 +696,8 @@ "app.actionsBar.reactions.raiseHand": "دست خود را بالا ببرید", "app.actionsBar.reactions.lowHand": "دست خود را پایین بیاورید", "app.actionsBar.reactions.autoCloseReactionsBarLabel": "نوار واکنش‌ها را به‌صورت خودکار ببند", - "app.actionsBar.reactions.setAway": "تنظیم به وضعیت عدم در دسترس", - "app.actionsBar.reactions.setActive": "تنظیم به وضعیت فعال", + "app.actionsBar.reactions.away": "عدم حضور", + "app.actionsBar.reactions.active": "فعال", "app.actionsBar.currentStatusDesc": "وضعیت کنونی {0}", "app.actionsBar.captions.start": "شروع مشاهدهٔ زیرنویس‌ها", "app.actionsBar.captions.stop": "توقف مشاهدهٔ زیرنویس‌ها", @@ -806,16 +822,75 @@ "app.audio.captions.speech.disabled": "غیرفعال شده", "app.audio.captions.speech.unsupported": "مرورگر شما از تشخیص گفتار پشتیبانی نمی‌کند. صدای شما آوانویسی نخواهد شد", "app.audio.captions.speech.auto": "تشخیص خودکار", - "app.audio.captions.select.de-DE": "آلمانی", - "app.audio.captions.select.en-US": "انگلیسی", - "app.audio.captions.select.es-ES": "اسپانیایی", + "app.audio.captions.select.af-ZA": "آفریقایی", + "app.audio.captions.select.sq-AL": "آلبانیایی", + "app.audio.captions.select.am-ET": "آمهری", + "app.audio.captions.select.ar": "عربی", + "app.audio.captions.select.hy-AM": "ارمنی", + "app.audio.captions.select.az-AZ": "آذربایجانی", + "app.audio.captions.select.eu-ES": "باسکی", + "app.audio.captions.select.bn": "بنگالی", + "app.audio.captions.select.bs-BA": "بوسنیایی", + "app.audio.captions.select.bg-BG": "بلغاری", + "app.audio.captions.select.ca-ES": "کاتالان", + "app.audio.captions.select.zh-CN": "چینی (ساده شده)", + "app.audio.captions.select.zh-TW": "چینی (سنتی)", + "app.audio.captions.select.hr-HR": "کرواتی", + "app.audio.captions.select.cs-CZ": "چکی", + "app.audio.captions.select.da-DK": "دانمارکی", + "app.audio.captions.select.nl-NL": "هلندی", + "app.audio.captions.select.en-US": "انگلیسی (ایالات متحده آمریکا)", + "app.audio.captions.select.en-GB": "انگلیسی (GB)", + "app.audio.captions.select.et-EE": "استونیایی", + "app.audio.captions.select.fi-FI": "فنلاندی", "app.audio.captions.select.fr-FR": "فرانسوی", - "app.audio.captions.select.hi-ID": "هندی", + "app.audio.captions.select.gl-ES": "گالیسیایی", + "app.audio.captions.select.de-DE": "آلمانی", + "app.audio.captions.select.el-GR": "یونانی", + "app.audio.captions.select.gu-IN": "گجراتی", + "app.audio.captions.select.hi-IN": "هندی", + "app.audio.captions.select.hu-HU": "مجارستانی", + "app.audio.captions.select.is-IS": "ایسلندی", + "app.audio.captions.select.id-ID": "اندونزیایی", "app.audio.captions.select.it-IT": "ایتالیایی", "app.audio.captions.select.ja-JP": "ژاپنی", - "app.audio.captions.select.pt-BR": "پرتغالی", + "app.audio.captions.select.jv-ID": "جاوه‌ای", + "app.audio.captions.select.kn-IN": "کانادا", + "app.audio.captions.select.kk-KZ": "قزاقستانی", + "app.audio.captions.select.km-KH": "خمر", + "app.audio.captions.select.ko-KR": "کره‌ای", + "app.audio.captions.select.lo-LA": "لائوس", + "app.audio.captions.select.lv-LV": "لتونی", + "app.audio.captions.select.lt-LT": "لیتوانیایی", + "app.audio.captions.select.mk-MK": "مقدونی", + "app.audio.captions.select.ms-MY": "مالایی", + "app.audio.captions.select.ml-IN": "مالایایی", + "app.audio.captions.select.mr-IN": "مراتی", + "app.audio.captions.select.mn-MN": "مغولی", + "app.audio.captions.select.ne-NP": "نپالی", + "app.audio.captions.select.no-NO": "نروژی", + "app.audio.captions.select.fa-IR": "فارسی", + "app.audio.captions.select.pl-PL": "لهستانی", + "app.audio.captions.select.ro-RO": "رومانیایی", + "app.audio.captions.select.pt-PT": "پرتغالی (پرتغال)", + "app.audio.captions.select.pt-BR": "پرتغالی (برزیل)", "app.audio.captions.select.ru-RU": "روسی", - "app.audio.captions.select.zh-CN": "چینی", + "app.audio.captions.select.sr-RS": "صربی", + "app.audio.captions.select.si-LK": "سینهالی", + "app.audio.captions.select.sk-SK": "اسلواکی", + "app.audio.captions.select.sl-SI": "اسلوونیایی", + "app.audio.captions.select.es-ES": "اسپانیایی", + "app.audio.captions.select.su-ID": "ساندانی", + "app.audio.captions.select.sw": "سواحیلی", + "app.audio.captions.select.sv-SE": "سوئدی", + "app.audio.captions.select.ta": "تامیل", + "app.audio.captions.select.te-IN": "تلوگو", + "app.audio.captions.select.th-TH": "تایلندی", + "app.audio.captions.select.tr-TR": "ترکی", + "app.audio.captions.select.uk-UA": "اوکراینی", + "app.audio.captions.select.ur": "اردو", + "app.audio.captions.select.uz-UZ": "ازبک", + "app.audio.captions.select.vi-VN": "ویتنامی", "app.error.removed": "شما از جلسه حذف شده‌اید", "app.error.meeting.ended": "شما از جلسه خارج شده‌اید", "app.meeting.logout.duplicateUserEjectReason": "کاربر تکراری در حال تلاش برای پیوستن به جلسه", @@ -858,6 +933,14 @@ "app.error.fallback.presentation.title": "خطایی رخ داد", "app.error.fallback.presentation.description": "این مورد ثبت شد. لطفا صفحه را دوباره بارگیری کنید.", "app.error.fallback.presentation.reloadButton": "بارگیری دوباره", + "app.error.userNotFound": "کاربر یافت نشد.", + "app.error.requestTimeout": "خطای مهلت زمانیِ درخواست.", + "app.error.meetingNotFound": "جلسه پیدا نشد.", + "app.error.sessionTokenReplaced": "کاربر با یک مجوز جلسه جدید متصل شد.", + "app.error.serverInternalError": "خطای داخلی سرور.", + "app.error.paramMissing": "مؤلفه در اتصال اولیه وجود ندارد.", + "app.error.tooManyConnections": "اتصالات خیلی زیاد.", + "app.error.serverClosed": "سرور اتصال را بسته است.", "app.guest.errorSeeConsole": "خطا: جزئیات بیش‌تر در کنسول.", "app.guest.noModeratorResponse": "هیچ پاسخی از مدیر وجود ندارد", "app.guest.noSessionToken": "هیچ ژتون جلسه‌ای دریافت نشد.", @@ -1367,6 +1450,10 @@ "app.learningDashboard.shareButton": "هم‌رسانی با دیگران", "app.learningDashboard.shareLinkCopied": "رونوشت پیوند باموفقیت انجام شد!", "app.learningDashboard.user": "کاربر", + "app.learningDashboard.learnMore": "درباره استفاده از پیشخوان در {0} از پایگاه دانش ما بیشتر بیاموزید.", + "app.learningDashboard.learnMoreLinkText": "این مقاله", + "app.learningDashboard.feedback": "تجربه شما از این ویژگی چگونه بوده است؟ ما دوست داریم نظرات و حتی پیشنهادات شما را در مورد چگونگی بهبود آن بشنویم. با کلیک کردن روی {0} با ما به اشتراک بگذارید.", + "app.learningDashboard.feedbackLinkText": "اینجا", "app.learningDashboard.indicators.meetingStatusEnded": "پایان یافته", "app.learningDashboard.indicators.meetingStatusActive": "فعال", "app.learningDashboard.indicators.usersOnline": "کاربران فعال", diff --git a/bigbluebutton-html5/public/locales/gl.json b/bigbluebutton-html5/public/locales/gl.json index 031677d89a..ecd242043d 100644 --- a/bigbluebutton-html5/public/locales/gl.json +++ b/bigbluebutton-html5/public/locales/gl.json @@ -5,6 +5,7 @@ "app.chat.errorMaxMessageLength": "A mensaxe é demasiado longa, superou o máximo de {0} caracteres", "app.chat.errorMinMessageLength": "A mensaxe non acadou o mínimo de {0} caracteres", "app.chat.errorOnSendMessage": "Produciuse un erro ao enviar a mensaxe de parola", + "app.chat.errorOnUpdateMessage": "Produciuse un erro ao actualizar a mensaxe de parola", "app.chat.disconnected": "Vde. esta desconectado, non é posíbel enviar as mensaxes", "app.chat.locked": "Parola bloqueada, non é posíbel enviar as mensaxes", "app.chat.inputLabel": "Entrada de mensaxe para a parola {0}", @@ -29,7 +30,7 @@ "app.chat.breakoutDurationUpdatedModerator": "O tempo das salas parciais é agora de {0} minutos, e enviouse unha notificación.", "app.chat.emptyLogLabel": "Rexistro da parola baleiro", "app.chat.away": "Está ausente", - "app.chat.notAway": "Xa non está ausente", + "app.chat.notAway": "está de novo en liña", "app.chat.clearPublicChatMessage": "A parola publica foi retirada por un moderador", "app.chat.multi.typing": "Varios usuarios están a escribir", "app.chat.someone.typing": "Alguén está a escribir", @@ -39,6 +40,21 @@ "app.chat.copyErr": "Produciuse un erro ao copiar a parola transcrita", "app.chat.messageRead": "Mensaxe lida polo destinatario", "app.chat.closePopup": "Pechar", + "app.chat.editTime": "Última edición ás {0}", + "app.chat.deleteMessage": "Esta mensaxe foi eliminada por {0}", + "app.chat.toolbar.reply": "Responder á mensaxe {0}", + "app.chat.toolbar.edit": "Editar", + "app.chat.toolbar.delete": "Eliminar", + "app.chat.toolbar.reactions.reactedByLabel": "Reacción de", + "app.chat.toolbar.reactions.youLabel": "vostede", + "app.chat.toolbar.reactions.andLabel": "e", + "app.chat.toolbar.reactions.findReactionButtonLabel": "Atopar unha reacción", + "app.chat.toolbar.edit.editing": "Editando a mensaxe", + "app.chat.toolbar.edit.cancel": "Prema {0} para cancelar.", + "app.chat.toolbar.edit.edited": "Editada", + "app.chat.toolbar.delete.cancelLabel": "Cancelar", + "app.chat.toolbar.delete.confirmationTitle": "Confirma isto?", + "app.chat.toolbar.delete.confirmationDescription": "Esta acción é permanente, non poderá volver acceder a esta mensaxe.", "app.timer.toolTipTimerStopped": "O temporizador detívose.", "app.timer.toolTipTimerRunning": "O temporizador está en marcha.", "app.timer.toolTipStopwatchStopped": "O cronómetro detívose.", @@ -237,7 +253,7 @@ "app.meeting.endedFromAPI": "A sesión foi rematada polo sistema", "app.meeting.endedWhenNoUserJoined": "A sesión rematou porque non se uniu ningún usuario", "app.meeting.endedWhenLastUserLeft": "A sesión rematou cando saíu o último usuario", - "app.meeting.endedAfterExceedingDuration": "a sesión rematou por exceder a duración máxima", + "app.meeting.endedAfterExceedingDuration": "A sesión rematou por exceder a duración máxima", "app.meeting.breakoutEndedAfterExceedingDuration": "A sala parcial rematou por superar a duración máxima", "app.meeting.breakoutEndedByModerator": "A sala parcial foi rematada polo moderador", "app.meeting.endedDueNoAuthed": "a sesión rematou porque non hai ningún usuario autenticado na sala", @@ -680,8 +696,8 @@ "app.actionsBar.reactions.raiseHand": "Erguer a súa man", "app.actionsBar.reactions.lowHand": "Baixar a súa man", "app.actionsBar.reactions.autoCloseReactionsBarLabel": "Pechar automaticamente a barra de reaccións", - "app.actionsBar.reactions.setAway": "Ausentarse", - "app.actionsBar.reactions.setActive": "Activarse", + "app.actionsBar.reactions.away": "Ausente", + "app.actionsBar.reactions.active": "Activo", "app.actionsBar.currentStatusDesc": "estado actual {0}", "app.actionsBar.captions.start": "Comezar a ver os subtítulos", "app.actionsBar.captions.stop": "Deixar de ver os subtítulos", @@ -806,16 +822,75 @@ "app.audio.captions.speech.disabled": "Desactivado", "app.audio.captions.speech.unsupported": "O seu navegador non admite o recoñecemento de voz. O seu son non se transcribirá", "app.audio.captions.speech.auto": "Detección automática", - "app.audio.captions.select.de-DE": "Alemán", - "app.audio.captions.select.en-US": "Inglés", - "app.audio.captions.select.es-ES": "Español", + "app.audio.captions.select.af-ZA": "Afrikaans", + "app.audio.captions.select.sq-AL": "Albanés", + "app.audio.captions.select.am-ET": "Amhárico", + "app.audio.captions.select.ar": "Árabe", + "app.audio.captions.select.hy-AM": "Armenio", + "app.audio.captions.select.az-AZ": "Azarí", + "app.audio.captions.select.eu-ES": "Éuscaro", + "app.audio.captions.select.bn": "Bengalí", + "app.audio.captions.select.bs-BA": "Bosníaco", + "app.audio.captions.select.bg-BG": "Búlgaro", + "app.audio.captions.select.ca-ES": "Catalán", + "app.audio.captions.select.zh-CN": "Chinés simplificado", + "app.audio.captions.select.zh-TW": "Chinés tradicional", + "app.audio.captions.select.hr-HR": "Croata", + "app.audio.captions.select.cs-CZ": "Checo", + "app.audio.captions.select.da-DK": "Danés", + "app.audio.captions.select.nl-NL": "Neerlandés", + "app.audio.captions.select.en-US": "Inglés (EUA)", + "app.audio.captions.select.en-GB": "Inglés (GB)", + "app.audio.captions.select.et-EE": "Estonio", + "app.audio.captions.select.fi-FI": "Finés", "app.audio.captions.select.fr-FR": "Francés", - "app.audio.captions.select.hi-ID": "Hindi", + "app.audio.captions.select.gl-ES": "Galego", + "app.audio.captions.select.de-DE": "Alemán", + "app.audio.captions.select.el-GR": "Grego", + "app.audio.captions.select.gu-IN": "Guxarati", + "app.audio.captions.select.hi-IN": "Hindi", + "app.audio.captions.select.hu-HU": "Húngaro", + "app.audio.captions.select.is-IS": "Islandés", + "app.audio.captions.select.id-ID": "Indonesio", "app.audio.captions.select.it-IT": "Italiano", "app.audio.captions.select.ja-JP": "Xaponés", - "app.audio.captions.select.pt-BR": "Portugués", + "app.audio.captions.select.jv-ID": "Xavanés", + "app.audio.captions.select.kn-IN": "Kanarés", + "app.audio.captions.select.kk-KZ": "Casaco", + "app.audio.captions.select.km-KH": "Khmer", + "app.audio.captions.select.ko-KR": "Coreano", + "app.audio.captions.select.lo-LA": "Laosiano", + "app.audio.captions.select.lv-LV": "Letón", + "app.audio.captions.select.lt-LT": "Lituano", + "app.audio.captions.select.mk-MK": "Macedonio", + "app.audio.captions.select.ms-MY": "Malaio", + "app.audio.captions.select.ml-IN": "Malayalam", + "app.audio.captions.select.mr-IN": "Marathi", + "app.audio.captions.select.mn-MN": "Mongol", + "app.audio.captions.select.ne-NP": "Nepalés", + "app.audio.captions.select.no-NO": "Noruegués", + "app.audio.captions.select.fa-IR": "Persa", + "app.audio.captions.select.pl-PL": "Polaco", + "app.audio.captions.select.ro-RO": "Romanés", + "app.audio.captions.select.pt-PT": "Portugués (Portugal)", + "app.audio.captions.select.pt-BR": "Portugués (Brasil)", "app.audio.captions.select.ru-RU": "Ruso", - "app.audio.captions.select.zh-CN": "Chinés", + "app.audio.captions.select.sr-RS": "Serbio", + "app.audio.captions.select.si-LK": "Cingalés", + "app.audio.captions.select.sk-SK": "Eslovaco", + "app.audio.captions.select.sl-SI": "Esloveno", + "app.audio.captions.select.es-ES": "Español", + "app.audio.captions.select.su-ID": "Sundanés", + "app.audio.captions.select.sw": "Suahili", + "app.audio.captions.select.sv-SE": "Sueco", + "app.audio.captions.select.ta": "Támil", + "app.audio.captions.select.te-IN": "Telugú", + "app.audio.captions.select.th-TH": "Tailandés", + "app.audio.captions.select.tr-TR": "Turco", + "app.audio.captions.select.uk-UA": "Ucraíno", + "app.audio.captions.select.ur": "Urdú", + "app.audio.captions.select.uz-UZ": "Usbeco", + "app.audio.captions.select.vi-VN": "Vietnamita", "app.error.removed": "Vde. foi retirado/a da conferencia", "app.error.meeting.ended": "Vde. desconectouse da conferencia", "app.meeting.logout.duplicateUserEjectReason": "Usuario duplicado tentando unirse á sesión", @@ -858,6 +933,14 @@ "app.error.fallback.presentation.title": "Produciuse un erro", "app.error.fallback.presentation.description": "Accedeu. Tente volver cargar a páxina.", "app.error.fallback.presentation.reloadButton": "Recargar", + "app.error.userNotFound": "Non se atopou o usuaio", + "app.error.requestTimeout": "Produciuse un erro de tempo de espera da solicitude.", + "app.error.meetingNotFound": "Non se atopou a xuntanza.", + "app.error.sessionTokenReplaced": "Usuario conectado cun novo testemuño de sesión.", + "app.error.serverInternalError": "Produciuse un erro interno do servidor.", + "app.error.paramMissing": "Falta un parámetro na conexión inicial.", + "app.error.tooManyConnections": "Demasiadas conexións.", + "app.error.serverClosed": "O servidor pechou a conexión.", "app.guest.errorSeeConsole": "Erro: máis detalles na consola.", "app.guest.noModeratorResponse": "Non hai resposta do moderador.", "app.guest.noSessionToken": "Non se recibiu ningún testemuño de sesión.", @@ -977,7 +1060,7 @@ "app.shortcut-help.copy": "Copiar", "app.shortcut-help.paste": "Pegar", "app.shortcut-help.selectAll": "Seleccionar todo", - "app.shortcut-help.delete": "Borrar", + "app.shortcut-help.delete": "Eliminar", "app.shortcut-help.duplicate": "Duplicar", "app.lock-viewers.title": "Bloquear aos espectadores", "app.lock-viewers.description": "Estas opcións permítenlle restrinxir aos espectadores o uso de funcións específicas.", @@ -1362,7 +1445,7 @@ "app.learningDashboard.dashboardTitle": " Taboleiro de análise da aprendizaxe", "app.learningDashboard.bigbluebuttonTitle": "BigBlueButton", "app.learningDashboard.downloadSessionDataLabel": "Descargar datos da sesión", - "app.learningDashboard.lastUpdatedLabel": "Última actualización en", + "app.learningDashboard.lastUpdatedLabel": "Última actualización ás", "app.learningDashboard.sessionDataDownloadedLabel": "Descargado!", "app.learningDashboard.shareButton": "Compartir con outros", "app.learningDashboard.shareLinkCopied": "A ligazón foi copiada correctamente!", diff --git a/bigbluebutton-html5/public/locales/it_IT.json b/bigbluebutton-html5/public/locales/it_IT.json index 38865f735b..36f540b086 100644 --- a/bigbluebutton-html5/public/locales/it_IT.json +++ b/bigbluebutton-html5/public/locales/it_IT.json @@ -39,6 +39,7 @@ "app.chat.copyErr": "Copia della trascrizione della chat fallita", "app.chat.messageRead": "Messaggio letto dal destinatario", "app.chat.closePopup": "Chiudi", + "app.chat.toolbar.reply": "Rispondi al messaggio {0}", "app.timer.toolTipTimerStopped": "Il contaminuti è stato fermato.", "app.timer.toolTipTimerRunning": "Il contaminuti è avviato.", "app.timer.toolTipStopwatchStopped": "Il cronometro è stato fermato.", @@ -173,6 +174,8 @@ "app.userList.menu.lockUser.label": "Blocca {0}", "app.userList.menu.directoryLookup.label": "Cerca directory", "app.userList.menu.makePresenter.label": "Promuovi a relatore", + "app.userList.menu.lockPublicChat.label": "Blocca chat pubblica", + "app.userList.menu.unlockPublicChat.label": "Sblocca la chat pubblica", "app.userList.userOptions.manageUsersLabel": "Gestisci utenti", "app.userList.userOptions.muteAllLabel": "Silenzia tutti gli utenti", "app.userList.userOptions.muteAllDesc": "Disattiva l'audio di tutti gli utenti nella sessione", @@ -227,6 +230,7 @@ "app.screenshare.screenshareRetryOtherEnvError": "Codice {0}. Impossibile condividere lo schermo. Prova di nuovo usando un browser o un dispositivo differenti.", "app.screenshare.screenshareUnsupportedEnv": "Codice {0}. Browser non supportato. Prova di nuovo con un browser o un dispositivo differenti.", "app.screenshare.screensharePermissionError": "Codice {0}. Devi fornire il permesso di registrare lo schermo.", + "app.screenshare.screenshareToastHelpLabel": "Ulteriori informazioni", "app.cameraAsContent.presenterLoadingLabel": "Avvio della telecamera", "app.cameraAsContent.viewerLoadingLabel": "La telecamera del relatore si sta avviando", "app.cameraAsContent.presenterSharingLabel": "Stai presentando la tua telecamera", @@ -333,6 +337,8 @@ "app.presentationUploder.conversion.204": "Nulla da importare", "app.presentationUploder.upload.413": "Il file è troppo grande, ha ecceduto il massimo di {0} MB", "app.presentationUploder.genericError": "Ops, qualcosa è andato storto...", + "app.presentationUploder.upload.fileVirus": "Caricamento non riuscito: virus rilevato! Controlla il file e riprova.", + "app.presentationUploder.upload.scanFailed": "Caricamento non riuscito: il file non può essere scansionato", "app.presentationUploder.upload.408": "Richiesta del token di caricamento scaduta.", "app.presentationUploder.upload.404": "404: Token di caricamento non valido", "app.presentationUploder.upload.401": "La richiesta di presentazione del token di caricamento è fallita.", @@ -521,6 +527,7 @@ "app.screenshare.screenShareLabel": "Condivisione schermo", "app.cameraAsContent.cameraAsContentLabel": "Presenta telecamera", "app.submenu.application.applicationSectionTitle": "Applicazione", + "app.submenu.application.pushToTalkLabel": "Audio push-to-talk", "app.submenu.application.animationsLabel": "Animazioni", "app.submenu.application.audioFilterLabel": "Filtri audio per microfono", "app.submenu.application.wbToolbarsAutoHideLabel": "Nascondi automaticamente strumenti lavagna", @@ -606,8 +613,8 @@ "app.submenu.notification.userJoinLabel": "Entra un utente", "app.submenu.notification.userLeaveLabel": "Esce un utente", "app.submenu.notification.guestWaitingLabel": "Ospite in attesa di ammissione", - "app.submenu.audio.micSourceLabel": "Ingresso audio", - "app.submenu.audio.speakerSourceLabel": "Uscita audio", + "app.submenu.audio.micSourceLabel": "Microfono", + "app.submenu.audio.speakerSourceLabel": "Altoparlante", "app.submenu.audio.streamVolumeLabel": "Volume dell'audio trasmesso", "app.submenu.video.title": "Video", "app.submenu.video.videoSourceLabel": "Visualizza sorgente", @@ -653,6 +660,9 @@ "app.actionsBar.actionsDropdown.presentationLabel": "Gestisci presentazioni", "app.actionsBar.actionsDropdown.initPollLabel": "Crea un sondaggio", "app.actionsBar.actionsDropdown.desktopShareLabel": "Condividi lo schermo", + "app.actionsBar.actionsDropdown.lockedDesktopShareDesc": "Condivisione schermo bloccata", + "app.actionsBar.actionsDropdown.notPresenterDesktopShareLabel": "Devi essere un presentatore per condividere lo schermo", + "app.actionsBar.actionsDropdown.notPresenterDesktopShareDesc": "Devi essere un presentatore per condividere lo schermo", "app.actionsBar.actionsDropdown.stopDesktopShareLabel": "Termina condivisione schermo", "app.actionsBar.actionsDropdown.presentationDesc": "Carica la tua presentazione", "app.actionsBar.actionsDropdown.initPollDesc": "Crea un sondaggio", @@ -723,10 +733,10 @@ "app.audioModal.yes.arialabel": "Il test audio si sente", "app.audioModal.no.arialabel": "Il test audio non si sente", "app.audioModal.echoTestTitle": "Questo è un test audio privato. Pronuncia qualche parola. Riesci a sentire il test audio?", - "app.audioModal.settingsTitle": "Cambia le impostazioni audio", "app.audioModal.helpTitle": "C'è stato un problema con i tuoi dispositivi audio/video", "app.audioModal.helpSubtitleMic": " Non è possibile abilitare il microfono", "app.audioModal.helpSubtitleGeneric": " Ci sono problemi con la connessione audio", + "app.audioModal.helpSubtitlePermission": "Abbiamo bisogno di accedere al tuo microfono", "app.audioModal.helpPermissionStep1": "Quando ti unisci ad una call, accetta le richieste di permesso per il microfono", "app.audioModal.helpPermissionStep2": "Controlla le impostazioni del browser e del dispositivo per assicurare che l'accesso al microfono sia consentito", "app.audioModal.helpPermissionStep3": "Ricarica la pagina e riprova", @@ -759,23 +769,30 @@ "app.audio.changeAudioDevice": "Cambia dispositivo audio", "app.audio.enterSessionLabel": "Entra nella sessione", "app.audio.playSoundLabel": "Riproduci un suono", + "app.audio.startAudioFeedback": "Avvia il feedback audio", "app.audio.stopAudioFeedback": "Ferma prova audio", "app.audio.backLabel": "Indietro", "app.audio.loading": "Caricamento", "app.audio.microphones": "Microfoni", "app.audio.speakers": "Altoparlanti", - "app.audio.noDeviceFound": "Nessun dispositivo trovato", - "app.audio.audioSettings.titleLabel": "Imposta la configurazione audio", - "app.audio.audioSettings.descriptionLabel": "Apparirà una finestra con una richiesta di accedere al tuo microfono.", - "app.audio.audioSettings.microphoneSourceLabel": "Sorgente microfono", - "app.audio.audioSettings.speakerSourceLabel": "Sorgente altoparlanti", + "app.audio.noDeviceFound": "Nessun dispositivo trovato (solo ascolto)", + "app.audio.audioSettings.titleLabel": "Le tue impostazioni audio", + "app.audio.audioSettings.baseSubtitle": "Per perfezionare le impostazioni, prova a parlare per verificare il funzionamento dei tuoi dispositivi di input e output.", + "app.audio.audioSettings.findingDevicesTitle": "Cerchiamo i tuoi dispositivi audio, accetta qualsiasi richiesta di utilizzo", + "app.audio.audioSettings.noMicSelectedWarning": "Nessun microfono selezionato. Potrai ascoltare, ma non parlare.", + "app.audio.audioSettings.noMicListenOnly": "Nessun microfono (solo ascolto)", + "app.audio.audioSettings.microphoneSourceLabel": "Microfono", + "app.audio.audioSettings.speakerSourceLabel": "Altoparlante", "app.audio.audioSettings.testSpeakerLabel": "Prova l'audio", - "app.audio.audioSettings.microphoneStreamLabel": "Volume dell'audio trasmesso", - "app.audio.audioSettings.retryLabel": "Riprova", + "app.audio.audioSettings.microphoneStreamLabel": "Volume audio", + "app.audio.audioSettings.retryMicLabel": "Riprova", "app.audio.audioSettings.fallbackInputLabel": "Ingresso audio {0}", "app.audio.audioSettings.fallbackOutputLabel": "Uscita audio {0}", + "app.audio.audioSettings.fallbackNoPermission": "(nessun permesso del dispositivo)", "app.audio.audioSettings.defaultOutputDeviceLabel": "Predefinito", - "app.audio.audioSettings.findingDevicesLabel": "Ricerca dei dispositivi...", + "app.audio.audioSettings.findingDevicesLabel": "Ricerca dispositivi audio...", + "app.audio.audioSettings.confirmLabel": "Conferma", + "app.audio.audioSettings.cancelLabel": "Annulla", "app.audio.listenOnly.backLabel": "Indietro", "app.audio.listenOnly.closeLabel": "Chiudi", "app.audio.permissionsOverlay.title": "Permetti l'accesso al microfono", @@ -906,6 +923,7 @@ "app.notification.userLeavePushAlert": "{0} ha lasciato la sessione", "app.submenu.notification.raiseHandLabel": "Alza la mano", "app.shortcut-help.title": "Scelta rapida", + "app.shortcut-help.pushToTalk": "Tieni premuto per la funzione Push-to-talk", "app.shortcut-help.accessKeyNotAvailable": "Non sono disponibili chiavi di accesso", "app.shortcut-help.comboLabel": "Combinazione", "app.shortcut-help.alternativeLabel": "Alternative", @@ -1009,10 +1027,16 @@ "app.connection-status.usingTurn": "Si sta usando TURN", "app.connection-status.yes": "Sì", "app.connection-status.connectionStats": "Statistiche di connessione", + "app.connection-status.connectionStatusNoEvent": "Nessun evento generato per questo stato.", "app.connection-status.myLogs": "Eventi", "app.connection-status.sessionLogs": "Eventi di sessione", "app.connection-status.next": "Pagina successiva", "app.connection-status.prev": "Pagina precedente", + "app.notificationBar.connectionCode3001": "Riconnessione in corso (codice 3001)", + "app.notificationBar.connectionCode3002": "Impossibile connettersi. Controlla la tua connessione Internet (codice 3002)", + "app.notificationBar.connectionCode3003": "Il server al momento non risponde. Riconnessione in corso (codice 3003)", + "app.notificationBar.connectionCode3004": "La connessione è instabile. Controlla la tua connessione Internet (codice 3004)", + "app.notificationBar.connectionCode3005": "I dati si stanno caricando lentamente. Riconnessione in corso (codice 3005)", "app.learning-dashboard.label": "Pannello di analisi dell'apprendimento", "app.learning-dashboard.description": "Apre la bacheca con le attività degli utenti", "app.learning-dashboard.clickHereToOpen": "Apri il pannello di analisi dell'apprendimento", @@ -1245,6 +1269,7 @@ "app.createBreakoutRoom.setTimeHigherThanMeetingTimeError": " La durata delle stanze di sottogruppi di lavoro non può superare il tempo rimanente della sessione.", "app.createBreakoutRoom.roomNameInputDesc": "Aggiorna il nome dell'aula SEparata", "app.createBreakoutRoom.movedUserLabel": "{0} spostato nell'aula {1}", + "app.createBreakoutRoom.currentSlideLabel": "Slide corrente", "app.updateBreakoutRoom.modalDesc": "Per aggiornare o invitare un utente basta trascinarlo nell'aula scelta.", "app.updateBreakoutRoom.cancelLabel": "Annulla", "app.updateBreakoutRoom.title": "Aggiorna aule separate", @@ -1279,7 +1304,7 @@ "app.layout.modal.title": "Disposizione", "app.layoutUpdate.label": "Modifica della disposizione applicata a tutti", "app.layout.modal.update": "Applica", - "app.layout.modal.updateAll": "Applica a tutti", + "app.layout.modal.updateAll": "Aggiorna a tutti", "app.layout.modal.layoutLabel": "Scegli la disposizione", "app.layout.modal.pushLayoutLabel": "Applica a tutti", "app.layout.modal.layoutToastLabel": "Disposizione modificata", @@ -1363,7 +1388,6 @@ "app.learningDashboard.userDetails.anonymousAnswer": "Sondaggio anonimo", "app.learningDashboard.userDetails.talkTime": "Tempo di parola", "app.learningDashboard.userDetails.messages": "Messaggi", - "app.learningDashboard.userDetails.emojis": "Emoji", "app.learningDashboard.userDetails.raiseHands": "Mani alzate", "app.learningDashboard.userDetails.pollVotes": "Risposte", "app.learningDashboard.userDetails.onlineIndicator": "Tempo online per {0}", @@ -1372,7 +1396,7 @@ "app.learningDashboard.usersTable.colTalk": "Tempo di parola", "app.learningDashboard.usersTable.colWebcam": "Tempo di webcam", "app.learningDashboard.usersTable.colMessages": "Messaggi", - "app.learningDashboard.usersTable.colEmojis": "Emoji", + "app.learningDashboard.usersTable.colReactions": "Reazioni", "app.learningDashboard.usersTable.colRaiseHands": "Mani alzate", "app.learningDashboard.usersTable.colActivityScore": "Punteggio attività", "app.learningDashboard.usersTable.colStatus": "Stato", diff --git a/bigbluebutton-html5/public/locales/ja.json b/bigbluebutton-html5/public/locales/ja.json index 872652811e..9e7dc9f055 100644 --- a/bigbluebutton-html5/public/locales/ja.json +++ b/bigbluebutton-html5/public/locales/ja.json @@ -5,6 +5,7 @@ "app.chat.errorMaxMessageLength": "メッセージが長すぎます。最大の{0}文字を超えています", "app.chat.errorMinMessageLength": "メッセージは最小の{0}文字に達しませんでした", "app.chat.errorOnSendMessage": "チャットメッセージの送付でエラーが生じました", + "app.chat.errorOnUpdateMessage": "チャットメッセージの更新でエラーが生じました", "app.chat.disconnected": "通信が切断されたため、メッセージを送ることができません", "app.chat.locked": "チャットがロックされているため、メッセージを送ることができません", "app.chat.inputLabel": "チャット {0} へメッセージ入力", @@ -29,7 +30,7 @@ "app.chat.breakoutDurationUpdatedModerator": "小会議の時間は現在{0}分です。通知が送られました。", "app.chat.emptyLogLabel": "チャットログは空です", "app.chat.away": "は席を外しています", - "app.chat.notAway": "は席に戻りました", + "app.chat.notAway": "はオンラインに復帰しました", "app.chat.clearPublicChatMessage": "チャット履歴は司会者により消去されました", "app.chat.multi.typing": "複数の人が入力中", "app.chat.someone.typing": "誰かが入力中", @@ -39,6 +40,21 @@ "app.chat.copyErr": "チャットのやりとりのコピーに失敗しました", "app.chat.messageRead": "メッセージら既読になりました", "app.chat.closePopup": "閉じる", + "app.chat.editTime": "{0} に最終更新", + "app.chat.deleteMessage": "{0} によってこのメッセージが削除されました", + "app.chat.toolbar.reply": "{0} のメッセージに返事をする", + "app.chat.toolbar.edit": "編集", + "app.chat.toolbar.delete": "削除", + "app.chat.toolbar.reactions.reactedByLabel": "反応した人:", + "app.chat.toolbar.reactions.youLabel": "あなた", + "app.chat.toolbar.reactions.andLabel": "と", + "app.chat.toolbar.reactions.findReactionButtonLabel": "反応を探す", + "app.chat.toolbar.edit.editing": "メッセージを編集中", + "app.chat.toolbar.edit.cancel": "キャンセルするには{0}を押してください", + "app.chat.toolbar.edit.edited": "編集済み", + "app.chat.toolbar.delete.cancelLabel": "キャンセル", + "app.chat.toolbar.delete.confirmationTitle": "本当に良いですか?", + "app.chat.toolbar.delete.confirmationDescription": "この操作は永続的なもので、二度とこのメッセージにアクセスすることはできません。", "app.timer.toolTipTimerStopped": "タイマーを止めました。", "app.timer.toolTipTimerRunning": "タイマーは動いています。", "app.timer.toolTipStopwatchStopped": "ストップウォッチを止めました。", @@ -237,7 +253,7 @@ "app.meeting.endedFromAPI": "会議はシステムによって停止されました", "app.meeting.endedWhenNoUserJoined": "一人も参加者がいないため、会議は終了しました", "app.meeting.endedWhenLastUserLeft": "最後の参加者の退室とともに会議は終了しました", - "app.meeting.endedAfterExceedingDuration": "最大の利用時間を超えたため、会議は終了しました", + "app.meeting.endedAfterExceedingDuration": "制限時間を超えたため、会議が終了しました。", "app.meeting.breakoutEndedAfterExceedingDuration": "最大の利用時間を超えたため、小会議室は終了しました", "app.meeting.breakoutEndedByModerator": "小会議室は司会者によって閉室されました", "app.meeting.endedDueNoAuthed": "承認を受けた参加者が不在のため、会議は終了しました", @@ -680,8 +696,8 @@ "app.actionsBar.reactions.raiseHand": "手をあげる", "app.actionsBar.reactions.lowHand": "手をおろす", "app.actionsBar.reactions.autoCloseReactionsBarLabel": "リアクションバーを自動で隠す", - "app.actionsBar.reactions.setAway": "不在にする", - "app.actionsBar.reactions.setActive": "在室にする", + "app.actionsBar.reactions.away": "離席", + "app.actionsBar.reactions.active": "アクティブ", "app.actionsBar.currentStatusDesc": "現在のステータス {0}", "app.actionsBar.captions.start": "字幕を表示", "app.actionsBar.captions.stop": "字幕を非表示", @@ -806,16 +822,75 @@ "app.audio.captions.speech.disabled": "無効", "app.audio.captions.speech.unsupported": "お使いのブラウザは音声認識をサポートしていないため、自動書き起こし機能は使用できません。", "app.audio.captions.speech.auto": "自動検出", - "app.audio.captions.select.de-DE": "ドイツ語", - "app.audio.captions.select.en-US": "英語", - "app.audio.captions.select.es-ES": "スペイン語", + "app.audio.captions.select.af-ZA": "アフリカーンス語", + "app.audio.captions.select.sq-AL": "アルバニア語", + "app.audio.captions.select.am-ET": "アムハラ語", + "app.audio.captions.select.ar": "アラビア語", + "app.audio.captions.select.hy-AM": "アルメニア語", + "app.audio.captions.select.az-AZ": "アゼルバイジャン語", + "app.audio.captions.select.eu-ES": "バスク語", + "app.audio.captions.select.bn": "ベンガル語", + "app.audio.captions.select.bs-BA": "ボスニア語", + "app.audio.captions.select.bg-BG": "ブルガリア語", + "app.audio.captions.select.ca-ES": "カタルーニャ語", + "app.audio.captions.select.zh-CN": "中国語(簡体字)", + "app.audio.captions.select.zh-TW": "中国語(繁体字)", + "app.audio.captions.select.hr-HR": "クロアチア語", + "app.audio.captions.select.cs-CZ": "チェコ語", + "app.audio.captions.select.da-DK": "デンマーク語", + "app.audio.captions.select.nl-NL": "オランダ語", + "app.audio.captions.select.en-US": "英語(米国)", + "app.audio.captions.select.en-GB": "英語(英国)", + "app.audio.captions.select.et-EE": "エストニア語", + "app.audio.captions.select.fi-FI": "フィンランド語", "app.audio.captions.select.fr-FR": "フランス語", - "app.audio.captions.select.hi-ID": "ヒンズー語", + "app.audio.captions.select.gl-ES": "ガリシア語", + "app.audio.captions.select.de-DE": "ドイツ語", + "app.audio.captions.select.el-GR": "ギリシャ語", + "app.audio.captions.select.gu-IN": "グジャラート語", + "app.audio.captions.select.hi-IN": "ヒンズー語", + "app.audio.captions.select.hu-HU": "ハンガリー語", + "app.audio.captions.select.is-IS": "アイスランド語", + "app.audio.captions.select.id-ID": "インドネシア語", "app.audio.captions.select.it-IT": "イタリア語", "app.audio.captions.select.ja-JP": "日本語", - "app.audio.captions.select.pt-BR": "ポルトガル語", + "app.audio.captions.select.jv-ID": "ジャワ語", + "app.audio.captions.select.kn-IN": "カンナダ語", + "app.audio.captions.select.kk-KZ": "カザフ語", + "app.audio.captions.select.km-KH": "クメール語", + "app.audio.captions.select.ko-KR": "韓国語", + "app.audio.captions.select.lo-LA": "ラオス語", + "app.audio.captions.select.lv-LV": "ラトビア語", + "app.audio.captions.select.lt-LT": "リトアニア語", + "app.audio.captions.select.mk-MK": "マケドニア語", + "app.audio.captions.select.ms-MY": "マレー語", + "app.audio.captions.select.ml-IN": "マラヤーラム語", + "app.audio.captions.select.mr-IN": "マラーティー語", + "app.audio.captions.select.mn-MN": "モンゴル語", + "app.audio.captions.select.ne-NP": "ネパール語", + "app.audio.captions.select.no-NO": "ノルウェー語", + "app.audio.captions.select.fa-IR": "ペルシャ語", + "app.audio.captions.select.pl-PL": "ポーランド語", + "app.audio.captions.select.ro-RO": "ルーマニア語", + "app.audio.captions.select.pt-PT": "ポルトガル語(ポルトガル)", + "app.audio.captions.select.pt-BR": "ポルトガル語(ブラジル)", "app.audio.captions.select.ru-RU": "ロシア語", - "app.audio.captions.select.zh-CN": "中国語", + "app.audio.captions.select.sr-RS": "セルビア語", + "app.audio.captions.select.si-LK": "シンハラ語", + "app.audio.captions.select.sk-SK": "スロバキア語", + "app.audio.captions.select.sl-SI": "スロベニア語", + "app.audio.captions.select.es-ES": "スペイン語", + "app.audio.captions.select.su-ID": "スーダン語", + "app.audio.captions.select.sw": "スワヒリ語", + "app.audio.captions.select.sv-SE": "スェーデン語", + "app.audio.captions.select.ta": "タミル語", + "app.audio.captions.select.te-IN": "テルグ語", + "app.audio.captions.select.th-TH": "タイ語", + "app.audio.captions.select.tr-TR": "トルコ語", + "app.audio.captions.select.uk-UA": "ウクライナ語", + "app.audio.captions.select.ur": "ウルドゥー語", + "app.audio.captions.select.uz-UZ": "ウズベク語", + "app.audio.captions.select.vi-VN": "ベトナム語", "app.error.removed": "会議から退席しました", "app.error.meeting.ended": "会議からログアウトしました", "app.meeting.logout.duplicateUserEjectReason": "重複したユーザーが会議に参加しようとしています", @@ -858,6 +933,14 @@ "app.error.fallback.presentation.title": "エラーが発生しました", "app.error.fallback.presentation.description": "記録されました。ページを再読み込みしてください。", "app.error.fallback.presentation.reloadButton": "再読み込み", + "app.error.userNotFound": "ユーザーが見つかりません。", + "app.error.requestTimeout": "要求が時間切れになりました。", + "app.error.meetingNotFound": "会議が見つかりません。", + "app.error.sessionTokenReplaced": "ユーザーが新しいセッショントークンで接続しました。", + "app.error.serverInternalError": "サーバの内部エラーです。", + "app.error.paramMissing": "初期接続のためのパラメータが不足しています。", + "app.error.tooManyConnections": "過剰な接続があります。", + "app.error.serverClosed": "サーバが接続を遮断しました。", "app.guest.errorSeeConsole": "エラー:詳細はコンソールに表示。", "app.guest.noModeratorResponse": "司会者からの反応がありません。", "app.guest.noSessionToken": "会議の参加許可が得られていません。", @@ -1367,6 +1450,10 @@ "app.learningDashboard.shareButton": "他人と共有", "app.learningDashboard.shareLinkCopied": "リンクがコピーされました!", "app.learningDashboard.user": "ユーザー", + "app.learningDashboard.learnMore": "ダッシュボードの使用方法の詳細については、ナレッジベースの{0} をご覧ください。", + "app.learningDashboard.learnMoreLinkText": "この記事", + "app.learningDashboard.feedback": "この機能に満足されましたか?感想や改善点に関するご意見をお待ちしています。{0} をクリックし、お聞かせください。", + "app.learningDashboard.feedbackLinkText": "ここ", "app.learningDashboard.indicators.meetingStatusEnded": "終了", "app.learningDashboard.indicators.meetingStatusActive": "会議中", "app.learningDashboard.indicators.usersOnline": "人のアクティブユーザー", diff --git a/bigbluebutton-html5/public/locales/pt_BR.json b/bigbluebutton-html5/public/locales/pt_BR.json index 656d9ca76e..9f68c9f627 100644 --- a/bigbluebutton-html5/public/locales/pt_BR.json +++ b/bigbluebutton-html5/public/locales/pt_BR.json @@ -1346,6 +1346,10 @@ "app.learningDashboard.sessionDataDownloadedLabel": "Baixado!", "app.learningDashboard.shareButton": "Compartilhe com outros", "app.learningDashboard.shareLinkCopied": "Link copiado com sucesso!", + "app.learningDashboard.learnMore": "Saiba mais sobre o uso do Painel {0} da nossa Base de Conhecimento.", + "app.learningDashboard.learnMoreLinkText": "nesse artigo", + "app.learningDashboard.feedback": "Como está sendo sua experiência com essa funcionalidade? Adoraríamos saber sua opinião e até mesmo sugestões de como podemos melhorá-la. Conta pra gente clicando {0}.", + "app.learningDashboard.feedbackLinkText": "aqui", "app.learningDashboard.user": "Usuário", "app.learningDashboard.indicators.meetingStatusEnded": "Finalizado", "app.learningDashboard.indicators.meetingStatusActive": "Ativo", diff --git a/bigbluebutton-html5/public/resources/images/bot-avatar.png b/bigbluebutton-html5/public/resources/images/bot-avatar.png new file mode 100644 index 0000000000..29fafa8959 Binary files /dev/null and b/bigbluebutton-html5/public/resources/images/bot-avatar.png differ diff --git a/bigbluebutton-tests/playwright/chat/chat.js b/bigbluebutton-tests/playwright/chat/chat.js index 5e392b4995..ebe73f009f 100644 --- a/bigbluebutton-tests/playwright/chat/chat.js +++ b/bigbluebutton-tests/playwright/chat/chat.js @@ -63,7 +63,7 @@ class Chat extends MultiUsers { // clear await this.modPage.waitAndClick(e.chatOptions); await this.modPage.waitAndClick(e.chatClear); - await this.modPage.hasText(e.chatUserMessageText, 'The public chat history was cleared by a moderator', 'should display the message where the chat has been cleared'); + await this.modPage.hasText(e.chatNotificationMessageText, 'The public chat history was cleared by a moderator', 'should display the message where the chat has been cleared'); } async copyChat() { diff --git a/bigbluebutton-tests/playwright/core/elements.js b/bigbluebutton-tests/playwright/core/elements.js index 2f97f18c1a..5e8adc8d6c 100644 --- a/bigbluebutton-tests/playwright/core/elements.js +++ b/bigbluebutton-tests/playwright/core/elements.js @@ -12,7 +12,7 @@ exports.closeModal = 'button[data-test="closeModal"]'; exports.isSharingScreen = 'div[data-test="isSharingScreen"]'; exports.pdfFileName = '100PagesFile.pdf'; exports.reactionsButton = 'button[data-test="reactionsButton"]'; -exports.raiseHandBtn = 'div[data-test="raiseHandBtn"]'; +exports.raiseHandBtn = 'button[data-test="raiseHandBtn"]'; exports.lowerHandBtn = 'div[data-test="lowerHandBtn"]'; exports.raiseHandRejection = 'button[data-test="raiseHandRejection"]'; exports.meetingEndedModal = 'div[data-test="meetingEndedModal"]'; @@ -120,6 +120,7 @@ exports.closePrivateChat = 'button[data-test="closePrivateChat"]'; exports.typingIndicator = 'span[data-test="typingIndicator"]'; exports.errorTypingIndicator = 'div[data-test="errorTypingIndicator"]'; exports.chatUserMessageText = 'div[data-test="messageContent"] p'; +exports.chatNotificationMessageText = 'div[data-test="chatMessageNotificationContent"] p'; exports.secondChatUserMessageText = 'p[data-test="chatUserMessageText"]>>nth=1'; exports.chatWelcomeMessageText = 'div[data-test="welcomeMessage"]'; exports.waitingUsersLobbyMessage = 'div[data-test="lobbyMessage"] >> textarea'; diff --git a/bigbluebutton-tests/playwright/learningdashboard/learningdashboard.js b/bigbluebutton-tests/playwright/learningdashboard/learningdashboard.js index 8e0402c758..67f02b4565 100644 --- a/bigbluebutton-tests/playwright/learningdashboard/learningdashboard.js +++ b/bigbluebutton-tests/playwright/learningdashboard/learningdashboard.js @@ -138,7 +138,6 @@ class LearningDashboard extends MultiUsers { async overview() { await this.modPage.waitAndClick(e.joinVideo); await this.modPage.waitAndClick(e.startSharingWebcam); - await this.modPage.waitAndClick(e.reactionsButton); await this.modPage.waitAndClick(e.raiseHandBtn); await this.dashboardPage.reloadPage(); diff --git a/bigbluebutton-tests/playwright/learningdashboard/learningdashboard.spec.js b/bigbluebutton-tests/playwright/learningdashboard/learningdashboard.spec.js index 43edc57ab7..5bcd9b6ccf 100644 --- a/bigbluebutton-tests/playwright/learningdashboard/learningdashboard.spec.js +++ b/bigbluebutton-tests/playwright/learningdashboard/learningdashboard.spec.js @@ -29,7 +29,7 @@ test.describe('Learning Dashboard', async () => { test('Basic Infos', { tag: '@ci' }, async () => { await learningDashboard.basicInfos(); }); - + test('Overview', { tag: '@ci' }, async () => { await learningDashboard.overview(); }); diff --git a/bigbluebutton-tests/playwright/notifications/notifications.spec.js b/bigbluebutton-tests/playwright/notifications/notifications.spec.js index 87fc4d093e..d46b790a13 100644 --- a/bigbluebutton-tests/playwright/notifications/notifications.spec.js +++ b/bigbluebutton-tests/playwright/notifications/notifications.spec.js @@ -24,7 +24,8 @@ test.describe.parallel('Notifications', { tag: '@ci' }, () => { await notifications.getUserJoinPopupResponse(); }); - test('Raise and lower hand notification', async ({ browser, context, page }) => { + //Notification does not disappear, test needs to be updated after the fix. + test('Raise and lower hand notification', { tag: '@flaky' }, async ({ browser, context, page }) => { const notifications = new Notifications(browser, context); await notifications.initModPage(page); await notifications.raiseAndLowerHandNotification(); diff --git a/bigbluebutton-tests/playwright/parameters/customparameters.js b/bigbluebutton-tests/playwright/parameters/customparameters.js index b7e9373950..5cb7618960 100644 --- a/bigbluebutton-tests/playwright/parameters/customparameters.js +++ b/bigbluebutton-tests/playwright/parameters/customparameters.js @@ -160,7 +160,7 @@ class CustomParameters extends MultiUsers { async hidePresentationOnJoin() { await this.modPage.hasElement(e.actions, 'should display the actions button'); - await this.modPage.hasElement(e.restorePresentation, 'should display the restore presentation button for the moderator'); + await this.modPage.hasElement(e.minimizePresentation, 'should display the minimize presentation button for the moderator'); await this.userPage.hasElement(e.restorePresentation, 'should display the restore presentation button for the attendee'); await this.userPage.wasRemoved(e.whiteboard, 'should not display the whiteboard for the attendee'); } diff --git a/bigbluebutton-tests/playwright/user/multiusers.js b/bigbluebutton-tests/playwright/user/multiusers.js index 2ea9b7d24d..2769d98021 100644 --- a/bigbluebutton-tests/playwright/user/multiusers.js +++ b/bigbluebutton-tests/playwright/user/multiusers.js @@ -138,45 +138,24 @@ class MultiUsers { } async raiseAndLowerHand() { - const { reactionsButton } = getSettings(); - if (!reactionsButton) { - await this.modPage.waitForSelector(e.whiteboard); - await this.modPage.hasElement(e.joinAudio, 'should display the join audio button for the moderator'); - await this.modPage.wasRemoved(e.reactionsButton, 'should not display the reactions button for the moderator'); - return; - } - + await this.modPage.waitForSelector(e.whiteboard); await this.initUserPage(); - await this.userPage.waitAndClick(e.reactionsButton); await this.userPage.waitAndClick(e.raiseHandBtn); - await this.userPage.waitAndClick(e.reactionsButton); - await this.userPage.hasElement(e.lowerHandBtn); + await this.userPage.hasElement(e.raiseHandBtn); await this.modPage.comparingSelectorsBackgroundColor(e.avatarsWrapperAvatar, `${e.userListItem} div:first-child`); await sleep(1000); - await this.userPage.waitAndClick(e.lowerHandBtn); - await this.userPage.waitAndClick(e.reactionsButton); + await this.userPage.waitAndClick(e.raiseHandBtn); await this.userPage.hasElement(e.raiseHandBtn, 'should display the raise hand button for the attendee'); } async raiseHandRejected() { - const { reactionsButton } = getSettings(); - if (!reactionsButton) { - await this.modPage.waitForSelector(e.whiteboard); - await this.modPage.hasElement(e.joinAudio, 'should display the join audio button for the moderator'); - await this.modPage.wasRemoved(e.reactionsButton, 'should not display the reactions button for the moderator'); - return - } - - await waitAndClearDefaultPresentationNotification(this.modPage); + await this.modPage.waitForSelector(e.whiteboard); await this.initUserPage(); - await this.userPage.waitAndClick(e.reactionsButton); await this.userPage.waitAndClick(e.raiseHandBtn); - await this.userPage.waitAndClick(e.reactionsButton); - await this.userPage.hasElement(e.lowerHandBtn, 'should display the lower hand button for the attendee'); + await this.userPage.hasElement(e.raiseHandBtn, 'should display the lower hand button for the attendee'); await this.userPage.press('Escape'); await this.modPage.comparingSelectorsBackgroundColor(e.avatarsWrapperAvatar, `${e.userListItem} div:first-child`); await this.modPage.waitAndClick(e.raiseHandRejection); - await this.userPage.waitAndClick(e.reactionsButton); await this.userPage.hasElement(e.raiseHandBtn, 'should display the raise hand button for the attendee'); } diff --git a/bigbluebutton-web/grails-app/conf/bigbluebutton.properties b/bigbluebutton-web/grails-app/conf/bigbluebutton.properties index a8cfad93c8..e3c0f64911 100644 --- a/bigbluebutton-web/grails-app/conf/bigbluebutton.properties +++ b/bigbluebutton-web/grails-app/conf/bigbluebutton.properties @@ -127,6 +127,28 @@ officeToPdfConversionTimeout=60 #------------------------------------ officeToPdfMaxConcurrentConversions=4 +#------------------------------------ +# Presentation upload and conversion timeouts in milliseconds +#------------------------------------ +extractTimeoutInMs=10000 +pngCreationExecTimeoutInMs=10000 +thumbnailCreationExecTimeoutInMs=10000 +pdfPageDownscaleExecTimeoutInMs=10000 +officeDocumentValidationExecTimeoutInMs=25000 +textFileCreationExecTimeoutInMs=60000 +presDownloadReadTimeoutInMs=60000 + +#------------------------------------ +# Presentation upload and conversion timeouts in seconds +#------------------------------------ +pngCreationConversionTimeout=7 +pngCreationWait=7 +pdfToSvgTimeout=60 +imageResizeWait=7 +officeDocumentValidationTimeout=20 +presOfficeConversionTimeout=60 +pdfPageCountWait=5 + #---------------------------------------------------- # Additional conversion of the presentation slides to PNG # to be used in the IOS mobile client @@ -241,8 +263,8 @@ allowStartStopRecording=true recordFullDurationMedia=false # Number of minutes that Learning Dashboard will be available after the end of the meeting -# if 0, the Learning Dashboard will keep available permanently -# this is the default value, can be customized using the create API +# If 0, the Learning Dashboard will remain available permanently. +# Below is the default value, it can be customized using the create API. learningDashboardCleanupDelayInMinutes=2 # Allow webcams streaming reception only to and from moderators @@ -332,6 +354,7 @@ defaultHttpSessionTimeout=14400 # The default avatar image to display. useDefaultAvatar=false defaultAvatarURL=${bigbluebutton.web.serverURL}/html5client/resources/images/avatar.png +defaultBotAvatarURL=${bigbluebutton.web.serverURL}/html5client/resources/images/bot-avatar.png # The default webcam background image to display. useDefaultWebcamBackground=false @@ -477,3 +500,7 @@ breakoutRoomsEnabled=true # legacy, please use maxUserConcurrentAccesses instead allowDuplicateExtUserid=true + +# list of plugins manifests (json array) +# e.g: [{url: "https://plugin_manifest.json"}] +pluginManifests= diff --git a/bigbluebutton-web/grails-app/conf/spring/resources.xml b/bigbluebutton-web/grails-app/conf/spring/resources.xml index 638f0aca96..76b755c973 100755 --- a/bigbluebutton-web/grails-app/conf/spring/resources.xml +++ b/bigbluebutton-web/grails-app/conf/spring/resources.xml @@ -94,6 +94,7 @@ with BigBlueButton; if not, see . + @@ -162,6 +163,7 @@ with BigBlueButton; if not, see . + @@ -201,6 +203,7 @@ with BigBlueButton; if not, see . + @@ -215,6 +218,50 @@ with BigBlueButton; if not, see . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy index 7efcf7312a..ddf26f5550 100755 --- a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy +++ b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy @@ -301,6 +301,11 @@ class ApiController { authenticated = true } + Boolean bot = false; + if(!StringUtils.isEmpty(params.bot)) { + bot = Boolean.parseBoolean(params.bot) + } + if (!StringUtils.isEmpty(params.auth)) { authenticated = Boolean.parseBoolean(params.auth) @@ -435,6 +440,7 @@ class ApiController { us.mode = "LIVE" us.record = meeting.isRecord() us.welcome = meeting.getWelcomeMessage() + us.bot = bot us.guest = guest us.authed = authenticated us.guestStatus = guestStatusVal @@ -452,6 +458,8 @@ class ApiController { if (!StringUtils.isEmpty(params.avatarURL)) { us.avatarURL = params.avatarURL; + } else if (us.bot) { + us.avatarURL = meeting.defaultBotAvatarURL } else { us.avatarURL = meeting.defaultAvatarURL } @@ -494,6 +502,7 @@ class ApiController { sessionToken, us.avatarURL, us.webcamBackgroundURL, + us.bot, us.guest, us.authed, guestStatusVal, @@ -1857,6 +1866,8 @@ class ApiController { Boolean reenter = meeting.getEnteredUserById(us.internalUserId) != null; // User are able to rejoin if he already joined previously with the same extId Boolean userExtIdAlreadyJoined = meeting.getUsersWithExtId(us.externUserID).size() > 0 + // Bot users should not be affected by max partiicpants limitation + Boolean isBot = us.bot // Users that already joined the meeting // It will count only unique users in order to avoid the same user from filling all slots int joinedUniqueUsers = meeting.countUniqueExtIds() @@ -1866,7 +1877,7 @@ class ApiController { log.info("Entered users - ${enteredUsers}. Joined users - ${joinedUniqueUsers}") Boolean reachedMax = joinedUniqueUsers >= maxParticipants; - if (enabled && !rejoin && !reenter && !userExtIdAlreadyJoined && reachedMax) { + if (enabled && !rejoin && !reenter && !userExtIdAlreadyJoined && reachedMax && !isBot) { return true; } diff --git a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ConnectionController.groovy b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ConnectionController.groovy index 658b868aac..1f86d8b44b 100755 --- a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ConnectionController.groovy +++ b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ConnectionController.groovy @@ -90,6 +90,12 @@ class ConnectionController { } response.addHeader("Meeting-Id", userSession.meetingID) + response.addHeader("Meeting-External-Id", userSession.externMeetingID) + response.addHeader("User-Id", userSession.internalUserId) + response.addHeader("User-External-Id", userSession.externUserID) + response.addHeader("User-Name", URLEncoder.encode(userSession.fullname, StandardCharsets.UTF_8.name())) + response.addHeader("User-Is-Moderator", u && u.isModerator() ? "true" : "false") + response.addHeader("User-Is-Presenter", u && u.isPresenter() ? "true" : "false") response.setStatus(200) withFormat { json { @@ -109,6 +115,12 @@ class ConnectionController { UserSessionBasicData removedUserSession = meetingService.getRemovedUserSessionWithSessionToken(sessionToken) if(removedUserSession) { response.addHeader("Meeting-Id", removedUserSession.meetingId) + response.addHeader("Meeting-External-Id", removedUserSession.extMeetingId) + response.addHeader("User-Id", removedUserSession.userId) + response.addHeader("User-External-Id", removedUserSession.extUserId) + response.addHeader("User-Name", URLEncoder.encode(removedUserSession.userFullName, StandardCharsets.UTF_8.name())) + response.addHeader("User-Is-Moderator", removedUserSession.isModerator() ? "true" : "false") + response.addHeader("User-Is-Presenter", "false") response.setStatus(200) withFormat { json { diff --git a/build/setup.sh b/build/setup.sh index 24787fe913..091572556e 100755 --- a/build/setup.sh +++ b/build/setup.sh @@ -57,12 +57,12 @@ max_retries=5 retry_wait=300 # wait time in seconds (5 minutes) while [[ $retry_count -lt $max_retries ]]; do - if sudo docker pull "$DOCKER_IMAGE"; then + if sudo docker pull "$DOCKER_IMAGE" || false; then echo "Docker image pulled successfully." break else echo "Failed to pull Docker image, attempt $((retry_count+1))/$max_retries." - ((retry_count++)) + retry_count=$((retry_count+1)) if [[ $retry_count -lt $max_retries ]]; then echo "Waiting for $retry_wait seconds before retrying..." sleep $retry_wait diff --git a/docs/docs/administration/cluster-proxy.md b/docs/docs/administration/cluster-proxy.md index 1ed5430381..4e180bdf3e 100644 --- a/docs/docs/administration/cluster-proxy.md +++ b/docs/docs/administration/cluster-proxy.md @@ -114,7 +114,7 @@ public: app: basename: '/bbb-01/html5client' bbbWebBase: 'https://bbb-01.example.com/bigbluebutton' - learningDashboardBase: 'https://bbb-01.example.com/learning-dashboard' + learningDashboardBase: 'https://bbb-01.example.com/learning-analytics-dashboard' media: stunTurnServersFetchAddress: 'https://bbb-01.example.com/bigbluebutton/api/stuns' sip_ws_host: 'bbb-01.example.com' diff --git a/docs/docs/administration/customize.md b/docs/docs/administration/customize.md index 5e0075c2d5..9e431149d2 100644 --- a/docs/docs/administration/customize.md +++ b/docs/docs/administration/customize.md @@ -1400,8 +1400,10 @@ Useful tools for development: | `userdata-bbb_skip_echotest_if_previous_device=` | (Introduced in BigBlueButton 3.0) If set to `true`, the user will not see the "echo test" if session has valid input/output devices stored previously | `false` | | `userdata-bbb_override_default_locale=` | (Introduced in BigBlueButton 2.3) If set to `de`, the user's browser preference will be ignored - the client will be shown in 'de' (i.e. German) regardless of the otherwise preferred locale 'en' (or other) | `null` | | `userdata-bbb_hide_presentation_on_join` | (Introduced in BigBlueButton 2.6) If set to `true` it will make the user enter the meeting with presentation minimized (Only for non-presenters), not permanent. - -| `userdata-bbb_direct_leave_button` | (Introduced in BigBlueButton 2.7) If set to `true` it will make a button to leave the meeting appear to the left of the Options menu. | `false` | | `false` | +| `userdata-bbb_direct_leave_button` | (Introduced in BigBlueButton 2.7) If set to `true` it will make a button to leave the meeting appear to the left of the Options menu. | `false` | +| `userdata-bbb_parent_room_moderator=` | (Introduced in BigBlueButton 3.0) Only used in breakouts: if set to `true`, user will have permission to kick other users inside the breakout | `false` +| `userdata-bbb_record_permission=` | (Introduced in BigBlueButton 3.0) If set to `true`, the user will be able to control the recording start/stop. If set to `false`, the user will not be allowed to control the recording start/stop even if their role is moderator. Otherwise only moderators will have the control (default). | `null` | +| `userdata-bbb_record_permission_tooltip=` | (Introduced in BigBlueButton 3.0) If set, the tooltip of the recording indicator shown when the user don't have permission to record will be replaced by it's content. | `null` | #### Branding parameters diff --git a/docs/docs/data/join.tsx b/docs/docs/data/join.tsx index 689dd1bf9d..7a31094581 100644 --- a/docs/docs/data/join.tsx +++ b/docs/docs/data/join.tsx @@ -80,6 +80,12 @@ const joinEndpointTableData = [ "type": "String", "description": (<>Set to “true” to indicate that the user is a guest, otherwise do NOT send this parameter.) }, + { + "name": "bot", + "required": false, + "type": "String", + "description": (<>Set to “true” to indicate that the user is a bot or an automated agent, otherwise do NOT send this parameter.) + }, { "name": "excludeFromDashboard", "required": false, diff --git a/docs/docs/new-features.md b/docs/docs/new-features.md index 5f7f4d7d26..33658ed3d5 100644 --- a/docs/docs/new-features.md +++ b/docs/docs/new-features.md @@ -191,6 +191,7 @@ For full details on what is new in BigBlueButton 3.0, see the release notes. Recent releases: +- [3.0.0-beta.4](https://github.com/bigbluebutton/bigbluebutton/releases/tag/v3.0.0-beta.4) - [3.0.0-beta.3](https://github.com/bigbluebutton/bigbluebutton/releases/tag/v3.0.0-beta.3) - [3.0.0-beta.2](https://github.com/bigbluebutton/bigbluebutton/releases/tag/v3.0.0-beta.2) - [3.0.0-beta.1](https://github.com/bigbluebutton/bigbluebutton/releases/tag/v3.0.0-beta.1) diff --git a/docs/package-lock.json b/docs/package-lock.json index da46b1ce61..20f8eeddbd 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -4606,8 +4606,9 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.6.0", - "license": "MIT", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "engines": { "node": ">= 0.6" } @@ -5655,16 +5656,16 @@ } }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -6852,8 +6853,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "license": "MIT", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1",