@webex/plugin-meetings 3.0.0-beta.180 → 3.0.0-beta.182

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"names":["LocusInfo","updateMeeting","webex","meetingId","parsedLocus","states","emitChange","compareAndUpdateFlags","locusParser","LocusDeltaParser","action","locus","meeting","loci","DESYNC","USE_CURRENT","USE_INCOMING","locusInfo","onDeltaLocus","locusDesync","needToGetFullLocus","meetingRequest","getFullLocus","desync","locusUrl","url","then","res","onFullLocus","body","resume","LoggerProxy","logger","info","onDeltaAction","parsedLoci","applyLocusDeltaData","onDeltaEvent","created","scheduledMeeting","participantsUrl","replaces","aclUrl","baseSequence","sequence","membership","identities","participants","deltaParticipants","updateLocusCache","updateParticipants","updateConversationUrl","conversationUrl","updateControls","controls","self","updateLocusUrl","updateFullState","fullState","updateMeetingInfo","updateEmbeddedApps","embeddedApps","updateSelf","updateHostInfo","host","updateMediaShares","mediaShares","updateServices","links","services","data","eventType","getTheLocusToUpdate","LOCUSEVENT","PARTICIPANT_JOIN","PARTICIPANT_LEFT","CONTROLS_UPDATED","PARTICIPANT_AUDIO_MUTED","PARTICIPANT_AUDIO_UNMUTED","PARTICIPANT_VIDEO_MUTED","PARTICIPANT_VIDEO_UNMUTED","SELF_CHANGED","PARTICIPANT_UPDATED","PARTICIPANT_CONTROLS_UPDATED","PARTICIPANT_ROLES_UPDATED","PARTICIPANT_DECLINED","FLOOR_GRANTED","FLOOR_RELEASED","DIFFERENCE","handleLocusDelta","scope","eventName","args","emit","error","updateParticipantDeltas","isReplaceMembers","ControlsUtils","isNeedReplaceMembers","updateLocusInfo","isMeetingActive","handleOneOnOneEvent","workingCopy","type","_CALL_","_SIP_BRIDGE_","emitScoped","file","function","EVENTS","REMOTE_RESPONSE","remoteDeclined","remoteAnswered","reason","state","updateCreated","updateParticipantsUrl","updateReplace","replace","updateAclUrl","updateBasequence","updateSequence","updateMemberShip","updateIdentifiers","compareAndUpdate","length","find","participant","identity","_USER_","removed","partner","getLocusPartner","LOCUS","STATE","INACTIVE","warn","internal","newMetrics","submitClientEvent","name","options","DESTROY_MEETING","CALL_REMOVED_REASON","CALL_INACTIVE","shouldLeave","MEETING_STATE","STATES","LEFT","DECLINED","NOTIFIED","JOINED","PARTNER_LEFT","joinedWith","_LEFT_","IDLE","SELF_LEFT","_MEETING_","TERMINATING","MEETING_REMOVED_REASON","MEETING_INACTIVE_TERMINATING","FULLSTATE_REMOVED","SELF_REMOVED","compareSelfAndHost","compareHostAndSelf","selfIdentity","hostId","moderator","LOCUS_INFO_CAN_ASSIGN_HOST","canAssignHost","findParticipant","collection","item","person","id","generateDelta","prevState","newState","deltas","audioStatus","videoSlidesStatus","videoStatus","forEach","key","reduce","existingParticipant","delta","status","changed","push","isReplace","LOCUS_INFO_UPDATE_PARTICIPANTS","recordingId","record","modifiedBy","selfId","parse","getControls","updates","hasRecordingChanged","hasRecordingPausedChanged","hasMeetingContainerChanged","hasTranscribeChanged","hasEntryExitToneChanged","hasBreakoutChanged","hasVideoEnabledChanged","hasMuteOnEntryChanged","hasShareControlChanged","hasDisallowUnmuteChanged","hasReactionsChanged","hasReactionDisplayNamesChanged","hasViewTheParticipantListChanged","hasRaiseHandChanged","hasVideoChanged","hasInterpretationChanged","current","LOCUSINFO","CONTROLS_MUTE_ON_ENTRY_CHANGED","muteOnEntry","CONTROLS_SHARE_CONTROL_CHANGED","shareControl","CONTROLS_DISALLOW_UNMUTE_CHANGED","disallowUnmute","CONTROLS_REACTIONS_CHANGED","reactions","CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED","viewTheParticipantList","CONTROLS_RAISE_HAND_CHANGED","raiseHand","CONTROLS_VIDEO_CHANGED","video","paused","RECORDING_STATE","PAUSED","recording","RESUMED","RECORDING","CONTROLS_RECORDING_UPDATED","lastModified","meetingContainerUrl","meetingContainer","CONTROLS_MEETING_CONTAINER_UPDATED","transcribe","transcribing","caption","CONTROLS_MEETING_TRANSCRIBE_UPDATED","breakout","breakoutMoveId","SelfUtils","getReplacedBreakoutMoveId","device","CONTROLS_MEETING_BREAKOUT_UPDATED","interpretation","CONTROLS_MEETING_INTERPRETATION_UPDATED","entryExitTone","CONTROLS_ENTRY_EXIT_TONE_UPDATED","videoEnabled","unmuteVideoAllowed","SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED","unmuteAllowed","LINKS_SERVICES","result","FullState","getFullState","meetingStateChangedTo","FULL_STATE_MEETING_STATE_CHANGE","previousState","previous","meetingState","currentState","meetingTypeChangedTo","FULL_STATE_TYPE_UPDATE","parsedHosts","HostUtils","getHosts","isNewHost","LOCUS_INFO_UPDATE_HOST","newHost","oldHost","roles","getRoles","isJoined","parsedInfo","InfoUtils","getInfos","MEETING_INFO_UPDATED","isLocked","MEETING_LOCKED","isUnlocked","MEETING_UNLOCKED","EmbeddedAppsUtils","areSimilar","parsedEmbeddedApps","EMBEDDED_APPS_UPDATED","parsedMediaShares","MediaSharesUtils","getMediaShares","LOCUS_INFO_UPDATE_MEDIA_SHARES","parsedSelves","getSelves","element","getSipUrl","sipUri","moderatorChanged","layoutChanged","CONTROLS_MEETING_LAYOUT_UPDATED","layout","breakoutsChanged","SELF_MEETING_BREAKOUTS_CHANGED","breakoutSessions","interpretationChanged","SELF_MEETING_INTERPRETATION_CHANGED","selfParticipantId","isMediaInactiveOrReleased","DISCONNECT_DUE_TO_INACTIVITY","SELF_MODERATOR_CHANGED","isRolesChanged","SELF_ROLES_CHANGED","oldRoles","newRoles","isVideoMutedByOthersChanged","muted","remoteVideoMuted","localAudioUnmuteRequiredByServer","LOCAL_UNMUTE_REQUIRED","remoteMuted","isMutedByOthersChanged","SELF_REMOTE_MUTE_STATUS_UPDATED","localAudioUnmuteRequestedByServer","LOCAL_UNMUTE_REQUESTED","isUserUnadmitted","SELF_UNADMITTED_GUEST","isUserAdmitted","SELF_ADMITTED_GUEST","isMediaInactive","MEDIA_INACTIVITY","getMediaStatus","mediaSessions","audioStateChange","videoStateChange","shareStateChange","MEDIA_STATUS_CHANGE","currentMediaStatus","audio","shareStatus","share","isUserObserving","SELF_OBSERVING","canNotViewTheParticipantListChanged","SELF_CANNOT_VIEW_PARTICIPANT_LIST_CHANGE","canNotViewTheParticipantList","isSharingBlockedChanged","SELF_IS_SHARING_BLOCKED_CHANGE","isSharingBlocked","LOCUS_INFO_UPDATE_SELF","oldSelf","newSelf","LOCUS_INFO_UPDATE_URL","isMainSessionDTO","updateMainSessionLocusCache","newLocus","switchStatus","getSessionSwitchStatus","isReturnToMain","mainSessionLocusCache","isJoinToBreakout","CONTROLS_JOIN_BREAKOUT_FROM_MAIN","mainLocusUrl","sourceParticipants","existIndex","findIndex","p","splice","mainLocus","locusClone","objValue","srcValue","mergeParticipants","EventsScope"],"sources":["index.ts"],"sourcesContent":["import {isEqual, assignWith, cloneDeep} from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport EventsScope from '../common/events/events-scope';\nimport {\n EVENTS,\n LOCUSEVENT,\n _USER_,\n _CALL_,\n _SIP_BRIDGE_,\n MEETING_STATE,\n _MEETING_,\n LOCUSINFO,\n LOCUS,\n _LEFT_,\n MEETING_REMOVED_REASON,\n CALL_REMOVED_REASON,\n RECORDING_STATE,\n} from '../constants';\nimport InfoUtils from './infoUtils';\nimport FullState from './fullState';\nimport SelfUtils from './selfUtils';\nimport HostUtils from './hostUtils';\nimport ControlsUtils from './controlsUtils';\nimport EmbeddedAppsUtils from './embeddedAppsUtils';\nimport MediaSharesUtils from './mediaSharesUtils';\nimport LocusDeltaParser from './parser';\n\n/**\n * @description LocusInfo extends ChildEmitter to convert locusInfo info a private emitter to parent object\n * @export\n * @private\n * @class LocusInfo\n */\nexport default class LocusInfo extends EventsScope {\n compareAndUpdateFlags: any;\n emitChange: any;\n locusParser: any;\n meetingId: any;\n parsedLocus: any;\n updateMeeting: any;\n webex: any;\n aclUrl: any;\n baseSequence: any;\n created: any;\n deltaParticipants: any;\n identities: any;\n membership: any;\n participants: any;\n participantsUrl: any;\n replaces: any;\n scheduledMeeting: any;\n sequence: any;\n controls: any;\n conversationUrl: any;\n embeddedApps: any;\n fullState: any;\n host: any;\n info: any;\n roles: any;\n mediaShares: any;\n replace: any;\n url: any;\n services: any;\n mainSessionLocusCache: any;\n /**\n * Constructor\n * @param {boolean} updateMeeting true if the meeting should be updated\n * @param {object} webex\n * @param {string} meetingId\n * @returns {undefined}\n */\n constructor(updateMeeting, webex, meetingId) {\n super();\n this.parsedLocus = {\n states: [],\n };\n this.webex = webex;\n this.emitChange = false;\n this.compareAndUpdateFlags = {};\n this.meetingId = meetingId;\n this.updateMeeting = updateMeeting;\n this.locusParser = new LocusDeltaParser();\n }\n\n /**\n * Apply locus delta data to meeting\n * @param {string} action Locus delta action\n * @param {Locus} locus\n * @param {Meeting} meeting\n * @returns {undefined}\n */\n applyLocusDeltaData(action: string, locus: any, meeting: any) {\n const {DESYNC, USE_CURRENT, USE_INCOMING} = LocusDeltaParser.loci;\n\n switch (action) {\n case USE_INCOMING:\n meeting.locusInfo.onDeltaLocus(locus);\n break;\n case USE_CURRENT:\n meeting.locusDesync = false;\n meeting.needToGetFullLocus = false;\n break;\n case DESYNC:\n meeting.meetingRequest\n .getFullLocus({\n desync: true,\n locusUrl: locus.url ? locus.url : meeting.locusUrl,\n })\n .then((res) => {\n meeting.locusInfo.onFullLocus(res.body);\n // Notify parser to resume processing delta events\n // now that we have full locus from DESYNC.\n this.locusParser.resume();\n });\n break;\n default:\n LoggerProxy.logger.info(\n `Locus-info:index#applyLocusDeltaData --> Unknown locus delta action: ${action}`\n );\n }\n }\n\n /**\n * Adds locus delta to parser's queue\n * and registers a function handler\n * to recieve parsed actions from queue.\n * @param {Locus} locus\n * @param {Meeting} meeting\n * @returns {undefined}\n */\n handleLocusDelta(locus: any, meeting: any) {\n // register a function to process delta actions\n if (!this.locusParser.onDeltaAction) {\n // delta action, along with associated loci\n // is passed into the function.\n this.locusParser.onDeltaAction = (action, parsedLoci) => {\n this.applyLocusDeltaData(action, parsedLoci, meeting);\n };\n }\n // queue delta event with parser\n this.locusParser.onDeltaEvent(locus);\n }\n\n /**\n * @param {Locus} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n init(locus: any = {}) {\n this.created = locus.created || null;\n this.scheduledMeeting = locus.meeting || null;\n this.participantsUrl = locus.participantsUrl || null;\n this.replaces = locus.replaces || null;\n this.aclUrl = locus.aclUrl || null;\n this.baseSequence = locus.baseSequence || null;\n this.sequence = locus.sequence || null;\n this.membership = locus.membership || null;\n this.identities = locus.identities || null;\n this.participants = locus.participants || null;\n\n /**\n * Stores the delta values for a changed participant.\n *\n * @typedef {Object} DeltaParticipant\n * @property {Record<string, boolean>} delta - Contains changed streams.\n * @property {Object} person - Contains person data.\n */\n\n /**\n * Stored participant changes between the last event and the current event.\n * All previously stored events are overwritten between events.\n *\n * @instance\n * @type {Array<DeltaParticipant>}\n * @private\n * @member LocusInfo\n */\n this.deltaParticipants = [];\n\n this.updateLocusCache(locus);\n // above section only updates the locusInfo object\n // The below section makes sure it updates the locusInfo as well as updates the meeting object\n this.updateParticipants(locus.participants);\n // For 1:1 space meeting the conversation Url does not exist in locus.conversation\n this.updateConversationUrl(locus.conversationUrl, locus.info);\n this.updateControls(locus.controls, locus.self);\n this.updateLocusUrl(locus.url);\n this.updateFullState(locus.fullState);\n this.updateMeetingInfo(locus.info);\n this.updateEmbeddedApps(locus.embeddedApps);\n // self and participants generate sipUrl for 1:1 meeting\n this.updateSelf(locus.self, locus.participants);\n this.updateHostInfo(locus.host);\n this.updateMediaShares(locus.mediaShares);\n this.updateServices(locus.links?.services);\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n initialSetup(locus: object) {\n this.updateLocusCache(locus);\n this.onFullLocus(locus);\n\n // Change it to true after it receives it first locus object\n this.emitChange = true;\n }\n\n /**\n * @param {Meeting} meeting\n * @param {Object} data\n * @returns {undefined}\n * @memberof LocusInfo\n */\n parse(meeting: any, data: any) {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const {eventType} = data;\n const locus = this.getTheLocusToUpdate(data.locus);\n LoggerProxy.logger.info(`Locus-info:index#parse --> received locus data: ${eventType}`);\n\n switch (eventType) {\n case LOCUSEVENT.PARTICIPANT_JOIN:\n case LOCUSEVENT.PARTICIPANT_LEFT:\n case LOCUSEVENT.CONTROLS_UPDATED:\n case LOCUSEVENT.PARTICIPANT_AUDIO_MUTED:\n case LOCUSEVENT.PARTICIPANT_AUDIO_UNMUTED:\n case LOCUSEVENT.PARTICIPANT_VIDEO_MUTED:\n case LOCUSEVENT.PARTICIPANT_VIDEO_UNMUTED:\n case LOCUSEVENT.SELF_CHANGED:\n case LOCUSEVENT.PARTICIPANT_UPDATED:\n case LOCUSEVENT.PARTICIPANT_CONTROLS_UPDATED:\n case LOCUSEVENT.PARTICIPANT_ROLES_UPDATED:\n case LOCUSEVENT.PARTICIPANT_DECLINED:\n case LOCUSEVENT.FLOOR_GRANTED:\n case LOCUSEVENT.FLOOR_RELEASED:\n this.onFullLocus(locus, eventType);\n break;\n case LOCUSEVENT.DIFFERENCE:\n this.handleLocusDelta(locus, meeting);\n break;\n\n default:\n // Why will there be a event with no eventType ????\n // we may not need this, we can get full locus\n this.handleLocusDelta(locus, meeting);\n }\n }\n\n /**\n * @param {String} scope\n * @param {String} eventName\n * @param {Array} args\n * @returns {undefined}\n * @memberof LocusInfo\n */\n emitScoped(scope?: any, eventName?: string, args?: any) {\n return this.emit(scope, eventName, args);\n }\n\n /**\n * updates the locus with full locus object\n * @param {object} locus locus object\n * @param {string} eventType particulat locus event\n * @returns {object} null\n * @memberof LocusInfo\n */\n // eslint-disable-next-line @typescript-eslint/no-shadow\n onFullLocus(locus: any, eventType?: string) {\n if (!locus) {\n LoggerProxy.logger.error(\n 'Locus-info:index#onFullLocus --> object passed as argument was invalid, continuing.'\n );\n }\n this.updateParticipantDeltas(locus.participants);\n this.scheduledMeeting = locus.meeting || null;\n this.participants = locus.participants;\n const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants, isReplaceMembers);\n this.isMeetingActive();\n this.handleOneOnOneEvent(eventType);\n this.updateEmbeddedApps(locus.embeddedApps);\n // set current (working copy) for parser\n this.locusParser.workingCopy = locus;\n }\n\n // used for ringing stops on one on one\n /**\n * @param {String} eventType\n * @returns {undefined}\n * @memberof LocusInfo\n */\n // eslint-disable-next-line @typescript-eslint/no-shadow\n handleOneOnOneEvent(eventType: string) {\n if (\n this.parsedLocus.fullState.type === _CALL_ ||\n this.parsedLocus.fullState.type === _SIP_BRIDGE_\n ) {\n // for 1:1 bob calls alice and alice declines, notify the meeting state\n if (eventType === LOCUSEVENT.PARTICIPANT_DECLINED) {\n // trigger the event for stop ringing\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'handleOneonOneEvent',\n },\n EVENTS.REMOTE_RESPONSE,\n {\n remoteDeclined: true,\n remoteAnswered: false,\n }\n );\n }\n // for 1:1 bob calls alice and alice answers, notify the meeting state\n if (eventType === LOCUSEVENT.PARTICIPANT_JOIN) {\n // trigger the event for stop ringing\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'handleOneonOneEvent',\n },\n EVENTS.REMOTE_RESPONSE,\n {\n remoteDeclined: false,\n remoteAnswered: true,\n }\n );\n }\n }\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n onDeltaLocus(locus: any) {\n const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants, isReplaceMembers);\n this.isMeetingActive();\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateLocusInfo(locus) {\n if (locus.self?.reason === 'MOVED' && locus.self?.state === 'LEFT') {\n // When moved to a breakout session locus sends a message for the previous locus\n // indicating that we have been moved. It isn't helpful to continue parsing this\n // as it gets interpreted as if we have left the call\n return;\n }\n\n this.updateControls(locus.controls, locus.self);\n this.updateConversationUrl(locus.conversationUrl, locus.info);\n this.updateCreated(locus.created);\n this.updateFullState(locus.fullState);\n this.updateHostInfo(locus.host);\n this.updateMeetingInfo(locus.info, locus.self);\n this.updateMediaShares(locus.mediaShares);\n this.updateParticipantsUrl(locus.participantsUrl);\n this.updateReplace(locus.replace);\n this.updateSelf(locus.self, locus.participants);\n this.updateLocusUrl(locus.url);\n this.updateAclUrl(locus.aclUrl);\n this.updateBasequence(locus.baseSequence);\n this.updateSequence(locus.sequence);\n this.updateMemberShip(locus.membership);\n this.updateIdentifiers(locus.identities);\n this.updateEmbeddedApps(locus.embeddedApps);\n this.updateServices(locus.links?.services);\n this.compareAndUpdate();\n // update which required to compare different objects from locus\n }\n\n /**\n * @param {Array} participants\n * @param {Object} self\n * @returns {Array}\n * @memberof LocusInfo\n */\n getLocusPartner(participants: Array<any>, self: any) {\n if (!participants || participants.length === 0) {\n return null;\n }\n\n return (\n participants.find(\n (participant) =>\n self &&\n participant.identity !== self.identity &&\n (participants.length <= 2 || (participant.type === _USER_ && !participant.removed))\n // @ts-ignore\n ) || this.partner\n );\n }\n\n // TODO: all the leave states need to be checked\n /**\n * @returns {undefined}\n * @memberof LocusInfo\n */\n isMeetingActive() {\n if (\n this.parsedLocus.fullState.type === _CALL_ ||\n this.parsedLocus.fullState.type === _SIP_BRIDGE_\n ) {\n // @ts-ignore\n const partner = this.getLocusPartner(this.participants, this.self);\n\n this.updateMeeting({partner});\n\n // Check if guest user needs to be checked here\n\n // 1) when bob declines call from bob, (bob='DECLINED')\n // 2) When alice rejects call to bob , (bob='NOTIFIED')\n\n // When we dont add MEDIA for condition 2. The state of bob='IDLE'\n\n if (this.fullState && this.fullState.state === LOCUS.STATE.INACTIVE) {\n // TODO: update the meeting state\n LoggerProxy.logger.warn(\n 'Locus-info:index#isMeetingActive --> Call Ended, locus state is inactive.'\n );\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.CALL_INACTIVE,\n shouldLeave: false,\n }\n );\n } else if (\n partner.state === MEETING_STATE.STATES.LEFT &&\n this.parsedLocus.self &&\n (this.parsedLocus.self.state === MEETING_STATE.STATES.DECLINED ||\n this.parsedLocus.self.state === MEETING_STATE.STATES.NOTIFIED ||\n this.parsedLocus.self.state === MEETING_STATE.STATES.JOINED)\n ) {\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.PARTNER_LEFT,\n shouldLeave:\n this.parsedLocus.self.joinedWith && this.parsedLocus.self.joinedWith.state !== _LEFT_,\n }\n );\n } else if (\n this.parsedLocus.self &&\n this.parsedLocus.self.state === MEETING_STATE.STATES.LEFT &&\n (partner.state === MEETING_STATE.STATES.LEFT ||\n partner.state === MEETING_STATE.STATES.DECLINED ||\n partner.state === MEETING_STATE.STATES.NOTIFIED ||\n partner.state === MEETING_STATE.STATES.IDLE) // Happens when user just joins and adds no Media\n ) {\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.SELF_LEFT,\n shouldLeave: false,\n }\n );\n }\n } else if (this.parsedLocus.fullState.type === _MEETING_) {\n if (\n this.fullState &&\n (this.fullState.state === LOCUS.STATE.INACTIVE ||\n // @ts-ignore\n this.fullState.state === LOCUS.STATE.TERMINATING)\n ) {\n LoggerProxy.logger.warn(\n 'Locus-info:index#isMeetingActive --> Meeting is ending due to inactive or terminating'\n );\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.MEETING_INACTIVE_TERMINATING,\n shouldLeave: false,\n }\n );\n } else if (this.fullState && this.fullState.removed) {\n // user has been dropped from a meeting\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.FULLSTATE_REMOVED,\n shouldLeave: false,\n }\n );\n }\n // If you are guest and you are removed from the meeting\n // You wont get any further events\n else if (this.parsedLocus.self && this.parsedLocus.self.removed) {\n // Check if we need to send an event\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.SELF_REMOVED,\n shouldLeave: false,\n }\n );\n }\n } else {\n LoggerProxy.logger.warn('Locus-info:index#isMeetingActive --> Meeting Type is unknown.');\n }\n }\n\n /**\n * checks if the host permissions have changed while in the meeting\n * This would be the case if your role as host or moderator has been updated\n * @returns {undefined}\n * @memberof LocusInfo\n */\n compareAndUpdate() {\n // TODO: check with locus team on host and moderator doc\n // use host as a validator if needed\n if (\n this.compareAndUpdateFlags.compareSelfAndHost ||\n this.compareAndUpdateFlags.compareHostAndSelf\n ) {\n this.compareSelfAndHost();\n }\n }\n\n /**\n * compared the self object to check if the user has host permissions\n * @returns {undefined}\n * @memberof LocusInfo\n */\n compareSelfAndHost() {\n // In some cases the host info is not present but the moderator values changes from null to false so it triggers an update\n if (\n this.parsedLocus.self.selfIdentity === this.parsedLocus.host?.hostId &&\n this.parsedLocus.self.moderator\n ) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'compareSelfAndHost',\n },\n EVENTS.LOCUS_INFO_CAN_ASSIGN_HOST,\n {\n canAssignHost: true,\n }\n );\n } else {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'compareSelfAndHost',\n },\n EVENTS.LOCUS_INFO_CAN_ASSIGN_HOST,\n {\n canAssignHost: false,\n }\n );\n }\n }\n\n /**\n * Update the deltaParticipants property of this object based on a list of\n * provided participants.\n *\n * @param {Array} [participants] - The participants to update against.\n * @returns {void}\n */\n updateParticipantDeltas(participants: Array<any> = []) {\n // Used to find a participant within a participants collection.\n const findParticipant = (participant, collection) =>\n collection.find((item) => item.person.id === participant.person.id);\n\n // Generates an object that indicates which state properties have changed.\n const generateDelta = (prevState: any = {}, newState: any = {}) => {\n // Setup deltas.\n const deltas = {\n audioStatus: prevState.audioStatus !== newState.audioStatus,\n videoSlidesStatus: prevState.videoSlidesStatus !== newState.videoSlidesStatus,\n videoStatus: prevState.videoStatus !== newState.videoStatus,\n };\n\n // Clean the object\n Object.keys(deltas).forEach((key) => {\n if (deltas[key] !== true) {\n delete deltas[key];\n }\n });\n\n return deltas;\n };\n\n this.deltaParticipants = participants.reduce((collection, participant) => {\n const existingParticipant = findParticipant(participant, this.participants || []) || {};\n\n const delta = generateDelta(existingParticipant.status, participant.status);\n\n const changed = Object.keys(delta).length > 0;\n\n if (changed) {\n collection.push({\n person: participant.person,\n delta,\n });\n }\n\n return collection;\n }, []);\n }\n\n /**\n * update meeting's members\n * @param {Object} participants new participants object\n * @param {Boolean} isReplace is replace the whole members\n * @returns {Array} updatedParticipants\n * @memberof LocusInfo\n */\n updateParticipants(participants: object, isReplace?: boolean) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateParticipants',\n },\n EVENTS.LOCUS_INFO_UPDATE_PARTICIPANTS,\n {\n participants,\n recordingId: this.parsedLocus.controls && this.parsedLocus.controls.record?.modifiedBy,\n selfIdentity: this.parsedLocus.self && this.parsedLocus.self.selfIdentity,\n selfId: this.parsedLocus.self && this.parsedLocus.self.selfId,\n hostId: this.parsedLocus.host && this.parsedLocus.host.hostId,\n isReplace,\n }\n );\n }\n\n /**\n * @param {Object} controls\n * @param {Object} self\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateControls(controls: object, self: object) {\n if (controls && !isEqual(this.controls, controls)) {\n this.parsedLocus.controls = ControlsUtils.parse(controls);\n const {\n updates: {\n hasRecordingChanged,\n hasRecordingPausedChanged,\n hasMeetingContainerChanged,\n hasTranscribeChanged,\n hasEntryExitToneChanged,\n hasBreakoutChanged,\n hasVideoEnabledChanged,\n hasMuteOnEntryChanged,\n hasShareControlChanged,\n hasDisallowUnmuteChanged,\n hasReactionsChanged,\n hasReactionDisplayNamesChanged,\n hasViewTheParticipantListChanged,\n hasRaiseHandChanged,\n hasVideoChanged,\n hasInterpretationChanged,\n },\n current,\n } = ControlsUtils.getControls(this.controls, controls);\n\n if (hasMuteOnEntryChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_MUTE_ON_ENTRY_CHANGED,\n {state: current.muteOnEntry}\n );\n }\n\n if (hasShareControlChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_SHARE_CONTROL_CHANGED,\n {state: current.shareControl}\n );\n }\n\n if (hasDisallowUnmuteChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_DISALLOW_UNMUTE_CHANGED,\n {state: current.disallowUnmute}\n );\n }\n\n if (hasReactionsChanged || hasReactionDisplayNamesChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_REACTIONS_CHANGED,\n {state: current.reactions}\n );\n }\n\n if (hasViewTheParticipantListChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED,\n {state: current.viewTheParticipantList}\n );\n }\n\n if (hasRaiseHandChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_RAISE_HAND_CHANGED,\n {state: current.raiseHand}\n );\n }\n\n if (hasVideoChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_VIDEO_CHANGED,\n {state: current.video}\n );\n }\n\n if (hasRecordingChanged || hasRecordingPausedChanged) {\n let state = null;\n\n if (hasRecordingPausedChanged) {\n if (current.record.paused) {\n state = RECORDING_STATE.PAUSED;\n } else {\n // state will be `IDLE` if the recording is not active, even when there is a `pause` status change.\n state = current.record.recording ? RECORDING_STATE.RESUMED : RECORDING_STATE.IDLE;\n }\n } else if (hasRecordingChanged) {\n state = current.record.recording ? RECORDING_STATE.RECORDING : RECORDING_STATE.IDLE;\n }\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_RECORDING_UPDATED,\n {\n state,\n modifiedBy: current.record.modifiedBy,\n lastModified: current.record.lastModified,\n }\n );\n }\n\n if (hasMeetingContainerChanged) {\n const {meetingContainerUrl} = current.meetingContainer;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_CONTAINER_UPDATED,\n {\n meetingContainerUrl,\n }\n );\n }\n\n if (hasTranscribeChanged) {\n const {transcribing, caption} = current.transcribe;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_TRANSCRIBE_UPDATED,\n {\n transcribing,\n caption,\n }\n );\n }\n\n if (hasBreakoutChanged) {\n const {breakout} = current;\n breakout.breakoutMoveId = SelfUtils.getReplacedBreakoutMoveId(\n self,\n this.webex.internal.device.url\n );\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_BREAKOUT_UPDATED,\n {\n breakout,\n }\n );\n }\n\n if (hasInterpretationChanged) {\n const {interpretation} = current;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_INTERPRETATION_UPDATED,\n {\n interpretation,\n }\n );\n }\n\n if (hasEntryExitToneChanged) {\n const {entryExitTone} = current;\n\n this.updateMeeting({entryExitTone});\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_ENTRY_EXIT_TONE_UPDATED,\n {\n entryExitTone,\n }\n );\n }\n\n // videoEnabled is handled differently than other controls,\n // to fit with audio mute status logic\n if (hasVideoEnabledChanged) {\n const {videoEnabled} = current;\n\n this.updateMeeting({unmuteVideoAllowed: videoEnabled});\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,\n {\n // muted: not part of locus.controls\n unmuteAllowed: videoEnabled,\n }\n );\n }\n\n this.controls = controls;\n }\n }\n\n /**\n * @param {String} conversationUrl\n * @param {Object} info\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateConversationUrl(conversationUrl: string, info: any) {\n if (conversationUrl && !isEqual(this.conversationUrl, conversationUrl)) {\n this.conversationUrl = conversationUrl;\n this.updateMeeting({conversationUrl});\n } else if (\n info &&\n info.conversationUrl &&\n !isEqual(this.conversationUrl, info.conversationUrl)\n ) {\n this.conversationUrl = info.conversationUrl;\n this.updateMeeting({conversationUrl: info.conversationUrl});\n }\n }\n\n /**\n * @param {Object} created\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateCreated(created: object) {\n if (created && !isEqual(this.created, created)) {\n this.created = created;\n }\n }\n\n /**\n * @param {Object} services\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateServices(services: Record<'breakout' | 'record', {url: string}>) {\n if (services && !isEqual(this.services, services)) {\n this.services = services;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateServices',\n },\n LOCUSINFO.EVENTS.LINKS_SERVICES,\n {\n services,\n }\n );\n }\n }\n\n /**\n * @param {Object} fullState\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateFullState(fullState: object) {\n if (fullState && !isEqual(this.fullState, fullState)) {\n const result = FullState.getFullState(this.fullState, fullState);\n\n this.updateMeeting(result.current);\n\n if (result.updates.meetingStateChangedTo) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateFullState',\n },\n LOCUSINFO.EVENTS.FULL_STATE_MEETING_STATE_CHANGE,\n {\n previousState: result.previous && result.previous.meetingState,\n currentState: result.current.meetingState,\n }\n );\n }\n\n if (result.updates.meetingTypeChangedTo) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateFullState',\n },\n LOCUSINFO.EVENTS.FULL_STATE_TYPE_UPDATE,\n {\n type: result.current.type,\n }\n );\n }\n this.parsedLocus.fullState = result.current;\n this.fullState = fullState;\n }\n }\n\n /**\n * handles when the locus.host is updated\n * @param {Object} host the locus.host property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal event locus_info_update_host\n */\n updateHostInfo(host: object) {\n if (host && !isEqual(this.host, host)) {\n const parsedHosts = HostUtils.getHosts(this.host, host);\n\n this.updateMeeting(parsedHosts.current);\n this.parsedLocus.host = parsedHosts.current;\n if (parsedHosts.updates.isNewHost) {\n this.compareAndUpdateFlags.compareSelfAndHost = true;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateHostInfo',\n },\n EVENTS.LOCUS_INFO_UPDATE_HOST,\n {\n newHost: parsedHosts.current,\n oldHost: parsedHosts.previous,\n }\n );\n }\n this.host = host;\n } else {\n this.compareAndUpdateFlags.compareSelfAndHost = false;\n }\n }\n\n /**\n * @param {Object} info\n * @param {Object} self\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMeetingInfo(info: object, self?: object) {\n const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];\n if (\n (info && !isEqual(this.info, info)) ||\n (roles.length && !isEqual(this.roles, roles) && info)\n ) {\n const isJoined = SelfUtils.isJoined(self || this.parsedLocus.self);\n const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles, isJoined);\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo',\n },\n LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,\n {info: parsedInfo.current, self}\n );\n\n if (parsedInfo.updates.isLocked) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo',\n },\n LOCUSINFO.EVENTS.MEETING_LOCKED,\n info\n );\n }\n if (parsedInfo.updates.isUnlocked) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo',\n },\n LOCUSINFO.EVENTS.MEETING_UNLOCKED,\n info\n );\n }\n\n this.info = info;\n this.parsedLocus.info = parsedInfo.current;\n // Parses the info and adds necessary values\n this.updateMeeting(parsedInfo.current);\n }\n this.roles = roles;\n }\n\n /**\n * @param {Object} embeddedApps\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateEmbeddedApps(embeddedApps: object) {\n // don't do anything if the arrays of apps haven't changed significantly\n if (EmbeddedAppsUtils.areSimilar(this.embeddedApps, embeddedApps)) {\n return;\n }\n\n const parsedEmbeddedApps = EmbeddedAppsUtils.parse(embeddedApps);\n\n this.updateMeeting({embeddedApps: parsedEmbeddedApps});\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateEmbeddedApps',\n },\n LOCUSINFO.EVENTS.EMBEDDED_APPS_UPDATED,\n parsedEmbeddedApps\n );\n this.embeddedApps = embeddedApps;\n }\n\n /**\n * handles when the locus.mediaShares is updated\n * @param {Object} mediaShares the locus.mediaShares property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal event locus_info_update_media_shares\n */\n updateMediaShares(mediaShares: object) {\n if (mediaShares && !isEqual(this.mediaShares, mediaShares)) {\n const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);\n\n this.updateMeeting(parsedMediaShares.current);\n this.parsedLocus.mediaShares = parsedMediaShares.current;\n this.mediaShares = mediaShares;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMediaShares',\n },\n EVENTS.LOCUS_INFO_UPDATE_MEDIA_SHARES,\n {\n current: parsedMediaShares.current,\n previous: parsedMediaShares.previous,\n }\n );\n }\n }\n\n /**\n * @param {String} participantsUrl\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateParticipantsUrl(participantsUrl: string) {\n if (participantsUrl && !isEqual(this.participantsUrl, participantsUrl)) {\n this.participantsUrl = participantsUrl;\n }\n }\n\n /**\n * @param {Object} replace\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateReplace(replace: object) {\n if (replace && !isEqual(this.replace, replace)) {\n this.replace = replace;\n }\n }\n\n /**\n * handles when the locus.self is updated\n * @param {Object} self the locus.mediaShares property\n * @param {Array} participants the locus.participants property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal events self_admitted_guest, self_unadmitted_guest, locus_info_update_self\n */\n updateSelf(self: any, participants: Array<any>) {\n // @ts-ignore - check where this.self come from\n if (self && !isEqual(this.self, self)) {\n // @ts-ignore\n const parsedSelves = SelfUtils.getSelves(this.self, self, this.webex.internal.device.url);\n\n this.updateMeeting(parsedSelves.current);\n this.parsedLocus.self = parsedSelves.current;\n\n const element = this.parsedLocus.states[this.parsedLocus.states.length - 1];\n\n if (element !== parsedSelves.current.state) {\n this.parsedLocus.states.push(parsedSelves.current.state);\n }\n\n // TODO: check if we need to save the sipUri here as well\n // this.emit(LOCUSINFO.EVENTS.MEETING_UPDATE, SelfUtils.getSipUrl(this.getLocusPartner(participants, self), this.parsedLocus.fullState.type, this.parsedLocus.info.sipUri));\n const result = SelfUtils.getSipUrl(\n this.getLocusPartner(participants, self),\n this.parsedLocus.fullState.type,\n this.parsedLocus.info.sipUri\n );\n\n if (result.sipUri) {\n this.updateMeeting(result);\n }\n\n if (parsedSelves.updates.moderatorChanged) {\n this.compareAndUpdateFlags.compareHostAndSelf = true;\n } else {\n this.compareAndUpdateFlags.compareHostAndSelf = false;\n }\n\n if (parsedSelves.updates.layoutChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_LAYOUT_UPDATED,\n {layout: parsedSelves.current.layout}\n );\n }\n\n if (parsedSelves.updates.breakoutsChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_MEETING_BREAKOUTS_CHANGED,\n {breakoutSessions: parsedSelves.current.breakoutSessions}\n );\n }\n\n if (parsedSelves.updates.interpretationChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_MEETING_INTERPRETATION_CHANGED,\n {\n interpretation: parsedSelves.current.interpretation,\n selfParticipantId: parsedSelves.current.selfId,\n }\n );\n }\n\n if (parsedSelves.updates.isMediaInactiveOrReleased) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.DISCONNECT_DUE_TO_INACTIVITY,\n {reason: self.reason}\n );\n }\n\n if (parsedSelves.updates.moderatorChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_MODERATOR_CHANGED,\n self\n );\n }\n\n if (parsedSelves.updates.isRolesChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_ROLES_CHANGED,\n {oldRoles: parsedSelves.previous?.roles, newRoles: parsedSelves.current?.roles}\n );\n }\n\n if (parsedSelves.updates.isVideoMutedByOthersChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,\n {\n muted: parsedSelves.current.remoteVideoMuted,\n // unmuteAllowed: not part of .self\n }\n );\n }\n if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUIRED,\n {\n muted: parsedSelves.current.remoteMuted,\n unmuteAllowed: parsedSelves.current.unmuteAllowed,\n }\n );\n }\n if (parsedSelves.updates.isMutedByOthersChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_MUTE_STATUS_UPDATED,\n {\n muted: parsedSelves.current.remoteMuted,\n unmuteAllowed: parsedSelves.current.unmuteAllowed,\n }\n );\n }\n if (parsedSelves.updates.localAudioUnmuteRequestedByServer) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUESTED,\n {}\n );\n }\n if (parsedSelves.updates.isUserUnadmitted) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_UNADMITTED_GUEST,\n self\n );\n }\n if (parsedSelves.updates.isUserAdmitted) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_ADMITTED_GUEST,\n self\n );\n }\n\n if (parsedSelves.updates.isMediaInactive) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n // @ts-ignore\n LOCUSINFO.EVENTS.MEDIA_INACTIVITY,\n SelfUtils.getMediaStatus(self.mediaSessions)\n );\n }\n\n if (\n parsedSelves.updates.audioStateChange ||\n parsedSelves.updates.videoStateChange ||\n parsedSelves.updates.shareStateChange\n ) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.MEDIA_STATUS_CHANGE,\n {\n audioStatus: parsedSelves.current.currentMediaStatus?.audio,\n videoStatus: parsedSelves.current.currentMediaStatus?.video,\n shareStatus: parsedSelves.current.currentMediaStatus?.share,\n }\n );\n }\n\n if (parsedSelves.updates.isUserObserving) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_OBSERVING\n );\n }\n\n if (parsedSelves.updates.canNotViewTheParticipantListChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_CANNOT_VIEW_PARTICIPANT_LIST_CHANGE,\n {canNotViewTheParticipantList: parsedSelves.current.canNotViewTheParticipantList}\n );\n }\n\n if (parsedSelves.updates.isSharingBlockedChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_IS_SHARING_BLOCKED_CHANGE,\n {isSharingBlocked: parsedSelves.current.isSharingBlocked}\n );\n }\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n EVENTS.LOCUS_INFO_UPDATE_SELF,\n {\n oldSelf: parsedSelves.previous,\n newSelf: parsedSelves.current,\n }\n );\n this.parsedLocus.self = parsedSelves.current;\n // @ts-ignore\n this.self = self;\n } else {\n this.compareAndUpdateFlags.compareHostAndSelf = false;\n }\n }\n\n /**\n * handles when the locus.url is updated\n * @param {String} url\n * @returns {undefined}\n * emits internal event locus_info_update_url\n */\n updateLocusUrl(url: string) {\n if (url && this.url !== url) {\n this.url = url;\n this.updateMeeting({locusUrl: url});\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateLocusUrl',\n },\n EVENTS.LOCUS_INFO_UPDATE_URL,\n url\n );\n }\n }\n\n /**\n * @param {String} aclUrl\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateAclUrl(aclUrl: string) {\n if (aclUrl && !isEqual(this.aclUrl, aclUrl)) {\n this.aclUrl = aclUrl;\n }\n }\n\n /**\n * @param {Number} baseSequence\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateBasequence(baseSequence: number) {\n if (baseSequence && !isEqual(this.baseSequence, baseSequence)) {\n this.baseSequence = baseSequence;\n }\n }\n\n /**\n * @param {Number} sequence\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateSequence(sequence: number) {\n if (sequence && !isEqual(this.sequence, sequence)) {\n this.sequence = sequence;\n }\n }\n\n /**\n * @param {Object} membership\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMemberShip(membership: object) {\n if (membership && !isEqual(this.membership, membership)) {\n this.membership = membership;\n }\n }\n\n /**\n * @param {Array} identities\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateIdentifiers(identities: Array<any>) {\n if (identities && !isEqual(this.identities, identities)) {\n this.identities = identities;\n }\n }\n\n /**\n * check the locus is main session's one or not, if is main session's, update main session cache\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateLocusCache(locus: any) {\n const isMainSessionDTO = ControlsUtils.isMainSessionDTO(locus);\n if (isMainSessionDTO) {\n this.updateMainSessionLocusCache(locus);\n }\n }\n\n /**\n * if return from breakout to main session, need to use cached main session DTO since locus won't send the full locus (participants)\n * if join breakout from main session, need to query main locus url (if response with 403 means no privilege, need to clear the cache)\n * @param {Object} newLocus\n * @returns {Object}\n * @memberof LocusInfo\n */\n getTheLocusToUpdate(newLocus: any) {\n const switchStatus = ControlsUtils.getSessionSwitchStatus(this.controls, newLocus?.controls);\n if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {\n return cloneDeep(this.mainSessionLocusCache);\n }\n if (switchStatus.isJoinToBreakout) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_JOIN_BREAKOUT_FROM_MAIN,\n {\n mainLocusUrl: this.url,\n }\n );\n }\n\n return newLocus;\n }\n\n /**\n * merge participants by participant id\n * @param {Array} participants\n * @param {Array} sourceParticipants\n * @returns {Array} merged participants\n * @memberof LocusInfo\n */\n // eslint-disable-next-line class-methods-use-this\n mergeParticipants(participants, sourceParticipants) {\n if (!sourceParticipants || !sourceParticipants.length) return participants;\n if (!participants || !participants.length) {\n return sourceParticipants;\n }\n sourceParticipants.forEach((participant) => {\n const existIndex = participants.findIndex((p) => p.id === participant.id);\n if (existIndex > -1) {\n participants.splice(existIndex, 1, participant);\n } else {\n participants.push(participant);\n }\n });\n\n return participants;\n }\n\n /**\n * need cache main sessions' participants since locus will not send the full list when cohost/host leave breakout\n * @param {Object} mainLocus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMainSessionLocusCache(mainLocus: any) {\n if (!mainLocus) {\n return;\n }\n const locusClone = cloneDeep(mainLocus);\n if (this.mainSessionLocusCache) {\n // shallow merge and do special merge for participants\n assignWith(this.mainSessionLocusCache, locusClone, (objValue, srcValue, key) => {\n if (key === 'participants') {\n return this.mergeParticipants(objValue, srcValue);\n }\n\n return srcValue || objValue;\n });\n } else {\n this.mainSessionLocusCache = locusClone;\n }\n }\n\n /**\n * clear main session cache\n * @returns {undefined}\n * @memberof LocusInfo\n */\n clearMainSessionLocusCache() {\n this.mainSessionLocusCache = null;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["LocusInfo","updateMeeting","webex","meetingId","parsedLocus","states","emitChange","compareAndUpdateFlags","locusParser","LocusDeltaParser","action","locus","meeting","loci","DESYNC","USE_CURRENT","USE_INCOMING","locusInfo","onDeltaLocus","locusDesync","needToGetFullLocus","meetingRequest","getFullLocus","desync","locusUrl","url","then","res","onFullLocus","body","resume","LoggerProxy","logger","info","onDeltaAction","parsedLoci","applyLocusDeltaData","onDeltaEvent","created","scheduledMeeting","participantsUrl","replaces","aclUrl","baseSequence","sequence","membership","identities","participants","deltaParticipants","updateLocusCache","updateParticipants","updateConversationUrl","conversationUrl","updateControls","controls","self","updateLocusUrl","updateFullState","fullState","updateMeetingInfo","updateEmbeddedApps","embeddedApps","updateSelf","updateHostInfo","host","updateMediaShares","mediaShares","updateServices","links","services","data","eventType","getTheLocusToUpdate","LOCUSEVENT","PARTICIPANT_JOIN","PARTICIPANT_LEFT","CONTROLS_UPDATED","PARTICIPANT_AUDIO_MUTED","PARTICIPANT_AUDIO_UNMUTED","PARTICIPANT_VIDEO_MUTED","PARTICIPANT_VIDEO_UNMUTED","SELF_CHANGED","PARTICIPANT_UPDATED","PARTICIPANT_CONTROLS_UPDATED","PARTICIPANT_ROLES_UPDATED","PARTICIPANT_DECLINED","FLOOR_GRANTED","FLOOR_RELEASED","DIFFERENCE","handleLocusDelta","scope","eventName","args","emit","error","isNewFullLocus","updateParticipantDeltas","isReplaceMembers","ControlsUtils","isNeedReplaceMembers","updateLocusInfo","isMeetingActive","handleOneOnOneEvent","workingCopy","type","_CALL_","_SIP_BRIDGE_","emitScoped","file","function","EVENTS","REMOTE_RESPONSE","remoteDeclined","remoteAnswered","reason","state","updateCreated","updateParticipantsUrl","updateReplace","replace","updateAclUrl","updateBasequence","updateSequence","updateMemberShip","updateIdentifiers","compareAndUpdate","length","find","participant","identity","_USER_","removed","partner","getLocusPartner","LOCUS","STATE","INACTIVE","warn","internal","newMetrics","submitClientEvent","name","options","DESTROY_MEETING","CALL_REMOVED_REASON","CALL_INACTIVE","shouldLeave","MEETING_STATE","STATES","LEFT","DECLINED","NOTIFIED","JOINED","PARTNER_LEFT","joinedWith","_LEFT_","IDLE","SELF_LEFT","_MEETING_","TERMINATING","MEETING_REMOVED_REASON","MEETING_INACTIVE_TERMINATING","FULLSTATE_REMOVED","SELF_REMOVED","compareSelfAndHost","compareHostAndSelf","selfIdentity","hostId","moderator","LOCUS_INFO_CAN_ASSIGN_HOST","canAssignHost","findParticipant","collection","item","person","id","generateDelta","prevState","newState","deltas","audioStatus","videoSlidesStatus","videoStatus","forEach","key","reduce","existingParticipant","delta","status","changed","push","isReplace","LOCUS_INFO_UPDATE_PARTICIPANTS","recordingId","record","modifiedBy","selfId","parse","getControls","updates","hasRecordingChanged","hasRecordingPausedChanged","hasMeetingContainerChanged","hasTranscribeChanged","hasEntryExitToneChanged","hasBreakoutChanged","hasVideoEnabledChanged","hasMuteOnEntryChanged","hasShareControlChanged","hasDisallowUnmuteChanged","hasReactionsChanged","hasReactionDisplayNamesChanged","hasViewTheParticipantListChanged","hasRaiseHandChanged","hasVideoChanged","hasInterpretationChanged","current","LOCUSINFO","CONTROLS_MUTE_ON_ENTRY_CHANGED","muteOnEntry","CONTROLS_SHARE_CONTROL_CHANGED","shareControl","CONTROLS_DISALLOW_UNMUTE_CHANGED","disallowUnmute","CONTROLS_REACTIONS_CHANGED","reactions","CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED","viewTheParticipantList","CONTROLS_RAISE_HAND_CHANGED","raiseHand","CONTROLS_VIDEO_CHANGED","video","paused","RECORDING_STATE","PAUSED","recording","RESUMED","RECORDING","CONTROLS_RECORDING_UPDATED","lastModified","meetingContainerUrl","meetingContainer","CONTROLS_MEETING_CONTAINER_UPDATED","transcribe","transcribing","caption","CONTROLS_MEETING_TRANSCRIBE_UPDATED","breakout","breakoutMoveId","SelfUtils","getReplacedBreakoutMoveId","device","CONTROLS_MEETING_BREAKOUT_UPDATED","interpretation","CONTROLS_MEETING_INTERPRETATION_UPDATED","entryExitTone","CONTROLS_ENTRY_EXIT_TONE_UPDATED","videoEnabled","unmuteVideoAllowed","SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED","unmuteAllowed","LINKS_SERVICES","result","FullState","getFullState","meetingStateChangedTo","FULL_STATE_MEETING_STATE_CHANGE","previousState","previous","meetingState","currentState","meetingTypeChangedTo","FULL_STATE_TYPE_UPDATE","parsedHosts","HostUtils","getHosts","isNewHost","LOCUS_INFO_UPDATE_HOST","newHost","oldHost","roles","getRoles","isJoined","parsedInfo","InfoUtils","getInfos","MEETING_INFO_UPDATED","isLocked","MEETING_LOCKED","isUnlocked","MEETING_UNLOCKED","EmbeddedAppsUtils","areSimilar","parsedEmbeddedApps","EMBEDDED_APPS_UPDATED","parsedMediaShares","MediaSharesUtils","getMediaShares","LOCUS_INFO_UPDATE_MEDIA_SHARES","parsedSelves","getSelves","element","getSipUrl","sipUri","moderatorChanged","layoutChanged","CONTROLS_MEETING_LAYOUT_UPDATED","layout","breakoutsChanged","SELF_MEETING_BREAKOUTS_CHANGED","breakoutSessions","interpretationChanged","SELF_MEETING_INTERPRETATION_CHANGED","selfParticipantId","isMediaInactiveOrReleased","DISCONNECT_DUE_TO_INACTIVITY","SELF_MODERATOR_CHANGED","isRolesChanged","SELF_ROLES_CHANGED","oldRoles","newRoles","isVideoMutedByOthersChanged","muted","remoteVideoMuted","localAudioUnmuteRequiredByServer","LOCAL_UNMUTE_REQUIRED","remoteMuted","isMutedByOthersChanged","SELF_REMOTE_MUTE_STATUS_UPDATED","localAudioUnmuteRequestedByServer","LOCAL_UNMUTE_REQUESTED","isUserUnadmitted","SELF_UNADMITTED_GUEST","isUserAdmitted","SELF_ADMITTED_GUEST","isMediaInactive","MEDIA_INACTIVITY","getMediaStatus","mediaSessions","audioStateChange","videoStateChange","shareStateChange","MEDIA_STATUS_CHANGE","currentMediaStatus","audio","shareStatus","share","isUserObserving","SELF_OBSERVING","canNotViewTheParticipantListChanged","SELF_CANNOT_VIEW_PARTICIPANT_LIST_CHANGE","canNotViewTheParticipantList","isSharingBlockedChanged","SELF_IS_SHARING_BLOCKED_CHANGE","isSharingBlocked","LOCUS_INFO_UPDATE_SELF","oldSelf","newSelf","LOCUS_INFO_UPDATE_URL","isMainSessionDTO","updateMainSessionLocusCache","newLocus","switchStatus","getSessionSwitchStatus","isReturnToMain","mainSessionLocusCache","isJoinToBreakout","CONTROLS_JOIN_BREAKOUT_FROM_MAIN","mainLocusUrl","sourceParticipants","existIndex","findIndex","p","splice","mainLocus","locusClone","objValue","srcValue","mergeParticipants","EventsScope"],"sources":["index.ts"],"sourcesContent":["import {isEqual, assignWith, cloneDeep} from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport EventsScope from '../common/events/events-scope';\nimport {\n EVENTS,\n LOCUSEVENT,\n _USER_,\n _CALL_,\n _SIP_BRIDGE_,\n MEETING_STATE,\n _MEETING_,\n LOCUSINFO,\n LOCUS,\n _LEFT_,\n MEETING_REMOVED_REASON,\n CALL_REMOVED_REASON,\n RECORDING_STATE,\n} from '../constants';\nimport InfoUtils from './infoUtils';\nimport FullState from './fullState';\nimport SelfUtils from './selfUtils';\nimport HostUtils from './hostUtils';\nimport ControlsUtils from './controlsUtils';\nimport EmbeddedAppsUtils from './embeddedAppsUtils';\nimport MediaSharesUtils from './mediaSharesUtils';\nimport LocusDeltaParser from './parser';\n\n/**\n * @description LocusInfo extends ChildEmitter to convert locusInfo info a private emitter to parent object\n * @export\n * @private\n * @class LocusInfo\n */\nexport default class LocusInfo extends EventsScope {\n compareAndUpdateFlags: any;\n emitChange: any;\n locusParser: any;\n meetingId: any;\n parsedLocus: any;\n updateMeeting: any;\n webex: any;\n aclUrl: any;\n baseSequence: any;\n created: any;\n deltaParticipants: any;\n identities: any;\n membership: any;\n participants: any;\n participantsUrl: any;\n replaces: any;\n scheduledMeeting: any;\n sequence: any;\n controls: any;\n conversationUrl: any;\n embeddedApps: any;\n fullState: any;\n host: any;\n info: any;\n roles: any;\n mediaShares: any;\n replace: any;\n url: any;\n services: any;\n mainSessionLocusCache: any;\n /**\n * Constructor\n * @param {boolean} updateMeeting true if the meeting should be updated\n * @param {object} webex\n * @param {string} meetingId\n * @returns {undefined}\n */\n constructor(updateMeeting, webex, meetingId) {\n super();\n this.parsedLocus = {\n states: [],\n };\n this.webex = webex;\n this.emitChange = false;\n this.compareAndUpdateFlags = {};\n this.meetingId = meetingId;\n this.updateMeeting = updateMeeting;\n this.locusParser = new LocusDeltaParser();\n }\n\n /**\n * Apply locus delta data to meeting\n * @param {string} action Locus delta action\n * @param {Locus} locus\n * @param {Meeting} meeting\n * @returns {undefined}\n */\n applyLocusDeltaData(action: string, locus: any, meeting: any) {\n const {DESYNC, USE_CURRENT, USE_INCOMING} = LocusDeltaParser.loci;\n\n switch (action) {\n case USE_INCOMING:\n meeting.locusInfo.onDeltaLocus(locus);\n break;\n case USE_CURRENT:\n meeting.locusDesync = false;\n meeting.needToGetFullLocus = false;\n break;\n case DESYNC:\n meeting.meetingRequest\n .getFullLocus({\n desync: true,\n locusUrl: locus.url ? locus.url : meeting.locusUrl,\n })\n .then((res) => {\n meeting.locusInfo.onFullLocus(res.body);\n // Notify parser to resume processing delta events\n // now that we have full locus from DESYNC.\n this.locusParser.resume();\n });\n break;\n default:\n LoggerProxy.logger.info(\n `Locus-info:index#applyLocusDeltaData --> Unknown locus delta action: ${action}`\n );\n }\n }\n\n /**\n * Adds locus delta to parser's queue\n * and registers a function handler\n * to recieve parsed actions from queue.\n * @param {Locus} locus\n * @param {Meeting} meeting\n * @returns {undefined}\n */\n handleLocusDelta(locus: any, meeting: any) {\n // register a function to process delta actions\n if (!this.locusParser.onDeltaAction) {\n // delta action, along with associated loci\n // is passed into the function.\n this.locusParser.onDeltaAction = (action, parsedLoci) => {\n this.applyLocusDeltaData(action, parsedLoci, meeting);\n };\n }\n // queue delta event with parser\n this.locusParser.onDeltaEvent(locus);\n }\n\n /**\n * @param {Locus} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n init(locus: any = {}) {\n this.created = locus.created || null;\n this.scheduledMeeting = locus.meeting || null;\n this.participantsUrl = locus.participantsUrl || null;\n this.replaces = locus.replaces || null;\n this.aclUrl = locus.aclUrl || null;\n this.baseSequence = locus.baseSequence || null;\n this.sequence = locus.sequence || null;\n this.membership = locus.membership || null;\n this.identities = locus.identities || null;\n this.participants = locus.participants || null;\n\n /**\n * Stores the delta values for a changed participant.\n *\n * @typedef {Object} DeltaParticipant\n * @property {Record<string, boolean>} delta - Contains changed streams.\n * @property {Object} person - Contains person data.\n */\n\n /**\n * Stored participant changes between the last event and the current event.\n * All previously stored events are overwritten between events.\n *\n * @instance\n * @type {Array<DeltaParticipant>}\n * @private\n * @member LocusInfo\n */\n this.deltaParticipants = [];\n\n this.updateLocusCache(locus);\n // above section only updates the locusInfo object\n // The below section makes sure it updates the locusInfo as well as updates the meeting object\n this.updateParticipants(locus.participants);\n // For 1:1 space meeting the conversation Url does not exist in locus.conversation\n this.updateConversationUrl(locus.conversationUrl, locus.info);\n this.updateControls(locus.controls, locus.self);\n this.updateLocusUrl(locus.url);\n this.updateFullState(locus.fullState);\n this.updateMeetingInfo(locus.info);\n this.updateEmbeddedApps(locus.embeddedApps);\n // self and participants generate sipUrl for 1:1 meeting\n this.updateSelf(locus.self, locus.participants);\n this.updateHostInfo(locus.host);\n this.updateMediaShares(locus.mediaShares);\n this.updateServices(locus.links?.services);\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n initialSetup(locus: object) {\n this.updateLocusCache(locus);\n this.onFullLocus(locus);\n\n // Change it to true after it receives it first locus object\n this.emitChange = true;\n }\n\n /**\n * @param {Meeting} meeting\n * @param {Object} data\n * @returns {undefined}\n * @memberof LocusInfo\n */\n parse(meeting: any, data: any) {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const {eventType} = data;\n const locus = this.getTheLocusToUpdate(data.locus);\n LoggerProxy.logger.info(`Locus-info:index#parse --> received locus data: ${eventType}`);\n\n switch (eventType) {\n case LOCUSEVENT.PARTICIPANT_JOIN:\n case LOCUSEVENT.PARTICIPANT_LEFT:\n case LOCUSEVENT.CONTROLS_UPDATED:\n case LOCUSEVENT.PARTICIPANT_AUDIO_MUTED:\n case LOCUSEVENT.PARTICIPANT_AUDIO_UNMUTED:\n case LOCUSEVENT.PARTICIPANT_VIDEO_MUTED:\n case LOCUSEVENT.PARTICIPANT_VIDEO_UNMUTED:\n case LOCUSEVENT.SELF_CHANGED:\n case LOCUSEVENT.PARTICIPANT_UPDATED:\n case LOCUSEVENT.PARTICIPANT_CONTROLS_UPDATED:\n case LOCUSEVENT.PARTICIPANT_ROLES_UPDATED:\n case LOCUSEVENT.PARTICIPANT_DECLINED:\n case LOCUSEVENT.FLOOR_GRANTED:\n case LOCUSEVENT.FLOOR_RELEASED:\n this.onFullLocus(locus, eventType);\n break;\n case LOCUSEVENT.DIFFERENCE:\n this.handleLocusDelta(locus, meeting);\n break;\n\n default:\n // Why will there be a event with no eventType ????\n // we may not need this, we can get full locus\n this.handleLocusDelta(locus, meeting);\n }\n }\n\n /**\n * @param {String} scope\n * @param {String} eventName\n * @param {Array} args\n * @returns {undefined}\n * @memberof LocusInfo\n */\n emitScoped(scope?: any, eventName?: string, args?: any) {\n return this.emit(scope, eventName, args);\n }\n\n /**\n * updates the locus with full locus object\n * @param {object} locus locus object\n * @param {string} eventType particulat locus event\n * @returns {object} null\n * @memberof LocusInfo\n */\n onFullLocus(locus: any, eventType?: string) {\n if (!locus) {\n LoggerProxy.logger.error(\n 'Locus-info:index#onFullLocus --> object passed as argument was invalid, continuing.'\n );\n }\n\n if (!this.locusParser.isNewFullLocus(locus)) {\n LoggerProxy.logger.info(\n `Locus-info:index#onFullLocus --> ignoring old full locus DTO, eventType=${eventType}`\n );\n\n return;\n }\n this.updateParticipantDeltas(locus.participants);\n this.scheduledMeeting = locus.meeting || null;\n this.participants = locus.participants;\n const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants, isReplaceMembers);\n this.isMeetingActive();\n this.handleOneOnOneEvent(eventType);\n this.updateEmbeddedApps(locus.embeddedApps);\n // set current (working copy) for parser\n this.locusParser.workingCopy = locus;\n }\n\n // used for ringing stops on one on one\n /**\n * @param {String} eventType\n * @returns {undefined}\n * @memberof LocusInfo\n */\n // eslint-disable-next-line @typescript-eslint/no-shadow\n handleOneOnOneEvent(eventType: string) {\n if (\n this.parsedLocus.fullState.type === _CALL_ ||\n this.parsedLocus.fullState.type === _SIP_BRIDGE_\n ) {\n // for 1:1 bob calls alice and alice declines, notify the meeting state\n if (eventType === LOCUSEVENT.PARTICIPANT_DECLINED) {\n // trigger the event for stop ringing\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'handleOneonOneEvent',\n },\n EVENTS.REMOTE_RESPONSE,\n {\n remoteDeclined: true,\n remoteAnswered: false,\n }\n );\n }\n // for 1:1 bob calls alice and alice answers, notify the meeting state\n if (eventType === LOCUSEVENT.PARTICIPANT_JOIN) {\n // trigger the event for stop ringing\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'handleOneonOneEvent',\n },\n EVENTS.REMOTE_RESPONSE,\n {\n remoteDeclined: false,\n remoteAnswered: true,\n }\n );\n }\n }\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n onDeltaLocus(locus: any) {\n const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants, isReplaceMembers);\n this.isMeetingActive();\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateLocusInfo(locus) {\n if (locus.self?.reason === 'MOVED' && locus.self?.state === 'LEFT') {\n // When moved to a breakout session locus sends a message for the previous locus\n // indicating that we have been moved. It isn't helpful to continue parsing this\n // as it gets interpreted as if we have left the call\n return;\n }\n\n this.updateControls(locus.controls, locus.self);\n this.updateConversationUrl(locus.conversationUrl, locus.info);\n this.updateCreated(locus.created);\n this.updateFullState(locus.fullState);\n this.updateHostInfo(locus.host);\n this.updateMeetingInfo(locus.info, locus.self);\n this.updateMediaShares(locus.mediaShares);\n this.updateParticipantsUrl(locus.participantsUrl);\n this.updateReplace(locus.replace);\n this.updateSelf(locus.self, locus.participants);\n this.updateLocusUrl(locus.url);\n this.updateAclUrl(locus.aclUrl);\n this.updateBasequence(locus.baseSequence);\n this.updateSequence(locus.sequence);\n this.updateMemberShip(locus.membership);\n this.updateIdentifiers(locus.identities);\n this.updateEmbeddedApps(locus.embeddedApps);\n this.updateServices(locus.links?.services);\n this.compareAndUpdate();\n // update which required to compare different objects from locus\n }\n\n /**\n * @param {Array} participants\n * @param {Object} self\n * @returns {Array}\n * @memberof LocusInfo\n */\n getLocusPartner(participants: Array<any>, self: any) {\n if (!participants || participants.length === 0) {\n return null;\n }\n\n return (\n participants.find(\n (participant) =>\n self &&\n participant.identity !== self.identity &&\n (participants.length <= 2 || (participant.type === _USER_ && !participant.removed))\n // @ts-ignore\n ) || this.partner\n );\n }\n\n // TODO: all the leave states need to be checked\n /**\n * @returns {undefined}\n * @memberof LocusInfo\n */\n isMeetingActive() {\n if (\n this.parsedLocus.fullState.type === _CALL_ ||\n this.parsedLocus.fullState.type === _SIP_BRIDGE_\n ) {\n // @ts-ignore\n const partner = this.getLocusPartner(this.participants, this.self);\n\n this.updateMeeting({partner});\n\n // Check if guest user needs to be checked here\n\n // 1) when bob declines call from bob, (bob='DECLINED')\n // 2) When alice rejects call to bob , (bob='NOTIFIED')\n\n // When we dont add MEDIA for condition 2. The state of bob='IDLE'\n\n if (this.fullState && this.fullState.state === LOCUS.STATE.INACTIVE) {\n // TODO: update the meeting state\n LoggerProxy.logger.warn(\n 'Locus-info:index#isMeetingActive --> Call Ended, locus state is inactive.'\n );\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.CALL_INACTIVE,\n shouldLeave: false,\n }\n );\n } else if (\n partner.state === MEETING_STATE.STATES.LEFT &&\n this.parsedLocus.self &&\n (this.parsedLocus.self.state === MEETING_STATE.STATES.DECLINED ||\n this.parsedLocus.self.state === MEETING_STATE.STATES.NOTIFIED ||\n this.parsedLocus.self.state === MEETING_STATE.STATES.JOINED)\n ) {\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.PARTNER_LEFT,\n shouldLeave:\n this.parsedLocus.self.joinedWith && this.parsedLocus.self.joinedWith.state !== _LEFT_,\n }\n );\n } else if (\n this.parsedLocus.self &&\n this.parsedLocus.self.state === MEETING_STATE.STATES.LEFT &&\n (partner.state === MEETING_STATE.STATES.LEFT ||\n partner.state === MEETING_STATE.STATES.DECLINED ||\n partner.state === MEETING_STATE.STATES.NOTIFIED ||\n partner.state === MEETING_STATE.STATES.IDLE) // Happens when user just joins and adds no Media\n ) {\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.SELF_LEFT,\n shouldLeave: false,\n }\n );\n }\n } else if (this.parsedLocus.fullState.type === _MEETING_) {\n if (\n this.fullState &&\n (this.fullState.state === LOCUS.STATE.INACTIVE ||\n // @ts-ignore\n this.fullState.state === LOCUS.STATE.TERMINATING)\n ) {\n LoggerProxy.logger.warn(\n 'Locus-info:index#isMeetingActive --> Meeting is ending due to inactive or terminating'\n );\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.MEETING_INACTIVE_TERMINATING,\n shouldLeave: false,\n }\n );\n } else if (this.fullState && this.fullState.removed) {\n // user has been dropped from a meeting\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.FULLSTATE_REMOVED,\n shouldLeave: false,\n }\n );\n }\n // If you are guest and you are removed from the meeting\n // You wont get any further events\n else if (this.parsedLocus.self && this.parsedLocus.self.removed) {\n // Check if we need to send an event\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.SELF_REMOVED,\n shouldLeave: false,\n }\n );\n }\n } else {\n LoggerProxy.logger.warn('Locus-info:index#isMeetingActive --> Meeting Type is unknown.');\n }\n }\n\n /**\n * checks if the host permissions have changed while in the meeting\n * This would be the case if your role as host or moderator has been updated\n * @returns {undefined}\n * @memberof LocusInfo\n */\n compareAndUpdate() {\n // TODO: check with locus team on host and moderator doc\n // use host as a validator if needed\n if (\n this.compareAndUpdateFlags.compareSelfAndHost ||\n this.compareAndUpdateFlags.compareHostAndSelf\n ) {\n this.compareSelfAndHost();\n }\n }\n\n /**\n * compared the self object to check if the user has host permissions\n * @returns {undefined}\n * @memberof LocusInfo\n */\n compareSelfAndHost() {\n // In some cases the host info is not present but the moderator values changes from null to false so it triggers an update\n if (\n this.parsedLocus.self.selfIdentity === this.parsedLocus.host?.hostId &&\n this.parsedLocus.self.moderator\n ) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'compareSelfAndHost',\n },\n EVENTS.LOCUS_INFO_CAN_ASSIGN_HOST,\n {\n canAssignHost: true,\n }\n );\n } else {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'compareSelfAndHost',\n },\n EVENTS.LOCUS_INFO_CAN_ASSIGN_HOST,\n {\n canAssignHost: false,\n }\n );\n }\n }\n\n /**\n * Update the deltaParticipants property of this object based on a list of\n * provided participants.\n *\n * @param {Array} [participants] - The participants to update against.\n * @returns {void}\n */\n updateParticipantDeltas(participants: Array<any> = []) {\n // Used to find a participant within a participants collection.\n const findParticipant = (participant, collection) =>\n collection.find((item) => item.person.id === participant.person.id);\n\n // Generates an object that indicates which state properties have changed.\n const generateDelta = (prevState: any = {}, newState: any = {}) => {\n // Setup deltas.\n const deltas = {\n audioStatus: prevState.audioStatus !== newState.audioStatus,\n videoSlidesStatus: prevState.videoSlidesStatus !== newState.videoSlidesStatus,\n videoStatus: prevState.videoStatus !== newState.videoStatus,\n };\n\n // Clean the object\n Object.keys(deltas).forEach((key) => {\n if (deltas[key] !== true) {\n delete deltas[key];\n }\n });\n\n return deltas;\n };\n\n this.deltaParticipants = participants.reduce((collection, participant) => {\n const existingParticipant = findParticipant(participant, this.participants || []) || {};\n\n const delta = generateDelta(existingParticipant.status, participant.status);\n\n const changed = Object.keys(delta).length > 0;\n\n if (changed) {\n collection.push({\n person: participant.person,\n delta,\n });\n }\n\n return collection;\n }, []);\n }\n\n /**\n * update meeting's members\n * @param {Object} participants new participants object\n * @param {Boolean} isReplace is replace the whole members\n * @returns {Array} updatedParticipants\n * @memberof LocusInfo\n */\n updateParticipants(participants: object, isReplace?: boolean) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateParticipants',\n },\n EVENTS.LOCUS_INFO_UPDATE_PARTICIPANTS,\n {\n participants,\n recordingId: this.parsedLocus.controls && this.parsedLocus.controls.record?.modifiedBy,\n selfIdentity: this.parsedLocus.self && this.parsedLocus.self.selfIdentity,\n selfId: this.parsedLocus.self && this.parsedLocus.self.selfId,\n hostId: this.parsedLocus.host && this.parsedLocus.host.hostId,\n isReplace,\n }\n );\n }\n\n /**\n * @param {Object} controls\n * @param {Object} self\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateControls(controls: object, self: object) {\n if (controls && !isEqual(this.controls, controls)) {\n this.parsedLocus.controls = ControlsUtils.parse(controls);\n const {\n updates: {\n hasRecordingChanged,\n hasRecordingPausedChanged,\n hasMeetingContainerChanged,\n hasTranscribeChanged,\n hasEntryExitToneChanged,\n hasBreakoutChanged,\n hasVideoEnabledChanged,\n hasMuteOnEntryChanged,\n hasShareControlChanged,\n hasDisallowUnmuteChanged,\n hasReactionsChanged,\n hasReactionDisplayNamesChanged,\n hasViewTheParticipantListChanged,\n hasRaiseHandChanged,\n hasVideoChanged,\n hasInterpretationChanged,\n },\n current,\n } = ControlsUtils.getControls(this.controls, controls);\n\n if (hasMuteOnEntryChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_MUTE_ON_ENTRY_CHANGED,\n {state: current.muteOnEntry}\n );\n }\n\n if (hasShareControlChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_SHARE_CONTROL_CHANGED,\n {state: current.shareControl}\n );\n }\n\n if (hasDisallowUnmuteChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_DISALLOW_UNMUTE_CHANGED,\n {state: current.disallowUnmute}\n );\n }\n\n if (hasReactionsChanged || hasReactionDisplayNamesChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_REACTIONS_CHANGED,\n {state: current.reactions}\n );\n }\n\n if (hasViewTheParticipantListChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED,\n {state: current.viewTheParticipantList}\n );\n }\n\n if (hasRaiseHandChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_RAISE_HAND_CHANGED,\n {state: current.raiseHand}\n );\n }\n\n if (hasVideoChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_VIDEO_CHANGED,\n {state: current.video}\n );\n }\n\n if (hasRecordingChanged || hasRecordingPausedChanged) {\n let state = null;\n\n if (hasRecordingPausedChanged) {\n if (current.record.paused) {\n state = RECORDING_STATE.PAUSED;\n } else {\n // state will be `IDLE` if the recording is not active, even when there is a `pause` status change.\n state = current.record.recording ? RECORDING_STATE.RESUMED : RECORDING_STATE.IDLE;\n }\n } else if (hasRecordingChanged) {\n state = current.record.recording ? RECORDING_STATE.RECORDING : RECORDING_STATE.IDLE;\n }\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_RECORDING_UPDATED,\n {\n state,\n modifiedBy: current.record.modifiedBy,\n lastModified: current.record.lastModified,\n }\n );\n }\n\n if (hasMeetingContainerChanged) {\n const {meetingContainerUrl} = current.meetingContainer;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_CONTAINER_UPDATED,\n {\n meetingContainerUrl,\n }\n );\n }\n\n if (hasTranscribeChanged) {\n const {transcribing, caption} = current.transcribe;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_TRANSCRIBE_UPDATED,\n {\n transcribing,\n caption,\n }\n );\n }\n\n if (hasBreakoutChanged) {\n const {breakout} = current;\n breakout.breakoutMoveId = SelfUtils.getReplacedBreakoutMoveId(\n self,\n this.webex.internal.device.url\n );\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_BREAKOUT_UPDATED,\n {\n breakout,\n }\n );\n }\n\n if (hasInterpretationChanged) {\n const {interpretation} = current;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_INTERPRETATION_UPDATED,\n {\n interpretation,\n }\n );\n }\n\n if (hasEntryExitToneChanged) {\n const {entryExitTone} = current;\n\n this.updateMeeting({entryExitTone});\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_ENTRY_EXIT_TONE_UPDATED,\n {\n entryExitTone,\n }\n );\n }\n\n // videoEnabled is handled differently than other controls,\n // to fit with audio mute status logic\n if (hasVideoEnabledChanged) {\n const {videoEnabled} = current;\n\n this.updateMeeting({unmuteVideoAllowed: videoEnabled});\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,\n {\n // muted: not part of locus.controls\n unmuteAllowed: videoEnabled,\n }\n );\n }\n\n this.controls = controls;\n }\n }\n\n /**\n * @param {String} conversationUrl\n * @param {Object} info\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateConversationUrl(conversationUrl: string, info: any) {\n if (conversationUrl && !isEqual(this.conversationUrl, conversationUrl)) {\n this.conversationUrl = conversationUrl;\n this.updateMeeting({conversationUrl});\n } else if (\n info &&\n info.conversationUrl &&\n !isEqual(this.conversationUrl, info.conversationUrl)\n ) {\n this.conversationUrl = info.conversationUrl;\n this.updateMeeting({conversationUrl: info.conversationUrl});\n }\n }\n\n /**\n * @param {Object} created\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateCreated(created: object) {\n if (created && !isEqual(this.created, created)) {\n this.created = created;\n }\n }\n\n /**\n * @param {Object} services\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateServices(services: Record<'breakout' | 'record', {url: string}>) {\n if (services && !isEqual(this.services, services)) {\n this.services = services;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateServices',\n },\n LOCUSINFO.EVENTS.LINKS_SERVICES,\n {\n services,\n }\n );\n }\n }\n\n /**\n * @param {Object} fullState\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateFullState(fullState: object) {\n if (fullState && !isEqual(this.fullState, fullState)) {\n const result = FullState.getFullState(this.fullState, fullState);\n\n this.updateMeeting(result.current);\n\n if (result.updates.meetingStateChangedTo) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateFullState',\n },\n LOCUSINFO.EVENTS.FULL_STATE_MEETING_STATE_CHANGE,\n {\n previousState: result.previous && result.previous.meetingState,\n currentState: result.current.meetingState,\n }\n );\n }\n\n if (result.updates.meetingTypeChangedTo) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateFullState',\n },\n LOCUSINFO.EVENTS.FULL_STATE_TYPE_UPDATE,\n {\n type: result.current.type,\n }\n );\n }\n this.parsedLocus.fullState = result.current;\n this.fullState = fullState;\n }\n }\n\n /**\n * handles when the locus.host is updated\n * @param {Object} host the locus.host property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal event locus_info_update_host\n */\n updateHostInfo(host: object) {\n if (host && !isEqual(this.host, host)) {\n const parsedHosts = HostUtils.getHosts(this.host, host);\n\n this.updateMeeting(parsedHosts.current);\n this.parsedLocus.host = parsedHosts.current;\n if (parsedHosts.updates.isNewHost) {\n this.compareAndUpdateFlags.compareSelfAndHost = true;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateHostInfo',\n },\n EVENTS.LOCUS_INFO_UPDATE_HOST,\n {\n newHost: parsedHosts.current,\n oldHost: parsedHosts.previous,\n }\n );\n }\n this.host = host;\n } else {\n this.compareAndUpdateFlags.compareSelfAndHost = false;\n }\n }\n\n /**\n * @param {Object} info\n * @param {Object} self\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMeetingInfo(info: object, self?: object) {\n const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];\n if (\n (info && !isEqual(this.info, info)) ||\n (roles.length && !isEqual(this.roles, roles) && info)\n ) {\n const isJoined = SelfUtils.isJoined(self || this.parsedLocus.self);\n const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles, isJoined);\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo',\n },\n LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,\n {info: parsedInfo.current, self}\n );\n\n if (parsedInfo.updates.isLocked) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo',\n },\n LOCUSINFO.EVENTS.MEETING_LOCKED,\n info\n );\n }\n if (parsedInfo.updates.isUnlocked) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo',\n },\n LOCUSINFO.EVENTS.MEETING_UNLOCKED,\n info\n );\n }\n\n this.info = info;\n this.parsedLocus.info = parsedInfo.current;\n // Parses the info and adds necessary values\n this.updateMeeting(parsedInfo.current);\n }\n this.roles = roles;\n }\n\n /**\n * @param {Object} embeddedApps\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateEmbeddedApps(embeddedApps: object) {\n // don't do anything if the arrays of apps haven't changed significantly\n if (EmbeddedAppsUtils.areSimilar(this.embeddedApps, embeddedApps)) {\n return;\n }\n\n const parsedEmbeddedApps = EmbeddedAppsUtils.parse(embeddedApps);\n\n this.updateMeeting({embeddedApps: parsedEmbeddedApps});\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateEmbeddedApps',\n },\n LOCUSINFO.EVENTS.EMBEDDED_APPS_UPDATED,\n parsedEmbeddedApps\n );\n this.embeddedApps = embeddedApps;\n }\n\n /**\n * handles when the locus.mediaShares is updated\n * @param {Object} mediaShares the locus.mediaShares property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal event locus_info_update_media_shares\n */\n updateMediaShares(mediaShares: object) {\n if (mediaShares && !isEqual(this.mediaShares, mediaShares)) {\n const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);\n\n this.updateMeeting(parsedMediaShares.current);\n this.parsedLocus.mediaShares = parsedMediaShares.current;\n this.mediaShares = mediaShares;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMediaShares',\n },\n EVENTS.LOCUS_INFO_UPDATE_MEDIA_SHARES,\n {\n current: parsedMediaShares.current,\n previous: parsedMediaShares.previous,\n }\n );\n }\n }\n\n /**\n * @param {String} participantsUrl\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateParticipantsUrl(participantsUrl: string) {\n if (participantsUrl && !isEqual(this.participantsUrl, participantsUrl)) {\n this.participantsUrl = participantsUrl;\n }\n }\n\n /**\n * @param {Object} replace\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateReplace(replace: object) {\n if (replace && !isEqual(this.replace, replace)) {\n this.replace = replace;\n }\n }\n\n /**\n * handles when the locus.self is updated\n * @param {Object} self the locus.mediaShares property\n * @param {Array} participants the locus.participants property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal events self_admitted_guest, self_unadmitted_guest, locus_info_update_self\n */\n updateSelf(self: any, participants: Array<any>) {\n // @ts-ignore - check where this.self come from\n if (self && !isEqual(this.self, self)) {\n // @ts-ignore\n const parsedSelves = SelfUtils.getSelves(this.self, self, this.webex.internal.device.url);\n\n this.updateMeeting(parsedSelves.current);\n this.parsedLocus.self = parsedSelves.current;\n\n const element = this.parsedLocus.states[this.parsedLocus.states.length - 1];\n\n if (element !== parsedSelves.current.state) {\n this.parsedLocus.states.push(parsedSelves.current.state);\n }\n\n // TODO: check if we need to save the sipUri here as well\n // this.emit(LOCUSINFO.EVENTS.MEETING_UPDATE, SelfUtils.getSipUrl(this.getLocusPartner(participants, self), this.parsedLocus.fullState.type, this.parsedLocus.info.sipUri));\n const result = SelfUtils.getSipUrl(\n this.getLocusPartner(participants, self),\n this.parsedLocus.fullState.type,\n this.parsedLocus.info.sipUri\n );\n\n if (result.sipUri) {\n this.updateMeeting(result);\n }\n\n if (parsedSelves.updates.moderatorChanged) {\n this.compareAndUpdateFlags.compareHostAndSelf = true;\n } else {\n this.compareAndUpdateFlags.compareHostAndSelf = false;\n }\n\n if (parsedSelves.updates.layoutChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_LAYOUT_UPDATED,\n {layout: parsedSelves.current.layout}\n );\n }\n\n if (parsedSelves.updates.breakoutsChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_MEETING_BREAKOUTS_CHANGED,\n {breakoutSessions: parsedSelves.current.breakoutSessions}\n );\n }\n\n if (parsedSelves.updates.interpretationChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_MEETING_INTERPRETATION_CHANGED,\n {\n interpretation: parsedSelves.current.interpretation,\n selfParticipantId: parsedSelves.current.selfId,\n }\n );\n }\n\n if (parsedSelves.updates.isMediaInactiveOrReleased) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.DISCONNECT_DUE_TO_INACTIVITY,\n {reason: self.reason}\n );\n }\n\n if (parsedSelves.updates.moderatorChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_MODERATOR_CHANGED,\n self\n );\n }\n\n if (parsedSelves.updates.isRolesChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_ROLES_CHANGED,\n {oldRoles: parsedSelves.previous?.roles, newRoles: parsedSelves.current?.roles}\n );\n }\n\n if (parsedSelves.updates.isVideoMutedByOthersChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,\n {\n muted: parsedSelves.current.remoteVideoMuted,\n // unmuteAllowed: not part of .self\n }\n );\n }\n if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUIRED,\n {\n muted: parsedSelves.current.remoteMuted,\n unmuteAllowed: parsedSelves.current.unmuteAllowed,\n }\n );\n }\n if (parsedSelves.updates.isMutedByOthersChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_MUTE_STATUS_UPDATED,\n {\n muted: parsedSelves.current.remoteMuted,\n unmuteAllowed: parsedSelves.current.unmuteAllowed,\n }\n );\n }\n if (parsedSelves.updates.localAudioUnmuteRequestedByServer) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUESTED,\n {}\n );\n }\n if (parsedSelves.updates.isUserUnadmitted) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_UNADMITTED_GUEST,\n self\n );\n }\n if (parsedSelves.updates.isUserAdmitted) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_ADMITTED_GUEST,\n self\n );\n }\n\n if (parsedSelves.updates.isMediaInactive) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n // @ts-ignore\n LOCUSINFO.EVENTS.MEDIA_INACTIVITY,\n SelfUtils.getMediaStatus(self.mediaSessions)\n );\n }\n\n if (\n parsedSelves.updates.audioStateChange ||\n parsedSelves.updates.videoStateChange ||\n parsedSelves.updates.shareStateChange\n ) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.MEDIA_STATUS_CHANGE,\n {\n audioStatus: parsedSelves.current.currentMediaStatus?.audio,\n videoStatus: parsedSelves.current.currentMediaStatus?.video,\n shareStatus: parsedSelves.current.currentMediaStatus?.share,\n }\n );\n }\n\n if (parsedSelves.updates.isUserObserving) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_OBSERVING\n );\n }\n\n if (parsedSelves.updates.canNotViewTheParticipantListChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_CANNOT_VIEW_PARTICIPANT_LIST_CHANGE,\n {canNotViewTheParticipantList: parsedSelves.current.canNotViewTheParticipantList}\n );\n }\n\n if (parsedSelves.updates.isSharingBlockedChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_IS_SHARING_BLOCKED_CHANGE,\n {isSharingBlocked: parsedSelves.current.isSharingBlocked}\n );\n }\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n EVENTS.LOCUS_INFO_UPDATE_SELF,\n {\n oldSelf: parsedSelves.previous,\n newSelf: parsedSelves.current,\n }\n );\n this.parsedLocus.self = parsedSelves.current;\n // @ts-ignore\n this.self = self;\n } else {\n this.compareAndUpdateFlags.compareHostAndSelf = false;\n }\n }\n\n /**\n * handles when the locus.url is updated\n * @param {String} url\n * @returns {undefined}\n * emits internal event locus_info_update_url\n */\n updateLocusUrl(url: string) {\n if (url && this.url !== url) {\n this.url = url;\n this.updateMeeting({locusUrl: url});\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateLocusUrl',\n },\n EVENTS.LOCUS_INFO_UPDATE_URL,\n url\n );\n }\n }\n\n /**\n * @param {String} aclUrl\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateAclUrl(aclUrl: string) {\n if (aclUrl && !isEqual(this.aclUrl, aclUrl)) {\n this.aclUrl = aclUrl;\n }\n }\n\n /**\n * @param {Number} baseSequence\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateBasequence(baseSequence: number) {\n if (baseSequence && !isEqual(this.baseSequence, baseSequence)) {\n this.baseSequence = baseSequence;\n }\n }\n\n /**\n * @param {Number} sequence\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateSequence(sequence: number) {\n if (sequence && !isEqual(this.sequence, sequence)) {\n this.sequence = sequence;\n }\n }\n\n /**\n * @param {Object} membership\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMemberShip(membership: object) {\n if (membership && !isEqual(this.membership, membership)) {\n this.membership = membership;\n }\n }\n\n /**\n * @param {Array} identities\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateIdentifiers(identities: Array<any>) {\n if (identities && !isEqual(this.identities, identities)) {\n this.identities = identities;\n }\n }\n\n /**\n * check the locus is main session's one or not, if is main session's, update main session cache\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateLocusCache(locus: any) {\n const isMainSessionDTO = ControlsUtils.isMainSessionDTO(locus);\n if (isMainSessionDTO) {\n this.updateMainSessionLocusCache(locus);\n }\n }\n\n /**\n * if return from breakout to main session, need to use cached main session DTO since locus won't send the full locus (participants)\n * if join breakout from main session, need to query main locus url (if response with 403 means no privilege, need to clear the cache)\n * @param {Object} newLocus\n * @returns {Object}\n * @memberof LocusInfo\n */\n getTheLocusToUpdate(newLocus: any) {\n const switchStatus = ControlsUtils.getSessionSwitchStatus(this.controls, newLocus?.controls);\n if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {\n return cloneDeep(this.mainSessionLocusCache);\n }\n if (switchStatus.isJoinToBreakout) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_JOIN_BREAKOUT_FROM_MAIN,\n {\n mainLocusUrl: this.url,\n }\n );\n }\n\n return newLocus;\n }\n\n /**\n * merge participants by participant id\n * @param {Array} participants\n * @param {Array} sourceParticipants\n * @returns {Array} merged participants\n * @memberof LocusInfo\n */\n // eslint-disable-next-line class-methods-use-this\n mergeParticipants(participants, sourceParticipants) {\n if (!sourceParticipants || !sourceParticipants.length) return participants;\n if (!participants || !participants.length) {\n return sourceParticipants;\n }\n sourceParticipants.forEach((participant) => {\n const existIndex = participants.findIndex((p) => p.id === participant.id);\n if (existIndex > -1) {\n participants.splice(existIndex, 1, participant);\n } else {\n participants.push(participant);\n }\n });\n\n return participants;\n }\n\n /**\n * need cache main sessions' participants since locus will not send the full list when cohost/host leave breakout\n * @param {Object} mainLocus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMainSessionLocusCache(mainLocus: any) {\n if (!mainLocus) {\n return;\n }\n const locusClone = cloneDeep(mainLocus);\n if (this.mainSessionLocusCache) {\n // shallow merge and do special merge for participants\n assignWith(this.mainSessionLocusCache, locusClone, (objValue, srcValue, key) => {\n if (key === 'participants') {\n return this.mergeParticipants(objValue, srcValue);\n }\n\n return srcValue || objValue;\n });\n } else {\n this.mainSessionLocusCache = locusClone;\n }\n }\n\n /**\n * clear main session cache\n * @returns {undefined}\n * @memberof LocusInfo\n */\n clearMainSessionLocusCache() {\n this.mainSessionLocusCache = null;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAEA;AACA;AACA;AAeA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAwC;AAAA;AAExC;AACA;AACA;AACA;AACA;AACA;AALA,IAMqBA,SAAS;EAAA;EAAA;EA+B5B;AACF;AACA;AACA;AACA;AACA;AACA;EACE,mBAAYC,aAAa,EAAEC,KAAK,EAAEC,SAAS,EAAE;IAAA;IAAA;IAC3C;IAAQ;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IACR,MAAKC,WAAW,GAAG;MACjBC,MAAM,EAAE;IACV,CAAC;IACD,MAAKH,KAAK,GAAGA,KAAK;IAClB,MAAKI,UAAU,GAAG,KAAK;IACvB,MAAKC,qBAAqB,GAAG,CAAC,CAAC;IAC/B,MAAKJ,SAAS,GAAGA,SAAS;IAC1B,MAAKF,aAAa,GAAGA,aAAa;IAClC,MAAKO,WAAW,GAAG,IAAIC,eAAgB,EAAE;IAAC;EAC5C;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,6BAAoBC,MAAc,EAAEC,KAAU,EAAEC,OAAY,EAAE;MAAA;MAC5D,4BAA4CH,eAAgB,CAACI,IAAI;QAA1DC,MAAM,yBAANA,MAAM;QAAEC,WAAW,yBAAXA,WAAW;QAAEC,YAAY,yBAAZA,YAAY;MAExC,QAAQN,MAAM;QACZ,KAAKM,YAAY;UACfJ,OAAO,CAACK,SAAS,CAACC,YAAY,CAACP,KAAK,CAAC;UACrC;QACF,KAAKI,WAAW;UACdH,OAAO,CAACO,WAAW,GAAG,KAAK;UAC3BP,OAAO,CAACQ,kBAAkB,GAAG,KAAK;UAClC;QACF,KAAKN,MAAM;UACTF,OAAO,CAACS,cAAc,CACnBC,YAAY,CAAC;YACZC,MAAM,EAAE,IAAI;YACZC,QAAQ,EAAEb,KAAK,CAACc,GAAG,GAAGd,KAAK,CAACc,GAAG,GAAGb,OAAO,CAACY;UAC5C,CAAC,CAAC,CACDE,IAAI,CAAC,UAACC,GAAG,EAAK;YACbf,OAAO,CAACK,SAAS,CAACW,WAAW,CAACD,GAAG,CAACE,IAAI,CAAC;YACvC;YACA;YACA,MAAI,CAACrB,WAAW,CAACsB,MAAM,EAAE;UAC3B,CAAC,CAAC;UACJ;QACF;UACEC,oBAAW,CAACC,MAAM,CAACC,IAAI,gFACmDvB,MAAM,EAC/E;MAAC;IAER;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,0BAAiBC,KAAU,EAAEC,OAAY,EAAE;MAAA;MACzC;MACA,IAAI,CAAC,IAAI,CAACJ,WAAW,CAAC0B,aAAa,EAAE;QACnC;QACA;QACA,IAAI,CAAC1B,WAAW,CAAC0B,aAAa,GAAG,UAACxB,MAAM,EAAEyB,UAAU,EAAK;UACvD,MAAI,CAACC,mBAAmB,CAAC1B,MAAM,EAAEyB,UAAU,EAAEvB,OAAO,CAAC;QACvD,CAAC;MACH;MACA;MACA,IAAI,CAACJ,WAAW,CAAC6B,YAAY,CAAC1B,KAAK,CAAC;IACtC;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,gBAAsB;MAAA;MAAA,IAAjBA,KAAU,uEAAG,CAAC,CAAC;MAClB,IAAI,CAAC2B,OAAO,GAAG3B,KAAK,CAAC2B,OAAO,IAAI,IAAI;MACpC,IAAI,CAACC,gBAAgB,GAAG5B,KAAK,CAACC,OAAO,IAAI,IAAI;MAC7C,IAAI,CAAC4B,eAAe,GAAG7B,KAAK,CAAC6B,eAAe,IAAI,IAAI;MACpD,IAAI,CAACC,QAAQ,GAAG9B,KAAK,CAAC8B,QAAQ,IAAI,IAAI;MACtC,IAAI,CAACC,MAAM,GAAG/B,KAAK,CAAC+B,MAAM,IAAI,IAAI;MAClC,IAAI,CAACC,YAAY,GAAGhC,KAAK,CAACgC,YAAY,IAAI,IAAI;MAC9C,IAAI,CAACC,QAAQ,GAAGjC,KAAK,CAACiC,QAAQ,IAAI,IAAI;MACtC,IAAI,CAACC,UAAU,GAAGlC,KAAK,CAACkC,UAAU,IAAI,IAAI;MAC1C,IAAI,CAACC,UAAU,GAAGnC,KAAK,CAACmC,UAAU,IAAI,IAAI;MAC1C,IAAI,CAACC,YAAY,GAAGpC,KAAK,CAACoC,YAAY,IAAI,IAAI;;MAE9C;AACJ;AACA;AACA;AACA;AACA;AACA;;MAEI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACI,IAAI,CAACC,iBAAiB,GAAG,EAAE;MAE3B,IAAI,CAACC,gBAAgB,CAACtC,KAAK,CAAC;MAC5B;MACA;MACA,IAAI,CAACuC,kBAAkB,CAACvC,KAAK,CAACoC,YAAY,CAAC;MAC3C;MACA,IAAI,CAACI,qBAAqB,CAACxC,KAAK,CAACyC,eAAe,EAAEzC,KAAK,CAACsB,IAAI,CAAC;MAC7D,IAAI,CAACoB,cAAc,CAAC1C,KAAK,CAAC2C,QAAQ,EAAE3C,KAAK,CAAC4C,IAAI,CAAC;MAC/C,IAAI,CAACC,cAAc,CAAC7C,KAAK,CAACc,GAAG,CAAC;MAC9B,IAAI,CAACgC,eAAe,CAAC9C,KAAK,CAAC+C,SAAS,CAAC;MACrC,IAAI,CAACC,iBAAiB,CAAChD,KAAK,CAACsB,IAAI,CAAC;MAClC,IAAI,CAAC2B,kBAAkB,CAACjD,KAAK,CAACkD,YAAY,CAAC;MAC3C;MACA,IAAI,CAACC,UAAU,CAACnD,KAAK,CAAC4C,IAAI,EAAE5C,KAAK,CAACoC,YAAY,CAAC;MAC/C,IAAI,CAACgB,cAAc,CAACpD,KAAK,CAACqD,IAAI,CAAC;MAC/B,IAAI,CAACC,iBAAiB,CAACtD,KAAK,CAACuD,WAAW,CAAC;MACzC,IAAI,CAACC,cAAc,iBAACxD,KAAK,CAACyD,KAAK,iDAAX,aAAaC,QAAQ,CAAC;IAC5C;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,sBAAa1D,KAAa,EAAE;MAC1B,IAAI,CAACsC,gBAAgB,CAACtC,KAAK,CAAC;MAC5B,IAAI,CAACiB,WAAW,CAACjB,KAAK,CAAC;;MAEvB;MACA,IAAI,CAACL,UAAU,GAAG,IAAI;IACxB;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,eAAMM,OAAY,EAAE0D,IAAS,EAAE;MAC7B;MACA,IAAOC,SAAS,GAAID,IAAI,CAAjBC,SAAS;MAChB,IAAM5D,KAAK,GAAG,IAAI,CAAC6D,mBAAmB,CAACF,IAAI,CAAC3D,KAAK,CAAC;MAClDoB,oBAAW,CAACC,MAAM,CAACC,IAAI,2DAAoDsC,SAAS,EAAG;MAEvF,QAAQA,SAAS;QACf,KAAKE,qBAAU,CAACC,gBAAgB;QAChC,KAAKD,qBAAU,CAACE,gBAAgB;QAChC,KAAKF,qBAAU,CAACG,gBAAgB;QAChC,KAAKH,qBAAU,CAACI,uBAAuB;QACvC,KAAKJ,qBAAU,CAACK,yBAAyB;QACzC,KAAKL,qBAAU,CAACM,uBAAuB;QACvC,KAAKN,qBAAU,CAACO,yBAAyB;QACzC,KAAKP,qBAAU,CAACQ,YAAY;QAC5B,KAAKR,qBAAU,CAACS,mBAAmB;QACnC,KAAKT,qBAAU,CAACU,4BAA4B;QAC5C,KAAKV,qBAAU,CAACW,yBAAyB;QACzC,KAAKX,qBAAU,CAACY,oBAAoB;QACpC,KAAKZ,qBAAU,CAACa,aAAa;QAC7B,KAAKb,qBAAU,CAACc,cAAc;UAC5B,IAAI,CAAC3D,WAAW,CAACjB,KAAK,EAAE4D,SAAS,CAAC;UAClC;QACF,KAAKE,qBAAU,CAACe,UAAU;UACxB,IAAI,CAACC,gBAAgB,CAAC9E,KAAK,EAAEC,OAAO,CAAC;UACrC;QAEF;UACE;UACA;UACA,IAAI,CAAC6E,gBAAgB,CAAC9E,KAAK,EAAEC,OAAO,CAAC;MAAC;IAE5C;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,oBAAW8E,KAAW,EAAEC,SAAkB,EAAEC,IAAU,EAAE;MACtD,OAAO,IAAI,CAACC,IAAI,CAACH,KAAK,EAAEC,SAAS,EAAEC,IAAI,CAAC;IAC1C;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,qBAAYjF,KAAU,EAAE4D,SAAkB,EAAE;MAC1C,IAAI,CAAC5D,KAAK,EAAE;QACVoB,oBAAW,CAACC,MAAM,CAAC8D,KAAK,CACtB,qFAAqF,CACtF;MACH;MAEA,IAAI,CAAC,IAAI,CAACtF,WAAW,CAACuF,cAAc,CAACpF,KAAK,CAAC,EAAE;QAC3CoB,oBAAW,CAACC,MAAM,CAACC,IAAI,mFACsDsC,SAAS,EACrF;QAED;MACF;MACA,IAAI,CAACyB,uBAAuB,CAACrF,KAAK,CAACoC,YAAY,CAAC;MAChD,IAAI,CAACR,gBAAgB,GAAG5B,KAAK,CAACC,OAAO,IAAI,IAAI;MAC7C,IAAI,CAACmC,YAAY,GAAGpC,KAAK,CAACoC,YAAY;MACtC,IAAMkD,gBAAgB,GAAGC,sBAAa,CAACC,oBAAoB,CAAC,IAAI,CAAC7C,QAAQ,EAAE3C,KAAK,CAAC2C,QAAQ,CAAC;MAC1F,IAAI,CAAC8C,eAAe,CAACzF,KAAK,CAAC;MAC3B,IAAI,CAACuC,kBAAkB,CAACvC,KAAK,CAACoC,YAAY,EAAEkD,gBAAgB,CAAC;MAC7D,IAAI,CAACI,eAAe,EAAE;MACtB,IAAI,CAACC,mBAAmB,CAAC/B,SAAS,CAAC;MACnC,IAAI,CAACX,kBAAkB,CAACjD,KAAK,CAACkD,YAAY,CAAC;MAC3C;MACA,IAAI,CAACrD,WAAW,CAAC+F,WAAW,GAAG5F,KAAK;IACtC;;IAEA;IACA;AACF;AACA;AACA;AACA;IACE;EAAA;IAAA;IAAA,OACA,6BAAoB4D,SAAiB,EAAE;MACrC,IACE,IAAI,CAACnE,WAAW,CAACsD,SAAS,CAAC8C,IAAI,KAAKC,iBAAM,IAC1C,IAAI,CAACrG,WAAW,CAACsD,SAAS,CAAC8C,IAAI,KAAKE,uBAAY,EAChD;QACA;QACA,IAAInC,SAAS,KAAKE,qBAAU,CAACY,oBAAoB,EAAE;UACjD;UACA,IAAI,CAACsB,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACDC,iBAAM,CAACC,eAAe,EACtB;YACEC,cAAc,EAAE,IAAI;YACpBC,cAAc,EAAE;UAClB,CAAC,CACF;QACH;QACA;QACA,IAAI1C,SAAS,KAAKE,qBAAU,CAACC,gBAAgB,EAAE;UAC7C;UACA,IAAI,CAACiC,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACDC,iBAAM,CAACC,eAAe,EACtB;YACEC,cAAc,EAAE,KAAK;YACrBC,cAAc,EAAE;UAClB,CAAC,CACF;QACH;MACF;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,sBAAatG,KAAU,EAAE;MACvB,IAAMsF,gBAAgB,GAAGC,sBAAa,CAACC,oBAAoB,CAAC,IAAI,CAAC7C,QAAQ,EAAE3C,KAAK,CAAC2C,QAAQ,CAAC;MAC1F,IAAI,CAAC8C,eAAe,CAACzF,KAAK,CAAC;MAC3B,IAAI,CAACuC,kBAAkB,CAACvC,KAAK,CAACoC,YAAY,EAAEkD,gBAAgB,CAAC;MAC7D,IAAI,CAACI,eAAe,EAAE;IACxB;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,yBAAgB1F,KAAK,EAAE;MAAA;MACrB,IAAI,gBAAAA,KAAK,CAAC4C,IAAI,gDAAV,YAAY2D,MAAM,MAAK,OAAO,IAAI,iBAAAvG,KAAK,CAAC4C,IAAI,iDAAV,aAAY4D,KAAK,MAAK,MAAM,EAAE;QAClE;QACA;QACA;QACA;MACF;MAEA,IAAI,CAAC9D,cAAc,CAAC1C,KAAK,CAAC2C,QAAQ,EAAE3C,KAAK,CAAC4C,IAAI,CAAC;MAC/C,IAAI,CAACJ,qBAAqB,CAACxC,KAAK,CAACyC,eAAe,EAAEzC,KAAK,CAACsB,IAAI,CAAC;MAC7D,IAAI,CAACmF,aAAa,CAACzG,KAAK,CAAC2B,OAAO,CAAC;MACjC,IAAI,CAACmB,eAAe,CAAC9C,KAAK,CAAC+C,SAAS,CAAC;MACrC,IAAI,CAACK,cAAc,CAACpD,KAAK,CAACqD,IAAI,CAAC;MAC/B,IAAI,CAACL,iBAAiB,CAAChD,KAAK,CAACsB,IAAI,EAAEtB,KAAK,CAAC4C,IAAI,CAAC;MAC9C,IAAI,CAACU,iBAAiB,CAACtD,KAAK,CAACuD,WAAW,CAAC;MACzC,IAAI,CAACmD,qBAAqB,CAAC1G,KAAK,CAAC6B,eAAe,CAAC;MACjD,IAAI,CAAC8E,aAAa,CAAC3G,KAAK,CAAC4G,OAAO,CAAC;MACjC,IAAI,CAACzD,UAAU,CAACnD,KAAK,CAAC4C,IAAI,EAAE5C,KAAK,CAACoC,YAAY,CAAC;MAC/C,IAAI,CAACS,cAAc,CAAC7C,KAAK,CAACc,GAAG,CAAC;MAC9B,IAAI,CAAC+F,YAAY,CAAC7G,KAAK,CAAC+B,MAAM,CAAC;MAC/B,IAAI,CAAC+E,gBAAgB,CAAC9G,KAAK,CAACgC,YAAY,CAAC;MACzC,IAAI,CAAC+E,cAAc,CAAC/G,KAAK,CAACiC,QAAQ,CAAC;MACnC,IAAI,CAAC+E,gBAAgB,CAAChH,KAAK,CAACkC,UAAU,CAAC;MACvC,IAAI,CAAC+E,iBAAiB,CAACjH,KAAK,CAACmC,UAAU,CAAC;MACxC,IAAI,CAACc,kBAAkB,CAACjD,KAAK,CAACkD,YAAY,CAAC;MAC3C,IAAI,CAACM,cAAc,kBAACxD,KAAK,CAACyD,KAAK,kDAAX,cAAaC,QAAQ,CAAC;MAC1C,IAAI,CAACwD,gBAAgB,EAAE;MACvB;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,yBAAgB9E,YAAwB,EAAEQ,IAAS,EAAE;MACnD,IAAI,CAACR,YAAY,IAAIA,YAAY,CAAC+E,MAAM,KAAK,CAAC,EAAE;QAC9C,OAAO,IAAI;MACb;MAEA,OACE/E,YAAY,CAACgF,IAAI,CACf,UAACC,WAAW;QAAA,OACVzE,IAAI,IACJyE,WAAW,CAACC,QAAQ,KAAK1E,IAAI,CAAC0E,QAAQ,KACrClF,YAAY,CAAC+E,MAAM,IAAI,CAAC,IAAKE,WAAW,CAACxB,IAAI,KAAK0B,iBAAM,IAAI,CAACF,WAAW,CAACG,OAAQ,CAAC;MAAA;MACrF;MAAA,CACD,IAAI,IAAI,CAACC,OAAO;IAErB;;IAEA;IACA;AACF;AACA;AACA;EAHE;IAAA;IAAA,OAIA,2BAAkB;MAChB,IACE,IAAI,CAAChI,WAAW,CAACsD,SAAS,CAAC8C,IAAI,KAAKC,iBAAM,IAC1C,IAAI,CAACrG,WAAW,CAACsD,SAAS,CAAC8C,IAAI,KAAKE,uBAAY,EAChD;QACA;QACA,IAAM0B,OAAO,GAAG,IAAI,CAACC,eAAe,CAAC,IAAI,CAACtF,YAAY,EAAE,IAAI,CAACQ,IAAI,CAAC;QAElE,IAAI,CAACtD,aAAa,CAAC;UAACmI,OAAO,EAAPA;QAAO,CAAC,CAAC;;QAE7B;;QAEA;QACA;;QAEA;;QAEA,IAAI,IAAI,CAAC1E,SAAS,IAAI,IAAI,CAACA,SAAS,CAACyD,KAAK,KAAKmB,gBAAK,CAACC,KAAK,CAACC,QAAQ,EAAE;UACnE;UACAzG,oBAAW,CAACC,MAAM,CAACyG,IAAI,CACrB,2EAA2E,CAC5E;;UAED;UACA,IAAI,CAACvI,KAAK,CAACwI,QAAQ,CAACC,UAAU,CAACC,iBAAiB,CAAC;YAC/CC,IAAI,EAAE,0BAA0B;YAChCC,OAAO,EAAE;cACP3I,SAAS,EAAE,IAAI,CAACA;YAClB;UACF,CAAC,CAAC;UAEF,IAAI,CAACwG,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACDC,iBAAM,CAACiC,eAAe,EACtB;YACE7B,MAAM,EAAE8B,8BAAmB,CAACC,aAAa;YACzCC,WAAW,EAAE;UACf,CAAC,CACF;QACH,CAAC,MAAM,IACLd,OAAO,CAACjB,KAAK,KAAKgC,wBAAa,CAACC,MAAM,CAACC,IAAI,IAC3C,IAAI,CAACjJ,WAAW,CAACmD,IAAI,KACpB,IAAI,CAACnD,WAAW,CAACmD,IAAI,CAAC4D,KAAK,KAAKgC,wBAAa,CAACC,MAAM,CAACE,QAAQ,IAC5D,IAAI,CAAClJ,WAAW,CAACmD,IAAI,CAAC4D,KAAK,KAAKgC,wBAAa,CAACC,MAAM,CAACG,QAAQ,IAC7D,IAAI,CAACnJ,WAAW,CAACmD,IAAI,CAAC4D,KAAK,KAAKgC,wBAAa,CAACC,MAAM,CAACI,MAAM,CAAC,EAC9D;UACA;UACA,IAAI,CAACtJ,KAAK,CAACwI,QAAQ,CAACC,UAAU,CAACC,iBAAiB,CAAC;YAC/CC,IAAI,EAAE,0BAA0B;YAChCC,OAAO,EAAE;cACP3I,SAAS,EAAE,IAAI,CAACA;YAClB;UACF,CAAC,CAAC;UACF,IAAI,CAACwG,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACDC,iBAAM,CAACiC,eAAe,EACtB;YACE7B,MAAM,EAAE8B,8BAAmB,CAACS,YAAY;YACxCP,WAAW,EACT,IAAI,CAAC9I,WAAW,CAACmD,IAAI,CAACmG,UAAU,IAAI,IAAI,CAACtJ,WAAW,CAACmD,IAAI,CAACmG,UAAU,CAACvC,KAAK,KAAKwC;UACnF,CAAC,CACF;QACH,CAAC,MAAM,IACL,IAAI,CAACvJ,WAAW,CAACmD,IAAI,IACrB,IAAI,CAACnD,WAAW,CAACmD,IAAI,CAAC4D,KAAK,KAAKgC,wBAAa,CAACC,MAAM,CAACC,IAAI,KACxDjB,OAAO,CAACjB,KAAK,KAAKgC,wBAAa,CAACC,MAAM,CAACC,IAAI,IAC1CjB,OAAO,CAACjB,KAAK,KAAKgC,wBAAa,CAACC,MAAM,CAACE,QAAQ,IAC/ClB,OAAO,CAACjB,KAAK,KAAKgC,wBAAa,CAACC,MAAM,CAACG,QAAQ,IAC/CnB,OAAO,CAACjB,KAAK,KAAKgC,wBAAa,CAACC,MAAM,CAACQ,IAAI,CAAC,CAAC;QAAA,EAC/C;UACA;UACA,IAAI,CAAC1J,KAAK,CAACwI,QAAQ,CAACC,UAAU,CAACC,iBAAiB,CAAC;YAC/CC,IAAI,EAAE,0BAA0B;YAChCC,OAAO,EAAE;cACP3I,SAAS,EAAE,IAAI,CAACA;YAClB;UACF,CAAC,CAAC;UAEF,IAAI,CAACwG,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACDC,iBAAM,CAACiC,eAAe,EACtB;YACE7B,MAAM,EAAE8B,8BAAmB,CAACa,SAAS;YACrCX,WAAW,EAAE;UACf,CAAC,CACF;QACH;MACF,CAAC,MAAM,IAAI,IAAI,CAAC9I,WAAW,CAACsD,SAAS,CAAC8C,IAAI,KAAKsD,oBAAS,EAAE;QACxD,IACE,IAAI,CAACpG,SAAS,KACb,IAAI,CAACA,SAAS,CAACyD,KAAK,KAAKmB,gBAAK,CAACC,KAAK,CAACC,QAAQ;QAC5C;QACA,IAAI,CAAC9E,SAAS,CAACyD,KAAK,KAAKmB,gBAAK,CAACC,KAAK,CAACwB,WAAW,CAAC,EACnD;UACAhI,oBAAW,CAACC,MAAM,CAACyG,IAAI,CACrB,uFAAuF,CACxF;;UAED;UACA,IAAI,CAACvI,KAAK,CAACwI,QAAQ,CAACC,UAAU,CAACC,iBAAiB,CAAC;YAC/CC,IAAI,EAAE,0BAA0B;YAChCC,OAAO,EAAE;cACP3I,SAAS,EAAE,IAAI,CAACA;YAClB;UACF,CAAC,CAAC;UACF,IAAI,CAACwG,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACDC,iBAAM,CAACiC,eAAe,EACtB;YACE7B,MAAM,EAAE8C,iCAAsB,CAACC,4BAA4B;YAC3Df,WAAW,EAAE;UACf,CAAC,CACF;QACH,CAAC,MAAM,IAAI,IAAI,CAACxF,SAAS,IAAI,IAAI,CAACA,SAAS,CAACyE,OAAO,EAAE;UACnD;;UAEA;UACA,IAAI,CAACjI,KAAK,CAACwI,QAAQ,CAACC,UAAU,CAACC,iBAAiB,CAAC;YAC/CC,IAAI,EAAE,0BAA0B;YAChCC,OAAO,EAAE;cACP3I,SAAS,EAAE,IAAI,CAACA;YAClB;UACF,CAAC,CAAC;UACF,IAAI,CAACwG,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACDC,iBAAM,CAACiC,eAAe,EACtB;YACE7B,MAAM,EAAE8C,iCAAsB,CAACE,iBAAiB;YAChDhB,WAAW,EAAE;UACf,CAAC,CACF;QACH;QACA;QACA;QAAA,KACK,IAAI,IAAI,CAAC9I,WAAW,CAACmD,IAAI,IAAI,IAAI,CAACnD,WAAW,CAACmD,IAAI,CAAC4E,OAAO,EAAE;UAC/D;UACA,IAAI,CAACxB,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACDC,iBAAM,CAACiC,eAAe,EACtB;YACE7B,MAAM,EAAE8C,iCAAsB,CAACG,YAAY;YAC3CjB,WAAW,EAAE;UACf,CAAC,CACF;QACH;MACF,CAAC,MAAM;QACLnH,oBAAW,CAACC,MAAM,CAACyG,IAAI,CAAC,+DAA+D,CAAC;MAC1F;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,4BAAmB;MACjB;MACA;MACA,IACE,IAAI,CAAClI,qBAAqB,CAAC6J,kBAAkB,IAC7C,IAAI,CAAC7J,qBAAqB,CAAC8J,kBAAkB,EAC7C;QACA,IAAI,CAACD,kBAAkB,EAAE;MAC3B;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,8BAAqB;MAAA;MACnB;MACA,IACE,IAAI,CAAChK,WAAW,CAACmD,IAAI,CAAC+G,YAAY,+BAAK,IAAI,CAAClK,WAAW,CAAC4D,IAAI,0DAArB,sBAAuBuG,MAAM,KACpE,IAAI,CAACnK,WAAW,CAACmD,IAAI,CAACiH,SAAS,EAC/B;QACA,IAAI,CAAC7D,UAAU,CACb;UACEC,IAAI,EAAE,YAAY;UAClBC,QAAQ,EAAE;QACZ,CAAC,EACDC,iBAAM,CAAC2D,0BAA0B,EACjC;UACEC,aAAa,EAAE;QACjB,CAAC,CACF;MACH,CAAC,MAAM;QACL,IAAI,CAAC/D,UAAU,CACb;UACEC,IAAI,EAAE,YAAY;UAClBC,QAAQ,EAAE;QACZ,CAAC,EACDC,iBAAM,CAAC2D,0BAA0B,EACjC;UACEC,aAAa,EAAE;QACjB,CAAC,CACF;MACH;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,mCAAuD;MAAA;MAAA,IAA/B3H,YAAwB,uEAAG,EAAE;MACnD;MACA,IAAM4H,eAAe,GAAG,SAAlBA,eAAe,CAAI3C,WAAW,EAAE4C,UAAU;QAAA,OAC9CA,UAAU,CAAC7C,IAAI,CAAC,UAAC8C,IAAI;UAAA,OAAKA,IAAI,CAACC,MAAM,CAACC,EAAE,KAAK/C,WAAW,CAAC8C,MAAM,CAACC,EAAE;QAAA,EAAC;MAAA;;MAErE;MACA,IAAMC,aAAa,GAAG,SAAhBA,aAAa,GAAgD;QAAA,IAA5CC,SAAc,uEAAG,CAAC,CAAC;QAAA,IAAEC,QAAa,uEAAG,CAAC,CAAC;QAC5D;QACA,IAAMC,MAAM,GAAG;UACbC,WAAW,EAAEH,SAAS,CAACG,WAAW,KAAKF,QAAQ,CAACE,WAAW;UAC3DC,iBAAiB,EAAEJ,SAAS,CAACI,iBAAiB,KAAKH,QAAQ,CAACG,iBAAiB;UAC7EC,WAAW,EAAEL,SAAS,CAACK,WAAW,KAAKJ,QAAQ,CAACI;QAClD,CAAC;;QAED;QACA,mBAAYH,MAAM,CAAC,CAACI,OAAO,CAAC,UAACC,GAAG,EAAK;UACnC,IAAIL,MAAM,CAACK,GAAG,CAAC,KAAK,IAAI,EAAE;YACxB,OAAOL,MAAM,CAACK,GAAG,CAAC;UACpB;QACF,CAAC,CAAC;QAEF,OAAOL,MAAM;MACf,CAAC;MAED,IAAI,CAACnI,iBAAiB,GAAGD,YAAY,CAAC0I,MAAM,CAAC,UAACb,UAAU,EAAE5C,WAAW,EAAK;QACxE,IAAM0D,mBAAmB,GAAGf,eAAe,CAAC3C,WAAW,EAAE,MAAI,CAACjF,YAAY,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;QAEvF,IAAM4I,KAAK,GAAGX,aAAa,CAACU,mBAAmB,CAACE,MAAM,EAAE5D,WAAW,CAAC4D,MAAM,CAAC;QAE3E,IAAMC,OAAO,GAAG,mBAAYF,KAAK,CAAC,CAAC7D,MAAM,GAAG,CAAC;QAE7C,IAAI+D,OAAO,EAAE;UACXjB,UAAU,CAACkB,IAAI,CAAC;YACdhB,MAAM,EAAE9C,WAAW,CAAC8C,MAAM;YAC1Ba,KAAK,EAALA;UACF,CAAC,CAAC;QACJ;QAEA,OAAOf,UAAU;MACnB,CAAC,EAAE,EAAE,CAAC;IACR;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,4BAAmB7H,YAAoB,EAAEgJ,SAAmB,EAAE;MAAA;MAC5D,IAAI,CAACpF,UAAU,CACb;QACEC,IAAI,EAAE,YAAY;QAClBC,QAAQ,EAAE;MACZ,CAAC,EACDC,iBAAM,CAACkF,8BAA8B,EACrC;QACEjJ,YAAY,EAAZA,YAAY;QACZkJ,WAAW,EAAE,IAAI,CAAC7L,WAAW,CAACkD,QAAQ,8BAAI,IAAI,CAAClD,WAAW,CAACkD,QAAQ,CAAC4I,MAAM,0DAAhC,sBAAkCC,UAAU;QACtF7B,YAAY,EAAE,IAAI,CAAClK,WAAW,CAACmD,IAAI,IAAI,IAAI,CAACnD,WAAW,CAACmD,IAAI,CAAC+G,YAAY;QACzE8B,MAAM,EAAE,IAAI,CAAChM,WAAW,CAACmD,IAAI,IAAI,IAAI,CAACnD,WAAW,CAACmD,IAAI,CAAC6I,MAAM;QAC7D7B,MAAM,EAAE,IAAI,CAACnK,WAAW,CAAC4D,IAAI,IAAI,IAAI,CAAC5D,WAAW,CAAC4D,IAAI,CAACuG,MAAM;QAC7DwB,SAAS,EAATA;MACF,CAAC,CACF;IACH;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,wBAAezI,QAAgB,EAAEC,IAAY,EAAE;MAC7C,IAAID,QAAQ,IAAI,CAAC,uBAAQ,IAAI,CAACA,QAAQ,EAAEA,QAAQ,CAAC,EAAE;QACjD,IAAI,CAAClD,WAAW,CAACkD,QAAQ,GAAG4C,sBAAa,CAACmG,KAAK,CAAC/I,QAAQ,CAAC;QACzD,4BAoBI4C,sBAAa,CAACoG,WAAW,CAAC,IAAI,CAAChJ,QAAQ,EAAEA,QAAQ,CAAC;UAAA,+CAnBpDiJ,OAAO;UACLC,mBAAmB,0BAAnBA,mBAAmB;UACnBC,yBAAyB,0BAAzBA,yBAAyB;UACzBC,0BAA0B,0BAA1BA,0BAA0B;UAC1BC,oBAAoB,0BAApBA,oBAAoB;UACpBC,uBAAuB,0BAAvBA,uBAAuB;UACvBC,kBAAkB,0BAAlBA,kBAAkB;UAClBC,sBAAsB,0BAAtBA,sBAAsB;UACtBC,qBAAqB,0BAArBA,qBAAqB;UACrBC,sBAAsB,0BAAtBA,sBAAsB;UACtBC,wBAAwB,0BAAxBA,wBAAwB;UACxBC,mBAAmB,0BAAnBA,mBAAmB;UACnBC,8BAA8B,0BAA9BA,8BAA8B;UAC9BC,gCAAgC,0BAAhCA,gCAAgC;UAChCC,mBAAmB,0BAAnBA,mBAAmB;UACnBC,eAAe,0BAAfA,eAAe;UACfC,wBAAwB,0BAAxBA,wBAAwB;UAE1BC,OAAO,yBAAPA,OAAO;QAGT,IAAIT,qBAAqB,EAAE;UACzB,IAAI,CAACpG,UAAU,CACb;YAACC,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4G,oBAAS,CAAC3G,MAAM,CAAC4G,8BAA8B,EAC/C;YAACvG,KAAK,EAAEqG,OAAO,CAACG;UAAW,CAAC,CAC7B;QACH;QAEA,IAAIX,sBAAsB,EAAE;UAC1B,IAAI,CAACrG,UAAU,CACb;YAACC,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4G,oBAAS,CAAC3G,MAAM,CAAC8G,8BAA8B,EAC/C;YAACzG,KAAK,EAAEqG,OAAO,CAACK;UAAY,CAAC,CAC9B;QACH;QAEA,IAAIZ,wBAAwB,EAAE;UAC5B,IAAI,CAACtG,UAAU,CACb;YAACC,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4G,oBAAS,CAAC3G,MAAM,CAACgH,gCAAgC,EACjD;YAAC3G,KAAK,EAAEqG,OAAO,CAACO;UAAc,CAAC,CAChC;QACH;QAEA,IAAIb,mBAAmB,IAAIC,8BAA8B,EAAE;UACzD,IAAI,CAACxG,UAAU,CACb;YAACC,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4G,oBAAS,CAAC3G,MAAM,CAACkH,0BAA0B,EAC3C;YAAC7G,KAAK,EAAEqG,OAAO,CAACS;UAAS,CAAC,CAC3B;QACH;QAEA,IAAIb,gCAAgC,EAAE;UACpC,IAAI,CAACzG,UAAU,CACb;YAACC,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4G,oBAAS,CAAC3G,MAAM,CAACoH,2CAA2C,EAC5D;YAAC/G,KAAK,EAAEqG,OAAO,CAACW;UAAsB,CAAC,CACxC;QACH;QAEA,IAAId,mBAAmB,EAAE;UACvB,IAAI,CAAC1G,UAAU,CACb;YAACC,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4G,oBAAS,CAAC3G,MAAM,CAACsH,2BAA2B,EAC5C;YAACjH,KAAK,EAAEqG,OAAO,CAACa;UAAS,CAAC,CAC3B;QACH;QAEA,IAAIf,eAAe,EAAE;UACnB,IAAI,CAAC3G,UAAU,CACb;YAACC,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4G,oBAAS,CAAC3G,MAAM,CAACwH,sBAAsB,EACvC;YAACnH,KAAK,EAAEqG,OAAO,CAACe;UAAK,CAAC,CACvB;QACH;QAEA,IAAI/B,mBAAmB,IAAIC,yBAAyB,EAAE;UACpD,IAAItF,KAAK,GAAG,IAAI;UAEhB,IAAIsF,yBAAyB,EAAE;YAC7B,IAAIe,OAAO,CAACtB,MAAM,CAACsC,MAAM,EAAE;cACzBrH,KAAK,GAAGsH,0BAAe,CAACC,MAAM;YAChC,CAAC,MAAM;cACL;cACAvH,KAAK,GAAGqG,OAAO,CAACtB,MAAM,CAACyC,SAAS,GAAGF,0BAAe,CAACG,OAAO,GAAGH,0BAAe,CAAC7E,IAAI;YACnF;UACF,CAAC,MAAM,IAAI4C,mBAAmB,EAAE;YAC9BrF,KAAK,GAAGqG,OAAO,CAACtB,MAAM,CAACyC,SAAS,GAAGF,0BAAe,CAACI,SAAS,GAAGJ,0BAAe,CAAC7E,IAAI;UACrF;UAEA,IAAI,CAACjD,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACgI,0BAA0B,EAC3C;YACE3H,KAAK,EAALA,KAAK;YACLgF,UAAU,EAAEqB,OAAO,CAACtB,MAAM,CAACC,UAAU;YACrC4C,YAAY,EAAEvB,OAAO,CAACtB,MAAM,CAAC6C;UAC/B,CAAC,CACF;QACH;QAEA,IAAIrC,0BAA0B,EAAE;UAC9B,IAAOsC,mBAAmB,GAAIxB,OAAO,CAACyB,gBAAgB,CAA/CD,mBAAmB;UAE1B,IAAI,CAACrI,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACoI,kCAAkC,EACnD;YACEF,mBAAmB,EAAnBA;UACF,CAAC,CACF;QACH;QAEA,IAAIrC,oBAAoB,EAAE;UACxB,0BAAgCa,OAAO,CAAC2B,UAAU;YAA3CC,YAAY,uBAAZA,YAAY;YAAEC,OAAO,uBAAPA,OAAO;UAE5B,IAAI,CAAC1I,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACwI,mCAAmC,EACpD;YACEF,YAAY,EAAZA,YAAY;YACZC,OAAO,EAAPA;UACF,CAAC,CACF;QACH;QAEA,IAAIxC,kBAAkB,EAAE;UACtB,IAAO0C,QAAQ,GAAI/B,OAAO,CAAnB+B,QAAQ;UACfA,QAAQ,CAACC,cAAc,GAAGC,kBAAS,CAACC,yBAAyB,CAC3DnM,IAAI,EACJ,IAAI,CAACrD,KAAK,CAACwI,QAAQ,CAACiH,MAAM,CAAClO,GAAG,CAC/B;UACD,IAAI,CAACkF,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAAC8I,iCAAiC,EAClD;YACEL,QAAQ,EAARA;UACF,CAAC,CACF;QACH;QAEA,IAAIhC,wBAAwB,EAAE;UAC5B,IAAOsC,cAAc,GAAIrC,OAAO,CAAzBqC,cAAc;UACrB,IAAI,CAAClJ,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACgJ,uCAAuC,EACxD;YACED,cAAc,EAAdA;UACF,CAAC,CACF;QACH;QAEA,IAAIjD,uBAAuB,EAAE;UAC3B,IAAOmD,aAAa,GAAIvC,OAAO,CAAxBuC,aAAa;UAEpB,IAAI,CAAC9P,aAAa,CAAC;YAAC8P,aAAa,EAAbA;UAAa,CAAC,CAAC;UAEnC,IAAI,CAACpJ,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACkJ,gCAAgC,EACjD;YACED,aAAa,EAAbA;UACF,CAAC,CACF;QACH;;QAEA;QACA;QACA,IAAIjD,sBAAsB,EAAE;UAC1B,IAAOmD,YAAY,GAAIzC,OAAO,CAAvByC,YAAY;UAEnB,IAAI,CAAChQ,aAAa,CAAC;YAACiQ,kBAAkB,EAAED;UAAY,CAAC,CAAC;UAEtD,IAAI,CAACtJ,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACqJ,qCAAqC,EACtD;YACE;YACAC,aAAa,EAAEH;UACjB,CAAC,CACF;QACH;QAEA,IAAI,CAAC3M,QAAQ,GAAGA,QAAQ;MAC1B;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,+BAAsBF,eAAuB,EAAEnB,IAAS,EAAE;MACxD,IAAImB,eAAe,IAAI,CAAC,uBAAQ,IAAI,CAACA,eAAe,EAAEA,eAAe,CAAC,EAAE;QACtE,IAAI,CAACA,eAAe,GAAGA,eAAe;QACtC,IAAI,CAACnD,aAAa,CAAC;UAACmD,eAAe,EAAfA;QAAe,CAAC,CAAC;MACvC,CAAC,MAAM,IACLnB,IAAI,IACJA,IAAI,CAACmB,eAAe,IACpB,CAAC,uBAAQ,IAAI,CAACA,eAAe,EAAEnB,IAAI,CAACmB,eAAe,CAAC,EACpD;QACA,IAAI,CAACA,eAAe,GAAGnB,IAAI,CAACmB,eAAe;QAC3C,IAAI,CAACnD,aAAa,CAAC;UAACmD,eAAe,EAAEnB,IAAI,CAACmB;QAAe,CAAC,CAAC;MAC7D;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,uBAAcd,OAAe,EAAE;MAC7B,IAAIA,OAAO,IAAI,CAAC,uBAAQ,IAAI,CAACA,OAAO,EAAEA,OAAO,CAAC,EAAE;QAC9C,IAAI,CAACA,OAAO,GAAGA,OAAO;MACxB;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,wBAAe+B,QAAsD,EAAE;MACrE,IAAIA,QAAQ,IAAI,CAAC,uBAAQ,IAAI,CAACA,QAAQ,EAAEA,QAAQ,CAAC,EAAE;QACjD,IAAI,CAACA,QAAQ,GAAGA,QAAQ;QACxB,IAAI,CAACsC,UAAU,CACb;UACEC,IAAI,EAAE,YAAY;UAClBC,QAAQ,EAAE;QACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACuJ,cAAc,EAC/B;UACEhM,QAAQ,EAARA;QACF,CAAC,CACF;MACH;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,yBAAgBX,SAAiB,EAAE;MACjC,IAAIA,SAAS,IAAI,CAAC,uBAAQ,IAAI,CAACA,SAAS,EAAEA,SAAS,CAAC,EAAE;QACpD,IAAM4M,MAAM,GAAGC,kBAAS,CAACC,YAAY,CAAC,IAAI,CAAC9M,SAAS,EAAEA,SAAS,CAAC;QAEhE,IAAI,CAACzD,aAAa,CAACqQ,MAAM,CAAC9C,OAAO,CAAC;QAElC,IAAI8C,MAAM,CAAC/D,OAAO,CAACkE,qBAAqB,EAAE;UACxC,IAAI,CAAC9J,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAAC4J,+BAA+B,EAChD;YACEC,aAAa,EAAEL,MAAM,CAACM,QAAQ,IAAIN,MAAM,CAACM,QAAQ,CAACC,YAAY;YAC9DC,YAAY,EAAER,MAAM,CAAC9C,OAAO,CAACqD;UAC/B,CAAC,CACF;QACH;QAEA,IAAIP,MAAM,CAAC/D,OAAO,CAACwE,oBAAoB,EAAE;UACvC,IAAI,CAACpK,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACkK,sBAAsB,EACvC;YACExK,IAAI,EAAE8J,MAAM,CAAC9C,OAAO,CAAChH;UACvB,CAAC,CACF;QACH;QACA,IAAI,CAACpG,WAAW,CAACsD,SAAS,GAAG4M,MAAM,CAAC9C,OAAO;QAC3C,IAAI,CAAC9J,SAAS,GAAGA,SAAS;MAC5B;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,wBAAeM,IAAY,EAAE;MAC3B,IAAIA,IAAI,IAAI,CAAC,uBAAQ,IAAI,CAACA,IAAI,EAAEA,IAAI,CAAC,EAAE;QACrC,IAAMiN,WAAW,GAAGC,kBAAS,CAACC,QAAQ,CAAC,IAAI,CAACnN,IAAI,EAAEA,IAAI,CAAC;QAEvD,IAAI,CAAC/D,aAAa,CAACgR,WAAW,CAACzD,OAAO,CAAC;QACvC,IAAI,CAACpN,WAAW,CAAC4D,IAAI,GAAGiN,WAAW,CAACzD,OAAO;QAC3C,IAAIyD,WAAW,CAAC1E,OAAO,CAAC6E,SAAS,EAAE;UACjC,IAAI,CAAC7Q,qBAAqB,CAAC6J,kBAAkB,GAAG,IAAI;UACpD,IAAI,CAACzD,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACDC,iBAAM,CAACuK,sBAAsB,EAC7B;YACEC,OAAO,EAAEL,WAAW,CAACzD,OAAO;YAC5B+D,OAAO,EAAEN,WAAW,CAACL;UACvB,CAAC,CACF;QACH;QACA,IAAI,CAAC5M,IAAI,GAAGA,IAAI;MAClB,CAAC,MAAM;QACL,IAAI,CAACzD,qBAAqB,CAAC6J,kBAAkB,GAAG,KAAK;MACvD;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,2BAAkBnI,IAAY,EAAEsB,IAAa,EAAE;MAAA;MAC7C,IAAMiO,KAAK,GAAGjO,IAAI,GAAGkM,kBAAS,CAACgC,QAAQ,CAAClO,IAAI,CAAC,GAAG,8BAAI,CAACnD,WAAW,CAACmD,IAAI,0DAArB,sBAAuBiO,KAAK,KAAI,EAAE;MAClF,IACGvP,IAAI,IAAI,CAAC,uBAAQ,IAAI,CAACA,IAAI,EAAEA,IAAI,CAAC,IACjCuP,KAAK,CAAC1J,MAAM,IAAI,CAAC,uBAAQ,IAAI,CAAC0J,KAAK,EAAEA,KAAK,CAAC,IAAIvP,IAAK,EACrD;QACA,IAAMyP,QAAQ,GAAGjC,kBAAS,CAACiC,QAAQ,CAACnO,IAAI,IAAI,IAAI,CAACnD,WAAW,CAACmD,IAAI,CAAC;QAClE,IAAMoO,UAAU,GAAGC,kBAAS,CAACC,QAAQ,CAAC,IAAI,CAACzR,WAAW,CAAC6B,IAAI,EAAEA,IAAI,EAAEuP,KAAK,EAAEE,QAAQ,CAAC;QAEnF,IAAI,CAAC/K,UAAU,CACb;UACEC,IAAI,EAAE,YAAY;UAClBC,QAAQ,EAAE;QACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACgL,oBAAoB,EACrC;UAAC7P,IAAI,EAAE0P,UAAU,CAACnE,OAAO;UAAEjK,IAAI,EAAJA;QAAI,CAAC,CACjC;QAED,IAAIoO,UAAU,CAACpF,OAAO,CAACwF,QAAQ,EAAE;UAC/B,IAAI,CAACpL,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACkL,cAAc,EAC/B/P,IAAI,CACL;QACH;QACA,IAAI0P,UAAU,CAACpF,OAAO,CAAC0F,UAAU,EAAE;UACjC,IAAI,CAACtL,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACoL,gBAAgB,EACjCjQ,IAAI,CACL;QACH;QAEA,IAAI,CAACA,IAAI,GAAGA,IAAI;QAChB,IAAI,CAAC7B,WAAW,CAAC6B,IAAI,GAAG0P,UAAU,CAACnE,OAAO;QAC1C;QACA,IAAI,CAACvN,aAAa,CAAC0R,UAAU,CAACnE,OAAO,CAAC;MACxC;MACA,IAAI,CAACgE,KAAK,GAAGA,KAAK;IACpB;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,4BAAmB3N,YAAoB,EAAE;MACvC;MACA,IAAIsO,0BAAiB,CAACC,UAAU,CAAC,IAAI,CAACvO,YAAY,EAAEA,YAAY,CAAC,EAAE;QACjE;MACF;MAEA,IAAMwO,kBAAkB,GAAGF,0BAAiB,CAAC9F,KAAK,CAACxI,YAAY,CAAC;MAEhE,IAAI,CAAC5D,aAAa,CAAC;QAAC4D,YAAY,EAAEwO;MAAkB,CAAC,CAAC;MAEtD,IAAI,CAAC1L,UAAU,CACb;QACEC,IAAI,EAAE,YAAY;QAClBC,QAAQ,EAAE;MACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACwL,qBAAqB,EACtCD,kBAAkB,CACnB;MACD,IAAI,CAACxO,YAAY,GAAGA,YAAY;IAClC;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,2BAAkBK,WAAmB,EAAE;MACrC,IAAIA,WAAW,IAAI,CAAC,uBAAQ,IAAI,CAACA,WAAW,EAAEA,WAAW,CAAC,EAAE;QAC1D,IAAMqO,iBAAiB,GAAGC,yBAAgB,CAACC,cAAc,CAAC,IAAI,CAACvO,WAAW,EAAEA,WAAW,CAAC;QAExF,IAAI,CAACjE,aAAa,CAACsS,iBAAiB,CAAC/E,OAAO,CAAC;QAC7C,IAAI,CAACpN,WAAW,CAAC8D,WAAW,GAAGqO,iBAAiB,CAAC/E,OAAO;QACxD,IAAI,CAACtJ,WAAW,GAAGA,WAAW;QAC9B,IAAI,CAACyC,UAAU,CACb;UACEC,IAAI,EAAE,YAAY;UAClBC,QAAQ,EAAE;QACZ,CAAC,EACDC,iBAAM,CAAC4L,8BAA8B,EACrC;UACElF,OAAO,EAAE+E,iBAAiB,CAAC/E,OAAO;UAClCoD,QAAQ,EAAE2B,iBAAiB,CAAC3B;QAC9B,CAAC,CACF;MACH;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,+BAAsBpO,eAAuB,EAAE;MAC7C,IAAIA,eAAe,IAAI,CAAC,uBAAQ,IAAI,CAACA,eAAe,EAAEA,eAAe,CAAC,EAAE;QACtE,IAAI,CAACA,eAAe,GAAGA,eAAe;MACxC;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,uBAAc+E,OAAe,EAAE;MAC7B,IAAIA,OAAO,IAAI,CAAC,uBAAQ,IAAI,CAACA,OAAO,EAAEA,OAAO,CAAC,EAAE;QAC9C,IAAI,CAACA,OAAO,GAAGA,OAAO;MACxB;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,oBAAWhE,IAAS,EAAER,YAAwB,EAAE;MAC9C;MACA,IAAIQ,IAAI,IAAI,CAAC,uBAAQ,IAAI,CAACA,IAAI,EAAEA,IAAI,CAAC,EAAE;QACrC;QACA,IAAMoP,YAAY,GAAGlD,kBAAS,CAACmD,SAAS,CAAC,IAAI,CAACrP,IAAI,EAAEA,IAAI,EAAE,IAAI,CAACrD,KAAK,CAACwI,QAAQ,CAACiH,MAAM,CAAClO,GAAG,CAAC;QAEzF,IAAI,CAACxB,aAAa,CAAC0S,YAAY,CAACnF,OAAO,CAAC;QACxC,IAAI,CAACpN,WAAW,CAACmD,IAAI,GAAGoP,YAAY,CAACnF,OAAO;QAE5C,IAAMqF,OAAO,GAAG,IAAI,CAACzS,WAAW,CAACC,MAAM,CAAC,IAAI,CAACD,WAAW,CAACC,MAAM,CAACyH,MAAM,GAAG,CAAC,CAAC;QAE3E,IAAI+K,OAAO,KAAKF,YAAY,CAACnF,OAAO,CAACrG,KAAK,EAAE;UAC1C,IAAI,CAAC/G,WAAW,CAACC,MAAM,CAACyL,IAAI,CAAC6G,YAAY,CAACnF,OAAO,CAACrG,KAAK,CAAC;QAC1D;;QAEA;QACA;QACA,IAAMmJ,MAAM,GAAGb,kBAAS,CAACqD,SAAS,CAChC,IAAI,CAACzK,eAAe,CAACtF,YAAY,EAAEQ,IAAI,CAAC,EACxC,IAAI,CAACnD,WAAW,CAACsD,SAAS,CAAC8C,IAAI,EAC/B,IAAI,CAACpG,WAAW,CAAC6B,IAAI,CAAC8Q,MAAM,CAC7B;QAED,IAAIzC,MAAM,CAACyC,MAAM,EAAE;UACjB,IAAI,CAAC9S,aAAa,CAACqQ,MAAM,CAAC;QAC5B;QAEA,IAAIqC,YAAY,CAACpG,OAAO,CAACyG,gBAAgB,EAAE;UACzC,IAAI,CAACzS,qBAAqB,CAAC8J,kBAAkB,GAAG,IAAI;QACtD,CAAC,MAAM;UACL,IAAI,CAAC9J,qBAAqB,CAAC8J,kBAAkB,GAAG,KAAK;QACvD;QAEA,IAAIsI,YAAY,CAACpG,OAAO,CAAC0G,aAAa,EAAE;UACtC,IAAI,CAACtM,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACoM,+BAA+B,EAChD;YAACC,MAAM,EAAER,YAAY,CAACnF,OAAO,CAAC2F;UAAM,CAAC,CACtC;QACH;QAEA,IAAIR,YAAY,CAACpG,OAAO,CAAC6G,gBAAgB,EAAE;UACzC,IAAI,CAACzM,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACuM,8BAA8B,EAC/C;YAACC,gBAAgB,EAAEX,YAAY,CAACnF,OAAO,CAAC8F;UAAgB,CAAC,CAC1D;QACH;QAEA,IAAIX,YAAY,CAACpG,OAAO,CAACgH,qBAAqB,EAAE;UAC9C,IAAI,CAAC5M,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAAC0M,mCAAmC,EACpD;YACE3D,cAAc,EAAE8C,YAAY,CAACnF,OAAO,CAACqC,cAAc;YACnD4D,iBAAiB,EAAEd,YAAY,CAACnF,OAAO,CAACpB;UAC1C,CAAC,CACF;QACH;QAEA,IAAIuG,YAAY,CAACpG,OAAO,CAACmH,yBAAyB,EAAE;UAClD,IAAI,CAAC/M,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAAC6M,4BAA4B,EAC7C;YAACzM,MAAM,EAAE3D,IAAI,CAAC2D;UAAM,CAAC,CACtB;QACH;QAEA,IAAIyL,YAAY,CAACpG,OAAO,CAACyG,gBAAgB,EAAE;UACzC,IAAI,CAACrM,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAAC8M,sBAAsB,EACvCrQ,IAAI,CACL;QACH;QAEA,IAAIoP,YAAY,CAACpG,OAAO,CAACsH,cAAc,EAAE;UAAA;UACvC,IAAI,CAAClN,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACgN,kBAAkB,EACnC;YAACC,QAAQ,2BAAEpB,YAAY,CAAC/B,QAAQ,0DAArB,sBAAuBY,KAAK;YAAEwC,QAAQ,2BAAErB,YAAY,CAACnF,OAAO,0DAApB,sBAAsBgE;UAAK,CAAC,CAChF;QACH;QAEA,IAAImB,YAAY,CAACpG,OAAO,CAAC0H,2BAA2B,EAAE;UACpD,IAAI,CAACtN,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACqJ,qCAAqC,EACtD;YACE+D,KAAK,EAAEvB,YAAY,CAACnF,OAAO,CAAC2G;YAC5B;UACF,CAAC,CACF;QACH;;QACA,IAAIxB,YAAY,CAACpG,OAAO,CAAC6H,gCAAgC,EAAE;UACzD,IAAI,CAACzN,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACuN,qBAAqB,EACtC;YACEH,KAAK,EAAEvB,YAAY,CAACnF,OAAO,CAAC8G,WAAW;YACvClE,aAAa,EAAEuC,YAAY,CAACnF,OAAO,CAAC4C;UACtC,CAAC,CACF;QACH;QACA,IAAIuC,YAAY,CAACpG,OAAO,CAACgI,sBAAsB,EAAE;UAC/C,IAAI,CAAC5N,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAAC0N,+BAA+B,EAChD;YACEN,KAAK,EAAEvB,YAAY,CAACnF,OAAO,CAAC8G,WAAW;YACvClE,aAAa,EAAEuC,YAAY,CAACnF,OAAO,CAAC4C;UACtC,CAAC,CACF;QACH;QACA,IAAIuC,YAAY,CAACpG,OAAO,CAACkI,iCAAiC,EAAE;UAC1D,IAAI,CAAC9N,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAAC4N,sBAAsB,EACvC,CAAC,CAAC,CACH;QACH;QACA,IAAI/B,YAAY,CAACpG,OAAO,CAACoI,gBAAgB,EAAE;UACzC,IAAI,CAAChO,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAAC8N,qBAAqB,EACtCrR,IAAI,CACL;QACH;QACA,IAAIoP,YAAY,CAACpG,OAAO,CAACsI,cAAc,EAAE;UACvC,IAAI,CAAClO,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACgO,mBAAmB,EACpCvR,IAAI,CACL;QACH;QAEA,IAAIoP,YAAY,CAACpG,OAAO,CAACwI,eAAe,EAAE;UACxC,IAAI,CAACpO,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC;UACD;UACA4G,oBAAS,CAAC3G,MAAM,CAACkO,gBAAgB,EACjCvF,kBAAS,CAACwF,cAAc,CAAC1R,IAAI,CAAC2R,aAAa,CAAC,CAC7C;QACH;QAEA,IACEvC,YAAY,CAACpG,OAAO,CAAC4I,gBAAgB,IACrCxC,YAAY,CAACpG,OAAO,CAAC6I,gBAAgB,IACrCzC,YAAY,CAACpG,OAAO,CAAC8I,gBAAgB,EACrC;UAAA;UACA,IAAI,CAAC1O,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACwO,mBAAmB,EACpC;YACElK,WAAW,4BAAEuH,YAAY,CAACnF,OAAO,CAAC+H,kBAAkB,2DAAvC,uBAAyCC,KAAK;YAC3DlK,WAAW,4BAAEqH,YAAY,CAACnF,OAAO,CAAC+H,kBAAkB,2DAAvC,uBAAyChH,KAAK;YAC3DkH,WAAW,4BAAE9C,YAAY,CAACnF,OAAO,CAAC+H,kBAAkB,2DAAvC,uBAAyCG;UACxD,CAAC,CACF;QACH;QAEA,IAAI/C,YAAY,CAACpG,OAAO,CAACoJ,eAAe,EAAE;UACxC,IAAI,CAAChP,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAAC8O,cAAc,CAChC;QACH;QAEA,IAAIjD,YAAY,CAACpG,OAAO,CAACsJ,mCAAmC,EAAE;UAC5D,IAAI,CAAClP,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACgP,wCAAwC,EACzD;YAACC,4BAA4B,EAAEpD,YAAY,CAACnF,OAAO,CAACuI;UAA4B,CAAC,CAClF;QACH;QAEA,IAAIpD,YAAY,CAACpG,OAAO,CAACyJ,uBAAuB,EAAE;UAChD,IAAI,CAACrP,UAAU,CACb;YACEC,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACmP,8BAA8B,EAC/C;YAACC,gBAAgB,EAAEvD,YAAY,CAACnF,OAAO,CAAC0I;UAAgB,CAAC,CAC1D;QACH;QAEA,IAAI,CAACvP,UAAU,CACb;UACEC,IAAI,EAAE,YAAY;UAClBC,QAAQ,EAAE;QACZ,CAAC,EACDC,iBAAM,CAACqP,sBAAsB,EAC7B;UACEC,OAAO,EAAEzD,YAAY,CAAC/B,QAAQ;UAC9ByF,OAAO,EAAE1D,YAAY,CAACnF;QACxB,CAAC,CACF;QACD,IAAI,CAACpN,WAAW,CAACmD,IAAI,GAAGoP,YAAY,CAACnF,OAAO;QAC5C;QACA,IAAI,CAACjK,IAAI,GAAGA,IAAI;MAClB,CAAC,MAAM;QACL,IAAI,CAAChD,qBAAqB,CAAC8J,kBAAkB,GAAG,KAAK;MACvD;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,wBAAe5I,GAAW,EAAE;MAC1B,IAAIA,GAAG,IAAI,IAAI,CAACA,GAAG,KAAKA,GAAG,EAAE;QAC3B,IAAI,CAACA,GAAG,GAAGA,GAAG;QACd,IAAI,CAACxB,aAAa,CAAC;UAACuB,QAAQ,EAAEC;QAAG,CAAC,CAAC;QACnC,IAAI,CAACkF,UAAU,CACb;UACEC,IAAI,EAAE,YAAY;UAClBC,QAAQ,EAAE;QACZ,CAAC,EACDC,iBAAM,CAACwP,qBAAqB,EAC5B7U,GAAG,CACJ;MACH;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,sBAAaiB,MAAc,EAAE;MAC3B,IAAIA,MAAM,IAAI,CAAC,uBAAQ,IAAI,CAACA,MAAM,EAAEA,MAAM,CAAC,EAAE;QAC3C,IAAI,CAACA,MAAM,GAAGA,MAAM;MACtB;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,0BAAiBC,YAAoB,EAAE;MACrC,IAAIA,YAAY,IAAI,CAAC,uBAAQ,IAAI,CAACA,YAAY,EAAEA,YAAY,CAAC,EAAE;QAC7D,IAAI,CAACA,YAAY,GAAGA,YAAY;MAClC;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,wBAAeC,QAAgB,EAAE;MAC/B,IAAIA,QAAQ,IAAI,CAAC,uBAAQ,IAAI,CAACA,QAAQ,EAAEA,QAAQ,CAAC,EAAE;QACjD,IAAI,CAACA,QAAQ,GAAGA,QAAQ;MAC1B;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,0BAAiBC,UAAkB,EAAE;MACnC,IAAIA,UAAU,IAAI,CAAC,uBAAQ,IAAI,CAACA,UAAU,EAAEA,UAAU,CAAC,EAAE;QACvD,IAAI,CAACA,UAAU,GAAGA,UAAU;MAC9B;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,2BAAkBC,UAAsB,EAAE;MACxC,IAAIA,UAAU,IAAI,CAAC,uBAAQ,IAAI,CAACA,UAAU,EAAEA,UAAU,CAAC,EAAE;QACvD,IAAI,CAACA,UAAU,GAAGA,UAAU;MAC9B;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,0BAAiBnC,KAAU,EAAE;MAC3B,IAAM4V,gBAAgB,GAAGrQ,sBAAa,CAACqQ,gBAAgB,CAAC5V,KAAK,CAAC;MAC9D,IAAI4V,gBAAgB,EAAE;QACpB,IAAI,CAACC,2BAA2B,CAAC7V,KAAK,CAAC;MACzC;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,6BAAoB8V,QAAa,EAAE;MACjC,IAAMC,YAAY,GAAGxQ,sBAAa,CAACyQ,sBAAsB,CAAC,IAAI,CAACrT,QAAQ,EAAEmT,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAEnT,QAAQ,CAAC;MAC5F,IAAIoT,YAAY,CAACE,cAAc,IAAI,IAAI,CAACC,qBAAqB,EAAE;QAC7D,OAAO,yBAAU,IAAI,CAACA,qBAAqB,CAAC;MAC9C;MACA,IAAIH,YAAY,CAACI,gBAAgB,EAAE;QACjC,IAAI,CAACnQ,UAAU,CACb;UACEC,IAAI,EAAE,YAAY;UAClBC,QAAQ,EAAE;QACZ,CAAC,EACD4G,oBAAS,CAAC3G,MAAM,CAACiQ,gCAAgC,EACjD;UACEC,YAAY,EAAE,IAAI,CAACvV;QACrB,CAAC,CACF;MACH;MAEA,OAAOgV,QAAQ;IACjB;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;IACE;EAAA;IAAA;IAAA,OACA,2BAAkB1T,YAAY,EAAEkU,kBAAkB,EAAE;MAClD,IAAI,CAACA,kBAAkB,IAAI,CAACA,kBAAkB,CAACnP,MAAM,EAAE,OAAO/E,YAAY;MAC1E,IAAI,CAACA,YAAY,IAAI,CAACA,YAAY,CAAC+E,MAAM,EAAE;QACzC,OAAOmP,kBAAkB;MAC3B;MACAA,kBAAkB,CAAC1L,OAAO,CAAC,UAACvD,WAAW,EAAK;QAC1C,IAAMkP,UAAU,GAAGnU,YAAY,CAACoU,SAAS,CAAC,UAACC,CAAC;UAAA,OAAKA,CAAC,CAACrM,EAAE,KAAK/C,WAAW,CAAC+C,EAAE;QAAA,EAAC;QACzE,IAAImM,UAAU,GAAG,CAAC,CAAC,EAAE;UACnBnU,YAAY,CAACsU,MAAM,CAACH,UAAU,EAAE,CAAC,EAAElP,WAAW,CAAC;QACjD,CAAC,MAAM;UACLjF,YAAY,CAAC+I,IAAI,CAAC9D,WAAW,CAAC;QAChC;MACF,CAAC,CAAC;MAEF,OAAOjF,YAAY;IACrB;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,qCAA4BuU,SAAc,EAAE;MAAA;MAC1C,IAAI,CAACA,SAAS,EAAE;QACd;MACF;MACA,IAAMC,UAAU,GAAG,yBAAUD,SAAS,CAAC;MACvC,IAAI,IAAI,CAACT,qBAAqB,EAAE;QAC9B;QACA,0BAAW,IAAI,CAACA,qBAAqB,EAAEU,UAAU,EAAE,UAACC,QAAQ,EAAEC,QAAQ,EAAEjM,GAAG,EAAK;UAC9E,IAAIA,GAAG,KAAK,cAAc,EAAE;YAC1B,OAAO,MAAI,CAACkM,iBAAiB,CAACF,QAAQ,EAAEC,QAAQ,CAAC;UACnD;UAEA,OAAOA,QAAQ,IAAID,QAAQ;QAC7B,CAAC,CAAC;MACJ,CAAC,MAAM;QACL,IAAI,CAACX,qBAAqB,GAAGU,UAAU;MACzC;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,sCAA6B;MAC3B,IAAI,CAACV,qBAAqB,GAAG,IAAI;IACnC;EAAC;EAAA;AAAA,EAljDoCc,oBAAW;AAAA"}
@@ -47,6 +47,34 @@ var Parser = /*#__PURE__*/function () {
47
47
  * @returns {string} loci comparison state
48
48
  */
49
49
  (0, _createClass2.default)(Parser, [{
50
+ key: "isNewFullLocus",
51
+ value:
52
+ /**
53
+ * Returns true if the incoming full locus DTO is newer than the current working copy
54
+ *
55
+ * @param {Types~Locus} incomingFullDto New Full Locus DTO
56
+ * @returns {string} either Parser.loci.USE_INCOMING or Parser.loci.USE_CURRENT
57
+ */
58
+ function isNewFullLocus(incomingFullDto) {
59
+ if (!Parser.isLoci(incomingFullDto)) {
60
+ _loggerProxy.default.logger.info('Locus-info:parser#isNewFullLocus --> Ignoring non-locus object.');
61
+ return false;
62
+ }
63
+ if (!this.workingCopy) {
64
+ // we don't have a working copy yet, so any full locus is better than nothing
65
+ return true;
66
+ }
67
+ var comparisonResult = Parser.compareFullDtoSequence(this.workingCopy, incomingFullDto);
68
+ return comparisonResult === Parser.loci.USE_INCOMING;
69
+ }
70
+
71
+ /**
72
+ * Compares Locus sequences
73
+ * @param {Types~Locus} current Current working copy
74
+ * @param {Types~Locus} incoming New Locus delta
75
+ * @returns {string}
76
+ */
77
+ }, {
50
78
  key: "isValidLocus",
51
79
  value:
52
80
  /**
@@ -407,11 +435,24 @@ var Parser = /*#__PURE__*/function () {
407
435
  }
408
436
 
409
437
  /**
410
- * Compares Locus sequences
438
+ * Compares Locus sequences - it should be called only for full Locus DTOs, not deltas
439
+ *
411
440
  * @param {Types~Locus} current Current working copy
412
- * @param {Types~Locus} incoming New Locus delta
413
- * @returns {string}
441
+ * @param {Types~Locus} incomingFullDto New Full Locus DTO
442
+ * @returns {string} either Parser.loci.USE_INCOMING or Parser.loci.USE_CURRENT
414
443
  */
444
+ }, {
445
+ key: "compareFullDtoSequence",
446
+ value: function compareFullDtoSequence(current, incomingFullDto) {
447
+ if (Parser.isSequenceEmpty(current) || Parser.isSequenceEmpty(incomingFullDto)) {
448
+ return Parser.loci.USE_INCOMING;
449
+ }
450
+
451
+ // the sequence.entries list will always contain at least 1 entry
452
+ // https://sqbu-github.cisco.com/WebExSquared/cloud-apps/wiki/Locus-Sequence-Comparison-Algorithm
453
+
454
+ return incomingFullDto.sequence.entries.slice(-1)[0] > current.sequence.entries.slice(-1)[0] ? Parser.loci.USE_INCOMING : Parser.loci.USE_CURRENT;
455
+ }
415
456
  }, {
416
457
  key: "compareSequence",
417
458
  value: function compareSequence(current, incoming) {